mha 环境搭建
测试环境:
系统:CentOS 6.5 64bits
DB: mysql 5.6.25
monotor 192.168.1.96 manager
node01 192.168.1.95 master
node02 192.168.1.94 master_candidate
node03 192.168.1.93 slave
前期准备工作:
(1).修改计算机名称
cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
(2).添加域名解析
/etc/hosts
mha的安转:
1.在所有的节点上安装
yum install perl-DBD-MySQL -y
2.下载mha软件
谷歌镜像:
mha 下载地址:
mha4mysql-manager-0.56.tar.gz
mha4mysql-node-0.56.tar.gz
3.在所有的节点上安装mha-node(包括管理节点) | mha4mysql-node-0.56.tar.gz
tar -zxvf mha4mysql-node-0.56.tar.gz
cd mha4mysql-node-0.56
perl Makefile.PL
make && make install
安装node报错:
Can't locate ExtUtils/MakeMaker.pm in @INC
yum -y install perl-devel perl-CPAN
安装完node后会生成以下几个脚本。
[root@localhost ~]# cd /usr/local/bin
[root@localhost bin]# ll
total 44
-r-xr-xr-x 1 root root 16367 Jun 9 14:12 apply_diff_relay_logs
-r-xr-xr-x 1 root root 4807 Jun 9 14:12 filter_mysqlbinlog
-r-xr-xr-x 1 root root 8261 Jun 9 14:12 purge_relay_logs
-r-xr-xr-x 1 root root 7525 Jun 9 14:12 save_binary_logs
save_binary_logs //保存和复制master的二进制日志
apply_diff_relay_logs //识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog //去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs //清除中继日志(不会阻塞SQL线程)
4.在管理节点上(manager)上安装 | mha4mysql-manager-0.56.tar.gz
安装依赖包:
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
tar -zxvf mha4mysql-manager-0.56.tar.gz
cd mha4mysql-manager-0.56
perl Makefile.PL
make && make install
安装完manager之后会生成以下脚本
[root@localhost mha4mysql-manager-0.56]# cd /usr/local/bin
[root@localhost bin]# ll
total 84
-r-xr-xr-x 1 root root 16367 Jun 9 14:19 apply_diff_relay_logs
-r-xr-xr-x 1 root root 4807 Jun 9 14:19 filter_mysqlbinlog
-r-xr-xr-x 1 root root 1995 Jun 9 14:23 masterha_check_repl
-r-xr-xr-x 1 root root 1779 Jun 9 14:23 masterha_check_ssh
-r-xr-xr-x 1 root root 1865 Jun 9 14:23 masterha_check_status
-r-xr-xr-x 1 root root 3201 Jun 9 14:23 masterha_conf_host
-r-xr-xr-x 1 root root 2517 Jun 9 14:23 masterha_manager
-r-xr-xr-x 1 root root 2165 Jun 9 14:23 masterha_master_monitor
-r-xr-xr-x 1 root root 2373 Jun 9 14:23 masterha_master_switch
-r-xr-xr-x 1 root root 5171 Jun 9 14:23 masterha_secondary_check
-r-xr-xr-x 1 root root 1739 Jun 9 14:23 masterha_stop
-r-xr-xr-x 1 root root 8261 Jun 9 14:19 purge_relay_logs
-r-xr-xr-x 1 root root 7525 Jun 9 14:19 save_binary_logs
master_ip_failover //自动切换时vip管理的脚本,不是必须,如果我们使用keepalived的,我们可以自己编写脚本完成对vip的管理,
比如监控mysql,如果mysql异常,我们停止keepalived就行,这样vip就会自动漂移
master_ip_online_change //在线切换时vip的管理,不是必须,同样可以可以自行编写简单的shell完成
power_manager //故障发生后关闭主机的脚本,不是必须
send_report //因故障切换后发送报警的脚本,不是必须,可自行编写简单的shell完成
5.配置SSH登录无密码验证
将manager主机的秘钥cp 到其他节点(node)
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.95
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.94
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.93
node 操作。
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.95
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.1.94
note:
monitor需要登录其他所有节点主机,其他各个节点主机需要相互登录,不需要登录monitor。
6.搭建复制环境。
在所有的非主库上执行添加以下两个参数:
read_only = 1 (在所有的非候选master上添加这个参数,保证数据的安全)--动态变量
relay_log_purge = 0 (不能让mysql自动清除中级日志,在所有的slave上添加) --动态变量
在所有的节点上创建以下复制账号
grant replication slave on *.* to 'repl'@'192.168.1.%' identified by '123456'; # 复制账号
创建监控账号:
grant all privileges on *.* to 'root'@'192.168.1.%' identified by '123456';
7.在管理节点(manager)上配置配置文件。
vi /etc/masterha/app1.cnf
[server default]
manager_log=/var/log/masterha/app1/manager.log # 日志文件
manager_workdir=/var/log/masterha/app1 # 工作目录,包括日志文件,差异二进制日志文件
master_binlog_dir=/var/lib/mysql/ # 节点binlog的位置
master_ip_failover_script=/usr/local/bin/master_ip_failover # 自动故障转移脚本
password=123456 # 监控账号的密码(mysql)
ping_interval=1 # 健康巡检频率
remote_workdir=/tmp # 远程主机临时binlog目录 如果不存在,系统自动创建此目录
repl_password=123456 # 复制账号密码
repl_user=repl # 复制账号
report_script=/usr/local/bin/send_report # 警报脚本
secondary_check_script=masterha_secondary_check -s node03 -s node02
shutdown_script="" # 关机脚本,防止脑裂(这个似乎有点问题,我是在master_ip_failover_script脚本中关闭mysql的)
ssh_user=root # ssh 账号
user=root # 监控账号(mysql)
[server1]
candidate_master=1 # 是否为候选master
check_repl_delay=0 # 是否忽略候选主机的延迟
hostname=192.168.1.93
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.1.94
7.mha的参数研究(secondary_check_script)
/usr/local/bin/masterha_secondary_check -s 10.45.20.59 -s 10.47.89.236 --user=root --master_host=db-group2-master --master_ip=10.47.90.163 --master_port=3306
说明: 首先检查monitor 到 10.45.20.59 的ssh是否是通的 ,再检查从 10.45.20.59 到master的 指定的端口号是否是通的,
如果第一步骤失败了 ,就不会再检查后面的机器了 ;
如果第一步成功了,第二步骤失败了,就会检查后面的机器
如果第一步和第二步都成功了 ,就不会再检查下面的机器了
前提条件:monitor到指定机器的ssh是通。
8.监测mah是否正常,如果正常就开启mha服务:
masterha_check_ssh --conf=/etc/masterha/app1.cnf (检查ssh连接状态)
masterha_check_repl --conf=/etc/masterha/app1.cnf (检查整个复制环境状态)
9.开启mha管理服务并且后台运行
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
参数解释:
remove_dead_master_conf:当发生主从切换的时候,老主库ip将会从配置文件中移除。ignore_last_failover:在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,
除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
10.监测监控服务是否开启。
masterha_check_status --conf=/etc/masterha/app1.cnf(检查manager的状态)
11.mha 常用命令:
masterha_stop --conf=/etc/masterha/app1.cnf(关闭manager服务)
masterha_manager : 开启manager服务 。
masterha_master_switch : 切换脚本
# mha 手动切换,在进行手动切换的时候必须确保master已死掉
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=dead --dead_master_host=192.168.1.95 --dead_master_port=3306 --new_master_host=192.168.1.94 --new_master_port=3306 --ignore_last_failover
# mha在线切换
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=192.168.2.129 --new_master_port=3306 --orig_master_is_new_slave --running_updates_limit=10000 --ignore_last_failover
参数解释:
running_updates_limit:候选master延迟在设定时间内允许切换。
ignore_last_failover:防止mha在短时间内多次切换
自动切换失败之后,可以手动强制切换:
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=dead --dead_master_host=192.168.1.93 --dead_master_port=3306 --new_master_host=192.168.1.94 --new_master_port=3306 --ignore_last_failover
开启mha服务
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &
mha的日常维护:
mha参考链接:
当个mhamanager节点监控管理多个master-slave复制集群