Linux运维——mysql高可用MHA

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服务器上,因此可以保证所有节点的数据一致性。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。

MHA工作原理:

(1)从宕机崩溃的master保存二进制日志事件(binlog events);

(2)识别含有最新更新的slave;

(3)应用差异的中继日志(relay log)到其他的slave;

(4)应用从master保存的二进制日志事件(binlog events);

(5)提升一个slave为新的master;

(6)使其他的slave连接新的master进行复制;

Manager工具包主要包括以下几个工具:

masterha_check_ssh              检查MHA的SSH配置状况
masterha_check_repl             检查MySQL复制状况
masterha_manger                 启动MHA
masterha_check_status           检测当前MHA运行状态
masterha_master_monitor         检测master是否宕机
masterha_master_switch          控制故障转移(自动或者手动)
masterha_conf_host              添加或删除配置的server信息

Node工具包(这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

save_binary_logs                保存和复制master的二进制日志
apply_diff_relay_logs           识别差异的中继日志事件并将其差异的事件应用于其他的slave
filter_mysqlbinlog              去除不必要的ROLLBACK事件(MHA已不再使用这个工具)
purge_relay_logs                清除中继日志(不会阻塞SQL线程)

环境:   一对多复制

server1:172.25.40.1(master,mha-manger,mha-node)
server2:172.25.40.2(slave,mha-node)
server3:172.25.40.3(slave,mha-node)

注:主从复制方式:

1.一对多:配置简单

2.线性复制:可以降低master的开销

eg:server1------>server2------>server3   对于server2master和slave都要激活,因为他也要记录二进制文件推送给server3

一、配置mysql从库『server3』

master【server1】、slave【server2】配置,请查看之前的博客 mysql主从复制

1.安装

[root@server3 ~]# ls                             ##所需安装包
mysql-community-client-5.7.24-1.el7.x86_64.rpm
mysql-community-common-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-5.7.24-1.el7.x86_64.rpm
mysql-community-libs-compat-5.7.24-1.el7.x86_64.rpm
mysql-community-server-5.7.24-1.el7.x86_64.rpm
mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@server3 ~]# yum install * -y
[root@server3 ~]# systemctl start mysqld

2.改密码

[root@server3 ~]# grep password /var/log/mysqld.log                     ##获取初始密码
2019-01-17T13:15:13.898545Z 1 [Note] A temporary password is generated for root@localhost: lF,,:.g96fsa
[root@server3 ~]# mysql_secure_installation    ##安全初始化
Enter password for user root:
New password:

3.下载半同步模块semisync_slave.so

为了尽可能的减少主库硬件损坏宕机造成的数据丢失,在配置MHA的同时建议配置成半同步复制

[root@server3 ~]# mysql -p
Enter password:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';    ##下载半同步slave模块

4.配置主配置文件

[root@server3 ~]# vim /etc/my.cnf


[root@server3 ~]# systemctl restart mysqld

5.加server1为主

[root@server3 ~]# mysql -p
Enter password:
mysql> change master to master_host='172.25.19.1',master_user='repl', master_password='Redhat-1',master_auto_position=1;                           ##用gtid自动
mysql> start slave;            ##开启
mysql> show slave status\G            ##查看slave状态
*************************** 1. row ***************************
 Slave_IO_Running: Yes
 Slave_SQL_Running: No           
  ##数据不一致导致
解决方法:

1)注释并行的代码
[root@server3 ~]# vim /etc/my.cnf


[root@server3 ~]# systemctl restart mysqld
2.关slave
[root@server3 ~]# mysql -pRedhat-1
mysql> stop slave;
3.备份
[root@server1 ~]# mysqldump -u root -p westos > westos.sql                 
Enter password:
[root@server1 ~]# mysqldump -u root -p --set-gtid-purged=OFF westos > westos.sql
Enter password:
[root@server1 ~]# diff westos.sql westos1.sql 17,24d16               ##对比两个文件不同
< SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
< SET @@SESSION.SQL_LOG_BIN= 0;
<
< --
< -- GTID state at the beginning of the backup
< --
<
< SET @@GLOBAL.GTID_PURGED='3472d0a6-1980-11e9-b8d1-525400963735:1-5';  
48d39
< SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
59c50
< -- Dump completed on 2019-01-17 21:30:20
---
> -- Dump completed on 2019-01-17 21:28:01

