• 生活的道路一旦选定,就要勇敢地走到底,决不回头。——左拉
  • 坚强的信心,能使平凡的人做出惊人的事业。——马尔顿
  • 人不可有傲气,但不可无傲骨。 --徐悲鸿
  • 古之立大志者,不惟有超世之才,亦必有坚韧不拔之志。 --苏轼
  • 时间像海绵里的水,只要你愿意挤,总还是有的。 --鲁迅

MHA的原理及搭建(ansible实现)

MySQL zkinogg 2年前 (2020-07-27) 170次浏览 0个评论

一、MHA介绍

准备三台机器:
    第一台:IP:10.0.0.51    db01   2G内存
    第二台:IP:10.0.0.52    db02   2G内存
    第三台:IP:10.0.0.53    db03   2G内存

1.简介

MHA能够在较短的时间内实现自动故障检测和故障转移,通常在10-30秒以内;在复制框架中,MHA能够很好地解决复制过程中的数据一致性问题,由于不需要在现有的replication中添加额外的服务器,仅需要一个manager节点,而一个Manager能管理多套复制,所以能大大地节约服务器的数量;另外,安装简单,无性能损耗,以及不需要修改现有的复制部署也是它的优势之处。

MHA还提供在线主库切换的功能,能够安全地切换当前运行的主库到一个新的主库中(通过将从库提升为主库),大概0.5-2秒内即可完成。

MHA由两部分组成:MHA Manager(管理节点)和MHA Node(数据节点)。MHA Manager可以独立部署在一台独立的机器上管理多个Master-Slave集群,也可以部署在一台Slave上。当Master出现故障时,它可以自动将最新数据的Slave提升为新的Master,然后将所有其他的Slave重新指向新的Master。整个故障转移过程对应用程序是完全透明的。

#在切换过程我们可以查看日志

2.原理

1.把宕机的master二进制日志保存下来。
2.找到binlog位置点最新的slave。
3.在binlog位置点最新的slave上用relay-log(差异日志)修复其它slave。
4.将宕机的master上保存下来的二进制日志恢复到含有最新位置点的slave上。
5.将含有最新位置点binlog所在的slave提升为master。
6.将其它slave重新指向新提升的master,并开启主从复制。

3.架构

1.MHA属于C/S结构
2.一个manager节点可以管理多套集群
3.集群中所有的机器都要部署node节点
4.node节点才是管理集群机器的
5.manager节点通过ssh连接node节点,管理
6.manager可以部署在集群中除了主库以外的任意一台机器上

4.工具

1)manager节点的工具

#解压tar包,查看
[root@db01 ~]# ll mha4mysql-manager-0.56/bin/
#检查主从状态
masterha_check_repl
#检查ssh连接(配置免密)
masterha_check_ssh
#检查MHA状态
masterha_check_status
#删除死掉机器的配置
masterha_conf_host
    [server2]
    hostname=10.0.0.52
    port=3306

    [server3]
    hostname=10.0.0.53
    port=3306

#启动程序
masterha_manager
#检测master是否宕机
masterha_master_monitor
#手动故障转移
masterha_master_switch
#建立TCP连接从远程服务器
masterha_secondary_check
#关闭进程的程序
masterha_stop

2)node节点工具

#解压node安装包

[root@db01 ~]# ll mha4mysql-node-0.56/bin/
#对比relay-log
apply_diff_relay_logs
#防止回滚事件
filter_mysqlbinlog
#删除relay-log
purge_relay_logs
#保存binlog
save_binary_logs

5.MHA优点

1)Masterfailover and slave promotion can be done very quickly
自动故障转移快

2)Mastercrash does not result in data inconsistency
主库崩溃不存在数据一致性问题

3)Noneed to modify current MySQL settings (MHA works with regular MySQL)
不需要对当前mysql环境做重大修改

4)Noneed to increase lots of servers
不需要添加额外的服务器(仅一台manager就可管理上百个replication)

5)Noperformance penalty
性能优秀,可工作在半同步复制和异步复制,当监控mysql状态时,仅需要每隔N秒向master发送ping包(默认3秒),所以对性能无影响。你可以理解为MHA的性能和简单的主从复制框架性能一样。

6)Works with any storage engine
只要replication支持的存储引擎,MHA都支持,不会局限于innodb

二、搭建MHA

