MySQL MHA架构介绍:
MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由
日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下
故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~30秒之内自动完成
数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,
以达到真正意义上的高可用。
该软件由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。
MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。
MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,
它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障
转移过程对应用程序完全透明。
在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,
但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行
故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与
半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于
其他所有的slave服务器上,因此可以保证所有节点的数据一致性。
实验环境:mysql5.7版本、虚拟机6.5版本、3台主机配置mha
实验:
一、mysql实现主从复制
1、初始配置
server1、2、3:
关闭数据库
/etc/init.d/mysqld stop
设置开机不开启
chkconfig mysqld off
chkconfig --list mysqld
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
删除数据库配置信息
cd /var/lib/mysql
rm -fr *
编辑配置文件
vim /etc/my.cnf
29 server_id=1 ##server2、server3分别改为2和3
30 gtid_mode=ON
31 enforce_gtid_consistency=ON
32 master_info_repository=TABLE
33 relay_log_info_repository=TABLE
34 log_slave_updates=ON
35 log_bin=binlog
36 binlog_format=ROW
开启数据库
/etc/init.d/mysqld start
查看数据库初始密码
grep password /var/log/mysqld.log
数据库安全设置(修改密码,第一个选项press,其他填y)
mysql_secure_installation
登陆
mysql -p
2、数据库配置(实现主从复制)
设置master
server1:
mysql> show master status;
设置授权
mysql> grant replication slave on *.* to repl@'172.25.10.%' identified by'Wxj14370902!';
mysql> show databases;
重置master
mysql> reset master;
设置slave
server2、3:
同步授权
mysql> change master to master_host='172.25.61.1',master_user='repl',master_password='Wxj14370902!',master_auto_position=1;
开启slave
mysql> start slave;
查看能否实现主从复制
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
检测:
master端:
建立库
mysql> create database haha;
slave端:
查看是否同步
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| haha |
| mysql |
| performance_schema |
| sys |
+--------------------+
二、mha实现mysql高可用
1、mha配置
server1:
[root@server1 ~]# yum install mha4mysql-manager-0.56-0.el6.noarch.rpm perl-* -y
[root@server1 ~]# mkdir -p /etc/masterha
[root@server1 ~]# cd /etc/masterha/
编辑脚本
[root@server1 masterha]# vim app1.cnf
[root@server1 ~]# cat /etc/masterha/app1.cnf
[server default]
manager_workdir=/etc/masterha/ //设置manager的工作目录
manager_log=/etc/masterha/app1.log //设置manager的日志
master_binlog_dir=/var/log/mysql //设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录
#master_ip_failover_script= /usr/local/bin/master_ip_failover //设置自动failover时候的切换脚本
#master_ip_online_change_script= /usr/local/bin/master_ip_online_change //设置手动切换时候的切换脚本
password=Wxj14370902! //设置mysql中root用户的密码,这个密码是前文中创建监控用户的那个密码
user=root //设置监控用户root
ping_interval=1 //设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
remote_workdir=/tmp //设置远端mysql在发生切换时binlog的保存位置
repl_password=Wxj14370902! //设置复制用户的密码
repl_user=repl //设置复制环境中的复制用户名
#report_script=/usr/local/send_report //设置发生切换后发送的报警的脚本
#secondary_check_script= /usr/local/bin/masterha_secondary_check -s server03 -s server02
#shutdown_script="" //设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
ssh_user=root //设置ssh的登录用户名
[server1]
hostname=172.25.10.1
port=3306
[server2]
hostname=172.25.10.2
port=3306
#candidate_master=1 //设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave
#check_repl_delay=0 //默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
[server3]
hostname=172.25.10.3
port=3306
server2、3:
yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
2、免密连接
server1:
创建密钥
[root@server1 masterha]# ssh-keygen
[root@server1 ~]# ssh-copy-id server1
[root@server1 ~]# ssh-copy-id 172.25.10.1/2/3
将密钥发送至server2、server3
[root@server1 ~]# scp -r .ssh/ server2:
[root@server1 ~]# scp -r .ssh/ server3:
尝试连接
ssh server1/2/3
logout
ssh 172.25.10.2/3
logout
[root@server1 ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf
3、集群配置
server1:
[root@server1 masterha]# mysql -p
mysql> grant all on *.* to root@'%' identified by 'Wxj14370902!';
mysql> grant replication slave on *.* to repl@'172.25.61.%' identified by 'Wxj14370902!';
server2、3:
mysql> set GLOBAL read_only=1;
查看集群状态
[root@server1 masterha]# masterha_check_repl --conf=/etc/masterha/app1.cnf
Sat Aug 11 11:09:30 2018 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Sat Aug 11 11:09:30 2018 - [info] Reading application default configuration from /etc/masterha/app1.cnf..
Sat Aug 11 11:09:30 2018 - [info] Reading server configuration from /etc/masterha/app1.cnf..
Sat Aug 11 11:09:30 2018 - [info] MHA::MasterMonitor version 0.56.
Sat Aug 11 11:09:30 2018 - [info] GTID failover mode = 1
Sat Aug 11 11:09:30 2018 - [info] Dead Servers:
Sat Aug 11 11:09:30 2018 - [info] Alive Servers:
Sat Aug 11 11:09:30 2018 - [info] 172.25.10.1(172.25.10.1:3306)
Sat Aug 11 11:09:30 2018 - [info] 172.25.10.2(172.25.10.2:3306)
Sat Aug 11 11:09:30 2018 - [info] 172.25.10.3(172.25.10.3:3306)
Sat Aug 11 11:09:30 2018 - [info] Alive Slaves:
Sat Aug 11 11:09:30 2018 - [info] 172.25.10.2(172.25.10.2:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled
Sat Aug 11 11:09:30 2018 - [info] GTID ON
Sat Aug 11 11:09:30 2018 - [info] Replicating from 172.25.10.1(172.25.10.1:3306)
Sat Aug 11 11:09:30 2018 - [info] 172.25.10.3(172.25.10.3:3306) Version=5.7.17-log (oldest major version between slaves) log-bin:enabled
Sat Aug 11 11:09:30 2018 - [info] GTID ON
Sat Aug 11 11:09:30 2018 - [info] Replicating from 172.25.10.1(172.25.10.1:3306)
Sat Aug 11 11:09:30 2018 - [info] Current Alive Master: 172.25.10.1(172.25.10.1:3306)
Sat Aug 11 11:09:30 2018 - [info] Checking slave configurations..
Sat Aug 11 11:09:30 2018 - [info] Checking replication filtering settings..
Sat Aug 11 11:09:30 2018 - [info] binlog_do_db= , binlog_ignore_db=
Sat Aug 11 11:09:30 2018 - [info] Replication filtering check ok.
Sat Aug 11 11:09:30 2018 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Sat Aug 11 11:09:30 2018 - [info] Checking SSH publickey authentication settings on the current master..
Sat Aug 11 11:09:30 2018 - [info] HealthCheck: SSH to 172.25.10.1 is reachable.
Sat Aug 11 11:09:30 2018 - [info]
172.25.10.1(172.25.10.1:3306) (current master)
+--172.25.10.2(172.25.10.2:3306)
+--172.25.10.3(172.25.10.3:3306)
Sat Aug 11 11:09:30 2018 - [info] Checking replication health on 172.25.10.2..
Sat Aug 11 11:09:30 2018 - [info] ok.
Sat Aug 11 11:09:30 2018 - [info] Checking replication health on 172.25.10.3..
Sat Aug 11 11:09:30 2018 - [info] ok.
Sat Aug 11 11:09:30 2018 - [warning] master_ip_failover_script is not defined.
Sat Aug 11 11:09:30 2018 - [warning] shutdown_script is not defined.
Sat Aug 11 11:09:30 2018 - [info] Got exit code 0 (Not master dead).
MySQL Replication Health is OK.
4、检测
手动切换:
在线切换(两台主机都好着)
masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive --new_master_host=172.25.10.1 --new_master_port=3306 --orig_master_is_new_slave
故障切换(当把主master的mysql进程关闭时,切换到slave当master)
masterha_master_switch --master_state=dead --conf=/etc/masterha/app1.cnf --dead_master_host=172.25.10.1 --dead_master_port=3306 --new_master_host=172.25.10.2 --new_master_port=3306 --ignore_last_failover
自动切换:
监控命令
nohup master_manager --conf=/etc/masterha/app1.cnf --ignore_last_failover &
关闭mysql进程
ps ax
3091 pts/0 S 0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --soc
3388 pts/0 Sl 0:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --
[root@server2 ~]# kill -9 3091
[root@server2 ~]# kill -9 3388
监控命令自动结束,master自动切换
在其他主机使用命令查看master切换至哪台主机、并且查看本机IO进程和SQL进程是否为yes
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes