MHA实现mysql的高可用集群

时间:2022-07-22
本文章向大家介绍MHA实现mysql的高可用集群,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言:

        在生产环境中,数据库对于一个企业是至关重要的,因此我们应该做到生产中的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 statusG;(没有异常说明主从配置成功)

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的高可用。