开始前,需要先完成MySQL主备集群和keepalived搭建
一、MySQL主备集群搭建
二、keepalived搭建(用于MHA集群负载)
三、MHA的搭建 (普通用户下监控)
删除时用到的一个指令
ps -ef |grep -v sshd |grep sshd| awk '{print $2}'|xargs kill -9
1. 创建connect监控用户(注意connect用户组为mysql)
1、配置所有主机(包括Manager主机在内),实现ssh-key可以相互登陆
当配置文件中的 ssh_user 为非 root 用户时:
- 需要手动创建node节点主机的文件夹,并授权node主机remote_workdir目录的权限给ssh_user用户
- 添加用户为MySQL同组用户,使其有读取mysql binary/relay log文件和relay_log.info文件的权限
- 授权Mysql日志目录的写权限
useradd -d /home/connect connect -g mysql
echo 'connect@2019' | passwd --stdin connect
echo "connect soft nofile 131072" >> /etc/security/limits.conf
echo "connect hard nofile 131072" >> /etc/security/limits.conf
echo "connect soft nproc unlimited" >> /etc/security/limits.d/20-nproc.conf
echo "connect hard nproc unlimited" >> /etc/security/limits.d/20-nproc.conf
chage -M 99999 connect
2. 配置connect用户下免密
- 步骤1: 用 ssh-key-gen 在主机10.162.16.221上创建公钥和密钥
ssh-keygen -t rsa
- 步骤2: 用 ssh-copy-id 把公钥复制到远程主机上
ssh-copy-id -i ~/.ssh/id_rsa.pub 10.162.16.222
- 步骤3:ssh到主机10.162.16.222
scp -r ~/.ssh/ 到10.162.16.221和10.162.16.223
3. 搭建MHA
(1) node节点部署:
在第三台mysql的slave节点部署manager(这里是10.162.16.222)
部署前的rpm环境安装(3节点都执行):
yum install perl-DBD-MySQL -y
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
在hadoop的 rpm路径下执行:
yum localinstall perl-*.rpm
yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
yum -y install perl-CPAN
tar -zxvf mha4mysql-node-0.58.tar.gz
mv mha4mysql-node-0.58 mha4mysql-node
cd mha4mysql-node
进入root用户下执行:
perl Makefile.PL
make && make install
(2) manager节点部署:
tar -zxvf mha4mysql-manager-0.58.tar.gz
mv mha4mysql-manager-0.58 mha4mysql-manager
cd mha4mysql-manager
进入root用户下执行:
perl Makefile.PL
make && make install
cp /home/connect/mha4mysql-manager/samples/scripts/* /usr/local/bin/
#修改配置文件:
chmod 777 /etc/masterha
vim /etc/masterha/app1.cnf
修改app1.cnf配置文件,修改后的文件内容如下(注意,配置文件中的注释需要去掉,我这里是为了解释清楚):
[root@192.168.0.20 ~]# 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/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.0.50
port=3306
[server2]
hostname=192.168.0.60
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.0.70
port=3306
[server default]
manager_workdir=/home/connect/masterha/app1.log
manager_log=/home/connect/masterha/app1/manager.log
master_binlog_dir=/data/mysql-bin/
master_ip_failover_script= /usr/local/bin/master_ip_failover
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
password=123456
user=admin
ping_interval=1
remote_workdir=/home/connect/tmp
repl_password=123456
repl_user=master
#report_script=/usr/local/send_report
secondary_check_script= /usr/local/bin/masterha_secondary_check -s dgp-lf-x86-hx03 -s dgp-lf-x86-hx01
shutdown_script=""
ssh_user=connect
[server1]
hostname=10.162.16.221
port=3306
[server2]
hostname=10.162.16.223
port=3306
candidate_master=1
check_repl_delay=0
[server3]
hostname=10.162.16.222
port=3306
(3) 按照配置文件创建监控用户,以及文件目录:
master同步用户,admin监控用户设置(三节点的mysql中):
参照:https://www.cnblogs.com/gomysql/p/3675429.html
grant all privileges on *.* to 'admin'@'10.162.16.%' identified by '123456';
grant all privileges on *.* to 'admin'@'10.162.16.221' identified by '123456';
grant all privileges on *.* to 'admin'@'10.162.16.222' identified by '123456';
grant all privileges on *.* to 'admin'@'10.162.16.223' identified by '123456';
flush privileges
进入connect家目录:
mkdir -p /home/connect/masterha/{app1,app1.log}
touch /home/connect/masterha/app1/manager.log
mkdir /home/connect/tmp
chmod -R 755 /usr/local/lib64/
chmod -R 755 /usr/local/share/perl5
chmod -R 755 /usr/lib64/perl5/vendor_perl
chmod -R 755 /usr/share/perl5/vendor_perl
chmod -R 755 /usr/lib64/perl5
chmod -R 755 /usr/share/perl5
echo "export PATH=\$PATH:/usr/local/bin" >> /etc/profile
source ~/.bash_profile
(4) 设置定期清理relay脚本(两台slave服务器)
#!/bin/bash
user=admin
passwd=123456
port=3306
log_dir='/home/connect/masterha/log'
work_dir='/home/connect/masterha/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>&1
mkdir -p /home/connect/masterha/log (root权限755)
mkdir -p /home/connect/masterha/data (connect用户)
添加到crontab定期执行:
crontab -l (查看)
crontab -e (添加)
0 4 * * * /bin/bash /home/connect/purge_relay_log.sh
4. MHA检测配置
(1)检查MHA Manger到所有MHA Node的SSH连接状态:
masterha_check_ssh --conf=/etc/masterha/app1.cnf
(2)检查整个复制环境状况。
通过masterha_check_repl脚本查看整个集群的状态:
masterha_check_repl --conf=/etc/masterha/app1.cnf
(3)检查MHA Manager的状态:
通过master_check_status脚本查看Manager的状态:
masterha_check_status --conf=/etc/masterha/app1.cnf
注意:如果正常,会显示"PING_OK",否则会显示"NOT_RUNNING",这代表MHA监控没有开启。
(4)开启MHA Manager监控:
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /home/connect/masterha/app1/manager.log 2>&1 &
启动参数介绍:
--remove_dead_master_conf 该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。
--manger_log 日志存放位置
--ignore_last_failover 在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/data产生app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。
查看MHA Manager监控是否正常:
masterha_check_status --conf=/etc/masterha/app1.cnf
(5)查看启动日志:
tail -n20 /home/connect/masterha/app1/manager.log
其中"Ping(SELECT) succeeded, waiting until MySQL doesn't respond.."说明整个系统已经开始监控了。
(6)关闭MHA Manage监控:
关闭很简单,使用masterha_stop命令完成:
masterha_stop --conf=/etc/masterha/app1.cnf