部署MHA

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

1、安装MHA node

在所有节点都要安装MHA node所需的perl模块(DBD:mysql),可以通过yum安装,如果没epel源,先安装epel源,在如下:(温馨提示:系统时间一定要是最新的,否则安装时会出各种奇葩问题)

在4台服务器上安装mha 准备操作(以node02(192.168.122.135)为例):

[root@node01 mha4mysql-node-0.56]# yum install perl-DBD-MySQL -y

 

[root@node01 mha4mysql-node-0.56]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker

 

[root@node01 mha4mysql-node-0.56]# yum -y install perl-CPAN

 

[root@node01 ~]# for i in 136 137 138; do rsync -r /root/MHA/RPM 192.168.122.$i:/root/RPM; done

 

[root@192.168.0.50 ~]# cat install.sh 
#!/bin/bash
wget http://xrl.us/cpanm --no-check-certificate
mv cpanm /usr/bin
chmod 755 /usr/bin/cpanm
cat > /root/list << EOF
install DBD::mysql
EOF
for package in `cat /root/list`
do
    cpanm $package
done


 

[root@node01 mha4mysql-node-0.56]# tar zxvf mha4mysql-node-0.56.tar.gz 

 

[root@node01 mha4mysql-node-0.56]# cd mha4mysql-node-0.56/

 

[root@node02 mha4mysql-node-0.56]# perl Makefile.PL

 

[root@node01 mha4mysql-node-0.56]# make && make install

 

[root@node01 mha4mysql-node-0.56]# ll /usr/local/bin/

总用量 44

-r-xr-xr-x 1 root root 16367 4月  13 17:13 apply_diff_relay_logs

-r-xr-xr-x 1 root root  4807 4月  13 17:13 filter_mysqlbinlog

-r-xr-xr-x 1 root root  8261 4月  13 17:13 purge_relay_logs

-r-xr-xr-x 1 root root  7525 4月  13 17:13 save_binary_logs

 

2.安装MHA Manager

MHA Manager中主要包括了几个管理员的命令行工具,例如master_manger,master_master_switch等。MHA Manger也依赖于perl模块,具体如下:

(1)安装MHA Node软件包之前需要安装依赖。我这里使用yum完成,没有epel源的可以使用上面提到的脚本(epel源安装也简单)。注意:在MHA Manager的主机也是需要安装MHA Node。

[root@node01 MHA]# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

 

[root@node01 MHA]# yum install perl-DBD-MySQL -y

 (2)安装MHA Manager。首先安装MHA Manger依赖的perl模块(我这里使用yum安装):

[root@node01 MHA]# yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y

 安装MHA Manager软件包:

[root@node01 ~]# tar zxvf mha4mysql-manager-0.56.tar.gz 

 

[root@node01 ~]# cd mha4mysql-manager-0.56/

 

[root@node01 mha4mysql-manager-0.56]# perl Makefile.PL

 

[root@node01 mha4mysql-manager-0.56]# make && make install

 

安装完成后会在/usr/local/bin目录下面生成以下脚本文件,前面已经说过这些脚本的作用,这里不再重复

[root@node01 mha4mysql-manager-0.56]# ll /usr/local/bin/

总用量 84

-r-xr-xr-x 1 root root 16367 4月  13 17:13 apply_diff_relay_logs

-r-xr-xr-x 1 root root  4807 4月  13 17:13 filter_mysqlbinlog

-r-xr-xr-x 1 root root  1995 4月  13 17:39 masterha_check_repl

-r-xr-xr-x 1 root root  1779 4月  13 17:39 masterha_check_ssh

-r-xr-xr-x 1 root root  1865 4月  13 17:39 masterha_check_status

-r-xr-xr-x 1 root root  3201 4月  13 17:39 masterha_conf_host

-r-xr-xr-x 1 root root  2517 4月  13 17:39 masterha_manager

-r-xr-xr-x 1 root root  2165 4月  13 17:39 masterha_master_monitor

-r-xr-xr-x 1 root root  2373 4月  13 17:39 masterha_master_switch

-r-xr-xr-x 1 root root  5171 4月  13 17:39 masterha_secondary_check

