MySQL集群高可用方案
单主:keepalived MHA MMM
多主:MySQL cluster PXC
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能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上的高可用。
可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上
运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master节点处现故障时,他可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移的过程对应用程序完全透明。(工作原理)
●自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失 ●使用半同步复制,可以大大降低数据丢失的风险,如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性 ●目前MHA支持一主多从架构,最少三台服务,即一主两从
<span style="background-color:#f8f8f8"><span style="color:#333333">hostnamectl set-hostname mysql1
hostnamectl set-hostname mysql2
hostnamectl set-hostname mysql3</span></span>
<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>
<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>
<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>
<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>
<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>
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
save_binary_logs 保存和复制 master 的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的 slave
filter_mysqlbinlog 去除不必要的 ROLLBACK 事件(MHA 已不再使用这个工具)
purge_relay_logs 清除中继日志(不会阻塞 SQL 线程)
<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>
<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>
<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>
<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>
<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>
<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>
<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>
<span style="background-color:#f8f8f8"><span style="color:#333333">ifconfig ens33:1 192.168.111.100/24
ifconfig</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_check_ssh -conf=/opt/mysql-mha/mha-manager.cnf</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_check_repl -conf=/opt/mysql-mha/mha-manager.cnf</span></span>
<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>
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_check_status --conf=/opt/mysql-mha/mha-manager.cnf</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">cat /opt/mysql-mha/manager.log | grep "current master"</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">masterha_stop --conf=/opt/mysql-mha/mha-manager.cnf</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">tail -f /opt/mysql-mha/manager.log</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">systemctl stop mysqld</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">systemctl restart mysqld</span></span>
<span style="background-color:#f8f8f8"><span style="color:#333333">show master status;</span></span>
<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>
<span style="background-color:#f8f8f8"><span style="color:#333333">vim /opt/mysql-mha/mha-manager.cnf</span></span>
<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>
MMM(Master-Master replication manager for MvSQL,MySQL主主复制管理器) 是一套支持双主故障切换和双主日常管理的脚本程序。MMM 使用 Perl 语言开发,主要用来监控和管理 MySQL Master-Master (双主)复制,虽然叫做双主复制,但是业务上同一时刻只允许对一个主进行写入,另一台备选主上提供部分读服务,以加速在主主切换时备选主的预热,可以说MMM这套脚本程序一方面实现了故障切换的功能,另一方面其内部附加的工具脚本也可以实现多个 Slave 的 read 负载均衡。
●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 用户。
MMM提供了自动和手动两种方式移除一组服务器中复制延迟较高的服务器的虚拟ip,同时它还可以备份数据,实现两节点之间的数据同步等。由于MMM无法完全保证数据的一致性,所以MMM适用于对数据的一致性要求不是很高,但是又想最大程度地保证业务可用性的场景。
MMM是一套灵活的脚本程序,基于perl实现,用来对 mysql replication 进行监控和故障迁移,并能管理 MySQL Master-Master 复制的配置。