MHA(MasterHighAvailability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。
自动故障检测和自动故障转移MHA能够在一个已经存在的复制环境中监控MySQL,当检测到Master故障后能够实现自动故障转移,通过鉴定出最“新”的Salve的relaylog,并将其应用到所有的Slave,这样MHA就能够保证各个slave之间的数据一致性,即使有些slave在主库崩溃时还没有收到最新的relaylog事件。一个slave节点能否成为候选的主节点可通过在配置文件中配置它的优先级。由于master能够保证各个slave之间的数据一致性,所以所有的slave节点都有希望成为主节点。在通常的replication环境中由于复制中断而极容易产生的数据一致性问题,在MHA中将不会发生。交互式(手动)故障转移MHA可以手动地实现故障转移,而不必去理会master的状态,即不监控master状态,确认故障发生后可通过MHA手动切换
在线切换Master到不同的主机MHA能够在0.5-2秒内实现切换,0.5-2秒的写阻塞通常是可接受的,所以你甚至能在非维护期间就在线切换master。诸如升级到高版本,升级到更快的服务器之类的工作,将会变得更容易
优势:
自动故障转移快主库崩溃不存在数据一致性问题配置不需要对当前mysql环境做重大修改不需要添加额外的服务器(仅一台manager就可管理上百个replication)性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。只要replication支持的存储引擎,MHA都支持,不会局限于innodb
组成:
MHA由Manager节点和Node节点组成。MHAManager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHANode运行在每台MySQL服务器上,MHAManager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明
MHA工作原理:
从宕机崩溃的master保存二进制日志事件(binlogevents);识别含有最新更新的slave;应用差异的中继日志(relaylog)到其他的slave;应用从master保存的二进制日志事件(binlogevents);提升一个slave为新的master;使其他的slave连接新的master进行复制;
1.2、MHA工具介绍MHA软件由两部分组成,Manager工具包和Node工具包,具体的说明如下。Manager工具包主要包括以下几个工具:masterha_check_ssh检查MHA的SSH配置状况masterha_check_repl检查MySQL复制状况masterha_manger启动MHAmasterha_check_status检测当前MHA运行状态masterha_master_monitor检测master是否宕机masterha_master_switch控制故障转移(自动或者手动)masterha_conf_host添加或删除配置的server信息Node工具包(这些工具通常由MHAManager的脚本触发,无需人为操作)主要包括以下几个工具:save_binary_logs保存和复制master的二进制日志apply_diff_relay_logs识别差异的中继日志事件并将其差异的事件应用于其他的slavefilter_mysqlbinlog去除不必要的ROLLBACK事件(MHA已不再使用这个工具)purge_relay_logs清除中继日志(不会阻塞SQL线程)
注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议成配置成MySQL5.5
MHA环境图:一主三从模式(通过VIP漂移)
1.4实验拓扑环境
二、前期环境部署2.11、配置所有主机名称
master1主机:hostnameserver01bashmaster2主机:hostnameserver02bashslave1主机:hostnameserver03bashslave2主机:hostnameserver04bashmanager主机:hostnameserver05bash.2.22、配置所有主机名及映射关系[root@server01~]#vim/etc/hosts
192.168.200.111server01192.168.200.112server02192.168.200.113server03192.168.200.114server04192.168.200.115server05通过SCP发送hosts映射到另外几台主机scp/etc/hosts192.168.200.111:/etc/scp/etc/hosts192.168.200.112:/etc/scp/etc/hosts192.168.200.113:/etc/scp/etc/hosts192.168.200.114:/etc/2.33、所有主机关闭防火墙和安全机制
systemctlstopiptablessystemctlstopfirewalldsetenforce0
1:导入epel源码包2:解压rpm-ivhepel-release-latest-7.noarch.rpm安装依赖包yuminstall-yperl-DBD-MySQL.x86_64perl-DBI.x86_64perl-CPANperl-ExtUtils-CBuilderperl-ExtUtils-MakeMaker注意:安装后建议检查一下所需软件包是否全部安装rpm-qperl-DBD-MySQL.x86_64perl-DBI.x86_64perl-CPANperl-ExtUtils-CBuilderperl-ExtUtils-MakeMakerperl-DBD-MySQL-4.023-6.el7.x86_64perl-DBI-1.627-4.el7.x86_64perl-CPAN-1.9800-292.el7.noarchperl-ExtUtils-CBuilder-0.28.2.6-292.el7.noarchperl-ExtUtils-MakeMaker-6.68-3.el7.noarch
3.2、所有主机装上安装MHANode
tarxfmha4mysql-node-0.56.tar.gzcdmha4mysql-node-0.56/perlMakefile.PLmake&&makeinstall3.3、MHANode安装完后会在/usr/local/bin生成以下脚本
[root@server04mha4mysql-node-0.56]#ls-l/usr/local/bin/总用量40-r-xr-xr-x.1rootroot1634610月2213:27apply_diff_relay_logs-r-xr-xr-x.1rootroot480710月2213:27filter_mysqlbinlog-r-xr-xr-x.1rootroot740110月2213:27purge_relay_logs-r-xr-xr-x.1rootroot739510月2213:27save_binary_logs
四、192.168.200.115上安装MHAManger以及perl-Config-Tiny-2.14-7.el7.noarch其余四台不需要装
注意:115安装MHAManger之前也需要安装MHANode
4.1、首先安装MHAManger依赖的perl模块(我这里使用yum安装)
192.168.200.115导入如下四个源码包
[root@server05~]#lsperl-Config-Tiny-2.14-7.el7.noarch.rpmmha4mysql-manager-0.56.tar.gzepel-release-latest-7.noarch.rpmmha4mysql-node-0.56.tar.gz
安装依赖包:yuminstall-yperlperl-Log-Dispatchperl-Parallel-ForkManagerperl-DBD-MySQLperl-DBIperl-Time-HiResyum-yinstallperl-Config-Tiny-2.14-7.el7.noarch.rpm注意:安装后建议检查一下所需软件包是否全部安装rpm-qperlcpanperl-Log-Dispatchperl-Parallel-ForkManagerperl-DBD-MySQLperl-DBIperl-Time-HiResperl-Config-Tinyperl-5.16.3-292.el7.x86_64perl-Log-Dispatch-2.41-1.el7.1.noarchperl-Parallel-ForkManager-1.18-2.el7.noarchperl-DBD-MySQL-4.023-6.el7.x86_64perl-DBI-1.627-4.el7.x86_64perl-Time-HiRes-1.9725-3.el7.x86_64perl-Config-Tiny-2.14-7.el7.noarch注意:之前时候perl-Config-Tiny.noarch没有安装成功,后来用cpan(cpaninstallConfig::Tiny)
4.2、安装MHAManger
tarxfmha4mysql-manager-0.56.tar.gzcdmha4mysql-manager-0.56/perlMakefile.PLmake&&makeinstall4.3、安装完成后会有以下脚本文件
[root@server05~]#ls-l/usr/local/bin/总用量76-r-xr-xr-x1rootroot1634612月2915:08apply_diff_relay_logs-r-xr-xr-x1rootroot480712月2915:08filter_mysqlbinlog-r-xr-xr-x1rootroot199512月2915:37masterha_check_repl-r-xr-xr-x1rootroot177912月2915:37masterha_check_ssh-r-xr-xr-x1rootroot186512月2915:37masterha_check_status-r-xr-xr-x1rootroot320112月2915:37masterha_conf_host-r-xr-xr-x1rootroot251712月2915:37masterha_manager-r-xr-xr-x1rootroot216512月2915:37masterha_master_monitor-r-xr-xr-x1rootroot237312月2915:37masterha_master_switch-r-xr-xr-x1rootroot387912月2915:37masterha_secondary_check-r-xr-xr-x1rootroot173912月2915:37masterha_stop-r-xr-xr-x1rootroot740112月2915:08purge_relay_logs-r-xr-xr-x1rootroot739512月2915:08save_binary_logs五、置配置SSH密钥对验证服务器之间需要实现密钥对验证。关于配置密钥对验证可看下面步骤。但是有一点需要注意:不能禁止password登陆,否则会出现错误
1.服务器先生成一个密钥对2.把自己的公钥传给对方
5.1、Server05(192.168.200.115)上操作:
[root@server05~]#ssh-keygen-trsa[root@server05~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.111[root@server05~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.112[root@server05~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.113[root@server05~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.114注意:Server05需要连接每个主机测试,因为第一次连接入的时候需要输入yes,影响后期故障切换时,对于每的个主机的SSH控制。检测秘钥对是否可以连接:[root@server05~]#sshserver01[root@server01~]#exit登出Connectiontoserver01closed.
[root@server05~]#sshserver02[root@server05~]#sshserver03[root@server05~]#sshserver045.2、PrimaryMaster(192.168.200.111)上操作:
[root@server01~]#ssh-keygen-trsa[root@server01~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.112[root@server01~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.113[root@server01~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.1145.3、SecondaryMaster(192.168.200.112)上操作:
[root@server02~]#ssh-keygen-trsa[root@server02~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.111[root@server02~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.113[root@server02~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.1145.4、slave1(192.168.200.113)上操作:
[root@server03~]#ssh-keygen-trsa[root@server03~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.111[root@server03~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.112[root@server03~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.1145.5、slave2(192.168.200.114)上操作:
[root@server04~]#ssh-keygen-trsa[root@server04~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.111[root@server04~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.112[root@server04~]#ssh-copy-id-i/root/.ssh/id_rsa.pubroot@192.168.200.113六、安装mysql:不做字符集,做字符集后期会报错,安装时,/etc/my.cnf不做任何改动111-114所有主机上的操作:
yum-yinstallmariadbmariadb-servermariadb-develsystemctlstartmariadbnetstat-lnpt|grep:3306设置数据库初始密码(后续操作中使用)mysqladmin-urootpassword123123七、搭建主从复制环境
注意:binlog-do-db和replicate-ignore-db设置必须相同。MHA在启动时候会检测过滤规则,如果过滤规则不同,MHA将不启动监控和故障转移功能。
7.11、修改mysql主机的配置文件PrimaryMaster(192.168.200.111)上操作:
vim/etc/my.cnf[mysqld]server-id=1log-bin=master-binlog-slave-updates=truerelay_log_purge=0systemctlrestartmariadbnetstat-anpt|grep3306SecondaryMaster(192.168.200.112)上操作:
vim/etc/my.cnf[mysqld]server-id=2log-bin=master-binlog-slave-updates=truerelay_log_purge=0systemctlrestartmariadbnetstat-anpt|grep3306slave1(192.168.200.113)上操作:
vim/etc/my.cnf[mysqld]server-id=3log-bin=mysql-binrelay-log=slave-relay-binlog-slave-updates=truerelay_log_purge=0systemctlrestartmariadbnetstat-anpt|grep3306slave2(192.168.200.114)上操作:
vim/etc/my.cnf[mysqld]server-id=4log-bin=mysql-binrelay-log=slave-relay-binlog-slave-updates=truerelay_log_purge=0systemctlrestartmariadbnetstat-anpt|grep33067.2、在PrimaryMaster(192.168.200.111))上对旧数据进行备份
mysqldump--master-data=2--single-transaction-R--triggers-A>all.sql参数解释:--master-data=2录备份时刻记录master的的Binlog位置和Position--single-transaction获取一致性快照-R备份存储过程和函数-triggres备份触发器-A备份所有的库。
没有旧数据就不用了执行本次7.2的操作
[root@server01~]#mysql-uroot-p123123WelcometotheMariaDBmonitor.Commandsendwith;or\g.YourMariaDBconnectionidis2Serverversion:5.5.60-MariaDBMariaDBServer
Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement.
MariaDB[(none)]>grantreplicationslaveon*.*to'repl'@'192.168.200.%'identifiedby'123123';QueryOK,0rowsaffected(0.00sec)
MariaDB[(none)]>flushprivileges;QueryOK,0rowsaffected(0.01sec)
MariaDB[(none)]>showmasterstatus;+-------------------+----------+--------------+------------------+|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|+-------------------+----------+--------------+------------------+|master-bin.000001|474|||+-------------------+----------+--------------+------------------+1rowinset(0.00sec)
7.5、把数据备份复制其他主机
mysql-uroot-p123456stopslave;QueryOK,0rowsaffected,1warning(0.01sec)
MariaDB[(none)]>CHANGEMASTERTO->MASTER_HOST='192.168.200.111',->MASTER_USER='repl',->MASTER_PASSWORD='123123',->MASTER_LOG_FILE='master-bin.000001',->MASTER_LOG_POS=474;QueryOK,0rowsaffected(0.03sec)
MariaDB[(none)]>startslave;QueryOK,0rowsaffected(0.01sec)
MariaDB[(none)]>showslavestatus\G
#检查IO和和SQL线程是否为:yesSlave_IO_Running:YesSlave_SQL_Running:Yes7.7、主从同步故障处理:如果7、6报错误就执行这段代码,没报错忽略
Slave_IO_Running:NoSlave_SQL_Running:Yes-----------------------------------忽略部分信息-----------------------------------Last_IO_Errno:1236Last_IO_Error:Gotfatalerror1236frommasterwhenreadingdatafrombinarylog:'Couldnotfindfirstlogfilenameinbinarylogindexfile'-----------------------------------忽略部分信息-----------------------------------处理方式:stopslave;resetslave;setglobalsql_slave_skip_counter=1;startslave;7.8、三台slave(112-114)服务置器设置read_yonly状态从库对外只进提供读服务,只所以没有写进mysql配置文件,是因为时随时server02会提升为master
方法一:在主页面输入[root@server02~]#mysql-uroot-p123123-e'setglobalread_only=1'[root@server03~]#mysql-uroot-p123123-e'setglobalread_only=1'[root@server04~]#mysql-uroot-p123123-e'setglobalread_only=1'方法二:三台slave都在数据库内输入MariaDB[(none)]>setglobalread_only=1;7.9、创建监控用户(111-114主机上的操作):做监控主要为了给115更加方便的监控master(111)主机有没有Down,一旦111主机down了就通过VIP漂移把VIP给112主机
,112主机从slave变成master
[root@server05~]#mkdir/etc/masterha[root@server05~]#cpmha4mysql-manager-0.56/samples/conf/app1.cnf/etc/masterha
8.2、修改app1.cnf配置文件/usr/local/bin/master_ip_failover脚本需要根据自己环境修改ip和网卡名称等。
mysql-uroot-p123123-e'setglobalrelay_log_purge=0;'注意:
8.5、配置从库(112--114)relay_log清除脚本加入计划任务个人实验时可以不做这条操作
MHA节点中包含了pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SETGLOBALrelay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志,再执行SETGLOBALrelay_log_purge=0。
vimpurge_relay_log.sh#!/bin/bashuser=rootpasswd=123123#注意:数据库要有密码,填自己所设置的密码就可以,前面设置过port=3306log_dir='/tmp'work_dir='/tmp'purge='/usr/local/bin/purge_relay_logs'if[!-d$log_dir]thenmkdir$log_dir-pfi$purge--user=$user--password=$passwd--disable_relay_log_purge--port=$port--workdir=$work_dir>>$log_dir/purge_relay_logs.log2>&1chmod+xpurge_relay_log.shcrontab-e04***/bin/bash/root/purge_relay_log.shpure_relay_logs脚本参数如下所示:--usermysql用户名--passwordmysql密码--port端口号--workdir指定创建relaylog的硬链接的位置,默认是/var/tmp,由于系统不同分区创建硬链接文件会失败,故需要执行硬链接具体位置,成功执行脚本后,硬链接的中继日志文件被删除--disable_relay_log_purge默认情况下,如果relay_log_purge=1,脚本会什么都不清理,自动退出,通过设定这个参数,当relay_log_purge=1的情况下会将relay_log_purge设置为0。清理relaylog之后,最后将参数设置为OFF。
8.6、手动清除中继日志可以不做这条操作purge_relay_logs--user=root--password=123456--disable_relay_log_purge--port=3306--workdir=/tmp2017-08-3121:33:52:purge_relay_logsscriptstarted.Foundrelay_log.info:/usr/local/mysql/data/relay-log.infoRemovinghardlinkedrelaylogfilesslave-relay-bin*under/tmp..done.Currentrelaylogfile:/usr/local/mysql/data/slave-relay-bin.000002Archivingunusedrelaylogfiles(upto/usr/local/mysql/data/slave-relay-bin.000001)...Creatinghardlinkfor/usr/local/mysql/data/slave-relay-bin.000001under/tmp/slave-relay-bin.000001..ok.Creatinghardlinksforunusedrelaylogfilescompleted.ExecutingSETGLOBALrelay_log_purge=1;FLUSHLOGS;sleepingafewsecondssothatSQLthreadcandeleteolderrelaylogfiles(ifitkeepsup);SETGLOBALrelay_log_purge=0;..ok.Removinghardlinkedrelaylogfilesslave-relay-bin*under/tmp..done.2017-08-3121:33:56:Allrelaylogpurgingoperationssucceeded.
8.7、检查MHAssh通信状态必须执行的操作
[root@server05~]#masterha_check_ssh--conf=/etc/masterha/app1.cnfSatDec2916:03:572018-[warning]Globalconfigurationfile/etc/masterha_default.cnfnotfound.Skipping.SatDec2916:03:572018-[info]Readingapplicationdefaultconfigurationsfrom/etc/masterha/app1.cnf..SatDec2916:03:572018-[info]Readingserverconfigurationsfrom/etc/masterha/app1.cnf..SatDec2916:03:572018-[info]StartingSSHconnectiontests..SatDec2916:04:022018-[debug]SatDec2916:03:582018-[debug]ConnectingviaSSHfromroot@server02(192.168.200.112:22)toroot@server01(192.168.200.111:22)..SatDec2916:03:592018-[debug]ok.-------------------------------------SatDec2916:04:012018-[debug]ConnectingviaSSHfromroot@server04(192.168.200.114:22)toroot@server03(192.168.200.113:22)..SatDec2916:04:022018-[debug]ok.SatDec2916:04:022018-[info]AllSSHconnectiontestspassedsuccessfully.#有这段话表示暂时也没有问题
8.9、检查整个主从复制集群的状态
[root@server02~]#mysql-uroot-p123123-e'setglobalrelay_log_purge=0;'
[root@server03~]#mysql-uroot-p123123-e'setglobalrelay_log_purge=0;'
[root@server04~]#mysql-uroot-p123123-e'setglobalrelay_log_purge=0;'
115主机再次查看日志:
MariaDB[(none)]>flushprivileges;QueryOK,0rowsaffected(0.00sec)
九、VIP配置管理Mastervip配置有两种方式,一种是通过keepalived或者heartbeat类似的软件的方式管理VIP的漂移,另一种为通过命令方式管理。
通过命令方式管理VIP地址:打开115在前面编辑过的文件/etc/masterha/app1.cnf,检查如下行是否正确,再检查集群状态。
Server05(192.168.200.115)修改故障转移脚本[root@server05~]#grep-n'master_ip_failover_script'/etc/masterha/app1.cnfmaster_ip_failover_script=/usr/local/bin/master_ip_failover#用于存放脚本的位置
Server05(192.168.200.115)修改故障转移脚本[root@server05~]#head-13/usr/local/bin/master_ip_failover
#!/usr/bin/envperlusestrict;usewarningsFATAL=>'all';useGetopt::Long;my($command,$ssh_user,$orig_master_host,$orig_master_ip,$orig_master_port,$new_master_host,$new_master_ip,$new_master_port,);my$vip='192.168.200.100';#写入VIPmy$key="1";#非非keepalived方式切换脚本使用的my$ssh_start_vip="/sbin/ifconfigens33:$key$vip";#若是使用keepalivedmy$ssh_stop_vip="/sbin/ifconfigens33:$keydown";#那么这里写服务的开关命令/usr/local/bin/master_ip_failover文件的内容意思是当主库发生故障时,会触发MHA切换,MHAmanager会停掉主库上的ens32:1接口,触发虚拟ip漂移到备选从库,从而完成切换。
Server05(192.168.200.115)检查manager状态
[root@server05~]#masterha_check_status--conf=/etc/masterha/app1.cnfapp1isstopped(2:NOT_RUNNING).
注意:如果正常会显示"PING_OK",否则会显示"NOT_RUNNING",代表MHA监控没有开启。Server05(192.168.200.115)开启manager监控
[root@server05~]#nohupmasterha_manager--conf=/etc/masterha/app1.cnf--remove_dead_master_conf--ignore_last_failover/var/log/masterha/app1/manager.log2>&1&[1]11275启动参数介绍:--remove_dead_master_conf该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。--manger_log日志存放位置--ignore_last_failover在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
Server05(192.168.200.115)再次查看Server05监控是否正常:
[root@monitor~]#masterha_check_status--conf=/etc/masterha/app1.cnfapp1(pid:65837)isrunning(0:PING_OK),master:server01有PING_OK、表示已经在监控了PrimaryMaster(192.168.200.111)上操作:
[root@server01~]#ipa|grepens332:ens33:
此时111作为master有了192.168.200.100的VIP
Server05(192.168.200.115)查看启动日志
[root@server05~]#cat/var/log/masterha/app1/manager.logWedOct2309:31:462019-[warning]Globalconfigurationfile/etc/masterha_default.cnfnotfound.Skipping.WedOct2309:31:462019-[info]Readingapplicationdefaultconfigurationsfrom/etc/masterha/app1.cnf..WedOct2309:31:462019-[info]Readingserverconfigurationsfrom/etc/masterha/app1.cnf..WedOct2309:31:462019-[info]MHA::MasterMonitorversion0.56.WedOct2309:31:472019-[info]DeadServers:WedOct2309:31:472019-[info]AliveServers:WedOct2309:31:472019-[info]server01(192.168.200.111:3306)WedOct2309:31:472019-[info]server02(192.168.200.112:3306)WedOct2309:31:472019-[info]server03(192.168.200.113:3306)WedOct2309:31:472019-[info]server04(192.168.200.114:3306)-------
-------------WedOct2309:31:592019-[info]server01(currentmaster)+--server02+--server03+--server04
WedOct2309:32:002019-[info]Ping(SELECT)succeeded,waitinguntilMySQLdoesn'trespond..
**注意:其中"Ping(SELECT)succeeded,waitinguntilMySQLdoesn'trespond.."说明整个系统已经开始监控了**
PrimaryMaster(192.168.200.111)模拟主库故障[root@server01~]#systemctlstopmariadb[root@server01~]#netstat-lnpt|grep:3306[root@server01~]#ipa|grepens32
2:ens32:
****如果当down了111时在113-114上看不到Master_Host:192.168.200.112且为111时并且报IO线程问题,就查看一下115能否通过sshserver02秘钥连接到112上
如果要输入密码就输入yes才能进入,就反复重启111-114的mariadb服务([root@server03~]#systemctlrestartmariadb)***
像这样就是IO线程的ssh秘钥没问题
步骤:
[root@server03~]#systemctlrestartmariadb#111-114都要重启
root@server05~]#sshserver02Lastlogin:WedOct2313:42:182019from192.168.200.2
[root@server05~]#nohupmasterha_manager--conf=/etc/masterha/app1.cnf--remove_dead_master_conf--ignore_last_failover/var/log/masterha/app1/manager.log2>&1&[6]20465
[root@server05~]#masterha_check_status--conf=/etc/masterha/app1.cnfapp1(pid:20465)isrunning(0:PING_OK),master:server01
[root@server02~]#ipa|grepens332:ens33:
slave1(192.168.200.113、192.168.200.114)查看状态:
MariaDB[(none)]>showslavestatus\G***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:192.168.200.112#发现此时VIP已经漂移到192.168.200.112上,112成为了masterMaster_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:master-bin.000001Read_Master_Log_Pos:1372Relay_Log_File:slave-relay-bin.000002Relay_Log_Pos:530Relay_Master_Log_File:master-bin.000001Slave_IO_Running:YesSlave_SQL_Running:YesServer05(192.168.200.115)查看监控配置文件已经发生了变化([server01]的配置已被删除):
[root@server05~]#cat/etc/masterha/app1.cnf[serverdefault]manager_log=/var/log/masterha/app1/manager.logmanager_workdir=/var/log/masterha/app1master_binlog_dir=/var/lib/mysqlmaster_ip_failover_script=/usr/local/bin/master_ip_failoverpassword=123123ping_interval=1remote_workdir=/tmprepl_password=123123repl_user=repluser=root
[server2]candidate_master=1check_repl_delay=0hostname=server02port=3306
[server3]hostname=server03port=3306
[server4]hostname=server04port=3306
Server05(192.168.200.115)故障切换过程中的日志文件内容如下:
[root@server05~]#tail-f/var/log/masterha/app1/manager.logSelectedserver02asanewmaster.server02:OK:Applyingalllogssucceeded.server02:OK:ActivatedmasterIPaddress.server04:Thishosthasthelatestrelaylogevents.server03:Thishosthasthelatestrelaylogevents.Generatingrelaydifffilesfromthelatestslavesucceeded.server04:OK:Applyingalllogssucceeded.Slavestarted,replicatingfromserver02.server03:OK:Applyingalllogssucceeded.Slavestarted,replicatingfromserver02.server02:Resettingslaveinfosucceeded.Masterfailovertoserver02(192.168.200.112:3306)completedsuccessfully.故障主库修复及及VIP切回测试PrimaryMaster(192.168.200.111)上操作:
[root@server01~]#systemctlstartmariadb[root@server01~]#netstat-lnpt|grep:3306tcp000.0.0.0:33060.0.0.0:*LISTEN6131/mysqldPrimaryMaster(192.168.200.111)指向新的master库[root@server01~]#mysql-uroot-p123123MariaDB[(none)]>startslave;MariaDB[(none)]>CHANGEMASTERTO>MASTER_HOST='192.168.200.112',>MASTER_USER='repl',>MASTER_PASSWORD='123123';MariaDB[(none)]>startslave;MariaDB[(none)]>showslavestatus\G***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:192.168.200.112Master_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:master-bin.000001Read_Master_Log_Pos:1372Relay_Log_File:mariadb-relay-bin.000002Relay_Log_Pos:1208Relay_Master_Log_File:master-bin.000001Slave_IO_Running:YesSlave_SQL_Running:Yes
Server05(192.168.200.115)修改监控配置文件重新添加server1配置:
[root@server05~]#vim/etc/masterha/app1.cnf[server01]hostname=server01port=3306Server05(192.168.200.115)检查集群状态:
[root@server05~]#masterha_check_repl--conf=/etc/masterha/app1.cnf-----------------------------------忽略部分信息-----------------------------------ThuAug3122:20:302017-[info]AliveServers:ThuAug3122:20:302017-[info]server01(192.168.200.111:3306)ThuAug3122:20:302017-[info]server02(192.168.200.112:3306)ThuAug3122:20:302017-[info]server03(192.168.200.113:3306)ThuAug3122:20:302017-[info]server04(192.168.200.114:3306)-----------------------------------忽略部分信息-----------------------------------server02(currentmaster)+--server01+--server03+--server04-----------------------------------忽略部分信息-----------------------------------MySQLReplicationHealthisOK.Server05(192.168.200.115)开启监控
[root@server05~]#nohupmasterha_manager--conf=/etc/masterha/app1.cnf--remove_dead_master_conf--ignore_last_failover/var/log/masterha/app1/manager.log2>&1&[7]22551
SecondaryMaster(192.168.200.112)关闭现有主库mysql
[root@server02~]#systemctlstopmariadb[root@server02~]#ipa|grepens332:ens33:
PrimaryMaster(192.168.200.111):查看VIP有没有回来
MariaDB[(none)]>showslavestatus\G***************************1.row***************************Slave_IO_State:WaitingformastertosendeventMaster_Host:192.168.200.111Master_User:replMaster_Port:3306Connect_Retry:60Master_Log_File:master-bin.000012Read_Master_Log_Pos:1586Relay_Log_File:slave-relay-bin.000002Relay_Log_Pos:530Relay_Master_Log_File:master-bin.000012Slave_IO_Running:YesSlave_SQL_Running:YesServer05(192.168.200.115)配置文件变化(已经移除故障机server2配置):
[root@server05~]#cat/etc/masterha/app1.cnf[serverdefault]manager_log=/var/log/masterha/app1/manager.logmanager_workdir=/var/log/masterha/app1master_binlog_dir=/var/lib/mysqlmaster_ip_failover_script=/usr/local/bin/master_ip_failoverpassword=123456ping_interval=1remote_workdir=/tmprepl_password=123456repl_user=repluser=root[server1]hostname=server01port=3306[server3]hostname=server03port=3306[server4]hostname=server04port=3306十、配置读请求负载均衡10.1、安装LVS和Keepalived
192.168.200.116和192.168.200.117主机:
yum-yinstallipvsadmkernel-developenssl-develkeepalived10.2、master主机设置
192.168.200.116lvsmaster主机配置:
[root@server06~]#vim/etc/keepalived/keepalived.conf!ConfigurationFileforkeepalivedglobal_defs{notification_email{route_id192.168.200.116}notification_email_fromAlexandre.Cassen@firewall.locsmtp_server192.168.200.1smtp_connect_timeout30router_idLVS_DEVELvrrp_skip_check_adv_addrvrrp_strictvrrp_garp_interval0vrrp_gna_interval0}vrrp_instanceVI_1{stateMASTERinterfaceens33virtual_router_id51priority100advert_int1authentication{auth_typePASSauth_pass1111}virtual_ipaddress{192.168.200.200}}virtual_server192.168.200.2003306{delay_loop6lb_algowrrlb_kindDRprotocolTCPreal_server192.168.200.1133306{weight1TCP_CHECK{connect_timeout10nb_get_retry3delay_before_retry3connect_port3306}}real_server192.168.200.1143306{weight1TCP_CHECK{connect_timeout10nb_get_retry3delay_before_retry3connect_port3306}}}[root@server06~]#systemctlrestartkeepalived
检查VIP地址:
[root@server06~]#ipa|grepens335:ens33:
[root@server06~]#ipvsadm-LnIPVirtualServerversion1.2.1(size=4096)ProtLocalAddress:PortSchedulerFlags->RemoteAddress:PortForwardWeightActiveConnInActConnTCP192.168.200.200:3306wrr->192.168.200.113:3306Route100->192.168.200.114:3306Route10010.3、192.168.200.117backup主机设置:
slave1(192.168.200.113)和slave2(192.168.200.114)主机配置realserver脚本:
[root@server03~]#vimrealserver.sh#!/bin/bashSNS_VIP=192.168.200.200ifconfiglo:0$SNS_VIPnetmask255.255.255.255broadcast$SNS_VIP/sbin/routeadd-host$SNS_VIPdevlo:0echo"1">/proc/sys/net/ipv4/conf/lo/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/lo/arp_announceecho"1">/proc/sys/net/ipv4/conf/all/arp_ignoreecho"2">/proc/sys/net/ipv4/conf/all/arp_announcesysctl-p>/dev/null2>&1
realserver1(192.168.200.113)检测VIP地址:
[root@server03~]#ipa|greplo1:lo:
[root@server04~]#bashrealserver.sh[root@server04~]#ipa|greplo1:lo:
Server05(192.168.200.115)担任client角色测试,连接vip
MariaDB[(none)]>
查看分流情况:
[root@server06~]#ipvsadm-LncIPVSconnectionentriesproexpirestatesourcevirtualdestinationTCP00:54FIN_WAIT192.168.200.115:42558192.168.200.200:3306192.168.200.113:3306TCP13:56ESTABLISHED192.168.200.115:42560192.168.200.200:3306192.168.200.114:3306查看此时111的VIP状态:#可以做一个周期计划用于关闭防火墙机制(111-114-116-117):
[root@server01~]#ipa|grepens332:ens33: