mysql-mha答辩
部署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脚本查看整个集群的状态