1.保证主从的状态

#主库
mysql> show master status;

#从库
mysql> show slave status\G
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

#从库
mysql> show slave status\G
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

2.部署MHA之前配置

1.关闭从库删除relay-log的功能
relay_log_purge=0

2.配置从库只读
read_only=1

3.从库保存binlog
log_slave_updates

#禁用自动删除relay log 功能
mysql> set global relay_log_purge = 0;
#设置只读
mysql> set global read_only=1;
#编辑配置文件
[root@mysql-db02 ~]# vim /etc/my.cnf
#在mysqld标签下添加
[mysqld]
#禁用自动删除relay log 永久生效
relay_log_purge = 0

3.配置

1)主库配置

[root@db01 ~]# vim /etc/my.cnf
[mysqld]
server_id=1
log_bin=/usr/local/mysql/data/mysql-bin
gtid_mode=on
enforce_gtid_consistency
log-slave-updates
relay_log_purge=0
read_only=1

2)从库01配置

[root@db02 ~]# vim /etc/my.cnf
[mysqld]
server_id=2
log_bin=/usr/local/mysql/data/mysql-bin
gtid_mode=on
enforce_gtid_consistency
log-slave-updates
relay_log_purge=0
read_only=1

3)从库02配置

[root@db03 ~]# vim /etc/my.cnf
[mysqld]
server_id=3
log_bin=/usr/local/mysql/data/mysql-bin
gtid_mode=on
enforce_gtid_consistency
log-slave-updates
relay_log_purge=0
read_only=1

4.部署MHA

1)安装依赖(所有机器)

[root@db01 ~]# yum install perl-DBD-MySQL -y
[root@db02 ~]# yum install perl-DBD-MySQL -y
[root@db03 ~]# yum install perl-DBD-MySQL -y

2)安装manager依赖(manager机器,10.0.0.53)

[root@db03 ~]# yum install -y perl-Config-Tiny epel-release perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes

3)部署node节点

[root@db01 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# rz mha4mysql-node-0.56-0.el6.noarch.rpm

[root@db01 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db02 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum localinstall -y mha4mysql-node-0.56-0.el6.noarch.rpm

4)部署manager节点

[root@db03 ~]# rz mha4mysql-manager-0.56-0.el6.noarch.rpm
[root@db03 ~]# yum local-install -y mha4mysql-manager-0.56-0.el6.noarch.rpm 

5)配置MHA

#创建MHA配置目录
[root@db03 ~]# mkdir -p /service/mha

#配置MHA
[root@db03 ~]# vim /service/mha/app1.cnf
[server default]
#指定日志存放路径
manager_log=/service/mha/manager
#指定工作目录
manager_workdir=/service/mha/app1
#binlog存放目录
master_binlog_dir=/usr/local/mysql/data
#MHA管理用户
user=mha
#MHA管理用户的密码
password=mha
#检测时间
ping_interval=2
#主从用户
repl_user=rep
#主从用户的密码
repl_password=123
#ssh免密用户
ssh_user=root

[server1]
hostname=172.16.1.51
port=3306

[server2]
#candidate_master=1
#check_repl_delay=0
hostname=172.16.1.52
port=3306

[server3]
hostname=172.16.1.53
port=3306

#设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库,即使这个主库不是集群中事件最新的slave。
candidate_master=1
#默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0

6)创建MHA管理用户

#主库执行即可
mysql> grant all on *.* to mha@'172.16.1.%' identified by 'mha';
Query OK, 0 rows affected (0.03 sec)

7)ssh免密(三台机器每一台都操作一下内容)

#创建秘钥对
[root@db01 ~]# ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
#发送公钥,包括自己
[root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.51
[root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.52
[root@db01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.53

8)检测MHA状态

#检测主从
[root@db03 ~]# masterha_check_repl --conf=/service/mha/app1.cnf
MySQL Replication Health is OK.

#检测ssh
[root@db03 ~]# masterha_check_ssh --conf=/service/mha/app1.cnf
Mon Jul 27 11:40:06 2020 - [info] All SSH connection tests passed successfully.

9)启动MHA

#启动
[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &

nohup ... &                     #后台启动
masterha_manager                #启动命令
--conf=/service/mha/app1.cnf         #指定配置文件
--remove_dead_master_conf        #移除挂掉的主库配置
--ignore_last_failover           #忽略最后一次切换
< /dev/null > /service/mha/manager.log 2>&1

#MHA保护机制:
    1.MHA主库切换后,8小时内禁止再次切换
    2.切换后会生成一个锁文件,下一次启动MHA需要检测该文件是否存在

5.报错总结

1)报错1:

#原因:
    从库没有rep用户
#解决方式:
    主库再次授权rep用户
    从库配置rep用户

2)报错2:

