一, 配置 MHA 工作环境
192.168.2.130 机器操作:
1.1. 创建 MHA 的工作目录, 并且创建相关配置文件
(在软件包解压后的目录里面有样例配置文件). 指的是可以下载 mha4mysql-manager-0.56.tar.gz 解压后找到样例配置文件
- [root@server03 ~]# ifconfig eth1|awk -F '[ :]+' 'NR==2{print $4}'
- 192.168.2.130
- [root@server03 ~]# ll /usr/bin/masterha*
- -rwxr-xr-x 1 root root 1995 Apr 1 2014 /usr/bin/masterha_check_repl
- -rwxr-xr-x 1 root root 1779 Apr 1 2014 /usr/bin/masterha_check_ssh
- -rwxr-xr-x 1 root root 1865 Apr 1 2014 /usr/bin/masterha_check_status
- -rwxr-xr-x 1 root root 3201 Apr 1 2014 /usr/bin/masterha_conf_host
- -rwxr-xr-x 1 root root 2517 Apr 1 2014 /usr/bin/masterha_manager
- -rwxr-xr-x 1 root root 2165 Apr 1 2014 /usr/bin/masterha_master_monitor
- -rwxr-xr-x 1 root root 2373 Apr 1 2014 /usr/bin/masterha_master_switch
- -rwxr-xr-x 1 root root 5171 Apr 1 2014 /usr/bin/masterha_secondary_check
- -rwxr-xr-x 1 root root 1739 Apr 1 2014 /usr/bin/masterha_stop
- [root@server03 ~]# cp -arp /usr/bin/masterha_*/usr/local/bin/
- [root@server03 bin]# cd /usr/bin/
- [root@server03 bin]# find ./ -name apply_diff_relay_logs
- ./apply_diff_relay_logs
- [root@server03 bin]# find ./ -name filter_mysqlbinlog
- ./filter_mysqlbinlog
- [root@server03 bin]# find ./ -name purge_relay_logs
- ./purge_relay_logs
- [root@server03 bin]# find ./ -name save_binary_logs
- ./save_binary_logs
- cp /usr/bin/save_binary_logs /usr/local/bin/
- cp /usr/bin/purge_relay_logs /usr/local/bin/
- cp /usr/bin/filter_mysqlbinlog /usr/local/bin/
- cp /usr/bin/apply_diff_relay_logs /usr/local/bin/
- ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql
- ln -s /usr/local/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog
- [root@server03 bin]# cd /usr/local/bin/
- You have new mail in /var/spool/mail/root
- [root@server03 bin]# ls
- apply_diff_relay_logs filter_mysqlbinlog masterha_check_ssh masterha_conf_host masterha_master_monitor masterha_secondary_check save_binary_logs
- masterha_check_repl masterha_check_status masterha_manager masterha_master_switch masterha_stop purge_relay_logs
MHA 配置文件如下
- [root@server03 ~]# mkdir -p /etc/masterha
- [root@server03 ~]# cat /etc/masterha/app1.cnf
- [server default]
- manager_log=/var/log/masterha/app1/manager.log
- manager_workdir=/var/log/masterha/app1.log
- master_binlog_dir=/data/mysql/logs/bin-log
- master_ip_failover_script=/usr/local/bin/master_ip_failover
- master_ip_online_change_script=/usr/local/bin/master_ip_online_change
- password=123456
- ping_interval=1
- remote_workdir=/tmp
- repl_password=123456
- repl_user=repmha
- report_script=/usr/local/bin/send_report
- secondary_check_script=/usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.2.128 --master_port=3306
- shutdown_script=""
- ssh_port=12570
- ssh_user=root
- user=monitor
- [server1]
- hostname=192.168.2.128
- port=3306
- [server2]
- candidate_master=1
- check_repl_delay=0
- hostname=192.168.2.129
- port=3306
- [server3]
- hostname=192.168.2.130
- port=3306
1.2 配置文件参数介绍:
- [root@192.168.2.131 ~]# cat /etc/masterha/app1.cnf
- [server default]
- 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/bin/send_report // 设置发生切换后发送的报警的脚本
- secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02 --user=root --master_host=server02 --master_ip=192.168.2.128 --master_port=3306
- // 一旦 MHA 到 server02 的监控之间出现问题, MHA Manager 将会尝试从 server03 登录到 server02
- shutdown_script="" // 设置故障发生后关闭故障主机脚本 (该脚本的主要作用是关闭主机放在发生脑裂, 这里没有使用)
- ssh_user=root // 设置 ssh 的登录用户名
- ssh_port=12570 // 设置 ssh 的登录端口. 默认是 22
- [server1]
- hostname=192.168.2.128
- port=3306
- [server2]
- hostname=192.168.2.129
- 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.2.130
- port=3306
注意:
##master_ip_failover_script= /usr/local/bin/master_ip_failover
MHA 的 Failover 两种方式: 一种是虚拟 IP 地址, 一种是全局配置文件. MHA 并没有限定使用哪一种方式, 而是让用户自己选择, 虚拟 IP 地址的方式会牵扯到其它的软件, 比如 keepalive 软件, 而且还要修改脚本
master_ip_failover.
所以先暂时注释 master_ip_failover_script= /usr/local/bin/master_ip_failover 这个选项. 后面引入 keepalived 后和修改该脚本以后再开启该选项
二, 设置 relay log 的清除方式 (在每个 slave 节点上):
2.1 三个节点服务器本地 hosts 解析
- [root@server03 ~]# cat /etc/hosts
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- 192.168.2.128 server02
- 192.168.2.129 server03
- 192.168.2.130 server04
在 slave master03 192.168.2.129 操作:
- [root@server03 ~]# mysql -uroot -p123456 -e "set global relay_log_purge=0"
- mysql: [Warning] Using a password on the command line interface can be insecure.
- [root@server03 ~]#
在 slave master04 192.168.2.130 操作:
- [root@server03 ~]# mysql -uroot -p123456 -e "set global relay_log_purge=0"
- mysql: [Warning] Using a password on the command line interface can be insecure.
- [root@server03 ~]#
注意:
MHA 在发生切换的过程中, 从库的恢复过程中依赖于 relay log 的相关信息, 所以这里要将 relay log 的自动清除设置为 OFF, 采用手动清除 relay log 的方式. 在默认情况下, 从服务器上的中继日志会在 SQL 线程执行完毕后被自动删除. 但是在 MHA 环境中, 这些中继日志在恢复其他从服务器时可能会被用到, 因此需要禁用中继日志的自动删除功能. 定期清除中继日志需要考虑到复制延时的问题. 在 ext3 的文件系统下, 删除大的文件需要一定的时间, 会导致严重的复制延时. 为了避免复制延时, 需要暂时为中继日志创建硬链接, 因为在 linux 系统中通过硬链接删除大文件速度会很快.(在 mysql 数据库中, 删除大表时, 通常也采用建立硬链接的方式)
2.2 设置定期清理 relay 脚本 (两台 slave 服务器):
在 slave sever03 192.168.2.129 操作:
- [root@server03 ~]# cat /data/scripts/purge_relay_log.sh
- #!/bin/bash
- user=root
- passwd=123456
- port=3306
- log_dir='/data/masterha/log'
- work_dir='/data'
- purge='/usr/local/bin/purge_relay_logs'
- if [ ! -d $log_dir ]
- then
- mkdir $log_dir -p
- fi
- $purge --user=$user --password=$passwd --disable_relay_log_purge --port=$port --workdir=$work_dir>> $log_dir/purge_relay_logs.log 2>
在 slave server04 192.168.2.130 操作跟上面是一样的, 这里不演示了.
脚本中参数介绍:
- --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.
purge_relay_logs 脚本删除中继日志不会阻塞 SQL 线程. 下面我们手动执行看看什么情况:
- [root@server03 ~]# purge_relay_logs --user=root --password=123456 --port=3306 -disable_relay_log_purge --workdir=/data/
- 2018-07-01 11:53:16: purge_relay_logs script started.
- Found relay_log.info: /data/mysql/relay-log.info
- Opening /data/mysql/logs/relay-log/relay-bin.000001 ..
- Opening /data/mysql/logs/relay-log/relay-bin.000002 ..
- Executing SET GLOBAL relay_log_purge=1; FLUSH LOGS; sleeping a few seconds so that SQL thread can delete older relay log files (if it keeps up); SET GLOBAL relay_log_purge=0; .. ok.
- 2018-07-01 11:53:20: All relay log purging operations succeeded.
- [root@server03 ~]#
来源: http://www.bubuko.com/infodetail-2670434.html