-r-xr-xr-x 1 root root  1739 4月  13 17:39 masterha_stop

-r-xr-xr-x 1 root root  8261 4月  13 17:13 purge_relay_logs

-r-xr-xr-x 1 root root  7525 4月  13 17:13 save_binary_logs

复制相关脚本到/usr/local/bin目录(软件包解压缩后就有了,不是必须,因为这些脚本不完整,需要自己修改,这是软件开发着留给我们自己发挥的,如果开启下面的任何一个脚本对应的参数,而对应这里的脚本又没有修改,则会抛错,自己被坑的很惨)

/root/mha4mysql-manager-0.56/samples/scripts

[root@node01 scripts]# ls

master_ip_failover  master_ip_online_change  power_manager  send_report

[root@node01 scripts]# cp * /usr/local/bin/

 

[root@node01 scripts]# ll /usr/local/bin/

总用量 116

-r-xr-xr-x 1 root root 16367 4月  13 17:13 apply_diff_relay_logs

-r-xr-xr-x 1 root root  4807 4月  13 17:13 filter_mysqlbinlog

-r-xr-xr-x 1 root root  1995 4月  13 17:39 masterha_check_repl

-r-xr-xr-x 1 root root  1779 4月  13 17:39 masterha_check_ssh

-r-xr-xr-x 1 root root  1865 4月  13 17:39 masterha_check_status

-r-xr-xr-x 1 root root  3201 4月  13 17:39 masterha_conf_host

-r-xr-xr-x 1 root root  2517 4月  13 17:39 masterha_manager

-r-xr-xr-x 1 root root  2165 4月  13 17:39 masterha_master_monitor

-r-xr-xr-x 1 root root  2373 4月  13 17:39 masterha_master_switch

-r-xr-xr-x 1 root root  5171 4月  13 17:39 masterha_secondary_check

-r-xr-xr-x 1 root root  1739 4月  13 17:39 masterha_stop

-rwxr-xr-x 1 root root  3648 4月  13 17:41 master_ip_failover

-rwxr-xr-x 1 root root  9870 4月  13 17:41 master_ip_online_change

-rwxr-xr-x 1 root root 11867 4月  13 17:41 power_manager

-r-xr-xr-x 1 root root  8261 4月  13 17:13 purge_relay_logs

-r-xr-xr-x 1 root root  7525 4月  13 17:13 save_binary_logs

-rwxr-xr-x 1 root root  1360 4月  13 17:41 send_report

 

3.配置SSH登录无密码验证(使用key登录,工作中常用)我的测试环境已经是使用key登录,服务器之间无需密码验证的。关于配置使用key登录,我想我不再重复。但是有一点需要注意:不能禁止 password 登陆,否则会出现错误

[root@node01 scripts]# ssh-keygen -t rsa

 

[root@node01 scripts]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.136

 

[root@node01 scripts]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.137

 

[root@node01 scripts]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.138

 

 

[root@node02 ~]# ssh-keygen -t rsa

 