[root@server1 ~]# scp westos.sql server3:
4.导入
[root@server3 ~]# mysqladmin -u root -pRedhat-1 create westos;     ##建库
[root@server3 ~]# mysql -u root -p westos < westos.sql                 
Enter password:
5.开启slave
[root@server3 ~]# mysql -pRedhat-1
mysql> start slave;

6.加入并行
[root@server3 ~]# vim /etc/my.cnf


[root@server3 ~]# systemctl restart mysqld
7.查看slave状态
[root@server3 ~]# mysql -pRedhat-1
mysql> use westos;
mysql> select * from userlist;

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

二、安装MHA

【server1】manger、node:

[root@server1 MHA-7]# ls
mha4mysql-manager-0.58-0.el7.centos.noarch.rpm         perl-Mail-Sender-0.8.23-1.el7.noarch.rpm
mha4mysql-node-0.58-0.el7.centos.noarch.rpm                perl-Mail-Sendmail-0.79-21.el7.noarch.rpm
perl-Config-Tiny-2.14-7.el7.noarch.rpm                                perl-MIME-Lite-3.030-1.el7.noarch.rpm
perl-Email-Date-Format-1.002-15.el7.noarch.rpm               perl-MIME-Types-1.38-2.el7.noarch.rpm
perl-Log-Dispatch-2.41-1.el7.1.noarch.rpm                           perl-Parallel-ForkManager-1.18-2.el7.noarch.rpm
[root@server1 MHA-7]# yum install * -y

【server2、server3】node:

