前言:
在生产环境中,数据库对于一个企业是至关重要的,因此我们应该做到生产中的mysql高可用,从而实现假如有一台数据库宕机,别的机器会自动代替宕机的服务器的工作,从而实现数据库的快速切换,避免单点故障,从而保证业务的正常运行。MHA就可以很好的实现这一功能。
MHA(Master High Availability)是一套相对成熟的MySQL高可用方案,能做到在0~30s内自动完成数据库的故障切换操作,在master服务器不宕机的情况下,基本能保证数据的一致性。
它由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台MySQL服务器上,MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。
MHA工作原理 1 从宕机崩溃的master保存二进制日志事件(binlog events) 2 识别含有最新更新的slave 3 应用差异的中继日志(relay log)到其他的slave 4 应用从master保存的二进制日志事件(binlog events) 5 提升一个slave为新的master 6 使其他的slave连接新的master进行复制
MHA Manager 工具包:
1. masterha_check_ssh:检查MHA的SSH配置状况 2. masterha_check_repl:检查MySQL的复制状况 3. masterha_manager:启动MHA 4. masterha_check_status:检测当前MHA运行状态 5. masterha_master_monitor:检测master是否宕机 6. masterha_master_switch:控制故障转移(自动或手动) 7. masterha_conf_host:添加或删除配置的server信息 8. masterha_stop:关闭MHA 搭建环境准备:
1:四台centos7主机
mha manager 172.18.253.189
master 172.18.254.235
candidate master (slave1) 172.18.254.144
slave2 172.18.254.109
master对外提供写服务,备选master提供读服务,slave1也提供相关的读服务,一旦master宕机,将会把备选master1提升为新的master,slave2指向新的master
2:MHA manager 下载安装MHA
mha4mysql-manager-0.56-0.el6.noarch.rpm
在所有机器上安装
mha4mysql-node-0.56-0.el6.noarch.rpm 由于MHA网址受到防火墙限制,所以可以在放到了个人网盘中,http://pan.baidu.com/s/1boS31vT,有需要的可自行下载。
实验步骤:
1:配置时间同步
#mha服务器上ntpServer
[root@mha ~]# vim /etc/ntp.conf
restrict 127.0.0.1 #限制可以同步的主机
restrict ::1
restrict 172.18.0.0 mask 255.255.255.0
server 127.127.1.0 #以该主机的时间为标准
[root@mha ~]#systemctl restart ntpd
[root@mha ~]#systemctl restart ntpd #开机自启动
#其他三台主机ntpclient
以master举例
[root@master ~]# vim /etc/ntp.conf
server 172.18.153.7 iburst #确认ntpserver
[root@master ~]# ntpdate 172.18.153.7 #生效
2:配置四台机器彼此ssh免密登陆
[root@mha ~]# cd .ssh/
[root@mha .ssh]# ssh-keygen
[root@mha .ssh]# ssh-copy-id localhost 主要是生成authorized_keys 文件
[root@mha ~]# rsync -rav /root/.ssh root@172.18.254.235:/root/
[root@mha ~]# rsync -rav /root/.ssh root@172.18.254.144:/root/
[root@mha ~]# rsync -rav /root/.ssh root@172.18.254.209:/root/
另外配置ssh首次连接某主机不要询问yes
[root@mha ~]# vim /etc/ssh/ssh_config
StrictHostKeyChecking no
另外三个主机同上设置
3:配置主从服务器
#mysql master
[root@master ~]# vim /etc/my.cnf
[mysqld]
server_id=1
datadir=/mysql/data
innodb_file_per_table
socket=/var/lib/mysql/mysql.sock
log_bin=/mysql/logbin/master-bin
binlog_format=row
skip_name_resolve
[root@master ~]# systemctl restart mariadb.service
[root@master ~]# mysql
MariaDB [(none)]> show master status;
+-------------------+-----------+
| Log_name | File_size |
+-------------------+-----------+
| master-bin.000001 | 245 |
+-------------------+-----------+
MariaDB [(none)]> grant replication slave on *.* to repluser@'172.18.%.%' identified by 'centos';
#MySQL slave1与MySQLslave2一样
[root@slave ~]# vim /etc/my.cnf
[mysqld]
server_id=2
datadir=/mysql/data
log_bin=/mysql/logbin/slave-log
read_only=1
relay_log_purge=0
skip_name_resolve=1
[root@slave ~]# systemctl restart mariadb.service
[root@slave ~]# mysql
MariaDB [(none)]> CHANGE MASTER TO
-> MASTER_HOST='172.18.254.235',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='master-bin.000001',
-> MASTER_LOG_POS=245,
-> MASTER_CONNECT_RETRY=10;
MariaDB [(none)]> start slave;
MariaDB [(none)]> show slave status\G;(没有异常说明主从配置成功)
4:配置mha
创建mha统一管理帐号
Master [(none)]> grant all on *.* to mhauser@'172.18.%.%' identified by 'centos';
Query OK, 0 rows affected (0.00 sec)
#安装mha软件包,需要epel源
[root@mha ~]# yum -y localinstall mha4mysql-*
#在其他三个节点上安装node
[root@master ~]# yum -y localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
[root@slave1 ~]# yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
[root@slave2 ~]# yum localinstall mha4mysql-node-0.56-0.el6.noarch.rpm
#配置mha
[root@mha ~]# mkdir /etc/mha
[root@mha ~]# vim /etc/mha/app1.conf
[server default]
user=mhauser #设置监控用户
password=centos #设置监控用户的密码
manager_workdir=/data/mastermha/app1/ #设置manager的工作目录
manager_log=/data/mastermha/app1/manager.log #设置manager的日志
master_logbin_dir=/mysql/logbin #master上用于存储binary日志的全路径。这个参数用于当master上mysql死掉后,通过ssh连到mysql服务器上,找到需要binary日志事件
remote_workdir=/data/mastermha/app1/ #设置远端mysql在发生切换时binlog的保存位置
ssh_user=root #设置ssh的登录用户名
repl_user=repluser #设置复制环境中的复制用户名
repl_password=centos#设置复制用户的密码
ping_interval=1 #设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候进行自动fail
[server1]
hostname=172.18.254.235 #配置MySQL服务器的机器名或是IP地址,这个配置项是必须的,而且只能配置在[server_xxx]这个块下面。
candidate_master=1
[server2]
hostname=172.18.254.144
candidate_master=1 #备用master
[server3]
hostname=172.18.254.209
5:检查mha
#mha manage
[root@mha ~]# masterha_check_ssh --conf=/etc/mha/app1.conf
[root@mha ~]# masterha_check_repl --conf=/etc/mha/app1.conf
6:运行mha
#mha manage
[root@mha ~]# nohup masterha_manager --conf=/etc/mha/app1.conf > mharun.log & #放到后端运行,把运行结果放到文件里,检测文件
7:模拟故障,直接对master关机在mha进行日志检查
[root@mha ~]# tailf /data/mastermha/app1/manager.log
Started automated(non-interactive) failover.
The latest slave 172.18.254.144(172.18.254.144:3306) has all relay logs for recovery.
Selected 172.18.254.144(172.18.254.144:3306) as a new master.
172.18.254.144(172.18.254.144:3306): OK: Applying all logs succeeded.
172.18.254.209(172.18.254.209:3306): This host has the latest relay log events.
Generating relay diff files from the latest slave succeeded.
172.18.254.209(172.18.254.209:3306): OK: Applying all logs succeeded. Slave started, replicating from 172.18.254.144(172.18.254.144:3306)
172.18.254.144(172.18.254.144:3306): Resetting slave info succeeded.
Master failover to 172.18.254.144(172.18.254.144:3306) completed successfully.
^C[1]+ 完成 nohup masterha_manager --conf=/etc/mha/app1.conf > mharun.log
8:在切换成功后,再开启旧的主,将旧的主设置为从。
#在slave1 进入mysql
MariaDB [(none)]> show master status;
+------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------+----------+--------------+------------------+
| bin.000007 | 375 | | |
+------------+----------+--------------+------------------+
[root@master ~]# vim /etc/my.cnf
增加以下两行
read_only=ON
relay_log_purge=0
[root@master ~]# systemctl restart mariadb.service
Master [(none)]> CHANGE MASTER TO
-> MASTER_HOST='172.18.254.144',
-> MASTER_USER='repluser',
-> MASTER_PASSWORD='centos',
-> MASTER_PORT=3306,
-> MASTER_LOG_FILE='slave-log.000003',
-> MASTER_LOG_POS=375,
-> MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.05 sec)
Master [(none)]> start slave;
Query OK, 0 rows affected (0.00 sec)
完成了mysql的高可用。