MHA高可用
传统的MySQL主从架构会存在单点故障问题
MySQL集群高可用方案
单主:keepalived MHA MMM
多主:MySQL cluster PXC
1 MHA
1.1 MHA简介
MHA(Master High Availability Manager and tools for MySQL)目前在MySQL高可用方面是一个相对成熟的解决方案,它是由日本人youshimaton采用Perl语言编写的一个脚本管理工具。目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制群集必须最少有三台数据库服务器,一主二从,即一台充当Master,一台充当备用Master,另一台充当从库。MHA(MasterHigh Availability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA 的出现就是解决MySQL 单点的问题。MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。
1.2 MHA的组成
MHA Manager(管理节点):
可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上
MHA Node(数据库节点):
运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master节点处现故障时,他可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移的过程对应用程序完全透明。(工作原理)
1.3 MHA的特点
●自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失 ●使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性 ●目前MHA支持一主多从架构,最少三台服务,即一主两从
1.4 MHA的部署过程
1)所有mysql节点都做主从复制授权和mha manager 访问数据库的授权
2)做时间同步和mysql的主从复制并设置所有的从节点(slave)为只读模式
3)所有节点安装mha node组件,在manager节点上还要再安装mha manager组件
4)所有节点做ssh密钥对免交互登录认证
5)在mha manager节点上准备好故障切换脚本和mha manager配置文件
6)在master节点上使用ifconfig创建VIP地址
7)使用masterha_check_ssh 和masterha_check_repl做mha启动前检查,再使用master_manager启动mha进程
8)做故障切换测试(故障切换后mha进程会自动退出,配置文件会自动删除旧master的配置信息,VIP会漂移到新的master节点上,其他的从节点会自动指向新master做主从复制)
1.5 MHA的部署
主服务器:192.168.111.6
备服务器:192.168.111.7
从服务器:192.168.111.8
manager服务器:192.168.111.9
同步主从服务器时间
主服务安装时间服务ntp
修改ntp配置文件
启动时间服务
备服务器和从服务器安装ntp服务并启动
设置时间同步为主服务器地址,并设置定时任务
配置主从同步动静分离
修改主服务器名为mysql1,备服务器名为mysql2,从服务器名为mysql3
<span style="background-color:#f8f8f8"><span style="color:#333333">hostnamectl set-hostname mysql1
hostnamectl set-hostname mysql2
hostnamectl set-hostname mysql3</span></span>
为主、备、从服务器mysql主配置文件文件/etc/my.cnf添加二进制日志功能和中继日志功能(server-id不能相同)
<span style="background-color:#f8f8f8"><span style="color:#333333">[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = mixed
log-slave-updates = true
relay-log = relay-log-bin
relay-log-index = slave-relay-bin.index</span></span>
重启服务并创建两个软链接
<span style="background-color:#f8f8f8"><span style="color:#333333">systemctl restart mysqld
[root@mysql1 ~]# ln -s /usr/local/mysql/bin/mysql /usr/sbin/
[root@mysql1 ~]# ln -s /usr/local/mysql/bin/mysqlbinlog /usr/sbin/</span></span>
修改mysql登录用户的密码并,在所有的mysql数据库节点进行mysql授权
<span style="background-color:#f8f8f8"><span style="color:#333333">mysqladmin -u root password "abc123"
grant replication slave on *.* to 'myslave'@'192.168.111.%' identified by 'myslave123'; #从数据库同步使用
grant all privileges on *.* to 'mha'@'192.168.111.%' identified by 'manager123'; #manager 使用
grant all privileges on *.* to 'mha'@'mysql1' identified by 'manager'; #防止从库通过主机名连接不上主库
grant all privileges on *.* to 'mha'@'mysql2' identified by 'manager';
grant all privileges on *.* to 'mha'@'mysql3' identified by 'manager';
flush privileges;</span></span>
在主服务器查看二进制文件和同步点
在从服务器和备服务器上执行同步操作并开启数据库同步功能
<span style="background-color:#f8f8f8"><span style="color:#333333">change master to master_host='192.168.111.6',master_user='myslave',master_password='myslave123',master_log_file='mysql-bin.000001',master_log_pos=1155;
start slave;</span></span>
查看备、从服务器数据同步结果
<span style="background-color:#f8f8f8"><span style="color:#333333">show slave status\G</span></span>
设置从、备服务器为只读模式
<span style="background-color:#f8f8f8"><span style="color:#333333">set global read_only=1;</span></span>
在主库中插入数据进行数据库同步测试
<span style="background-color:#f8f8f8"><span style="color:#333333">create database test_db;
use test_db;
create table test(id int);
insert into test(id) values (1);</span></span>
安装manager服务
所有服务器上安装MHA的epel源
<span style="background-color:#f8f8f8"><span style="color:#333333">yum install epel-release --nogpgcheck -y
yum install -y perl-DBD-MySQL \
perl-Config-Tiny \
perl-Log-Dispatch \
perl-Parallel-ForkManager \
perl-ExtUtils-CBuilder \
perl-ExtUtils-MakeMaker \
perl-CPAN</span></span>
将node源码包放进opt目录下,所有服务器解压、编译并安装node组件
<span style="background-color:#f8f8f8"><span style="color:#333333">tar zxvf mha4mysql-node-0.57.tar.gz
cd mha4mysql-node-0.57
perl Makefile.PL
make && make install</span></span>
把manager源码包放进opt目录中,在manager服务器上解压、编译并安装manage组件(manager 依赖 node 组件)
<span style="background-color:#f8f8f8"><span style="color:#333333">tar zxvf mha4mysql-manager-0.57.tar.gz
cd mha4mysql-manager-0.57
perl Makefile.PL
make && make install</span></span>
manager 组件安装后在/usr/local/bin 下面会生成几个工具
-
masterha_check_ssh 检查 MHA 的 SSH 配置状况
-
masterha_check_repl 检查 MySQL 复制状况
-
masterha_manger 启动 manager的脚本
-
masterha_check_status 检测当前 MHA 运行状态
-
masterha_master_monitor 检测 master 是否宕机
-
masterha_master_switch 控制故障转移(自动或者手动)
-
masterha_conf_host 添加或删除配置的 server 信息
-
masterha_stop 关闭manager
node 组件安装后也会在/usr/local/bin 下面会生成几个脚本(这些工具通常由 MHAManager 的脚本触发,无需人为操作)
-
save_binary_logs 保存和复制 master 的二进制日志
-
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
-
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
-
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
配置免交互登录
在 manager 节点上配置到所有数据库节点的无密码认证
<span style="background-color:#f8f8f8"><span style="color:#333333">ssh-keygen -t rsa #一路按回车键
ssh-copy-id 192.168.111.6
ssh-copy-id 192.168.111.7
ssh-copy-id 192.168.111.8</span></span>
在 mysql1 上配置到数据库节点 mysql2 和 mysql3 的无密码认证
<span style="background-color:#f8f8f8"><span style="color:#333333">ssh-keygen -t rsa
ssh-copy-id 192.168.111.7
ssh-copy-id 192.168.111.8</span></span>
在 mysql2 上配置到数据库节点 mysql1 和 mysql3 的无密码认证
<span style="background-color:#f8f8f8"><span style="color:#333333">ssh-keygen -t rsa
ssh-copy-id 192.168.111.6
ssh-copy-id 192.168.111.8</span></span>
在 mysql3 上配置到数据库节点 mysql1 和 mysql2 的无密码认证
<span style="background-color:#f8f8f8"><span style="color:#333333">ssh-keygen -t rsa
ssh-copy-id 192.168.111.6
ssh-copy-id 192.168.111.7</span></span>
在manager服务器上配置MHA
将解压后的源码包自带脚本复制到/usr/local/bin 目录
<span style="background-color:#f8f8f8"><span style="color:#333333">cp -rp /opt/mha4mysql-manager-0.57/samples/scripts /usr/local/bin
ll /usr/local/bin/scripts/</span></span>
复制的自动切换时 VIP 管理的脚本到 /usr/local/bin 目录,这里使用master_ip_failover脚本来管理 VIP 和故障切换
创建MHA软件目录并在目录中创建所有节点的相关目录mha-node和manager节点mha
<span style="background-color:#f8f8f8"><span style="color:#333333">mkdir -p /opt/mysql-mha/mha-node
mkdir -p /opt/mysql-mha/mha
ls /opt/mysql-mha/</span></span>
编写配置文件mha-manager.cnf来管理mysql节点服务器
<span style="background-color:#f8f8f8"><span style="color:#333333">vim /opt/mysql-mha/mha-manager.cnf
[server default]
manager_log=/opt/mysql-mha/manager.log
manager_workdir=/opt/mysql-mha/mha
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
user=mha
password=manager
port=3306
ping_interval=1
remote_workdir=/opt/mysql-mha/mha-node
repl_user=myslave
repl_password=123
secondary_check_script=/usr/local/bin/masterha_secondary_check -s 192.168.80.11 -s 192.168.80.12
shutdown_script=""
ssh_user=root
[server1]
hostname=192.168.80.10
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.80.11
port=3306
[server3]
hostname=192.168.80.12
port=3306</span></span>
第一次配置需要在主服务器上手动开启虚拟IP(VIP)
<span style="background-color:#f8f8f8"><span style="color:#333333">ifconfig ens33:1 192.168.111.100/24
ifconfig</span></span>
在 manager 节点上测试 ssh 无密码认证,如果正常最后会输出 successfully
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_check_ssh -conf=/opt/mysql-mha/mha-manager.cnf</span></span>
在 manager 节点上测试 mysql 主从连接情况,最后出现 MySQL Replication Health is OK 字样说明正常
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_check_repl -conf=/opt/mysql-mha/mha-manager.cnf</span></span>
在 manager 节点上启动 MHA
<span style="background-color:#f8f8f8"><span style="color:#333333">nohup masterha_manager \
--conf=/opt/mysql-mha/mha-manager.cnf \
--remove_dead_master_conf \
--ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &</span></span>
查看MHA状态,可以看到当前的mater是mysql1节点
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_check_status --conf=/opt/mysql-mha/mha-manager.cnf</span></span>
查看 MHA 日志,也以看到当前的 master 是 192.168.80.10
<span style="background-color:#f8f8f8"><span style="color:#333333">cat /opt/mysql-mha/manager.log | grep "current master"</span></span>
若要关闭 manager 服务,可以使用如下命令,查看 mysql1 的 VIP 地址 192.168.80.200 是否存在,这个 VIP 地址不会因为 manager 节点停止 MHA 服务而消失。
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_stop --conf=/opt/mysql-mha/mha-manager.cnf</span></span>
1.6 故障模拟恢复
故障模拟
在 manager 节点上监控观察日志记录
<span style="background-color:#f8f8f8"><span style="color:#333333">tail -f /opt/mysql-mha/manager.log</span></span>
在 Master 节点 mysql1 上停止mysql服务
<span style="background-color:#f8f8f8"><span style="color:#333333">systemctl stop mysqld</span></span>
正常自动切换一次后,MHA 进程会退出。HMA 会自动修改 mha-manager.cnf文件内容,将宕机的 mysql1 节点删除。查看 mysql2 是否接管 VIP,mha-manager.cnf是否删除mysql1的配置,manager服务状态是否退出
故障切换备选主库的算法:
1.一般判断从库的是从(position/GTID)判断优劣,数据有差异,最接近于master的slave,成为备选主。
2.数据一致的情况下,按照配置文件顺序,选择备选主库。
3.设定有权重(candidate_master=1),按照权重强制指定备选主。
(1)默认情况下如果一个slave落后master 100M的relay logs的话,即使有权重,也会失效。
(2)如果check_repl_delay=0的话,即使落后很多日志,也强制选择其为备选主。
故障恢复
重新启动mysql1的mysql服务
<span style="background-color:#f8f8f8"><span style="color:#333333">systemctl restart mysqld</span></span>
查看现主库服务器mysql2的二进制文件和同步点
<span style="background-color:#f8f8f8"><span style="color:#333333">show master status;</span></span>
在原主库mysql1上执行同步操作
<span style="background-color:#f8f8f8"><span style="color:#333333">change master to master_host='192.168.111.7',master_user='myslave',master_password='myslave123',master_log_file='mysql-bin.000002',master_log_pos=1331;
start slave;</span></span>
在 manager 节点上修改配置文件,把mysql1的IP地址和mysql端口加进去
<span style="background-color:#f8f8f8"><span style="color:#333333">vim /opt/mysql-mha/mha-manager.cnf</span></span>
关闭mysql2的mysql服务,并在 manager 节点上启动 MHA
<span style="background-color:#f8f8f8"><span style="color:#333333">systemctl stop mysqld.service
nohup masterha_manager --conf=/opt/mysql-mha/mha-manager.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/mha_manager.log 2>&1 &</span></span>
查看主是否回到mysql1上
2 MMM
1.1 MMM简介
MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器) 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个 Slave 的 read 负载均衡。
1.2 MMM组成
●mmm_mon:监控进程,负责所有的监控工作,决定和处理所有节点角色活动。此脚本需要在监控主机上运行。 ●mmm_agent:运行在每个MySQL服务器上的代理进程,完成监控的探针工作和执行简单的远端服务设置。此脚本需要在被监管机上运行。 ●mmm_control:一个简单的脚本,提供管理 mmm_mon 进程的命令。 ●mysql-mmm 的监管端会提供多个虚拟 IP(VIP),包括一个可写 VIP,多个可读 VIP,通过监管的管理,这些 IP 会绑定在可用 MySQL 之上,当某一台 MySQL 宕机时,监管会将 VIP 迁移至其他 MySQL。
在整个监管过程中,需要在 MySQL 中添加相关授权用户,以便让 MySQL 可以支持监控主机的维护。 授权的用户包括一个 mmm_monitor 用户和一个 mmm_agent 用户。
1.3 MMM的特点
-
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。
-
MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并能管理 MySQL Master-Master 复制的配置。