在上一篇完成了Mysql的半同步配置。

链接:,本篇则继续完成MHA+keepalived的配置。

角色 IP OS MySQL MHA
mha-manager 192.168.1.92 CentOS 7 mha-manager mha-node
mysql-master 192.168.1.151 CentOS 7 mysql-master mha-node
mysql-slave01 192.168.1.152 CentOS 7 mysql-slave mha-node
mysql-slave02 192.168.1.153 CentOS 7 mysql-slave mha-node

在所有的服务器上面安装mha-node。

安装依赖

yum install perl-DBD-MySQL perl-Module-Install cpan perl-DBI -y

从git上面拉取mha-node安装包

mkdir /root/softcd /root/softgit clone https://github.com/kevin-hao/mha-node.gitcd mha-node/perl Makefile.PLmake && make install

再强调一遍,四台服务器全部要安装node。

下面配置MHA manager

安装依赖

yum   install -y perl perl-Config-Tiny perl-Email-Date-Forma perl-Log-Dispatch perl-MIME-Liteperl-MIME-Types perl-Mail-Sender perl-Mail-Sendmail perl-MailTools perl-Parallel-ForkManagerperl-Params-Validate perl-Time-HiRes perl-TimeDate

从git上面拉取mha-manager安装包

cd /root/softgit clone cd mha-managerperl Makefile.PLmake && make install

配置hosts文件

vim /etc/hosts192.168.1.92  mha-manager192.168.1.151 mysql-master192.168.1.152 mysql-slave01192.168.1.153 mysql-slave02 scp   /etc/hosts   root@192.168.1.151:/etc/ scp   /etc/hosts   root@192.168.1.152:/etc/ scp   /etc/hosts   root@192.168.1.153:/etc/

在主库mysql和参与选举的从库中配置mha监控用户和repl同步用户,不参与选举的从库可以不用配置。

mysql> grant all privileges on *.* to 'mha'@'192.168.1.%' identified by '123456';mysql> grant replication slave on *.* to 'repl'@'192.168.1.%' identified by 'repl';mysql> flush privileges;

注意:关于参与选举的从库也要配置这两个用户的原因在于主库宕机的时候,从库要提升为主库,repl是继续和剩下的从库保持主从关系,mha监控用户是为了,mha可以继续监视,从而可以让修复了的原主库作为新的备库上线。

规范MHA目录