#原因:
    连接时被反向解析
#解决方式:
    [root@db01 ~]# vim /etc/my.cnf
    skip-name-resolve

3)报错3:

#原因:
    从库库没有开启保存binlog
#解决方式:
    [root@db01 ~]# vim /etc/my.cnf
    log-slave-updates

6.测试MHA

#停掉主库

#查看MHA的日志

#登录数据库查看状态

三、恢复MHA

1.修复数据库

[root@db01 ~]# systemctl start mysqld.service

2.恢复主从

#将恢复的数据库当成新的从库加入集群
#找到binlog位置点
[root@db03 ~]# grep 'CHANGE MASTER' /service/mha/manager | awk -F: 'NR==1 {print $4}'
 CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='xxx';

#恢复的数据库执行change master to
mysql> CHANGE MASTER TO MASTER_HOST='172.16.1.52', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='rep', MASTER_PASSWORD='123';
Query OK, 0 rows affected, 2 warnings (0.20 sec)

mysql> start slave;
Query OK, 0 rows affected (0.05 sec)

3.恢复MHA

#将恢复的数据库配置到MHA配置文件
[root@db03 ~]# vim /service/mha/app1.cnf 
......
[server1]
hostname=172.16.1.51
port=3306

[server2]
hostname=172.16.1.52
port=3306

[server3]
hostname=172.16.1.53
port=3306
......

#启动MHA
[root@db03 ~]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &

4.恢复脚本

[root@db01 ~]# vim start_mha.sh
#!/bin/bash
#判断主库数据库是否挂掉
mysql_pid=`ps -ef | grep [m]ysqld | wc -l`

#如果挂掉则重启,如果没挂则杀掉重启
if [ $mysql_pid -eq 0 ];then
    systemctl start mysqld
else
    pkill mysqld
    systemctl start mysqld
fi

sleep 3

#获取change master to语句
change=`ssh 172.16.1.53 "grep 'CHANGE MASTER TO' /service/mha/manager | tail -1 | sed 's#xxx#123#g'" | awk -F: '{print $4}'`

#重启的数据库执行change master to
mysql -uroot -p123 -e "$change;start slave"

#修复MHA配置文件
ssh 172.16.1.53 "\cp /service/mha/app1.cnf.bak /service/mha/app1.cnf"

#远程启动MHA
ssh 172.16.1.53 "nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &"

四.主库宕机,binlog如何保存

1.如果主库宕机,binlog如何保存

1)配置MHA实时备份binlog

[root@db03 ~]# vim /service/mha/app1.cnf
[root@db03 ~]# vim /service/mha/app1.cnf
......
[binlog1]
no_master=1
hostname=172.16.1.53
#不能跟当前机器数据库的binlog存放目录一样
master_binlog_dir=/root/binlog/

2)创建binlog存放目录

[root@db03 ~]# mkdir binlog

3)手动执行备份binlog

#进入该目录
[root@db03 ~]# cd /root/binlog/
#备份binlog
[root@db03 binlog]# mysqlbinlog  -R --host=172.16.1.52 --user=mha --password=mha --raw --stop-never mysql-bin.000001 &

4)重启MHA

[root@db03 binlog]# masterha_stop --conf=/service/mha/app1.cnf
Stopped app1 successfully.

[root@db03 binlog]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &

5)主库添加数据查看binlog

#主库
mysql> create database mha;
Query OK, 1 row affected (0.01 sec)

[root@db02 ~]# ll /usr/local/mysql/data/mysql-bin.000008 
-rw-rw---- 1 mysql mysql 67576 Jul 28 10:33 /usr/local/mysql/data/mysql-bin.000008