[root@node02 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.135

 

[root@node02 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.137

 

[root@node02 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.138

 

[root@node03 ~]# ssh-keygen -t rsa

 

[root@node03 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.135

 

[root@node03 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.136

 

[root@node03 ~]#  ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.138

 

[root@node04 ~]# ssh-keygen -t rsa

 

[root@node04 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.135

[root@node04 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.136

 

[root@node04 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub 192.168.122.137

 

4.搭建主从复制环境()

注意:binlog-do-db 和 replicate-ignore-db 设置必须相同。 MHA 在启动时候会检测过滤规则,如果过滤规则不同,MHA 不启动监控和故障转移。

1、开启binlog

【mysqld】

log-bin=mysql-bin

server- id =1 #主从的server-id不能一样

(1)安装数据库

[root@node02 ~]# yum install -y mariadb-server.x86_64 

 

[root@node02 ~]# systemctl start mariadb

 

[root@node02 ~]# mysql -u root -p

 

[root@node03 ~]# yum install -y mariadb-server.x86_64

 

[root@node03 ~]#  systemctl start mariadb

 

[root@node03 ~]# mysql -u root -p

 

[root@node04 ~]# yum install -y mariadb-server.x86_64

 

[root@node04 ~]# systemctl start mariadb

[root@node04 ~]# mysql -u root -p

 

创建一个测试库、表

>create database game;

>use game; >show tables; >create table LOL(  id  int AUTO_INCREMENT PRIMARY KEY, name char(20), age int); >insert into LOL(name,age) values( 'JS' ,12),( 'XYR' ,23);

 

(1)在node02上执行备份(192.168.122.136)

[root@node02 ~]# mysqldump --master-data=2 --single-transaction -R --triggers -A > all.sql

 其中--master-data=2代表备份时刻记录master的Binlog位置和Position,--single-transaction意思是获取一致性快照,-R意思是备份存储过程和函数,--triggres的意思是备份触发器,-A代表备份所有的库


(2)在node02上创建复制用户:

MariaDB [(none)]> grant replication slave on *.* to 'repl'@'192.168.122.%' identified by '123456';

 

MariaDB [(none)]> flush privileges;

 

(3)查看主库备份时的binlog名称和位置,MASTER_LOG_FILE和MASTER_LOG_POS:

MariaDB [(none)]> show master status \G;

*************************** 1. row ***************************

            File: mysql-bin.000002

        Position: 515483

(4)把备份复制到node03和node04,也就是192.168.122.137和192.168.122.138

[root@node02 ~]# scp all.sql 192.168.122.137:/root/

 

[root@node02 ~]# scp all.sql 192.168.122.138:/root/

 (5)导入备份到node03,node04,执行复制相关命令

[root@node03 ~]# mysql -u root -p < all.sql 

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.122.135',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=515483;

 

MariaDB [(none)]> start slave;

 

MariaDB [(none)]> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.122.136

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000002

          Read_Master_Log_Pos: 515483

               Relay_Log_File: mariadb-relay-bin.000002

                Relay_Log_Pos: 529

        Relay_Master_Log_File: mysql-bin.000002

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

[root@node04 ~]# mysql -u root -p < all.sql 

 

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='192.168.122.136',MASTER_USER='repl', MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000002',MASTER_LOG_POS=515483;

 

MariaDB [(none)]> start slave;

 

MariaDB [(none)]> show slave status\G

*************************** 1. row ***************************

               Slave_IO_State: Waiting for master to send event

                  Master_Host: 192.168.122.136

                  Master_User: repl

                  Master_Port: 3306

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000002

          Read_Master_Log_Pos: 515483

               Relay_Log_File: mariadb-relay-bin.000002

                Relay_Log_Pos: 529

        Relay_Master_Log_File: mysql-bin.000002

             Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

 

(8)创建监控用户(在master上执行,也就是192.168.122.136):

MariaDB [(none)]> grant all privileges on *.* to 'root'@'%' identified  by '123456';

 

MariaDB [(none)]> flush  privileges;

 

到这里整个集群环境已经搭建完毕,剩下的就是配置MHA软件了。

5.配置MHA

(1)创建MHA的工作目录,并且创建相关配置文件(在软件包解压后的目录里面有样例配置文件)

[root@node01 ~]# mkdir -p /etc/masterha

 

[root@node01 ~]# cp mha4mysql-manager-0.56/samples/conf/app1.cnf /etc/masterha/

 

修改app1.cnf配置文件,修改后的文件内容如下(注意,配置文件中的注释需要去掉,我这里是为了解释清楚):

 

[root@node01 ~]# cat /etc/masterha/app1.cnf

[server default]

manager_workdir=/var/log/masterha/app1

manager_log=/var/log/masterha/app1/manager.log

 

manager_workdir=/var/log/masterha/app1.log              //设置manager的工作目录

manager_log=/var/log/masterha/app1/manager.log          //设置manager的日志

master_binlog_dir=/data/mysql                         //设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录

master_ip_failover_script= /usr/local/bin/master_ip_failover    //设置自动failover时候的切换脚本

master_ip_online_change_script= /usr/local/bin/master_ip_online_change  //设置手动切换时候的切换脚本

password=123456         //设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码

user=root               设置监控用户root

ping_interval=1         //设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover

remote_workdir=/tmp     //设置远端mysql在发生切换时binlog的保存位置

repl_password=123456    //设置复制用户的密码

repl_user=repl          //设置复制环境中的复制用户名

report_script=/usr/local/send_report    //设置发生切换后发送的报警的脚本

secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02            

shutdown_script=""      //设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)

ssh_user=root           //设置ssh的登录用户名

 

 

[server1]

hostname=192.168.122.136

port=3306

 

[server2]

hostname=192.168.122.137

port=3306

candidate_master=1   //设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave

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=192.168.122.138

port=3306

 

(2)设置relay log的清除方式(在每个slave节点上):

'[root@node03 ~]# mysql -e 'set global relay_log_purge=0'

 

[root@node04 ~]# mysql -e 'set global relay_log_purge=0'

 

注意:

MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,需要暂时为中继日志创建硬链接,因为在linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)

MHA节点中包含了pure_relay_logs命令工具,它可以为中继日志创建硬链接,执行SET GLOBAL relay_log_purge=1,等待几秒钟以便SQL线程切换到新的中继日志,再执行SET GLOBAL relay_log_purge=0。

pure_relay_logs脚本参数如下所示:

--user mysql 用户名
--password mysql 密码
--port 端口号
--workdir 指定创建relay log的硬链接的位置,默认是/var/tmp,由于系统不同分区创建硬链接文件会失败,故需要执行硬链接具体位置,成功执行脚本后,硬链接的中继日志文件被删除
--disable_relay_log_purge 默认情况下,如果relay_log_purge=1,脚本会什么都不清理,自动退出,通过设定这个参数,当relay_log_purge=1的情况下会将relay_log_purge设置为0。清理relay log之后,最后将参数设置为OFF。

(3)设置定期清理relay脚本(两台slave服务器)

6.检查SSH配置

检查MHA Manger到所有MHA Node的SSH连接状态

[root@node01 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf 

Sat Apr 13 19:02:44 2019 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.

Sat Apr 13 19:02:44 2019 - [info] Reading application default configuration from /etc/masterha/app1.cnf..

Sat Apr 13 19:02:44 2019 - [info] Reading server configuration from /etc/masterha/app1.cnf..

Sat Apr 13 19:02:44 2019 - [info] Starting SSH connection tests..

Sat Apr 13 19:02:45 2019 - [debug] 

Sat Apr 13 19:02:44 2019 - [debug]  Connecting via SSH from root@192.168.122.137(192.168.122.137:22) to root@192.168.122.136(192.168.122.136:22)..

Sat Apr 13 19:02:45 2019 - [debug]   ok.

Sat Apr 13 19:02:45 2019 - [debug]  Connecting via SSH from root@192.168.122.137(192.168.122.137:22) to root@192.168.122.138(192.168.122.138:22)..

Sat Apr 13 19:02:45 2019 - [debug]   ok.

Sat Apr 13 19:02:45 2019 - [debug] 

Sat Apr 13 19:02:44 2019 - [debug]  Connecting via SSH from root@192.168.122.136(192.168.122.136:22) to root@192.168.122.137(192.168.122.137:22)..

Sat Apr 13 19:02:44 2019 - [debug]   ok.

Sat Apr 13 19:02:44 2019 - [debug]  Connecting via SSH from root@192.168.122.136(192.168.122.136:22) to root@192.168.122.138(192.168.122.138:22)..

Sat Apr 13 19:02:45 2019 - [debug]   ok.

Sat Apr 13 19:02:46 2019 - [debug] 

Sat Apr 13 19:02:45 2019 - [debug]  Connecting via SSH from root@192.168.122.138(192.168.122.138:22) to root@192.168.122.136(192.168.122.136:22)..

Sat Apr 13 19:02:45 2019 - [debug]   ok.

Sat Apr 13 19:02:45 2019 - [debug]  Connecting via SSH from root@192.168.122.138(192.168.122.138:22) to root@192.168.122.137(192.168.122.137:22)..

Sat Apr 13 19:02:45 2019 - [debug]   ok.

Sat Apr 13 19:02:46 2019 - [info] All SSH connection tests passed successfully.

 

可以看见各个节点ssh验证都是ok的。

7.检查整个复制环境状况。

通过masterha_check_repl脚本查看整个集群的状态



扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