MySQL高可用
-
MMM: 年久失修用的少了
Multi-Master Replication Manager for MySQL,Mysql主主复制管理器是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)
官网:http://www.mysql-mmm.org
https://code.google.com/archive/p/mysql-master-master/downloads
-
MHA:逐渐减少
Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从
官网:https://code.google.com/archive/p/mysql-master-ha/
-
Galera Cluster:新项目用这个
wsrep(MySQL extended with the Write Set Replication)
通过wsrep协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主读写
MHA
MHA工作原理
1 从宕机崩溃的master保存二进制日志事件(binlog events)
2 识别含有最新更新的slave
3 应用差异的中继日志(relay log)到其他的slave
4 应用从master保存的二进制日志事件(binlog events)
5 提升一个slave为新的master
6 使其他的slave连接新的master进行复制
MHA软件由两部分组成,Manager工具包和Node工具包
Manager工具包主要包括以下几个工具:
masterha_check_ssh 检查MHA的SSH配置状况
masterha_check_repl 检查MySQL复制状况
masterha_manger 启动MHA
masterha_check_status 检测当前MHA运行状态
masterha_master_monitor 检测master是否宕机
masterha_master_switch 故障转移(自动或手动)
masterha_conf_host 添加或删除配置的server信息
Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:
save_binary_logs 保存和复制master的二进制日志
apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用此工具)
purge_relay_logs 清除中继日志(不会阻塞SQL线程)
注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制
自定义扩展:
secondary_check_script: 通过多条网络路由检测master的可用性
master_ip_ailover_script: 更新Application使用的masterip
shutdown_script: 强制关闭master节点
report_script: 发送报告
init_conf_load_script: 加载初始配置参数
master_ip_online_change_script:更新master节点ip地址
配置文件:
global配置,为各application提供默认配置
application配置:为每个主从复制集群
实现MHA
在管理节点上安装两个包:
mha4mysql-manager
mha4mysql-node
在被管理节点安装:
mha4mysql-node
在管理节点建立配置文件
vim /etc/mastermha/app1.cnf
[server default]
user=mhauser
password=magedu
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=magedu
ping_interval=1
[server1]
hostname=192.168.8.17
candidate_master=1
[server2]
hostname=192.168.8.27
candidate_master=1
[server3]
hostname=192.168.8.37
实现Master
vim /etc/my.cnf
[mysqld]
log_bin
server_id=1
skip_name_resolve=1
mysql>show master logs
mysql>grant replication slave on *.* to repluser@'192.168.32.%' identified by 'centos';
mysql>grant all on *.* to mhauser@'192.168.32.%’identified by 'centos';
实现slave
vim /etc/my.cnf
[mysqld]
server_id=2
log_bin
read_only
relay_log_purge=0
skip_name_resolve=1
mysql>CHANGE MASTER TO MASTER_HOST='MASTER_IP',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245;
在所有节点实现相互之间ssh key验证
MHA验证和启动
检查配置文件SSH连接
masterha_check_ssh --conf=/etc/mha/app1.cnf
检查复制程序
masterha_check_repl --conf=/etc/mha/app1.cnf
启动mha
masterha_manager --conf=/etc/mha/app1.cnf
排错日志:
/data/mastermha/app1/manager.log
实战
一、准备IP和主机名
192.168.32.7 master
192.168.32.17 slave1
192.168.32.27 slave2
192.168.32.37 mha
二、确定四台机器时间一样
三、随便找一台机器生成公钥,并拷贝到每台机器一份(我这里用192.168.32.7生成)
192.168.32.7:
ssh-keygen
cd .ssh
ls
ssh-cpoy-id 192.168.32.7 拷贝自己机器上一份
scp -rp .ssh 192.168.32.17:/root/ 拷贝.ssh目录到17
scp -rp .ssh 192.168.32.27:/root/ 拷贝.ssh目录到27
scp -rp .ssh 192.168.32.37:/root/ 拷贝.ssh目录到37
ssh 192.168.32.17 连接到17测试
ssh 192.168.32.27 连接到27测试
ssh 192.168.32.37 连接到37测试
四、在master上配置
192.168.32.7:
vim /etc/my.cnf
[mysqld]
server_id=1
innodb_file_per_table
log_bin
skip_name_resolve
五、启动数据库
systemctl start mariadb
六、创建账号(复制账号,管理账号),查看master位置
192.168.32.7:
mysql>
grant replication slave on *.* to repluser@'192.168.32.%' identified by 'centos';
grant all on *.* to mhauser@'192.168.32.%' identified by 'centos';
show master logs;
'mariadb-bin.000002' 245
七、在slave1,slave2上配置
192.168.32.17:
vim /etc/my.cnf
[mysqld]
server_id=2
log_bin
read_only
relay_log_purge=0
skip_name_resolve
192.168.32.27:
vim /etc/my.cnf
[mysqld]
server_id=3
log_bin
read_only
relay_log_purge=0
skip_name_resolve
八、在slave上配置主从
192.168.32.17:
192.168.32.27:
mysql>
CHANGE MASTER TO MASTER_HOST='192.168.32.7',
MASTER_USER='repluser',
MASTER_PASSWORD='centos',
MASTER_PORT=3306,
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245;
SHOW SLAVE STATUS\G;
九、连接成功后测试是否能够同步
192.168.32.7:
mysql < hellodb_innodb.sql
192.168.32.17:
192.168.32.27:
mysql> show databases;
十、mha脚本安装
192.168.32.37:
epel 安装启动epel源
rz 导入需要安装的两个包
mha4mysql-manager-0.56-0.el6.noarch.rpm
mha4mysql-node-0.56-0.el6.noarch.rpm
yum install mha4mysql-manager-0.56-0.el6.noarch.rpm mha4mysql-node-0.56-0.el6.noarch.rpm
192.168.32.7:
192.168.32.17:
192.168.32.27:
epel 启动epel源
rz 导入需要安装的node包
mha4mysql-node-0.56-0.el6.noarch.rpm
十一、在管理节点建立配置文件
192.168.32.37:
mkdir /etc/mha
vim /etc/mha/app1.cnf
[server default]
user=mhauser
password=centos
manager_workdir=/data/mastermha/app1/
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1
[server1]
hostname=192.168.32.7
candidate_master=1
[server2]
hostname=192.168.32.17
candidate_master=1
[server3]
hostname=192.168.32.27
十二、检查配置文件并启动
192.168.32.37:
检查配置文件SSH连接
masterha_check_ssh --conf=/etc/mha/app1.cnf
检查复制程序
masterha_check_repl --conf=/etc/mha/app1.cnf
启动mha
masterha_manager --conf=/etc/mha/app1.cnf
注意:前台执行,不要ctrl+c
十三、测试确保复制成功
192.168.32.7:
mysql>
use hellodb
select * from teachers;
insert teachers values(5,'liuying',31,'f');
select * from teachers;
192.168.32.17:
192.168.32.27:
mysql>
use hellodb
select * from teachers;
十四、模拟正在复制中,突然宕机场景
192.168.32.7:
mysql>use hellod
mysql>delimiter $$
mysql>create procedure pro_testlog()
begin
declare i int;
set i = 1;
while i < 100000
do insert into testlog(name,age) values (concat'wang',i),i);
set i = i +1;
end while;
end$$
mysql>delimiter ;
mysql> call pro_testlog;
快速切换到从服务器看一眼
192.168.32.17:
mysql>select * from hellodb.testlog;
打开另一个主服务器192.168.32.7窗口,杀掉进程
192.168.32.7(2):
killall mysqld
十五、把提升为主的192.168.32.17配置文件中去掉read_only
192.168.32.17:
vim /etc/my.cnf
read_only 去掉配置文件中,下次重启生效,本次提升已经自动关闭
十六、添加一条记录测试新主是否可以复制
192.168.32.17:
mysql>use hellodb
insert teacher values(6,'dushan',30,m)
192.168.32.27:
mysql>select * from hellodb.teachers;