mysql-MHA架构

MHA目前是MYSQL高可用方面相对成熟的解决方案,是一套优秀的作为mysql高可用环境下故障切换和主从提升的高可用软件。在mysql故障切换过程中,MHA能做到在0-30m之内自动完成数据库的故障切换操作,并且在 进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

该软件由两分布组成:管理结点和数据结点。管理结点可以单独部署在一台独立的机器上管理多个master-slave集群,也可以部署在一台slave节点上。MHA Node运行在每台mysql服务器上,管理结点会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master。整个故障转移过程对应用程序完全透明。

在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据不丢失,但这并不总是可行的。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库。

MHA工作原理:

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

2.识别含有最新更新的slave

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

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

5.提升一个slave为新的master

6.使其他的slave连接新的master进行复制

MHA软件由两部分组成,Manager工具包和Node工具包

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

1

2

3

4

5

6

7

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工具包

1

2

3

4

save_binary_logs            保存和复制master的二进制日志

apply_diff_relay_logs       识别和差异的中继日志事件并将其差异的事件应用于其他的slave

filter_mysqlbinlog            去除不必要的ROLLBACK事件(MHA已不再使用这个工具)

purge_relay_logs             清除中继日志(不会阻塞sql线程)

操作:

环境,准备三台服务器  三台虚拟机都要做

1.时间同步  

1

echo "*/5 * * * * /usr/sbin/ntpdate ntpl.aliyun.com >/dev/null 2>&1"  >>/var/spool/cron/root

2.hosts解析  在做hosts解析前可以修改一下主机名   三台虚拟机都要修改

1

2

vim /etc/hostname

cen701

修改好了之后需要关机重启

1

2

3

4

5

cat >>/etc/hosts<<EOF

cen701 10.0.0.41  三台服务器的ip

cen702 10.0.0.43

cen703 10.0.0.44

<<EOF

互相配置ssh免密登录

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

yum -y install sshpass

 

vim test.sh

#!/bin/bash

UserName=root

IPlist=(10.0.0.41 10.0.0.43 10.0.0.44)

ssh-keygen -t dsa -f ~/.ssh/id_dsa -P "" &>/dev/nu11

for in ${IPlist[*]}

      do

      sshpass -p "123456" ssh-copy-id -i ~/.ssh/id_dsa.pub -p 22 -o StrictHostKeyChecking=no $UserName@$i &>/dev/nu11

done

 

保存退出之后执行

sh test.sh

我们可以验证一下

ssh root@10.0.0.44  看看是否还要输入密码不输入就证明正确

 2.安装mysql   三台服务器都需要安装

1

2

3

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm

rpm -ivh mysql-community-release-el7-5.noarch.rpm

yum install mysql-server -y<br><br>启动<br>systemctl restart mysql<br><br>修改密码<br>mysql<br>>update mysql.user set password=password('123456') where user='root' and host='localhost';<br>>flush privileges;

3.编辑配置文件  第一台master的配置

1

2

3

4

5

6

7

8

9

10

11

第一台  master主机<br>vim /etc/my.cnf

 

[mysqld]

server-id=1

log-bin=mysql-bin

#禁止mysql自动删除relaylog工能

relay_log_purge = 0

#mysql5.6已上的特性,开启gtid,必须主从全开

gtid_mode = on

enforce_gtid_consistency = 1

log_slave_updates = 1<br>skip-name-resolve<br>重启mysql<br>systemctl restart mysql<br>

4.创建同步的用户

1

2

3

mysql -uroot -p123456

mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';

mysql> flush privileges;

查看mysql主库的master状态

1

mysql> show master status\G;

 查看gid的状态

 

1

mysql> show global variables like '%gtid%';

 

 

 

 

5.编辑配置文件  第二台服务器从的操作

1

2

3

4

5

6

7

8

9

10

11

vim /etc/my.cnf

 

[mysqld]

server-id=2

log-bin=mysql-bin

#禁止mysql自动删除relaylog工能

relay_log_purge = 0

#mysql5.6已上的特性,开启gtid,必须主从全开

gtid_mode = on

enforce_gtid_consistency = 1

log_slave_updates = 1<br>skip-name-resolve<br>重启mysql<br>systemctl restart mysql

创建同步用户

1

2

3

mysql -uroot -p123456

mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';

mysql> flush privileges;

关闭从服务器的复制功能

1

2

mysql -uroot -p123456

mysql> stop slave;

配置从服务器指向master

1

2

3

4

5

6

change master to

master_host='10.0.0.41',

master_user='rep',

master_password='123456',

master_log_file='mysql-bin.0000001',

master_log_pos=530;

开启从服务器的复制功能

1

mysql>start slave;

检查从服务器的复制功能

1

mysql>show slave status \G;

 

 

 

6.编辑第三台的配置文件 

1

2

3

4

5

6

7

8

9

10

11

12

13

vim /etc/my.cnf

 

[mysqld]

server-id=3

log-bin=mysql-bin

#禁止mysql自动删除relaylog工能

relay_log_purge = 0

#mysql5.6已上的特性,开启gtid,必须主从全开

gtid_mode = on

enforce_gtid_consistency = 1