#MHA机器查看binlog
[root@db03 binlog]# ll
total 96
-rw-rw---- 1 root root   852 Jul 28 10:30 mysql-bin.000001
-rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000002
-rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000003
-rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000004
-rw-rw---- 1 root root   465 Jul 28 10:30 mysql-bin.000005
-rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000006
-rw-rw---- 1 root root   214 Jul 28 10:30 mysql-bin.000007
-rw-rw---- 1 root root 67576 Jul 28 10:33 mysql-bin.000008

五.vip漂移

1.VIP漂移的两种方式

1.keeplaived的方式
2.MHA自带的脚本进行VIP漂移

2.配置MHA读取VIP漂移脚本

#编辑配置文件
[root@db03 ~]# vim /service/mha/app1.cnf
#在[server default]标签下添加
[server default]
#使用MHA自带脚本
master_ip_failover_script=/service/mha/master_ip_failover

3.编写脚本

#默认脚本存放在
[root@db01 ~]# ll mha4mysql-manager-0.56/samples/scripts/
total 32
-rwxr-xr-x 1 4984 users  3648 Apr  1  2014 master_ip_failover

#上传现成的脚本

#编辑脚本
[root@db03 mha]# vim master_ip_failover
.......
my $vip = '172.16.1.50/24';
my $key = '1';
my $ssh_start_vip = "/sbin/ifconfig eth1:$key $vip";
my $ssh_stop_vip = "/sbin/ifconfig eth1:$key down";
......

4.手动绑定VIP

[root@db01 ~]# ifconfig eth1:1 172.16.1.50/24
[root@db01 ~]# ip a
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:2c:76:88 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.51/24 brd 172.16.1.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet 172.16.1.50/24 brd 172.16.1.255 scope global secondary eth1:1
       valid_lft forever preferred_lft forever
    inet6 fe80::de8c:34e1:563e:9f2b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

#解绑VIP
[root@db01 ~]# ifconfig eth1:1 [172.16.1.50] down

5.重启MHA

#启动MHA
[root@db03 mha]# nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager.log 2>&1 &

#启动失败:
    1.检查配置文件语法是否正确
    2.授权是否正确
        [root@db03 mha]# chmod 755 master_ip_failover
    3.脚本格式要正确
        [root@db03 mha]# dos2unix master_ip_failover 
        dos2unix: converting file master_ip_failover to Unix format ...

6.测试VIP漂移

#停止主库
[root@db01 ~]# systemctl stop mysqld.service

#查看切换成主库的ip地址
[root@db02 ~]# ip a
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:3e:56:1f brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.52/24 brd 172.16.1.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever
    inet 172.16.1.50/24 brd 172.16.1.255 scope global secondary eth1:1
       valid_lft forever preferred_lft forever
    inet6 fe80::de8c:34e1:563e:9f2b/64 scope link tentative noprefixroute dadfailed 
       valid_lft forever preferred_lft forever
    inet6 fe80::a3a8:499:ce26:b3be/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

六.ansible从二进制安装到实现MHA

# 1.准备文件
[root@m01 files]# ll
total 393884
-rw-r--r-- 1 root root       551 Jul 27 15:49 app1.cnf # MHA配置文件
-rw-r--r-- 1 root root       481 Jul 27 15:57 lj.sh    # db010203免密连接脚本
-rw-r--r-- 1 root root     87119 Jul  1 18:08 mha4mysql-manager-0.56-0.el6.noarch.rpm #manager安装包
-rw-r--r-- 1 root root     36326 Jul  1 18:10 mha4mysql-node-0.56-0.el6.noarch.rpm #noarch安装包
-rw-r--r-- 1 root root 403177622 Jul  9 08:59 mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
 #mysql5.6.46二进制包
-rw-r--r-- 1 root root       325 Jul  9 09:49 mysqld.service # mysql启动脚本
-rwxr-xr-x 1 root root     10565 Jul  9 09:17 mysql.server   # mysql启动脚本 
-rw-r--r-- 1 root root        39 Jul  9 09:45 mysql.sh       # mysql环境变量


