首页 > 代码库 > 在Centos7玩转Mysql半同步和keepalived+MHA(二)

在Centos7玩转Mysql半同步和keepalived+MHA(二)

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

链接:在Centos7玩转Mysql半同步和keepalived+MHA(一),本篇则继续完成MHA+keepalived的配置。

角色IPOSMySQLMHA
mha-manager192.168.1.92CentOS 7mha-manager mha-node
mysql-master192.168.1.151CentOS 7mysql-mastermha-node
mysql-slave01192.168.1.152CentOS 7mysql-slavemha-node
mysql-slave02192.168.1.153CentOS 7mysql-slavemha-node

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

安装依赖

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

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


mkdir /root/soft
cd /root/soft
git clone https://github.com/kevin-hao/mha-node.git
cd mha-node/
perl Makefile.PL
make && 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/soft
git clone 
cd mha-manager
perl Makefile.PL
make && make install

配置hosts文件

vim /etc/hosts
192.168.1.92  mha-manager
192.168.1.151 mysql-master
192.168.1.152 mysql-slave01
192.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/conf
mkdir -p /application/mha/workstatus/app1
mkdir -p /application/mha/logs
cp /root/soft/mha-manager/samples/conf/* /application/mha/conf/
mkdir -p  /application/mha/workstatus/app1
cd /application/mha/conf/
cp app1.cnf app1.cnf.ori

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

vim app1.cnf

文件内容

[server default]
port=3306
user=mha
password=123456
repl_user=repl
repl_password=repl
remote_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql #这个是Master-mysql主库的binlog目录别以为是本地目录。
manager_workdir=/application/mha/workstatus/app1
manager_log=/application/mha/logs/app1.log
[server1]
hostname=mysql-master
[server2]
hostname=mysql-slave01
candidate_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-slave02
no_master=1  #设置之后不参与切换主,并且不需要在此从库配置repl,否则需要配置。

配置全局配置文件

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

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

mysql> set global relay_log_purge=0;

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

vim /etc/cron.d/purge_relay_logs
0 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 </dev/null 2>&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.cnf
app1 (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-devel
yum install -y keepalived
vim /etc/keepalived/keepalived.conf

内容如下:

! Configuration File for keepalived
global_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/bash
MYSQL=mysql
MYSQL_HOST=127.0.0.1
MYSQL_PORT=3306
MYSQL_USER=root
MYSQL_PASSWORD=Www.vcolco.com
CHECK_TIME=3
#mysql  is working MYSQL_OK is 1 , mysql down MYSQL_OK is 0
MYSQL_OK=1
function check_mysql_helth (){
$MYSQL -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASSWORD -P$MYSQL_PORT -e "show status;" >/dev/null 2>&1
if [ $? = 0 ] ;then
     MYSQL_OK=1
else
     MYSQL_OK=0
fi
     return $MYSQL_OK
}
while [ $CHECK_TIME -ne 0 ]
do
     let "CHECK_TIME -= 1"
     check_mysql_helth
if [ $MYSQL_OK = 1 ] ; then
     CHECK_TIME=0
     exit 0
fi
if [ $MYSQL_OK -eq 0 ] &&  [ $CHECK_TIME -eq 0 ]
then
     pkill keepalived
exit 1
fi
sleep 1
done

启动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已经配置完成。

本文出自 “叼砖小书童” 博客,请务必保留此出处http://newbye.blog.51cto.com/5197506/1893099

在Centos7玩转Mysql半同步和keepalived+MHA(二)