学习完了mycat的高可用还是复习一下MHA+atlas吧,个人感觉还是比mycat好用,毕竟MHA有数据补全和切换主从的机制

1 MHA是什么?

  • MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
  • 该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
  • 在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性
  • 目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。

MHA实现机制:

  1. 监控AB的状态
  2. 完整的选举机制(看谁的数据跟master最接近)
  3. 让一个B切换到新A
  4. 保证数据的完整性(通过差异还原)

环境准备:

  • db01 主                10.0.0.51
  • db02 从                10.0.0.52
  • db03 从                10.0.0.53
  • mha+atlas           10.0.0.55

1.1  搭建MySQL主从

1.1.1 MySQL配置文件

  1. [root@db01 ~]# cat /etc/my.cnf
  2. [client]
  3. socket = /data/mysql.sock
  4. [mysqld]
  5. lower_case_table_names = 1
  6. default-storage-engine = InnoDB
  7. port = 3306
  8. datadir = /data
  9. character-set-server = utf8
  10. socket = /data/mysql.sock
  11. log_bin=mysql-bin #主从开启binlog
  12. server_id = 1 #serverID不能相同
  13. gtid_mode=ON #开启GTID复制
  14. log_slave_updates
  15. enforce_gtid_consistency
  16. innodb_buffer_pool_size = 200M
  17. slave-parallel-workers = 8
  18. thread_cache_size = 600
  19. back_log = 600
  20. slave_net_timeout = 60
  21. max_binlog_size = 512M
  22. key_buffer_size = 8M
  23. query_cache_size = 64M
  24. join_buffer_size = 2M
  25. sort_buffer_size = 2M
  26. query_cache_type = 1
  27. thread_stack = 192K
  28. innodb_thread_concurrency = 8
  29. connect_timeout = 300
  30. max_connections = 6000
  31. max_allowed_packet = 2048M
  32. max_connect_errors = 6000
  33. wait_timeout = 200000
  34. interactive_timeout = 200000
  35. table_open_cache = 256
  36. innodb_write_io_threads = 16
  37. innodb_read_io_threads = 16
  38. innodb_flush_log_at_trx_commit = 2
  39. slow_query_log = 1
  40. long_query_time = 1
  41. lower_case_table_names = 1
  42. skip-name-resolve

1.1.3 基于GTID复制

  1. mysql> grant replication slave on *.* to rep@'10.0.0.%' identified by '123456';
  2. mysql> show global variables like '%gtid%';
  3. +---------------------------------+-------+
  4. | Variable_name | Value |
  5. +---------------------------------+-------+
  6. | binlog_gtid_simple_recovery | OFF |
  7. | enforce_gtid_consistency | ON | #执行GTID一致
  8. | gtid_executed | |
  9. | gtid_mode | ON | #开启GTID模块
  10. | gtid_owned | |
  11. | gtid_purged | |
  12. | simplified_binlog_gtid_recovery | OFF |
  13. +---------------------------------+-------+
  14. mysql> change master to master_host='10.0.0.51',master_user='rep',master_password='123456',master_auto_position=1;
  15. mysql> start slave;
  16. mysql> show slave status\G
  17. *************************** 1. row ***************************
  18. Slave_IO_State: Waiting for master to send event
  19. Master_Host: 10.0.0.51
  20. Master_User: rep
  21. Master_Port: 3306
  22. Connect_Retry: 60
  23. Master_Log_File: mysql-bin.000002
  24. Read_Master_Log_Pos: 151
  25. Relay_Log_File: db03-relay-bin.000002
  26. Relay_Log_Pos: 361
  27. Relay_Master_Log_File: mysql-bin.000002
  28. Slave_IO_Running: Yes
  29. Slave_SQL_Running: Yes

2.1  搭建MHA高可用

  1. [root@db01 ~]# yum install perl-DBD-MySQL -y #所有节点都安装这条命令
  2. [root@db01 src]# ll
  3. total 306824
  4. -rw-r--r-- 1 root root 36326 Dec 18 14:00 mha4mysql-node-0.56-0.el6.noarch.rpm
  5. #每个节点安装node这个rpm包
  6. [root@db01 src]# rpm -ivh mha4mysql-node-0.56-0.el6.noarch.rpm
  7. Preparing... ################################# [100%]
  8. Updating / installing...
  9. 1:mha4mysql-node-0.56-0.el6 ################################# [100%]
  10. mysql> grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';
  11. #mha节点
  12. [root@mha_atlas src]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes
  13. [root@mha_atlas src]# rpm -ivh mha4mysql-manager-0.56-0.el6.noarch.rpm