log_slave_updates = 1<br>skip-name-resolve

重启mysql

systemctl restart mysql

创建同步的用户

1

2

3

mysql -uroot -p123456

mysql> grant replication slave on *.* to 'rep'@'10.0.0.%' identified by '123456';

mysql> flush privileges;

关闭从服务器的复制功能

1

2

mysql -uroot -p123456

mysql> stop slave;

配置从服务器指向master

1

2

3

4

5

6

change master to

master_host='10.0.0.41',

master_user='rep',

master_password='123456',

master_log_file='mysql-bin.0000001',

master_log_pos=530;

开启从服务器的复制功能

1

2

3

mysql>start slave;

检查从服务器的复制功能状态

mysql> show slave status \G;

7.安装MHA   所有节点都需要操作

  安装依赖

1

2

yum install perl-DBD-MySQL -y

yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

 授权MHA管理用户

1

2

mysql>grant all privileges on *.* to mha@'10.0.0.%' identified by 'mha';

mysql>flush privileges;

 安装MHA node节点

1

2

上传mha4mysql-node-0.58-0.el7.centos.noarch

rpm -ivh mha4mysql-node-0.58-0.el7.centos.noarch.rpm

 安装MHA管理节点  这里选择第三台服务器

1

2

上传mha4mysql-manager-0.58-0.el7.centos.noarch

rpm -ivh mha4mysql-manager-0.58-0.el7.centos.noarch.rpm

 配置MHA

1

2

3

mkdir -p /etc/mha

mkdir -p /var/log/mha/app1

vim /etc/mha/app1.cnf<br>[server default]<br>manager_log=/var/log/mha/app1/manager.log<br>manager_workdir=/var/log/mha/app1<br>master_binlog_dir=/var/lib/mysql #binlog的目录,如果说miysql的环境不一样,binlog位置不同,每台服务器的binlog的位置写在server标签里面即可<br>user=mha<br>password=mha<br>ping_interval=2<br>repl_password=123456<br>repl_user=rep<br>ssh_user=root<br><br>[server1]<br>hostname=10.0.0.41

1

port=3306<br><br>[server2]<br>hostname=10.0.0.43

1

<em id="__mceDel">port=3306<br><br>[server3]<br>hostname=</em><em id="__mceDel">10.0.0.44<br></em>

1

<em id="__mceDel">port=3306<br>ignore_fail=1  #如果这个节点挂了,mha将不可用,加上这个参数,slave挂了一样可以用<br>no_master=1  #从不将这台主机转换为master</em>

启动测试

ssh检查测试

1

masterha_check_ssh --conf=/etc/mha/app1.cnf

 

 

 

1

masterha_check_repl --conf=/etc/mha/app1.cnf

 可以之后 需要启动

1

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 &

查看进程

1

ps -ef|grep mha

 

 

 

查看状态

1

masterha_check_status --conf=/etc/mha/app1.cnf

 

 

 接下来可以测试MHA故障转移

     停掉cen701的主库10.0.0.41

1

systemctl stop mysql

  查看cen703的状态,看看Master_Host是否变成了第二台服务器的ip

1

mysql -uroot -p123456 -e 'show slave status\G;'

  

 

 

      查看cen702的master状态

1

mysql -uroot -p123456 -e 'show master status;'

 

 

 回到第三台服务器我们查看一下我们添加的内容

1

cat /etc/mha/app1.cnf

 

 

 我们发现这时候 我们server1的标签已经没有了,这是因为我们mha帮我们完成了这个效果

8.故障还原

在第三台服务器上我们查看一下故障

1

grep "CHANGE MASTER TO MASTER"  /var/log/mha/app1/manager.log | tail -1<br>

 

 

 回到第一台服务器

1

2

3

4

5

6

重启mysql

systemctl restart mysql

这里是第三台服务器报的提示<br>

mysql -uroot -p123456 -e "CHANGE MASTER TO MASTER_HOST='10.0.0.43', MASTER_PORT=3306, <br>MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123456';"<br>

mysql -uroot -p123456 -e 'start slave;'

mysql -uroot -p123456 -e 'show slave status\G;'

 

 

配置vip飘逸

   首先我们需要MHA的脚本  可以参考我的另一个博客

    https://www.cnblogs.com/lny916/articles/12342605.html    重命名为master_ip_failover.sh

将脚本放到 /usr/bin下并且给上权限  chmod +x /usr/bin/master_ip_failover.sh

修改配置文件  

1

2

3

4

vim /etc/mha/app1.cnf

 

添加上一行

master_ip_failover_script=/usr/bin/master_ip_failover

模拟主库宕机vip飘逸

现在我们的cen702是master 所以现在需要在第二台服务器上操作

1

2

3

4

手动添加vip

ifconfig ens33:1 10.0.0.100/24    和MHAvip飘逸的脚本里面的vip保持一致

ip a show ens33

这时候就可以发现已经多了一个vip100了<br>此时关闭mysql<br>systemctl stop mysql<br>vip飘逸会有延迟几秒,此时可以再查看一下ens33<br>ip a show ens33<br>此时的vip已经去了cen701上面了<br>V

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值