[root@m01 templates]# ll
total 4
-rw-r--r-- 1 root root 1719 Jul 27 15:11 my-default.cnf.j2  #mysql主配置文件
[root@m01 templates]# cat my-default.cnf.j2 
[mysqld]
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
socket = /usr/local/mysql/mysql.sock
{% if ansible_fqdn == 'db01' %}
server_id = 1
log-slave-updates
relay_log_purge=0
read_only=1
skip_name_resolve
log_bin=/usr/local/mysql/data/mysql-bin
{% elif ansible_fqdn == 'db02' %}
server_id = 2
log_bin=/usr/local/mysql/data/mysql-bin
log-slave-updates
relay_log_purge=0
read_only=1
skip_name_resolve
{% else %}
server_id = 3
log_bin=/usr/local/mysql/data/mysql-bin
log-slave-updates
relay_log_purge=0
read_only=1
skip_name_resolve
{% endif %}
[client]
socket = /usr/local/mysql/mysql.sock

2.准备hosts文件
[root@m01 roles]# cat hosts 
[db_group]
db01 ansible_ssh_host=172.16.1.51 mysql_role=master server_id=1
db02 ansible_ssh_host=172.16.1.52 mysql_role=slave server_id=2
db03 ansible_ssh_host=172.16.1.53 mysql_role=slave server_id=3-



[root@m01 tasks]# cat Push_mysql.yml 
- name: yum rely on #安装依赖
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - ncurses-devel
    - libaio-devel
    - autoconf
  when: ansible_fqdn is match 'db*'

- name: useradd mysql  #创建mysql用户
  user:
    name: mysql
    shell: /sbin/nologin
    create_home: false
    state: present
  when: ansible_fqdn is match 'db*'

- name: Unarchive mysql tgz  #解压mysql二进制安装包
  unarchive:
    src: mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
    dest: /usr/local/
    owner: mysql
    group: mysql
  tags: unarchive
  when: ansible_fqdn is match 'db*'

- name: Link mysql      #做软链接
  file:
    src: /usr/local/mysql-5.6.46-linux-glibc2.12-x86_64
    dest: /usr/local/mysql
    owner: mysql
    group: mysql
    state: link
  when: ansible_fqdn is match 'db*'

- name: mysql config overwrite   #推mysql主配置文件
  template:
    src: my-default.cnf.j2
    dest: /etc/my.cnf
  when: ansible_fqdn is match 'db*'

- name: Push sh mysql server     #推mysql启动脚本
  copy: 
    src: mysql.server
    dest: /etc/init.d/mysqld
  when: ansible_fqdn is match 'db*'

- name: initialization mysql    #初始化
  shell: 'cd /usr/local/mysql/scripts/ && ./mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --socket=/usr/local/mysql/mysql.sock'
  when: ansible_fqdn is match 'db*'

- name: Push mysql sh     #推环境变量文件
  copy: 
    src: mysql.sh
    dest: /etc/profile.d/mysql.sh
  when: ansible_fqdn is match 'db*'

- name: source            # 刷新环境变量
  shell: 'source /etc/profile'
  when: ansible_fqdn is match 'db*'

- name: Push mysqld service    # 推mysql的systemd启动脚本 
  copy:
    src: mysqld.service
    dest: /usr/lib/systemd/system/mysqld.service
  when: ansible_fqdn is match 'db*'

- name: daemon reload        #重启systemd
  shell: 'systemctl daemon-reload'
  when: ansible_fqdn is match 'db*'

- name: start mysqld       #开启mysqld服务
  service:
    name: mysqld
    state: started
    enabled: true
  when: ansible_fqdn is match 'db*'

- name: Yum Phthon          #安装mysql python
  yum:
    name: MySQL-python
    state: present
  when: ansible_fqdn is match 'db*'

- name: Update Root User Password  #添加root用户及密码
  mysql_user:
    name: root
    password: '123'
    login_unix_socket: /usr/local/mysql/mysql.sock
    update_password: always
    host: 'localhost'
    priv: '*.*:ALL,GRANT'
    state: present
  when: ansible_fqdn is match 'db*'

- name: Create rep User   #创建主从复制rep用户并授权
  mysql_user:
    login_user: root
    login_password: '123'
    login_unix_socket: /usr/local/mysql/mysql.sock
    login_host: 'localhost'
    name: rep
    password: '123'
    host: '172.16.1.%'
    priv: '*.*:replication slave'
    state: present

- name: Get master            #获取主库信息
  mysql_replication:
    mode: getmaster
    login_user: root
    login_password: '123'
    login_unix_socket: /usr/local/mysql/mysql.sock
    login_host: 'localhost'
  register: master_status


