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

[经验分享] Mysql 的高可用之 MHA-13352895

[复制链接]

尚未签到

发表于 2018-9-28 10:18:00 | 显示全部楼层 |阅读模式
  Mysql 的高可用之 MHA
  MHA作为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,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器。
   DSC0000.jpg
  MHA工作原理
  (1)从宕机崩溃的master保存二进制日志事件(binlog events);
  (2)识别含有最新更新的slave;
  (3)应用差异的中继日志(relay log) 到其他slave;
  (4)应用从master保存的二进制日志事件(binlog events);
  (5)提升一个slave为新master;
  (6)使用其他的slave连接新的master进行复制。
  MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。
  Manager工具包主要包括以下几个工具:
masterha_check_ssh              检查MHA的SSH配置状况  masterha_check_repl             检查MySQL复制状况
  masterha_manger                 启动MHA
  masterha_check_status           检测当前MHA运行状态
  masterha_master_monitor         检测master是否宕机
  masterha_master_switch          控制故障转移(自动或者手动)
  masterha_conf_host              添加或删除配置的server信息
  Node工具包主要包括以下几个工具:
  save_binary_logs                保存和复制master的二进制日志
  apply_diff_relay_logs           识别差异的中继日志事件并将其差异的事件应用于其他的slave
  filter_mysqlbinlog              去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
  purge_relay_logs                清除中继日志(不会阻塞SQL线程)
  配置环境,高可用要在主从复制基础前提下实现
  实验:
  Monitor host and master     server1      192.168.122.11
  Candicate master                 server2       192.168.122.12
  Slave                                     server3        192.168.122.13
  首先确保主从复制
  查看slave状态时发现,IO线程为NO;
   DSC0001.jpg
  如下解决:
  重启master库:/etc/init.d/mysqld restart
  mysql> show master status;
   DSC0002.jpg
  关闭slave,mysql> slave stop;
  mysql> change master to master_log_file='binlog.000004',master_log_pos=154;
  如下,已经OK!
   DSC0003.jpg
  继续实验:
  主上授权  mysql> grant replication slave on *.* to cara@'192.168.122.%'>
  两从        mysql> change master to master_host='192.168.122.11',master_user='cara',master_password='LH=liuhuan123',master_log_file='mysql-bin.000003',master_log_pos=1401;
  最好禁掉密码插件(server2,3同理)
  [root@server1 ~]# vim /etc/init.d/mysqld
