基于MySQL数据库,谈MySQL高可用运维
本篇文章将介绍MySQL的另外一种高可用实现方案,即:MHA(MasterHigh Avaliable)。Master HA。是一个开源的高可用程序,为MySQL的主从架构提供了故障自动恢复的功能。一、基本知识介绍1、MHA定义
Master HA。是一个开源的高可用程序,为MySQL的主从架构提供了故障自动恢复的功能。主从复制期间,当MHA监测到MySQL的Master节点故障时,会自动提升复制集群中的某个Slave节点成为新的Master节点。在切换期间,也会通过从其他节点中获取额外信息来避免数据一致性问题。除此之外,MHA还提供了master节点的在线故障切换功能,可以按照需要来切换Master/Slave节点。
2、MHA结构
MHA中的所有节点主要有两种角色,即:管理节点和数据节点。管理节点(MHA Manager):一般单独部署在一台机器上,用来管理多个master和slave集群,而每个master和slave组成的集群称之为一个application。数据节点(MHA Node):运行在每一台MySQL服务器上,通过监控具有解析和清理logs功能的脚本来加速节点的故障转移。
3、HMA组件(1)Manager组件masterha_check_sh:MHA依赖的ssh环境监测工具masterha_check_repl:MySQL复制环境监测工具masterha_manager:MHA服务主程序masterha_check_status:MHA运行状态探测工具masterha_master_monitor:MySQL master节点可用性监测工具masterha_master_switch:master节点切换工具masterha_conf_host:添加或删除配置的节点masterha_stop:关闭MHA服务的工具(2)Node组件save_binary_logs:保存和赋值master的二进制日志apply_diff_relay_logs:识别差异的中继日志并应用于其他slavefilter_mysqlbinlog:去除不必要的ROLLBACK事件(MHA已经不再使用这个工具)purge_relay_logs:清除中继日志(不会阻塞SQL线程)(3)自定义扩展secondary_check_script:通过多条网络路由监测master的可用性master_ip_failover_script:更新application使用的masteripshutdown_script:强制关闭master节点report_script:发送报告init_conf_load_script:加载初始配置参数master_ip_online_change_script:更新master节点ip地址二、MHA搭建1、环境准备操作系统:CentOS6.9_X86_64MySQL版本:MySQL5.6.39通用二进制服务器规划:主节点Master:192.168.199.104(mysql-master,master)
从节点1:192.168.199.105(mysql-slave01,slave01)从节点2:192.168.199.106(mysql-slave02,slave02)管理节点:192.168.199.107(mysql-manager,manager)
2、搭建(1)配置各个节点的host,在后面使用起来会比较方便,不用每次手写IP[root@mysql-master ~]# vim /etc/hosts#添加如下内容:127.0.0.1localhost localhost.localdomain localhost4 localhost4.localdomain4::1localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.199.104 mysql-master master192.168.199.105 mysql-slave01 slave01192.168.199.106 mysql-slave02 slave02192.168.199.107 mysql-manager manager(2)将配置好的host文件复制到其他三个节点上[root@mysql-master ~]# scp /etc/hosts slave01:/etc/[root@mysql-master ~]# scp /etc/hosts slave02:/etc/[root@mysql-master ~]# scp /etc/hosts manager:/etc/(3)配置主从同步,slave01和slave02为master的从库开启master的二进制日志[root@mysql-master ~]# vim /etc/my.cnf#在[mysqld]下面添加如下内容:server-id = 104skip-name-resolvelog_bin=/mysql_data/mysql-binlog_bin_index=/mysql_data/mysql-bin.indexbinlog_format = mixed在master上查看当前的二进制日志点位置,并创建复制账户[root@mysql-master ~]# mysql -urootproot#查看当前二进制日志点的位置mysql> SHOW MASTER STATUS G*************************** 1. row ***************************File: mysql-bin.000090Position: 120Binlog_Do_DB:Binlog_Ignore_DB: Executed_Gtid_Set: 1 row in set (0.00 sec)#创建从库的复制账户mysql> GRANT REPLICATION SLAVE ,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.199.%' IDENTIFIED BY 'repl';#刷新权限mysql> FLUSH PRIVILEGES;在slave01上开启二进制日志和中继日志,并配置为master的从库[root@mysql-slave01 ~]# vim /etc/my.cnf#在[mysqld]下添加如下内容:server-id = 105log_bin = /mysql_data/mysql-binlog_bin_index = /mysql_data/mysql-bin.indexrelay_log = /mysql_data/mysql-relayrelay_log_index = /mysql_data/mysql-relay.indexread_onlyrelay_log_purge = 0参数解释:relay_log_purge:该参数表示不自动清理中继日志,因为MHA需要根据slave的中继日志判断slave同步master的binlog到什么位置了read_only:表示是只读,MHA需要根据这个参数来识别主从库bin_log:开启从库的二进制日志,因为在主节点出现故障时,需要将其中某个从库提升为主库,所以需要开启从库的二进制日志启动slave01节点,并将需要同步的主节点信息指向master节点:[root@mysql-slave01 ~]# service mysqld restart[root@mysql-slave01 ~]# mysql -urootproot#使用change master命令将主库指向master节点mysql> CHANGE MASTER TO MASTER_HOST = '192.168.199.104',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000090',MASTER_LOG_POS=120;mysql> START SLAVE;#查看是否同步成功mysql> SHOW SLAVE STATUS G看到如下信息表示同步成功:Slave_IO_Running: YesSlave_SQL_Running: Yes以同样的方式配置第二台从库,可以直接将slave01上的配置文件直接复制到第二台slave上,然后修改即可。[root@mysql-slave01 ~]# scp /etc/my.cnf slave02:/etc/[root@mysql-slave02 ~]# vim /etc/my.cnf#修改server-id即可:server-id = 106修改完成之后,保存退出,并重启mysql,然后配置slave02为master的从库[root@mysql-slave02 ~]# mysql -urootprootmysql> CHANGE MASTER TO MASTER_HOST = '192.168.199.104',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='repl',MASTER_LOG_FILE='mysql-bin.000090',MASTER_LOG_POS=120;mysql> START SLAVE;#查看是否同步成功mysql> SHOW SLAVE STATUS G看到如下信息表示同步成功:Slave_IO_Running: YesSlave_SQL_Running: Yes(4)创建具有管理权限的用户账号#在主节点master上创建管理账号,使其可以同步到其他连个从节点,注意:这个管理账号需要能够远程连接MySQLmysql> GRANT ALL ON *.* TO 'mha'@'192.168.199.%' IDENTIFIED BY 'mha';mysql> FLUSH PRIVILEGES;(5)由于MHA架构需要各个节点之间可以进行互信通信,所以需要将各个节点之间配置为无秘钥登录,由于节点比较多,单个生成并复制比较麻烦,可以在主节点上生成秘钥对,然后让每个主机都具有同样的私钥#在master上生成秘钥对[root@mysql-master ~]# ssh-keygen -t rsa -P ''#首先保存到本机的秘钥文件中,使得本机可以无秘钥使用ssh方式登陆本机[root@mysql-master ~]# cat .ssh/id_rsa.pub >> .ssh/authorized_keys#使用ssh登陆本机测试,发现可以无密码登陆[root@mysql-master ~]# ssh 192.168.199.104#修改authorized_keys文件的权限,只能属主查看,同组用户和其他用户不可查看[root@mysql-master ~]# chmod go= .ssh/authorized_keys将秘钥对和私钥文件复制到其他三个节点上,注意:保证其原有的权限[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave01:/root/.ssh/[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys slave02:/root/.ssh/[root@mysql-master ~]# scp -p .ssh/id_rsa .ssh/authorized_keys manager:/root/.ssh/#测试无密码登陆,在主节点上执行如下命令,查看slave01节点的ip地址[root@mysql-master ~]# ssh slave01 'ifconfig eth0'#能够查看到slave01的ip地址表示无秘钥登陆配置成功,其他俩节点可以自己验证(6)下载mha4mysql-manager和mha4mysql-node安装包此处使用的软件包版本如下:管理节点:mha4mysql-manager-0.56.tar.gz数据节点:mha4mysql-node-0.56.tar.gz(7)配置epel,因为mha4mysql有的包是来自于base中,有的包是来自于epel中[root@mysql-master ~]# rpmivhhttp://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm(8)解压,并使用perl命令执行Makefile.PL脚本[root@mysql-master ~]# tar xf mha4mysql-manager-0.56.tar.gz[root@mysql-master ~]# cd mha4mysql-manager-0.56[root@mysql-master mha4mysql-manager-0.56]# perl Makefile.PL注意:执行Makefile.PL过程中,如果出现类似于如下的错误,则需要安装perl程序所依赖的库文件:Can't locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at inc/Module/Install/Makefile.pm line 4.BEGIN failed--compilation aborted at inc/Module/Install/Makefile.pm line 4出现上述错误,则需要安装依赖:[root@mysql-master ~]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker cpan perl-Time-HiRes perl-DBI perl-DBD-MySQL(9)确保”perl MakeFile.PL”正确执行之后,使用make命令完成安装。注:可以使用”echo $?”查看上此命令的执行结果来判断上条命令是否正确执行完成。通常0代表正确完成。[root@mysql-master mha4mysql-manager-0.56]# make[root@mysql-master mha4mysql-manager-0.56]# make install(10)master上的manager安装完成之后,按照同样的方式编译安装mha4mysql-node[root@mysql-manager ~]# tar xf mha4mysql-node-0.56.tar.gz[root@mysql-manager ~]# cd mha4mysql-node-0.56[root@mysql-manager mha4mysql-node-0.56]# perl Makefile.PL#判断Makefile.PL是否正常执行完成[root@mysql-manager mha4mysql-node-0.56]# echo $?0[root@mysql-manager mha4mysql-node-0.56]# make && make install(11)在其他三台服务器上(master,slave01,slave02)上安装mha4mysql-node[root@mysql-slave01 ~]# tar mha4mysql-node-0.56.tar.gz[root@mysql-slave01 ~]# cd mha4mysql-node-0.56[root@mysql-slave01 mha4mysql-node-0.56]# perl Makefile.PL[root@mysql-slave01 mha4mysql-node-0.56]# make && make install其他两个节点安装方式相同,此处略。
(12)安装完成,可以看到在/usr/local/bin下有一些脚本,就是mha4mysql生成的脚本文件
(13)初始化MHA编辑mha的配置文件,主要有以下两类:global配置:为各个application提供默认配置application配置:用来指定有哪些服务器#创建目录并编辑配置文件[root@mysql-manager ~]# mkdir -pv /etc/masterha/[root@mysql-manager ~]# vim /etc/masterha/app01.conf写入如下内容:[server default]user=mha#管理用户的用户名password=mha#管理用户密码manager_workdir=/data/masterha/app01#manager节点的工作目录,用来存放一些二进制日志,不存在会自动创建manager_log=/data/masterha/app01/manager.log #日志文件位置remote_workdir=/data/masterha/app01#远程的每一个节点的工作目录,没有会自动生成ssh_user=root#需要使用ssh来完成一些管理操作repl_user=repl#拥有复制权限的用户名repl_password=repl#拥有复制权限的密码ping_interval=1#每隔多长时间监测一次主节点是否在线,心跳信息监测#其他主机[server1]hostname=192.168.199.104#ssh_port=3306#如果MySQL没有使用默认端口号,则此处需要指定,使用默认端口不需要指定candidate_master=1#表示该节点是否在主节点故障之后参与成为主节点master_binlog_dir=/mysql_data/ #指定mysql的binlog日志路径[server2]hostname=192.168.199.105candidate_master=1master_binlog_dir=/mysql_data/[server3]hostname=192.168.199.106#no_master=1#表示主节点故障之后,该节点不参与成为主节点master_binlog_dir=/mysql_data/(14)检查各个节点之间的通信是否正常[root@mysql-manager ~]# masterha_check_ssh --conf=/etc/masterha/app01.conf错误1:Can't locate Config/Tiny.pm in @INC (@INC contains:XXX原因:这种错误是因为缺少依赖包解决办法:安装提示的依赖包如下的几个rpm包如果操作系统本身没有自带,需要自己从网上下载,可以从http://rpmfind.net/ 下载所需要的rpm包。以下的rpm包都是针对CentOS6.9 X86_64的:perl-Mail-Sender-0.8.16-3.el6.noarch.rpm perl-Log-Dispatch-2.26-1.el6.rf.noarch.rpm perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpmperl-Config-Tiny-2.12-7.1.el6.noarch.rpm下载完成之后,使用yum命令安装即可,因为其中可能还会依赖其他包。
错误2:master_check_ssh执行中的错误:Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).原因:/root/.ssh/下的文件内容不一样或者文件的权限有问题,我遇到的是文件内容有问题。解决办法:重新将其他主机上的秘钥对和私钥拷贝一份就正常了。
(15)检查主从复制环境是否正常[root@mysql-manager ~]# masterha_check_repl --conf=/etc/masterha/app01.conf错误1:Sat Jun2 03:07:26 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln301] install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 27) line 3.Perhaps the DBD::mysql perl module hasn't been fully installed,or perhaps the capitalisation of 'mysql' isn't right.原因:缺少perl-DBD-MySQL依赖库解决办法:[root@mysql-manager ~]# yum install -y perl-DBD-MySQL*错误2:Sat Jun2 03:11:06 2018 - [error][/usr/local/share/perl5/MHA/ServerManager.pm, ln188] There is no alive server. We can't do failover错误3:Failed to save binary log: Binlog not found from /var/lib/mysql,/var/log/mysql! If you got this error at MHA Manager, please set "master_binlog_dir=/path/to/binlog_directory_of_the_master原因:mysql的binlog日志目录没有在默认的/var/log/mysql下,而是在其他地方,导致目录找不到。解决办法:在manager节点的配置文件中每个节点下制定二进制日志的目录路径。[server1]hostname=192.168.199.105candidate_master=1master_binlog_dir=/mysql_data/#指定二进制日志文件目录错误4:Can't exec "mysqlbinlog": No such file or directory at /usr/local/share/perl5/MHA/BinlogManager.pm line 106.mysqlbinlog version command failed with rc 1:0, please verify PATH, LD_LIBRARY_PATH, and client options原因:使用ssh连接之后找不到mysqlbinlog命令解决办法:将/usr/local/mysql-5.6.39/目录连接到/usr/bin下[root@mysql-master ~]# lns /usr/local/mysql-5.6.39/bin /usr/bin[root@mysql-slave01 ~]# lns /usr/local/mysql-5.6.39/bin /usr/bin[root@mysql-slave02 ~]# lns /usr/local/mysql-5.6.39/bin /usr/bin(16)启动MHA#前台启动,日志会直接打印在控制台上[root@mysql-manager app01]# masterha_manager --conf=/etc/masterha/app01.conf#后台启动[root@mysql-manager app01]# nohup masterha_manager --conf=/etc/masterha/app01.conf &(17)验证高可用故障自动转移#停止master节点的mysqld服务[root@mysql-master ~]# killall mysqld mysqld_safe#查看原来的两个slave节点信息,发现已经有slave01被提升为master了mysql> SHOW SLAVE STATUS G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.199.105Master_User: repl...#查看slave01的read_only属性,发现已经被修改为OFF了mysql> SHOW VARIABLES LIKE 'read_only';+---------------+-------+| Variable_name | Value |+---------------+-------+| read_only| OFF|+---------------+-------+注意:当某一个master故障之后,从库提升为主库,原来的manager节点上的manager服务会自动退出。需要手动重启。(18)故障的服务器再次恢复时,需要使用”CHANGE MASTER”命令手动将其加入到从节点中(19)manager节点启动之后,可以使用masterha_check_status命令查看当前的主节点状态信息[root@mysql-manager ~]# masterha_check_status --conf=/etc/masterha/app01.confapp01 (pid:20582) is running(0:PING_OK), master:192.168.199.105MHA的其他用法,如在线主从切换等,可以自行参考官方文档,此处不再介绍。另外还有MHA的manager节点的自动重启功能,报警功能,故障主机彻底摘除功能等可以通过shell脚本实现,后面有时间会继续介绍。
至此,MySQL的MHA高可用基本功能搭建完成。整个过程中有无数的坑,可能读者在搭建过程中,还会遇到其他的深坑,最好能够硬着头皮一个一个去解决!篇幅较长,所有内容都是经过验证一个字一个字敲上去的,但也难免有笔误,如有错误,欢迎在下方评论指出!
相关推荐:
运维角度浅谈MySQL数据库优化
运维角度浅谈MySQL数据库优化(李振良)以上就是基于MySQL数据库,谈MySQL高可用运维的详细内容,更多请关注小潘博客其它相关文章!