2.1.1 配置MHA

  • 事前需要每台机器互信
  • 主从复制搭建好
  1. [root@mha_atlas ~]# mkdir -p /etc/mha
  2. [root@mha_atlas ~]# mkdir -p /var/log/mha/app1
  3. [root@mha_atlas ~]# cat /etc/mha/app1.cnf
  4. [server default]
  5. manager_log=/var/log/mha/app1/manager
  6. manager_workdir=/var/log/mha/app1
  7. master_binlog_dir=/usr/local/mysql/data
  8. password=mha
  9. ping_interval=2
  10. repl_password=123456
  11. repl_user=rep
  12. ssh_user=root
  13. user=mha
  14.  
  15. [server1]
  16. hostname=10.0.0.51
  17. port=3306
  18.  
  19. [server2]
  20. candidate_master=1 //设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
  21. check_repl_delay=0 //默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
  22. hostname=10.0.0.52
  23. port=3306
  24.  
  25. [server3]
  26. hostname=10.0.0.53
  27. port=3306
  28. #检查ssh
  29. [root@mha_atlas ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
  30. #检查主从复制
  31. [root@mha_atlas ~]# masterha_check_ssh --conf=/etc/mha/app1.cnf
  32. #后台启动MHA
  33. [root@mha_atlas ~]# nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha/app1/manager.log 2>&1 &

2.1.2 禁止自动删除relay_log

(设置relay log的清除方式(在每个slave节点上):

在slave master03 192.168.2.129操作:

  1. [rootdb01 ~]$ mysql -uroot -p123456 -e "set global relay_log_purge=0"

在slave master04 192.168.2.130操作:

  1. [rootdb02 ~]$ mysql -uroot -p123456 -e "set global relay_log_purge=0"

注意:

MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,需要暂时为中继日志创建硬链接,因为在linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式),mysql 在执行同步的时候 , 只要执行完一个sql线程 ,就会自动删除一次relaylog

可以手动删除purge_relay_logs

3.1 搭建atlas读写分离

  1. [root@mha_atlas src]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
  2. [root@mha_atlas src]# cd /usr/local/mysql-proxy/
  3. [root@mha_atlas mysql-proxy]# ll
  4. total 4
  5. drwxr-xr-x 2 root root 71 Jan 27 08:13 bin
  6. drwxr-xr-x 2 root root 21 Jan 27 08:13 conf
  7. drwxr-xr-x 3 root root 4096 Jan 27 08:13 lib
  8. drwxr-xr-x 2 root root 6 Dec 17 2014 log
  9. [root@mha_atlas conf]# cat test.cnf
  10. [mysql-proxy]
  11.  
  12. #带#号的为非必需的配置项目
  13.  
  14. #管理接口的用户名
  15. admin-username = user
  16.  
  17. #管理接口的密码
  18. admin-password = pwd
  19.  
  20. #Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
  21. proxy-backend-addresses = 10.0.0.52:3306
  22.  
  23. #Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
  24. proxy-read-only-backend-addresses = 10.0.0.51:3306@1,10.0.0.53:3306@1
  25.  
  26. #用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
  27. pwds = root:/iZxz+0GRoA=
  28.  
  29. #设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
  30. daemon = true
  31.  
  32. #设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
  33. keepalive = true
  34.  
  35. #工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
  36. event-threads = 8
  37.  
  38. #日志级别,分为message、warning、critical、error、debug五个级别
  39. log-level = message
  40.  
  41. #日志存放的路径
  42. log-path = /usr/local/mysql-proxy/log
  43.  
  44. #SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
  45. sql-log = ON
  46.  
  47. #慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
  48. #sql-log-slow = 10
  49.  
  50. #实例名称,用于同一台机器上多个Atlas实例间的区分
  51. #instance = test
  52.  
  53. #Atlas监听的工作接口IP和端口
  54. proxy-address = 0.0.0.0:3306
  55.  
  56. #Atlas监听的管理接口IP和端口
  57. admin-address = 0.0.0.0:2345
  58.  
  59. #分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
  60. #tables = person.mt.id.3
  61.  
  62. #默认字符集,设置该项后客户端不再需要执行SET NAMES语句
  63. charset = utf8
  64.  
  65. #允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
  66. #client-ips = 127.0.0.1, 192.168.1
  67.  
  68. #Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
  69. #lvs-ips = 192.168.1.1
  70.  
  71. #启动Atlas
  72. [root@mha_atlas conf]# /usr/local/mysql-proxy/bin/mysql-proxyd test start

3.1.1 进入Atlas管理

  1. [root@db01 ~]# mysql -uuser -ppwd -h 10.0.0.55 -P2345
  2. mysql> SELECT * FROM backends;
  3. +-------------+----------------+-------+------+
  4. | backend_ndx | address | state | type |
  5. +-------------+----------------+-------+------+
  6. | 1 | 10.0.0.52:3306 | up | rw |
  7. | 2 | 10.0.0.51:3306 | up | ro |
  8. | 3 | 10.0.0.53:3306 | up | ro |
  9. +-------------+----------------+-------+------+
  10. #平滑摘除mysql
  11. mysql> REMOVE BACKEND 2;
  12. #检查是否摘除成功
  13. mysql> SELECT * FROM backends;
  14. #保存到配置文件中
  15. mysql> SAVE CONFIG;

  

  

MHA+atlas(数据库的高可用与读写分离)的更多相关文章

  1. MHA + Maxscale 数据库的高可用和读写分离

    MySQL 常见发行版本 MySQL 标准化.自动化部署 深入浅出MySQL备份与恢复 深入理解MySQL主从复制 MySQL构架设计与容量规划 MHA Maxscale MySQL 常见发行版本 M ...

  2. MHA + proxysql 高可用以及读写分离

    环境 vip 192.168.1.101 slave 192.168.1.16 5.7.17 3306 master 192.168.1.135 5.7.17 3306 proxysql 192.16 ...

  3. mha高可用以及读写分离

    一.MHA简介 二.工作流程 三.MHA架构图 四.MHA工具介绍 五.基于GTID的主从复制 六.部署MHA 七.配置VIP漂移 八.配置binlog-server 九.MySQL中间件Atlas ...

  4. 第十一章· MHA高可用及读写分离

    一.MHA简介 1.1.作者简介 松信嘉範: MySQL/Linux专家 2001年索尼公司入职 2001年开始使用oracle 2004年开始使用MySQL 2006年9月-2010年8月MySQL ...

  5. MHA高可用及读写分离

    一.MHA简介 二.工作流程 三.MHA架构图 四.MHA工具介绍 五.基于GTID的主从复制 六.部署MHA 七.配置VIP漂移 八.配置binlog-server 九.MySQL中间件Atlas

  6. mysql数据库的高可用方法总结

    高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一 些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无 ...

  7. MySQL数据库的高可用方案总结

    高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用.虽然互联网服务号称7*24小时不间断服务,但多多少少有一些时候服务不可用,比如某些时候网页打不开,百度不能搜索或者无法 ...

  8. MySQL数据库的优化(下)MySQL数据库的高可用架构方案

    MySQL数据库的优化(下)MySQL数据库的高可用架构方案 2011-03-09 08:53 抚琴煮酒 51CTO 字号:T | T 在上一篇MySQL数据库的优化中,我们跟随笔者学习了单机MySQ ...

  9. 利用keepalive+mysql replication 实现数据库的高可用

    利用keepalive+mysql replication 实现数据库的高可用 http://www.xuchanggang.cn/archives/866.html

随机推荐

  1. linux-centOS环境下安装jdk8

    版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/lx_Frolf/article/det ...

  2. Elasticsearch后台运行步骤

    Elasticsearch后台运行步骤 1.cmd 到elasticsearch 中bin目录下 2.elasticsearch-service 出现  3.安装服务 elasticsearch-se ...

  3. mysql + grafana监控

      1.首先需要增加授权 CREATE USER 'exporter'@'localhost' IDENTIFIED BY 'XXXXXXXX' WITH MAX_USER_CONNECTIONS 3 ...

  4. HTML- 锚点实例

    <!DOCTYPE HTML> <html> <head> <meta charset='utf-8'> <title>锚点实例</t ...

  5. IIS 解决跨域问题

    打开 HTTP响应标头 添加如下三条 名称Access-Control-Allow-Origin  值*名称Access-Control-Allow-Headers  值Content-Type,Ac ...

  6. Qt 程序在 Windows 下的发布

    本文讨论在 Windows 平台下编译成功的 Qt 程序,如何在未配置 Qt 开发环境的 Windows 平台下独立运行的方法. 经过验证发现,在 Ubuntu 平台下编译成功的程序可在未安装 Qt ...

  7. SVD和SVD++

    参考自:http://blog.csdn.net/wjmishuai/article/details/71191945 http://www.cnblogs.com/Xnice/p/4522671.h ...

  8. SetViewportOrgEx和SetWindowOrgEx

    在MM_TEXT映射模式下使用这两个函数. 对于 BOOL SetViewportOrgEx( HDC hdc, // 设备内容HANDLE int X, // 新Viewport的x坐标 int Y ...

  9. 用python实现批量获取Linux主机简要信息并保存到Excel中 unstable 1.1

    #!/usr/bin/env python3 # -*- coding: utf-8 -*- #filename get_linux_info.py #获取Linux主机的信息 # titles=[' ...

  10. MariaDB学习笔记(二)

    七 索引索引:索引是创建在表上的,是对数据库表中的一列或多列的值进行排序的一种结构.索引可以提高查询的速度.索引有两种存储类型: B型树索引 哈希索引I nnoDB和MyISAM支持B型树索引,MEM ...