- name: check slave for replication    #获取从库信息
  mysql_replication:
    login_user: root
    login_password: '123'
    login_unix_socket: /usr/local/mysql/mysql.sock
    mode: getslave
  ignore_errors: true
  register: slave
  when: ansible_fqdn is match 'db*'

- name: change master to slave         #从库填写主库binlog信息
  mysql_replication:
    mode: changemaster
    login_user: root
    login_password: '123'
    login_unix_socket: /usr/local/mysql/mysql.sock
    login_host: 'localhost'
    master_host: '172.16.1.51'
    master_user: rep
    master_password: '123'
    master_log_file: "{{ hostvars['db01']['master_status']['File'] }}"
    master_log_pos: "{{ hostvars['db01']['master_status']['Position'] }}"
  when: mysql_role is match 'slave*'

- name: start slave                #开启主从复制
  mysql_replication:
    mode: startslave
    login_user: root
    login_password: '123'
    login_unix_socket: /usr/local/mysql/mysql.sock
    login_host: 'localhost'
  when: mysql_role is match 'slave*'


[root@m01 mysql]# cat tasks/Mha.yml 
- name: yum DBD mysql                   #安装MHA依赖
  yum:
    name: perl-DBD-MySQL
    state: present

- name: yum manager packages             #安装MHA服务依赖包
  yum:
    name: "{{ item }}"
    state: present
  loop:
    - perl-Config-Tiny
    - epel-release
    - perl-Log-Dispatch
    - perl-Parallel-ForkManager
    - perl-Time-HiRes
  when: ansible_fqdn == 'db03'

- name: Push node                           #推送node包
  copy:
    src: mha4mysql-node-0.56-0.el6.noarch.rpm
    dest: /root/mha4mysql-node-0.56-0.el6.noarch.rpm

- name: yum node                             #安装node包
  yum:
    name: mha4mysql-node-0.56-0.el6.noarch.rpm
    state: present

- name: Push manager                           #推送服务端 manager包
  copy:
    src: mha4mysql-manager-0.56-0.el6.noarch.rpm
    dest: /root/mha4mysql-manager-0.56-0.el6.noarch.rpm
  when: ansible_fqdn == 'db03'

- name: yum manager                             #服务端安装manager包
  yum:
    name: mha4mysql-manager-0.56-0.el6.noarch.rpm
    state: present
  when: ansible_fqdn == 'db03'

- name: mkdir mha directory                              #创建mha目录
  file:
    path: /service/mha
    state: directory
  when: ansible_fqdn == 'db03'

- name: Push mha config                               #推送MHA配置文件
  copy:
    src: app1.cnf
    dest: /service/mha/app1.cnf
  when: ansible_fqdn == 'db03'

- name: Create mha User                            #创建MHA数据库用户并授权
  mysql_user:
    login_user: root
    login_password: 123
    login_unix_socket: /usr/local/mysql/mysql.sock
    login_host: 'localhost'
    name: mha
    password: 'mha'
    host: '172.16.1.%'
    priv: '*.*:ALL'
  when: ansible_fqdn is match 'db01'

- name: Push lj sh                                  #推送免密连接脚本
  copy:
    src: lj.sh
    dest: /root/
    mode: 0755
  when: ansible_fqdn is match 'db*'

- name: sh lj sh                                   #执行免密连接脚本
  shell: '/bin/sh lj.sh'
  when: ansible_fqdn is match 'db*'

- name: test ssh                                      #检测ssh连接状态
  shell: 'masterha_check_ssh --conf=/service/mha/app1.cnf'
  when: ansible_fqdn == 'db03'

- name: test master slave                                #检测主从状态
  shell: 'masterha_check_repl --conf=/service/mha/app1.cnf'
  when: ansible_fqdn == 'db03'

- name: start mha                                        #开启MHA
  shell: 'nohup masterha_manager --conf=/service/mha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /service/mha/manager 2>&1 &'
  when: ansible_fqdn == 'db03'

查看当前主从状态:

 

 

 

 

 

 

 

 

 

 

查看MHA日志

 

 

 

 

 

 

 

 

 

 

主库停掉mysql服务

 

 

 

观察MHA日志主库从51切换到了52

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

再次查看53的主从状态。发现主库信息变成了52.。MHA启动成功


极客公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:MHA的原理及搭建(ansible实现)
喜欢 (0)
[17551054905]
分享 (0)

您必须 登录 才能发表评论!