一、MHA
一、概述
1、—套优秀的MySQL高可用环境下故障切换和主从复制的软件(MHA是基于标准的MySQL主从复制(异步/半同步))。
2、MySQL故障过程中MHA能做到0-30秒内自动完成故障切换。
二、组成
MHA Manager:
1、管理节点,控制管理的主节点。
2、可以借助node组件,实现健康检查(ssh、主从复制)、故障切换功能
MHA Node:
1、存在所有服务器
2、定时汇报给manager服务的状态
3、监控本队mysql服务功能
三、特点
1、自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失。
2、使用半同步复制,可以大大降低数据丢失的风险。
3、目前MHA支持一主多从架构,,最少三台服务,即一主两从。
二、实例
设备ip
mysql-master 192.168.238.150
mysql-slave1 192.168.238.100
mysql-slave2 192.168.238.99
MHA-manager 192.168.238.134
一、MySQL服务器配置
一、配置主从同步
#三台mysql服务器
[root@master ~]# vim /etc/my.cnf #注释掉字符集
二、配置软连接
#三台mysql服务器
[root@master ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin #优化管理;mysql命令
[root@master ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin #节点恢复
三、提权
#三台mysql服务器
mysql> grant replication slave on *.* to 'myslave'@'192.168.238.%' identified by '123456'; #从库同步
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> grant all privileges on *.* to 'mha'@'192.168.238.%' identified by 'manager'; #manager节点使用
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> grant all privileges on *.* to 'mha'@'master' identified by 'manager'; #防止MHA检查MySQL检查不通过
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> grant all privileges on *.* to 'mha'@'slave1' identified by 'manager'; #防止MHA检查MySQL检查不通过
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> grant all privileges on *.* to 'mha'@'slave2' identified by 'manager'; #防止MHA检查MySQL检查不通过
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> flush privileges; #刷新权限
Query OK, 0 rows affected (0.00 sec)
四、mysql从服务器
#两台从服务器
mysql> set global read_only=1; #开启只读
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
验证只读权限是否成功
二、MHA
一、安装node组件
所有服务器安装
#遇事不要慌,下面两条代码执行两遍
[root@manager ~]# yum install epel-release --nogpgcheck -y #安装epel且不对gph检查
[root@manager ~]# yum install -y perl-DBD-MySQL \ #perl针对于mysql数据库
> perl-Config-Tiny \ #从配置文件中提拿其中的值
> perl-Log-Dispatch \ #log-日志
> perl-Parallel-ForkManager \ #多线程管理
> perl-ExtUtils-CBuilder \ #扩展工具
> perl-ExtUtils-MakeMaker \ #扩展工具
> perl-CPAN #cpan perl中的数据库
[root@manager opt]# tar zvxf mha4mysql-node-0.57.tar.gz -C /root
[root@manager opt]# cd /root/mha4mysql-node-0.57/
[root@manager mha4mysql-node-0.57]# perl Makefile.PL
[root@manager mha4mysql-node-0.57]# make && make install
在MHA节点上安装manager组件
[root@manager mha4mysql-node-0.57]# tar -zxvf /opt/mha4mysql-manager-0.57.tar.gz -C /root
[root@manager mha4mysql-node-0.57]# cd ..
[root@manager ~]# cd mha4mysql-manager-0.57
[root@manager mha4mysql-manager-0.57]# perl Makefile.PL
[root@manager mha4mysql-manager-0.57]# make && make install
[root@manager mha4mysql-manager-0.57]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin
[root@manager mha4mysql-manager-0.57]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin
通过脚本管理vip
在master上创建vip地址
[root@master ~]# ifconfig ens33:1 192.168.238.222
[root@manager mha4mysql-manager-0.57]# cp -ra /root/mha4mysql-manager-0.57/samples/scripts/ /usr/local/bin #在MHA节点上复制相关脚本到/usr/local/bin目录
[root@manager mha4mysql-manager-0.57]# cp /usr/local/bin/scripts/master_ip_failover /usr/local/bin #复制master_ip_failover 到/usr/local/bin目录,使用脚本管理VIP
[root@manager mha4mysql-manager-0.57]# vim /usr/local/bin/master_ip_failover #管理vip漂移的脚本
[root@manager mha4mysql-manager-0.57]# mkdir /etc/masterha
[root@manager mha4mysql-manager-0.57]# cp /root/mha4mysql-manager-0.57/samples/conf/app1.cnf /etc/masterha/
[root@manager mha4mysql-manager-0.57]# vim /etc/masterha/app1.cnf #创建MHA软件目录并拷贝配置文件
[server default]
manager_log=/var/log/masterha/app1/manager.log
manager_workdir=/var/log/masterha/app1
master_binlog_dir=/usr/local/mysql/data
master_ip_failover_script=/usr/local/bin/master_ip_failover
master_ip_online_change_script=/usr/local/bin/master_ip_online_change
password=manager
ping_interval=1
remote_workdir=/tmp
repl_password=123456
repl_user=myslave
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.226.131 -s 192.168.226.132
shutdown_script=""
ssh_user=root
user=mha
[server1]
hostname=192.168.238.150
port=3306
[server2]
candidate_master=1
hostname=192.168.238.100
check_repl_delay=0
port=3306
[server3]
hostname=192.168.238.99
port=3306
所有服务器设置免密登录
[root@slave2 mha4mysql-node-0.57]# ssh-keygen -t rsa
[root@slave2 mha4mysql-node-0.57]# ssh-copy-id 192.168.238.150
[root@slave2 mha4mysql-node-0.57]# ssh-copy-id 192.168.238.100
[root@slave2 mha4mysql-node-0.57]# ssh-copy-id 192.168.238.99
[root@slave2 mha4mysql-node-0.57]# ssh-copy-id 192.168.238.134
[root@manager ~]# masterha_check_ssh -conf=/etc/masterha/app1.cnf #测试无密码认证
[root@manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf #测试主从复制
三、测试
#后台启动MHA,并进行日志记录
[root@manager ~]# 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 &
[1] 111978
[root@manager ~]# jobs #查看后台运行的进程
[1]+ 运行中 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 &
注释:
nohup #不挂断地运行
masterha_manager #开启
--conf=/etc/masterha/app1.cnf #指定配置文件
--remove_dead_master_conf #当master服务器失效时,发生主从切换后,会把旧的master的ip从主配置文件删
--ignore_last_failover #忽略故障转移,忽略掉总是宕机不够可靠的服务器
##在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failove之所以这样限制是为了避免ping-pong效应。该参数代表忽略桑次MHA出发切换产生的文件,默认情况 MHA发生切换后会在日志记录下,也就是上面设置的日志app1.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件:为了方便,这里设为为--ianore_last_failover
< /dev/null> #生成的所有信息会导到nul1下或者/var/log/masterha/app1/manager.log日志文件中
2>&1 #把2错误性的输山从定向为标准性输出
& #开启后台运行
#查看当前的master节点
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:111978) is running(0:PING_OK), master:192.168.238.150
模拟master服务器宕机
[root@master ~]# systemctl stop mysqld
[root@manager ~]# tail -f /var/log/masterha/app1/manager.log #实时查看日志
#在slave2上查看主从同步情况,会发现新的master变为原来的slave2
查看vip地址,是否在新的master上
四、修复原master
#重启开启,并建立主从同步
[root@master ~]# systemctl start mysqld
[root@master ~]# mysql -uroot -p123
mysql> change master to master_host='192.168.238.100',master_user='myslave',master_password='123456',master_log_file='master-bin.000004',master_log_pos=154;
mysql> start slave;
mysql> show slave status\G;
[root@manager ~]# vim /etc/masterha/app1.cnf #重新添加server1,因为在其服务器失效后,自动删除
[root@manager ~]# masterha_check_repl -conf=/etc/masterha/app1.cnf #重新进行主从检测,发现master为slave1的ip地址