MHA实现Mysql半同步高可用

一、MHA介绍

1、MHA两部分组成

MHA 由两部分组成: MHA Manager(管理节点)和 MHA Node(数据节点)。 MHA Manager可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。

2、MHA实现原理

原理:

MHA(Master High Availability)是现在解决mysql高可用的一个相对成熟的方案

它是由两部分组成,管理端(master manager)和节点端(node manager),管理端可以单独布置在一台机器上,整个mysql主从集群就是它的各个节点,

管理端对所有节点进行监控,当master宕机之后,管理端会根据自己配置文件里的设定,将某一个从节点升为主节点,(如果没有设置,它会自己比对,将最新数据的节点升为主节点),然后将其他节点自动指向提升上来的新的主节点,在提升的过程中,所有结点之间必须可以无密码ssh连接,管理端可以对所有的节点ssh无密码连接.

在MHA自动故障切换的过程中,如果宕掉的 master 无法ssh连接上,则无法同步最新的二进制日志,也就无法获得最新的数据,造成数据丢失,因此,为了避免这中情况发生,MHA一般配合半同步复制.可以最大程度的保存数据.

为了避免在更换主节点时同步日志出错(pos模式下更换节点,日志同步会出错),我们开启GTID模式

目前MHA支持一主多从,整个MHA架构最少有三个节点,一台master 一台slave做备用master 一台slave只做同步,当然,为了充分利用资源,集群可以做读写分离(master做写操作,slave做读操作)

二、实验环境

 server1:172.25.12.1(安装 MHA)
 server2:172.25.12.2(Mysql Master)
 server3:172.25.12.3(Mysql Slave)
 server4:172.25.12.4(Mysql Slave)

三、Mysql 安装

mysql-community-client.x86_64 0:5.7.17-1.el6 mysql-community-common.x86_64 0:5.7.17-1.el6 mysql-community-libs.x86_64 0:5.7.17-1.el6

mysql-community-libs-compat.x86_64 0:5.7.17-1.el6 mysql-community-server.x86_64 0:5.7.17-1.el6 

1,在server2,3,4上面安装mysql


/etc/init.d/mysqld restart
 grep password /var/log/mysqld.log          #在日志里面查找临时密码
 mysql_secure_installation             #通过临时密码修改密码

2、设置server-id(server2,3,4)

所有节点配置文件都一样,除了里面的参数 server-id 其他的都必须一致,因为所有节点都有可能升至master

 vim /etc/my.cnf
 server-id=2                       #id需要唯一
 log-bin=mysql-bin
 gtid_mode=ON
 enforce-gtid-consistency=true
 /etc/init.d/mysqld restart       #修改完以后需要重新启动

 四、半同步复制安装

1、在master中授权

 mysql> grant REPLICATION SLAVE on *.* to repl@'172.25.12.%' identified by 'GAOyu123...';
 mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      446 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

2、在slave启动serve3,4

 mysql> change master to master_host='172.25.12.2',master_user='repl',master_password='GAOyu123...',master_log_file='mysql-bin.000001',master_log_pos=446;
   #master_log_file 和master_log_pos参考server2
 mysql> start slave;
 mysql> show slave status\G;                #查询的信息中2个必须为yes
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes 

3、开启master(server2)

 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
 mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1;
 mysql> show status like 'Rpl_semi_sync_master_status';                     ###查询主是否开启成功
 +-----------------------------+-------+
 | Variable_name               |       |
 | Value                       |       |
 +-----------------------------+-------+
 | Rpl_semi_sync_master_status | ON    |
 |                             |       |
 +-----------------------------+-------+

4、开启slave(serve3、4)

 mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
 mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1;
 mysql> STOP SLAVE IO_THREAD;
 mysql> START SLAVE IO_THREAD;
 mysql> show status like 'Rpl_semi_sync_slave_status';                    ###查询从是否开启成功
 +----------------------------+-------+
 | Variable_name              |       |
 | Value                      |       |
 +----------------------------+-------+
 | Rpl_semi_sync_slave_status | ON    |
 |                            |       |
 +----------------------------+-------+

五、SSH 无密码连接

MHA manager 通过 SSH 访问所有的 node 节点,各个 node 节点也同样需要通过 SSH 来相互发送不同的 relay log文件,所以有必要在每一个node和manager上配置SSH无密码登陆。MHAmanager可通过 masterha_check_ssh 脚本检测 SSH 连接是否配置正常。

1、在server1中生成key

 ssh-keygen
#一路回车

2、在server1中把公钥和私钥发送给 server2.3.4

 scp /root/.ssh/id_rsa /root/.ssh/id_rsa.pub [email protected]:/root/.ssh/
 #如果没有目录则自己创建这个目录

3、server2.3.4 执行

 ssh-copy-id -i /root/.ssh/id_rsa.pub root@IP

六、安装

MHA Manager可以单独部署在一台独立的机器上管理多个 master-slave 集群,也可以部署在一台 slave 节点上。

1,安装MHA Node(数据节点)

yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm

2、依赖性

 perl-Config-Tiny-2.12-7.1.el6.noarch.rpm
 perl-Email-Date-Format-1.002-5.el6.noarch.rpm
 perl-Log-Dispatch-2.27-1.el6.noarch.rpm
 perl-Mail-Sender-0.8.16-3.el6.noarch.rpm
 perl-Mail-Sendmail-0.79-12.el6.noarch.rpm
 perl-MailTools-2.04-4.el6.noarch.rpm
 perl-MIME-Lite-3.027-2.el6.noarch.rpm
 perl-MIME-Lite-HTML-1.23-2.el6.noarch.rpm
 perl-MIME-Types-1.28-2.el6.noarch.rpm
 perl-Parallel-ForkManager-0.7.9-1.el6.noarch.rpm
 perl-Params-Validate-0.92-3.el6.x86_64.rpm
 perl-TimeDate-1.16-13.el6.noarch.rpm

3、安装MHAMHA Manager(管理节点)

 yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm

 七、配置 MHA

1、配置

创建配置文件及其目录:

mkdir /etc/mha
vim /etc/mha/mha.conf
[server default]
manager_workdir=/usr/local/mha      
#设置manager的工作目录

manager_log=/usr/local/mha/mha.log  
#设置manager的日志

master_binlog_dir=/var/lib/mysql    
#设置master 保存binlog的位置,以便MHA可以找到master的日志,我这里的也就是mysql的数据目录

user=root                   
#设置监控用户root,这个用户在mysql里存在

password=GAOyu123...           
#设置mysql中监控用户的那个密码

ping_interval=1             
#设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回应的时候自动进行railover

remote_workdir=/tmp         
#设置远端mysql在发生切换时binlog的保存位置

repl_user=repl              
#设置同步用户mha

repl_password=GAOyu123...      
#设置mha的密码

ssh_user=root               
#设置ssh的登录用户名

[server2]                 
hostname=172.25.12.2
port=3306

[server3]
hostname=172.25.12.3
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

[server4]
hostname=172.25.12.4
port=3306
#no_master=1             #一定不会是master

测试

(1)master(server2) down 掉

 /etc/init.d/mysqld stop

(2)在 server3查看slave状态

 mysql> show slave status\G;
 *************************** 1. row ***************************
 Slave_IO_State: Waiting for master to send event
 Master_Host: 172.25.12.3
 Master_User: repl
 Master_Port: 3306
 Connect_Retry: 60

猜你喜欢

转载自blog.csdn.net/u010489158/article/details/81538971
今日推荐