[root@server2 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm
[root@server3 ~]# yum install mha4mysql-node-0.58-0.el7.centos.noarch.rpm

三、三节点相互免密连接

[root@server1 ~]# ssh-keygen             ##生成私钥、公钥对
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
98:85:ef:f5:55:61:a3:58:da:49:4a:eb:82:96:9d:e2 root@server1
The key's randomart image is:


[root@server1 ~]# cd .ssh/
[root@server1 .ssh]# ls
id_rsa  id_rsa.pub   known_hosts
[root@server1 .ssh]# ssh-copy-id server1
[root@server1 .ssh]# logout
Connection to 172.25.19.1 closed.
[kiosk@foundation19 ~]$ ssh root@172.25.19.1
[root@server1 ~]# scp -r .ssh/ server2:          ##将私钥、公钥发送给其他node
[root@server1 ~]# scp -r .ssh/ server3:
检测:各节点都可以免密登陆
[root@server1 ~]# ssh server1
Last login: Thu Jan 17 23:35:43 2019 from foundation19.ilt.example.com
[root@server1 ~]# logout
Connection to server1 closed.
[root@server1 ~]# ssh server2
Last login: Thu Jan 17 17:23:48 2019 from foundation19.ilt.example.com
[root@server2 ~]# logout
Connection to server2 closed.
[root@server1 ~]# ssh server3
Last login: Thu Jan 17 18:53:40 2019 from foundation19.ilt.example.com
[root@server3 ~]# logout

[root@server2 ~]# ssh server1
Last login: Thu Jan 17 23:36:20 2019 from server1
[root@server1 ~]# logout
Connection to server1 closed.
[root@server2 ~]# ssh server2
Last login: Thu Jan 17 23:36:25 2019 from server1
[root@server2 ~]# logout
Connection to server2 closed.
[root@server2 ~]# ssh server3
Last login: Thu Jan 17 23:36:31 2019 from server1
[root@server3 ~]# logout

[root@server3 ~]# ssh server1
Last login: Thu Jan 17 23:36:50 2019 from server2
[root@server1 ~]# logout
Connection to server1 closed.
[root@server3 ~]# ssh server2
Last login: Thu Jan 17 23:36:54 2019 from server2
[root@server2 ~]# logout

四、配置主从  (原则:每个节点配置完全一样;文件除server-id外全一样)

[server1]
[root@server1 masterha]# mysql -p
Enter password:
mysql> grant all on *.* to root@'%' identified by 'Redhat-1';     ##给root用户所有权限
mysql> flush privileges;    ##生效
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';    ##加半同步slave
mysql> grant replication slave on *.* to repl@'172.25.19.%' identified by 'Redhat-1';   ##给repl复制权限
mysql> flush privileges;     ##生效
[root@server1 masterha]# vim /etc/my.cnf      ##与server3除id外都一样
[root@server1 masterha]# systemctl restart mysqld
[server2]
[root@server2 ~]# mysql -p
Enter password:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
mysql> set global read_only=1;
[root@server2 ~]# vim /etc/my.cnf    ##与server3除id外都一样
[root@server2 ~]# systemctl restart mysqld
[server3]
[root@server3 ~]# mysql -p
Enter password:
mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
Query OK, 0 rows affected (0.48 sec)

mysql> set global read_only=1;

[root@server3 ~]# vim /etc/my.cnf


[root@server3 ~]# systemctl restart mysqld

五、配置MHA-manger

1.创建MHA的工作目录,并且创建相关配置文件(在软件包解压后的目录里面有样例配置文件)

[root@server1 conf]# mkdir /etc/masterha

[root@server1 MHA-7]# tar zxf mha4mysql-manager-0.58.tar.gz

[root@server1 MHA-7]# cd mha4mysql-manager-0.58/samples/conf/
[root@server1 conf]# ls
app1.cnf    masterha_default.cnf
[root@server1 conf]# cp   *    /etc/masterha/
[root@server1 conf]# cd /etc/masterha/
[root@server1 masterha]# ls
app1.cnf  masterha_default.cnf
[root@server1 masterha]# cat app1.cnf  >>masterha_default.cnf

2.修改配置文件

[root@server1 masterha]# vim masterha_default.cnf
[server default]
manager_workdir=/etc/masterha                           
##设置manger工作目录
manager_log=/etc/masterha/manager.log             ##设置manger日志
user=root                        ##设置监控用户
password=Redhat-1     ##监控用户密码
ssh_user=root               ##设置ssh登陆用户名
master_binlog_dir=/var/lib/mysql  ##mysql的数据目录。设置master保存binlog,以便MHA可找到master的日志。
remote_workdir=/tmp            ##设置远端mysql在发生切换时binlog的保存位置
#secondary_check_script= masterha_secondary_check -s remote_host1 -s remote_host2   ##添加谁来做二次检测
ping_interval=1    ##设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover
repl_user=repl     ##设置复制环境中的复制用户名
repl_password=Redhat-1   ##复制用户的密码
#master_ip_failover_script= /usr/local/bin/master_ip_failover      ##设置自动failover时切换脚本
# shutdown_script= /script/masterha/power_manager  ##设置故障发生后关闭故障主机脚本(该脚本的主要作用是关闭主机放在发生脑裂,这里没有使用)
# report_script= /script/masterha/send_report       ##设置发生切换后发送的报警的脚本
#master_ip_online_change_script= /usr/local/bin/master_ip_online_change  ###设置手动failover时切换脚本

[server1]
hostname=172.25.19.1

candidate_master=1
check_repl_delay=0

[server2]
hostname=172.25.19.2
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.19.3
no_master=1

注:MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。在每个节点上都执行mysql -e 'set global relay_log_purge=0'

六、检测

[root@server1 masterha]# masterha_check_ssh --conf=/etc/masterha/masterha_default.cnf   ##检测manger到节点的免密ssh连接状态


[root@server1 masterha]# masterha_check_repl --conf=/etc/masterha/masterha_default.cnf  ##检测整个复制环境状态

七、

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值