设为首页 收藏本站
查看: 579|回复: 0

[经验分享] mysql MHA集群的搭建

[复制链接]

尚未签到

发表于 2018-10-5 08:24:10 | 显示全部楼层 |阅读模式
MHA集群介绍与安装  

  MHA ( Master High Availability )

  – 由日本 DeNA 公司 youshimaton (现就职于>  – 是一套优秀的作为 MySQL 高可用性环境下故障切换和主从提升的高可用软件。
  – 目前在 MySQL 高可用方面是一个相对成熟的解决方案。
  – 在 MySQL 故障切换过程中, MHA 能做到在 0~30 秒之内自动完成数据库的故障切换操作
  – 并且在进行故障切换的过程中, MHA 能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
  MHA 组成
  · MHA Manager (管理节点)
  – 可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。
  · MHA Node (数据节点)
  – 运行在每台 MySQL 服务器上。
  MHA 工作过程
  · MHA Manager 会定时探测集群中的 master 节点,当 master 出现故障时,它可以自动将最新数据的 slave 提升为新的 master ,然后将所有其他的 slave重新指向新的 master 。整个故障转移过程对应用程序完全透明。
  – ( 1 )从宕机崩溃的 master 保存二进制日志事件( binlog events)
  – ( 2 )识别含有最新更新的 slave

  – ( 3 )应用差异的中继日志(>  – ( 4 )应用从 master 保存的二进制日志事件( binlog events )
  – ( 5 )提升一个 slave 为新的 master ;
  – ( 6 )使其他的 slave 连接新的 master 进行复制;
  master51
  

    |  

  |
  

  |     |         |         |       |
  slave52    slave53   slave54     slave55      mgm56
  备用主     备用主                            Manager
  一、配置所有数据节点主机之间可以互相以ssh密钥对方式认证登陆
  1.1 在每一台数据库服务器创建密钥对,然后把公钥拷贝给其他4台数据库服务器
  [root@51 mysql]# ssh-keygen  创建密钥对
  [root@51 ~]# for i in 192.168.4.{52..56}; ssh-copy-id $i //同样拷贝公钥给其他4台数据库服务器
  1.2 配置manager56主机 无密码ssh登录 所有数据节点主机
  [root@56 ~]#ssh-keygen  //创建密钥对
  [root@56 ~]#for i in 192.168.4.{51..55}; do  ssh-copy-id $i; done
  二、安装软件包
  2.1 在所有主机(51-56)上安装perl软件包(在此我以51为例)
  [root@51 ]# yum -y install perl-*.rpm
  2.2 在所有数据节点主机上[51-56]安装mha_node软件包
  [root@51 mha-soft-student]# yum -y  install perl-DBD-mysql perl-DBI
  [root@56 mha-soft-student]# rpm -ivh  mha4mysql-node-0.56-0.el6.noarch.rpm
  2.3 只在管理 "主机56" 上安装mha_manager软件包
  [root@56 mha-soft-student]# yum -y  install    perl-ExtUtils-     perl-CPAN
  2.4 [root@56 mha-soft-student]# tar  -zxvf  mha4mysql-manager-0.56.tar.gz
  [root@56 mha-soft-student]# cd mha4mysql-manager-0.56/
  [root@56 mha4mysql-manager-0.56]# perl  Makefile.PL
  [root@56 mha4mysql-manager-0.56]# make && make install
  三、配置主从同步,要求如下:
  51 主库           开半同步复制
  52 从库(备用主库)  开半同步复制
  53 从库(备用主库)  开半同步复制
  54 从库 不做备用主库所以不用开半同步复制
  55 从库 不做备用主库所以不用开半同步复制
  56 管理主机
  3.1 配置主库51
  [root@51 ~]# vim /etc/my.cnf
  [mysqld]
  plugin-load =                     "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
  rpl-semi-sync-master-enabled = 1
  rpl-semi-sync-slave-enabled = 1
  server_id=51
  log-bin=master51
  binlog-format="mixed"
  :wq
  [root@51 ~]# systemctl restart mysqld
  [root@51 ~]# ls /var/lib/mysql/master51.*
  /var/lib/mysql/master51.000001  /var/lib/mysql/master51.index
  [root@51 ~]# mysql -uroot -p123456

  mysql> grant replication slave on . to harry@"%">  Query OK, 0 rows affected, 1 warning (10.00 sec)

  mysql> set global>  Query OK, 0 rows affected (0.00 sec)
  mysql> show master status;
  +-----------------+----------+--------------+------------------+-------------------+
  | File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
  +-----------------+----------+--------------+------------------+-------------------+
  | master51.000001 |      438 |              |                  |                   |
  +-----------------+----------+--------------+------------------+-------------------+
  mysql> quit
  3.2、备用master52的配置
  [root@52 ~]# vim /etc/my.cnf
  [mysqld]
  plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
  rpl-semi-sync-master-enabled = 1
  rpl-semi-sync-slave-enabled = 1
  server_id=52
  log-bin=master52
  binlog-format="mixed"
  [root@52 ~]# ls /var/lib/mysql/master52.*
  /var/lib/mysql/master52.000001  /var/lib/mysql/master52.index
  [root@52 ~]# mysql -uroot -p123456

  mysql> grant replication slave on . to harry@"%">  Query OK, 0 rows affected, 1 warning (10.00 sec)

  mysql> set global>  Query OK, 0 rows affected (0.00 sec)
  mysql> change master to master_host="192.168.4.51", \
  

-> master_user="harry", \  

  
-> master_password="123456", \
  

  
-> master_log_file="master51.000001", \
  

  
-> master_log_pos=438;
  

  Query OK, 0 rows affected, 2 warnings (0.04 sec)
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
  mysql> show slave status\G;
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.4.51
  Master_User: harry
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: master51.000001
  Read_Master_Log_Pos: 438
  Relay_Log_File: 52-relay-bin.000002
  Relay_Log_Pos: 319
  Relay_Master_Log_File: master51.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  3.3、备用master53的配置
  [root@53 ~]# vim /etc/my.cnf
  plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
  rpl-semi-sync-master-enabled = 1
  rpl-semi-sync-slave-enabled = 1
  server_id=53
  log-bin=master53
  binlog-format="mixed"
  [root@53 ~]# systemctl restart mysqld
  [root@53 ~]# ls /var/lib/mysql/master53.*
  /var/lib/mysql/master53.000001  /var/lib/mysql/master53.index
  [root@53 ~]# mysql -uroot -p123456

  mysql> grant replication slave on . to harry@"%">  Query OK, 0 rows affected, 1 warning (10.00 sec)

  mysql> set global>  Query OK, 0 rows affected (0.00 sec)
  mysql> change master to master_host="192.168.4.51", \
  

-> master_user="harry", \  

  
-> master_password="123456", \
  

  
-> master_log_file="master51.000001", \
  

  
-> master_log_pos=438;
  

  Query OK, 0 rows affected, 2 warnings (0.04 sec)
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
  mysql> show slave status\G;
   1. row
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.4.51
  Master_User: harry
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: master51.000001
  Read_Master_Log_Pos: 438
  Relay_Log_File: 53-relay-bin.000002
  Relay_Log_Pos: 319
  Relay_Master_Log_File: master51.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  ......
  mysql> quit;
  3.4、配置从服务器54
  [root@54 ~]# vim /etc/my.cnf
  [mysqld]
  server_id=54
  :wq
  [root@54 ~]# systemctl restart mysqld
  mysql> change master to master_host="192.168.4.51", \
  

-> master_user="harry", \  

  
-> master_password="123456", \
  

  
-> master_log_file="master51.000001", \
  

  
-> master_log_pos=438;
  

  Query OK, 0 rows affected, 2 warnings (0.13 sec)
  mysql> start slave;
  Query OK, 0 rows affected (0.00 sec)
  mysql> show slave status\G;
   1. row
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.4.51
  Master_User: harry
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: master51.000001
  Read_Master_Log_Pos: 438
  Relay_Log_File: 54-relay-bin.000002
  Relay_Log_Pos: 319
  Relay_Master_Log_File: master51.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  3.5、配置从服务器55
  [root@55 ~]# vim /etc/my.cnf
  server_id=55
  :wq
  [root@55 ~]# systemctl restart mysqld
  [root@55 ~]# mysql -uroot -p123456
  mysql> change master to master_host="192.168.4.51", \
  

-> master_user="harry",  

  
-> master_password="123456", \
  

  
-> master_log_file="master51.000001", \
  

  
-> master_log_pos=438;
  

  Query OK, 0 rows affected, 2 warnings (0.04 sec)
  mysql> start slave;
  Query OK, 0 rows affected (0.01 sec)
  mysql> show slave status\G;
   1. row
  Slave_IO_State: Waiting for master to send event
  Master_Host: 192.168.4.51
  Master_User: harry
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: master51.000001
  Read_Master_Log_Pos: 438
  Relay_Log_File: 55-relay-bin.000002
  Relay_Log_Pos: 319
  Relay_Master_Log_File: master51.000001
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
  3.6.2在客户端测试主从同步配置
  3.6.1  在主库51上添加访问数据的授权用户
  [root@51 ~]# mysql -uroot -p123456

  mysql> grant all on  gamedb.* to admin@"%">  Query OK, 0 rows affected, 1 warning (0.00 sec)
  mysql> create database gamedb;
  Query OK, 1 row affected (0.06 sec)
  mysql> create table  gamedb.t1 (id int);
  mysql> insert into gamedb.t1 values(222);
  Query OK, 1 row affected (0.03 sec)
  mysql> insert into gamedb.t1 values(222);
  Query OK, 1 row affected (0.04 sec)
  然后在从库上查看
  3.6.3  在客户端使用授权用户连接从库52-55,也能看到同样的库表及记录
  [root@52 ~]# mysql -uroot -p123456
  mysql> select * from gamedb.t1;
  +------+

  |>  +------+
  |  222 |
  |  222 |
  +------+
  四、编辑管理主机(56)主配置文件
  [root@56 mha-soft-student]# cp mha4mysql-manager-0.56/bin/* /usr/local/bin/
  [root@56 mha-soft-student]# mkdir /etc/mha_manager/
  [root@56 mha-soft-student]# cp mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/mha_manager/
  [root@56 ]# vim /etc/mha_manager/app1.cnf
  [server default]
  manager_workdir=/etc/mha_manager
  manager_log=/etc/mha_manager.log
  master_ip_failover_script=/usr/local/bin/master_ip_failover
  ssh_user=root
  ssh_port=22
  repl_user=harry  //主从同步用户名
  repl_password=123456  //主从同步密码
  user=root  //连接数据库用户名
  password=123456  //连接数据库密码
  [server1]
  hostname=192.168.4.51
  candidate_master=1   // 设置为候选 master
  port=3306
  [server2]
  hostname=192.168.4.52
  candidate_master=1
  port=3306
  [server3]
  hostname=192.168.4.53
  candidate_master=1
  port=3306
  [server4]
  hostname=192.168.4.54
  no_master=1  // 不竞选 master
  port=3306
  [server5]
  hostname=192.168.4.55
  no_master=1
  port=3306
  在管理节点上 通过 master_check_ssh 做 ssh 检查
  [root@56 mha_manager]# masterha_check_ssh --conf /etc/mha_manager/app1.cnf
  测试主从同步状态
  **检查主从同步时把app1.cnf文件中的此配置项#master_ip_failover_script=/usr/local/bin/master_ip_failover注释掉,不然检查失败。
  [root@56 mha_manager]# vim /etc/mha_manager/app1.cnf
  

  #master_ip_failover_script=/usr/local/bin/master_ip_failover  

  [root@56 ~]# masterha_check_repl --conf=/etc/mha_manager/app1.cnf
  四、测试高可用集群配置
  4.1 在主库上手动部署vip 地址   192.168.4.100
  [root@51 ~]# ifconfig  eth0:1 192.168.4.100/24
  [root@51 ~]# ifconfig  eth0:1
  4.2 修改故障切换脚本 指定vip地址的部署信息
  [root@56 ~]# vim /etc/mha_manager/master_ip_failover
  my $vip = '192.168.4.100/24';  # Virtual IP
  my $key = "1";
  my $ssh_start_vip = "/sbin/ifconfig eth0:$key $vip";
  my $ssh_stop_vip = "/sbin/ifconfig eth0:$key down";
  :wq
  4.3 启动管理服务,并查看服务状态
  开启 MHA Manager 监控
  – masterha_manager // 启动命令
  – --remove_dead_master_conf // 不在 app1.cnf 文件
  里删除宕机的主库的信息
  – --ignore_last_failover // 忽略 .health 文件
  [root@56 ~]# masterha_manager --conf=/etc/mha_manager/app1.cnf --remove_dead_master_conf --ignore_last_failover
  查看状态 : masterha_check_status
  [root@56 ~]# masterha_check_status --conf=/etc/mha_manager/app1.cnf
  app1 (pid:9399) is running(0:PING_OK), master:192.168.4.51
  停止服务 : masterha_stop
  [root@host56 bin]# masterha_stop --conf=/etc/mha_manager/app1.cnf
  Stopped app1 successfully.
  4.4 测试故障转移
  在主库51 上执行  ]# shutdown   -h  now
  4.5 在管理主机上查看服务状态(如果服务停止了,手动启动一下服务,再查看状态)
  [root@56 ~]# masterha_check_status --conf=/etc/mha_manager/app1.cnf
  app1 (pid:17507) is running(0:PING_OK), master:192.168.4.52
  4.6 在52 本机查看是否获取vip地址
  [root@52 ~]# ip addr  show  | grep  192.168.4
  

inet 192.168.4.52/24 brd 192.168.4.255 scope global eth0  

  inet 192.168.4.100/24 brd 192.168.4.255 scope global secondary eth0:1
  4.6 客户端连接vip地址 ,访问数据服务
  [root@58]#mysql   -h192.168.4.100   -uwebadmin   -p123456
  查看 VIP 地址
  当主库服务器宕机后,在备用 1 主库数据库服务器上查看 VIP 地址
  [root@server0 ~]# ip addr show | grep vip 地址
  手动配置 vip 地址
  [root@server0 ~]# ifconfig ethX:1 x.x.x.x/32



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-612458-1-1.html 上篇帖子: 2018-07-18笔记(mysql主从) 下篇帖子: Windows 2012安装mysql 5.7.22 企业版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表