mysql基于主从同步的MHA高可用集群:详细实战版

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 工作原理

主库宕机处理过程

  1. 监控节点 (通过配置文件获取所有节点信息)
    系统,网络,SSH连接性
    主从状态,重点是主库

  2. 选主
    (1) 如果判断从库(position或者GTID),数据有差异,最接近于 Master 的 slave,成为备选主
    (2) 如果判断从库(position或者GTID),数据一致,按照配置文件顺序,选主.
    (3) 如果设定有权重(candidate_master=1),按照权重强制指定备选主.

    1. 默认情况下如果一个 slave 落后 master 100M的 relay logs 的话,即使有权重,也会失效.
    2. 如果 check_repl_delay=0 的话,即使落后很多日志,也强制选择其为备选主
  3. 数据补偿
    (1) 当SSH能连接,从库对比主库 GTID 或者 position 号,立即将二进制日志保存至各个从节点并且应用( save_binary_logs )
    (2) 当SSH不能连接, 对比从库之间的relaylog的差异( apply_diff_relay_logs )

  4. 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 ~]# 

这样就完成了

写这篇文档的时候我也有参考别的文章,如有侵权请联系告知删除。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值