mysql的MHA高可用集群搭建
MHA技术介绍:
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。除了failover之外,MHA还支持在线master切换,非常安全和高效,大概只需要(0.5 ~ 2秒)的阻塞写时间。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
MHA 工作原理
主库宕机处理过程
-
监控节点 (通过配置文件获取所有节点信息)
系统,网络,SSH连接性
主从状态,重点是主库 -
选主
(1) 如果判断从库(position或者GTID),数据有差异,最接近于 Master 的 slave,成为备选主
(2) 如果判断从库(position或者GTID),数据一致,按照配置文件顺序,选主.
(3) 如果设定有权重(candidate_master=1),按照权重强制指定备选主.- 默认情况下如果一个 slave 落后 master 100M的 relay logs 的话,即使有权重,也会失效.
- 如果 check_repl_delay=0 的话,即使落后很多日志,也强制选择其为备选主
-
数据补偿
(1) 当SSH能连接,从库对比主库 GTID 或者 position 号,立即将二进制日志保存至各个从节点并且应用( save_binary_logs )
(2) 当SSH不能连接, 对比从库之间的relaylog的差异( apply_diff_relay_logs ) -
Failover
将故障节点踢出集群
将备选主进行身份切换,对外提供服务
其余从库和新主库确认新的主从关系
下面开始MHA的安装操作
数据库角色 IP 系统与MySQL版本
主数据库 192.168.121.142 RHEL7 MySQL5.7
从数据库 192.168.121.143 RHEL7 MySQL5.7
从数据库 192.168.121.144 RHEL7 MySQL5.7
监控主机 192.168.121.161 RHEL7 MySQL5.7
首先添加阿里源:
[root@server1 ~]# vim aliyun.repo
[aliyun-os]
name=aliyun-os
baseurl=https://mirrors.aliyun.com/centos/7/os/x86_64/
enabled=1
gpgcheck=0
[aliyun-epel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
enabled=1
gpgcheck=0
[aliyun-extra]
name=aliyun-extra
baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64/
enabled=1
gpgcheck=0
然后上传安装包,大家可以网上找资源,评论私聊我拿也行
在所有节点主机安装依赖源
yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-CPAN -y
然后在每一台主机安装mha4mysql-node-0.54-0.el6.noarch.rpm
没有下载依赖的话就会显示下下面的报错
[root@ly001 ~]# rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm
error: Failed dependencies:
perl(DBD::mysql) is needed by mha4mysql-node-0.54-0.el6.noarch
perl(DBI) is needed by mha4mysql-node-0.54-0.el6.noarch
下载依赖源以后就可以安装了
[root@ly001 ~]# rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm
Preparing... ################################# [100%]
Updating / installing...
1:mha4mysql-node-0.54-0.el6 ################################# [100%]
[root@ly001 ~]#
记住mha4mysql-node-0.54-0.el6.noarch.rpm 是每一台都安装
然后在监控主机上安装mha4mysql-manager-0.54-0.el6.noarch.rpm
[root@ly001 ~]# rpm -ivh mha4mysql-manager-0.54-0.el6.noarch.rpm
Preparing... ################################# [100%]
Updating / installing...
1:mha4mysql-manager-0.54-0.el6 ################################# [100%]
[root@ly001 ~]#
安装完成后就会在/usr/bin下产生以下目录
[root@ly001 ~]# ls /usr/bin/mast*
/usr/bin/masterha_check_repl /usr/bin/masterha_conf_host /usr/bin/masterha_master_switch
/usr/bin/masterha_check_ssh /usr/bin/masterha_manager /usr/bin/masterha_secondary_check
/usr/bin/masterha_check_status /usr/bin/masterha_master_monitor /usr/bin/masterha_stop
然后安装就完成了
下面结合mysql的主从复制
主库142的my.cnf配置
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
autocommit=1
skip-name-resolve
log-bin=mysql-bin-master #开启二进制日志
server-id=1 #服务器ID,必须唯一
log-slave-updates=1 #从库binlog记录主库同步的操作日志
binlog-ignore-db=mysql #不可被复制的库
lower_case_table_names=1
然后进入数据库添加复制用户,这里为了方便就开启所有权限了
mysql -uroot -pMySQL@666
grant all privileges on *.* to 'cat'@'192.168.121.%' identified by "MySQL@666";
flush privileges;
重启数据库
systemctl restart mysqld
从库143的my.cnf配置
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
autocommit=1
lower_case_table_names = 1
log-bin=mysql-slave1
server-id=2
log-slave-updates=1
binlog-ignore-db=mysql
然后进入数据库添加复制用户,这里为了方便就开启所有权限了
mysql -uroot -pMySQL@666
grant all privileges on *.* to 'cat'@'192.168.121.%' identified by "MySQL@666";
flush privileges;
重启数据库
systemctl restart mysqld
进入数据库,连接同步主库
mysql -uroot -pMySQL@666
连接主库,开启主从配置
stop slave;
reset slave all;
change master to master_host='192.168.121.142',master_user='cat',master_password='MySQL@666';
start slave;
show slave status\G
看到有下面那个IO和SQL线程的两个yes就是成功了
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.121.142
Master_User: cat
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000002
Read_Master_Log_Pos: 2060
Relay_Log_File: ljc103-relay-bin.000003
Relay_Log_Pos: 1166
Relay_Master_Log_File: mysql-bin-master.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
从库144的my.cnf配置
基本和143一样
vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
autocommit=1
lower_case_table_names = 1
log-bin=mysql-slave1
server-id=3
log-slave-updates=1
binlog-ignore-db=mysql
然后进入数据库添加复制用户,这里为了方便就开启所有权限了
mysql -uroot -pMySQL@666
grant all privileges on *.* to 'cat'@'192.168.121.%' identified by "MySQL@666";
flush privileges;
重启数据库
systemctl restart mysqld
进入数据库,连接同步主库
mysql -uroot -pMySQL@666
连接主库,开启主从配置
stop slave;
reset slave all;
change master to master_host='192.168.121.142',master_user='cat',master_password='MySQL@666';
start slave;
show slave status\G
看到有下面那个IO和SQL线程的两个yes就是成功了
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.121.142
Master_User: cat
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin-master.000002
Read_Master_Log_Pos: 2060
Relay_Log_File: ljc104-relay-bin.000002
Relay_Log_Pos: 862
Relay_Master_Log_File: mysql-bin-master.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
主从配置到这里就完成了
然后配置mha配置文件
创建相关目录,再写入配置信息
mkdir /etc/mha
mkdir -p /var/log/mha/app1
vim /etc/mha/app1.cnf
[server default]
manager_log=/var/log/mha/app1/manager
manager_workdir=/var/log/mha/app1
master_binlog_dir=/var/lib/mysql
password=MySQL@666
ping_interval=2
repl_password=MySQL@666
repl_user=cat
ssh_user=root
user=cat
[server1]
hostname=192.168.121.142
port=3306
[server2]
candidate_master=1
check_repl_delay=0
hostname=192.168.121.143
port=3306
[server3]
hostname=192.168.121.144
port=3306
然后主从通信是否正常
masterha_check_ssh --conf=/etc/mha/app1.cnf
如果最后一行显示下面的结果则各主机之间通信没有问题
[info] All SSH connection tests passed successfully.
检查主从复制是否完好
masterha_check_repl --conf=/etc/mha/app1.cnf
如果最后一行显示下面的结果则各主机之间通信没有问题
MySQL Replication Health is OK.
如果有报错就得看问题解决了
没有问题以后启动MHA Manager
nohup masterha_manager --conf=/etc/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null> /var/log/mha/app1/manager.log 2>&1 &
查看MHA Manager运行状态
masterha_check_status --conf=/etc/mha/app1.cnf
像我这样就是正常运行着
[root@server1 ~]# masterha_check_status --conf=/etc/mha/app1.cnf
app1 (pid:43749) is running(0:PING_OK), master:192.168.121.142
[root@server1 ~]#
这样就完成了
写这篇文档的时候我也有参考别的文章,如有侵权请联系告知删除。