DSC0004.jpg

  一、进行环境配置
  在master上进行授权
   DSC0005.jpg
  修改配置文件my.cnf
  master(server1)
   DSC0006.jpg
  slave(server2)
   DSC0007.jpg
  slave (server3)
   DSC0008.jpg
  查看状态
   DSC0009.jpg
  二、安装 MHA 及相关配置
  1)Server1 安装
  mha4mysql-manager-0.56-0.el6.noarch.rpm
  mha4mysql-node-0.56-0.el6.noarch.rpm
  perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
  perl-Email-Date-Format-1.002-5.el6.noarch.rpm
  perl-Log-Dispatch-2.27-1.el6.noarch.rpm
  perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
  perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
  perl-MIME-Lite-3.027-2.el6.noarch.rpm
  perl-MIME-Types-1.28-2.el6.noarch.rpm
  perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
  Server2,3 安装
  mha4mysql-node-0.56-0.el6.noarch.rpm
  
  2).编辑配置文件
  将配置文件拷贝到指定目录下
   DSC00010.jpg
  修改配置文件
  
   DSC00011.jpg
  
  [server default]
  user=root
  password=LH=liuhuan123
  ssh_user=root
  repl_password=LH=liuhuan123
  repl_user=repl
  master_binlog_dir=/var/lib/mysql
  remote_workdir=/tmp
  ping_interval=1
  #master_ip_failover_script=/script/masterha/master_ip_failover
  #shutdown_script=/script/masterha/power_manager
  #report_script=/script/masterha/send_report
  #master_ip_online_change_script=/script/masterha/master_ip_online_change
  #secondary_check_script=masterha_secondary_check -s remote_host1 -s
  remote_host2
  manager_workdir=/usr/local/masterha/
  manager_log=/usr/local/masterha/manager.log
  [server1]
  hostname=192.168.122.11
  [server2]
  hostname=192.168.122.12
  candidate_master=1
  check_repl_delay=0
  [server3]
  hostname=192.168.122.13
  no_master=1
  3).使 master 和 slave 相互之间可以无密码连接
  [root@server1 masterha]# ssh-keygen -t rsa
  [root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.11
  [root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.12
  [root@server1 masterha]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.13
  [root@server2 ~]# ssh-keygen -t rsa
  [root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.11
  [root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.12
  [root@server2 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.13
  [root@server3 ~]# ssh-keygen -t rsa
  [root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.11
  [root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.12
  [root@server3 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.122.13
  ssh-copy-id命令可以把本地主机的公钥复制到远程主机的authorized_keys文件上,ssh-copy-id命令也会给远程主机的用户主目录(home)和~/.ssh, 和~/.ssh/authorized_keys设置合适的权限。
  三、测试及结果
  [root@server1 masterha]# masterha_check_ssh --conf=/usr/local/masterha/app1.cnf
   DSC00012.jpg
  
   DSC00013.jpg
  
  
  [root@server1 masterha]# masterha_check_repl --conf=/usr/local/masterha/app1.cnf
   DSC00014.jpg
   DSC00015.jpg
  分析报错后发现时没有在master端给prel和root授权的缘故
  
  mysql> grant replication slave on *.* to repl@'%'>

  mysql> grant replication slave on *.* to root@'%'>
DSC00016.jpg

   DSC00017.jpg
  建立授权用户
  授权后,可远程登录
  mysql> grant all on *.* to root@'%'>
DSC00018.jpg

   DSC00019.jpg
  
   DSC00020.jpg
  
  测试,master是否切换
  [root@server1 masterha]# nohup masterha_manager --conf=/usr/local/masterha/app1.cnf &  在管理主机启动管理程序
   DSC00021.jpg
  [root@server1 masterha]# pkill -9 mysqld    杀掉master端的进程
  在server2和server3上查看
  server2已经继承master
   DSC00022.jpg
  server3上看到master状态已经变为server2
   DSC00023.jpg
  手动切换:当master端数据库关掉后可用下面手动方法切换
  masterha_master_switch --master_state=dead --conf=/usr/local/masterha/app1.cnf --dead_master_host=192.168.122.12   --dead_master_port=3306 --new_master_host=192.168.122.11 --new_master_port=3306 --ignore_last_failover
  手动热切换:可以在master正常工作时使其数据库关掉,让备用mastre机接替其工作
  masterha_master_switch --conf=/usr/local/masterha/app1.cnf --master_state=alive --new_master_host=192.168.122.12 --new_master_port=3306  --orig_master_is_new_slave --running_updates_limit=10000
  当把master切换到备用master上时,若再次想切回master,需要手动将备master和slave上做change master
  备用master上:
   DSC00024.jpg
   DSC00025.jpg
  
  查看日志 [root@server2 ~]# cat /var/log/mysqld.log
   DSC00026.jpg
  
   DSC00027.jpg
  
   DSC00028.jpg
  
   DSC00029.jpg
  slave端:
   DSC00030.jpg
  网上查找得如下:
  不带MASTER_LOG_FILE,MASTER_LOG_POS参数,执行change master 语句,按照mysql官方文档的说法,执行语句后的复制点应该与之前的复制点一致
  
   DSC00031.jpg
  
  
  测试:停掉备用主机的io,然后在master主机加入数据,造成备用master和master主机二进制数据不一致,然后关掉master主机的mysql,执行manager命令,使备用master成为master,看数据是否会一致
  change master to master_host='192.168.122.11', master_user='cara', master_password='LH=liuhuan123', master_auto_position=1;   #使master指向server1(注意:每次执行需删除app1.failover.complete,否则出错)
  1)stop slave io_thread;  停掉备用主机io线程(server2)
   DSC00032.jpg
  2)在主master主机插入数据(server1)
   DSC00033.jpg
  3)在另一台slave中查看数据是否同步过去(server3)
   DSC00034.jpg
  
  4)主master上,关掉mysql
   DSC00035.jpg
   DSC00036.jpg
  
  5)使备用成为master后,查看数据是否根据差异日志恢复过来
   DSC00037.jpg
  
  slave端master已经改变
   DSC00038.jpg
  
  再切回master
   DSC00039.jpg
  server2上:  指定master_auto_position=1,不会遇到上面change master 时的错误;
DSC00040.jpg

  
  server3上:
   DSC00041.jpg
  
  四、使用脚本控制master状态
  
   DSC00042.jpg
  将所需脚本移至指定目录
   DSC00043.jpg
  
  修改app1.cnf文件
   DSC00044.jpg
   DSC00045.jpg
  vim master_ip_failover  #给master添加虚拟ip
  
   DSC00046.jpg
  
  vim master_ip_online_change #同样只需添加虚拟ip
   DSC00047.jpg
  vim send_report  #添加邮箱和密码
   DSC00048.jpg
  
  chmod +x send_report master_ip_failover master_ip_online_change   #给脚本添加执行权限
  在测试时需要虚拟机进行联网
  在物理主机添加路由
  [root@foundation12 MHA]# iptables -t nat -A POSTROUTING -s 192.168.122.0/24 -j MASQUERADE
  在需要联网的虚拟机上添加网关,为物理机ip
  [root@server1 masterha]# vim /etc/sysconfig/network-scripts/ifcfg-eth0或
  [root@server1 masterha]#route add default gw 192.168.122.1
  添加本地解析,使其可以上网
  [root@server1 masterha]# vim /etc/resolv.conf
DSC00049.jpg

  重启网络使其生效
  [root@server1 masterha]# /etc/init.d/network restart
   DSC00050.jpg
  
  以上可以实现邮件报警!
  [root@server1 masterha]# masterha_master_switch --conf=/usr/local/masterha/app1.cnf --master_state=alive --new_master_host=192.168.122.11 --new_master_port=3306  --orig_master_is_new_slave --running_updates_limit=10000
   DSC00051.jpg
   DSC00052.jpg
   DSC00053.jpg
  
  
  
  



运维网声明 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-603137-1-1.html 上篇帖子: MySQL数据类型--------整数类型实战 下篇帖子: Scrapy结合Mysql爬取天气预报入库
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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