mkdir -p /application/mha/confmkdir -p /application/mha/workstatus/app1mkdir -p /application/mha/logscp /root/soft/mha-manager/samples/conf/* /application/mha/conf/mkdir -p  /application/mha/workstatus/app1cd /application/mha/conf/cp app1.cnf app1.cnf.ori

接下来这个文件很重要,关系到能不能启动mha。

vim app1.cnf

文件内容

[server default]port=3306user=mhapassword=123456repl_user=replrepl_password=replremote_workdir=/var/log/mha/app1master_binlog_dir=/var/lib/mysql #这个是Master-mysql主库的binlog目录别以为是本地目录。manager_workdir=/application/mha/workstatus/app1manager_log=/application/mha/logs/app1.log[server1]hostname=mysql-master[server2]hostname=mysql-slave01candidate_master=1 #参与主库选举check_repl_delay=0 #默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master[server3]hostname=mysql-slave02no_master=1  #设置之后不参与切换主,并且不需要在此从库配置repl,否则需要配置。

配置全局配置文件

cp masterha_default.cnf masterha_default.cnf.oldvim masterha_default.cnf[server default]log-level=debugcheck_repl_delay=1check_repl_filter=1ping_interval=5ping_type=CONNECT设置relay log清除方式(在每个slave上)

在所有的salve上面配置relay log清除方式

mysql> set global relay_log_purge=0;

在crontab添加自动清理脚本示例如下

vim /etc/cron.d/purge_relay_logs0 4 * * * /usr/bin/purge_relay_logs --user=root --password=xxx --disable_relay_log_purge --port=3306 --workdir=/var/lib/mysql/ >>/application/mha/logs/purge_relay_logs.log 2>&1

检查配置分别用masterha_check_ssh和masterha_check_repl

masterha_check_ssh  --conf=/application/mha/conf/app1.cnf

看到[info] All SSH connection tests passed successfully.字样代表ssh是通的。

masterha_check_repl --conf=/application/mha/conf/app1.cnf

看到MySQL Replication Health is OK.字样代表数据库之间同步是没有问题的。

启动

nohup masterha_manager --conf=/application/mha/conf/app1.cnf --remove_dead_master_conf --ignore_last_failover &1 &

启动参数解释:

–remove_dead_master_conf   该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。

–ignore_last_failover     在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,本示例会在/application/mha/workstatus/app1产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在切换后删除该文件,为了方便,这里设置为–ignore_last_failover。

检查MHA manager状态

masterha_check_status  --conf=/application/mha/conf/app1.cnfapp1 (pid:43568) is running(0:PING_OK), master:mysql-master

测试

到151上面关掉数据库,在92也就是mha-manager上面tail -f /application/mha/logs/app1.log可以查看切换日志

切换完成后到153的mysql上面使用show slave status\G;查看master是不是已经变成了152。

关于测试的一些说明,在测试过程中如果想验证数据是否有丢失,可以采用sysbench进行压测,通过安装percona-toolkit的pt-table-checksum来检查数据一致性,如果发现有不一致的数据,可以使用pt-table-sync 工具来修复。

关于二次三次测试

当主库宕了之后,修复好之后,在151上面启动。在mha-manager服务器上面使用

grep -i "All other slaves should start" manager.log

(不需要锁表)或者登陆到新主库152上面show master status;(需要锁表和解锁)查看位置和binlog文件信息。

在151上面做change master操作

change master to master_host='192.168.1.152',master_user='repl',master_password='repl',master_port=3306,master_log_file='master-bin.00000X',master_log_pos=XXXX;

然后start slave;查看同步信息show slave status\G;。

回到mha-manager服务器,停掉mha

masterha_stop --conf=/application/mha/conf/app1.cnf

然后编辑app1.cnf,由于运行是采用了–remove_dead_master_conf这个参数,发现server1不见了,添加进去,并把

candidate_master=1 

check_repl_delay=0

加入到master下面,作为新主库的从库,并参与选举。

然后启动mha,就完成了一轮测试。

---------------------------分割线---------------------------------

下面配置keepalived,先停掉mha

masterha_stop --conf=/application/mha/conf/app1.cnf

在151和152上面安装keepalived。

yum install -y gcc kernel-devel openssl-devel popt-develyum install -y keepalived
vim /etc/keepalived/keepalived.conf

内容如下:

! Configuration File for keepalivedglobal_defs {   notification_email {        bbbbbb@126.com   }   notification_email_from aaaaaaa@126.com   smtp_server smtp.126.com   smtp_connect_timeout 30   router_id LVS_DEVEL}vrrp_script Monitor_mysql {                script "/etc/keepalived/scripts/monitor_mysql.sh"                interval 1                 weight 2                }track_script {                Monitor_mysql                        }vrrp_instance VI_1 {    state BACKUP   #主备都配置为BACKUP模式    interface eno16777736  #虚拟机是这个,用ip addr查看自己网卡    virtual_router_id 51   #主备必须相同    priority 100    advert_int 1    authentication {        auth_type PASS    #主备必须相同        auth_pass 1111    #主备必须相同    }    virtual_ipaddress {        192.168.1.150     #也可以配置多个虚拟IP        #192.168.200.18    }}

配置监控mysql脚本

注意:这里采用的是其中一种关掉keepalived的方法,还可以通过配置MHA的master_ip_failover脚本,指定keepalived相关设定,然后在app1.cnf里面添加

master_ip_failover_script= /路径/master_ip_failover来控制keepalived进程。

mkdir -p /etc/keepalived/scripts/vim /etc/keepalived/scripts/monitor_mysql.sh

内容如下:

#!/bin/bashMYSQL=mysqlMYSQL_HOST=127.0.0.1MYSQL_PORT=3306MYSQL_USER=rootMYSQL_PASSWORD=Www.vcolco.comCHECK_TIME=3#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0MYSQL_OK=1function check_mysql_helth (){$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -e "show status;" >/dev/null 2>&1if [ $? = 0 ] ;then     MYSQL_OK=1else     MYSQL_OK=0fi     return $MYSQL_OK}while [ $CHECK_TIME -ne 0 ]do     let "CHECK_TIME -= 1"     check_mysql_helthif [ $MYSQL_OK = 1 ] ; then     CHECK_TIME=0     exit 0fiif [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]then     pkill keepalivedexit 1fisleep 1done

启动151和152的keepalived

systemctl start keepalived

在分别在151和152上面查看ip

ip a

发现优先级高的151正在使用150这个VIP(虚IP),而152没有。

测试keepalived可以使用pkill keepalived掉151的keepalived进程。然后去152上面使用ip a查看VIP是否漂移。

到此Mysql半同步+MHA+keepalived已经配置完成。