MHA搭建

一、MHA搭建

clipboard.png

三台服务器:

主:221

从:222

从:220,兼职作为manager

除了manager以外所有的节点都是node

node+manager两种类型

1、基础环境准备:

准备好三台linux Redhat 6.5机器

规划好IP地址、配置hosts文件解析主机名

vim /etc/hosts

172.16.88.220 master

172.16.88.221 bakmas

172.16.88.222 slave

配置好本地yum源

关闭iptables 和selinux

三台安装一样版本的mysql数据库-5.7.14rpm和xtrabackup工具2.4.4

2、搭建主从

在主上创建复制用户并授权:

mysql> grant replication slave,replication client on *.* to
'repl'@'172.16.88.%' identified by 'repl';

对主库做全备,并应用,传输到2个从库上

在各个从库上进行恢复,并授权

启动后设置主从关系,开启从库,检查主从状态

修改配置文件vim /etc/my.cnf

log-bin=server

binlog_format=roe

binlog_rows_query_log_events=on

server_id=1/2/3

重启主库

service mysqld restart

查看节点文件

[root@master ~]# cd /usr/local/mysql/data/

[root@master data]# ll

total 122920

-rw-r----- 1 mysql mysql 56 May 1 12:23 auto.cnf

-rw-r----- 1 mysql mysql 330 May 1 15:48 ib_buffer_pool

-rw-r----- 1 mysql mysql 12582912 May 1 15:55 ibdata1

-rw-r----- 1 mysql mysql 50331648 May 1 15:55 ib_logfile0

-rw-r----- 1 mysql mysql 50331648 May 1 12:23 ib_logfile1

-rw-r----- 1 mysql mysql 12582912 May 1 15:55 ibtmp1

drwxr-x--- 2 mysql mysql 4096 May 1 12:23 mysql

-rw-rw---- 1 root root 6 May 1 15:55 mysqld_safe.pid

drwxr-x--- 2 mysql mysql 4096 May 1 12:23 performance_schema

-rw-r----- 1 mysql mysql 154 May 1 15:55 server.000001

-rw-r----- 1 mysql mysql 16 May 1 15:55 server.index

drwxr-x--- 2 mysql mysql 12288 May 1 12:23 sys

确定主从关系

mysql> ? change master to

CHANGE MASTER TO

MASTER_HOST='172.16.88.220',

MASTER_USER='repl',

MASTER_PASSWORD='repl',

MASTER_PORT=3306,

MASTER_LOG_FILE='server.000001',

MASTER_LOG_POS=154,

MASTER_CONNECT_RETRY=10;

mysql> start slave;

查看主从状态

从:

mysql> show slave statusG

*************************** 1. row
***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 172.16.88.220

Master_User: repl

Master_Port: 3306

Connect_Retry: 10

Master_Log_File: server.000001

Read_Master_Log_Pos: 154

Relay_Log_File: bakmas-relay-bin.000003

Relay_Log_Pos: 317

Relay_Master_Log_File: server.000001

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

主:

mysql> show processlist;

clipboard.png

主从库安装node节点软件

[root@master mha_file]# rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm

备主机器安装所有软件

rpm localinstall ./*.rpm

查看/usr/bin有没有生成脚本

[root@bakmas mha_file]# cd /usr/bin/

[root@bakmas bin]# ll |grep "_logs"

-rwxr-xr-x 1 root root 15977 Dec 1 2012 apply_diff_relay_logs

-rwxr-xr-x 1 root root 7401 Dec 1 2012 purge_relay_logs

-rwxr-xr-x 1 root root 7263 Dec 1 2012 save_binary_logs

3、配置免密

三台都需要

主库:

生成rsa秘钥:

[root@master ~]# ssh-keygen -t rsa

[root@master ~]# cd .ssh/

[root@master .ssh]# ll

total 8

-rw------- 1 root root 1675 May 1 16:45 id_rsa//私钥

-rw-r--r-- 1 root root 393 May 1 16:45 id_rsa.pub//公钥

将生成的公钥追加到认证文件中:

cat /root/.ssh/id_rsa.pub >> authorized_keys

修改ssh文件夹和公钥的权限:

chmod 700 /root/.ssh

chmod 600 authorized_keys

将公钥传输到其他2个机器上:

ssh-copy-id -i id_rsa.pub root@slave

ssh-copy-id -i id_rsa.pub root@bakmas

slave:

ssh-copy-id -i id_rsa.pub root@master

ssh-copy-id -i id_rsa.pub root@bakmas

bakmas:

ssh-copy-id -i id_rsa.pub root@master

ssh-copy-id -i id_rsa.pub root@slave

验证三台机器间无密码登录任何一台机器

4、配置监控用户

在master上创建mha监控用户,这样2个从上自动有该用户

mysql> grant all privileges on *.* to 'mha_bakmas'@'172.16.88.%' identified
by 'mha_bakmas';

测试是否成功:

mysql -umha_bakmas -pmha_bakmas -hmaster -P3306

5、配置MHA

在mha-manager上执行:

1、创建mha的工作目录

mkdir -p /etc/masterha

修改相关配置文件app1.cnf

[server default]

manager_workdir=/var/log/masterha/app1

manager_log=/var/log/masterha/app1/manager.log

master_binlog_dir=/var/lib/mysql/data

master_ip_failover_script=/usr/bin/master_ip_failover //失败切换

master_ip_online_change_script=/usr/bin/master_ip_online_change //主动切换

user=mha_monitor //manager 使用这个账号连接各个数据库

password=mha_monitor //manager 使用这个账号密码连接各个数据库

ping_interval=1 //manager 每隔 1 秒钟,探测一下各个节点

remote_workdir=/tmp //指定远端目录

repl_user=repl //各个节点之间的复制账号和密码

repl_password=repl

ssh_user=root

[server1]

hostname=192.168.10.50

#candidate_master=1

port=3306

[server2]

hostname=192.168.10.51

candidate_master=1 //指定2节点优先成为主,假设没有这个选项,默认使用最新的 slave
成为主

check_repl_delay=0 //关闭延迟监测

port=3306

[server3]

hostname=192.168.10.52

port=3306

填充:

[server default]

manager_workdir=/var/log/masterha/app1

manager_log=/var/log/masterha/app1/manager.log

master_binlog_dir=/var/lib/mysql/data

master_ip_failover_script=/usr/bin/master_ip_failover

master_ip_online_change_script=/usr/bin/master_ip_online_change

user=mha_bakmas

password=mha_bakmas

ping_interval=1

remote_workdir=/tmp

repl_user=repl

repl_password=repl

ssh_user=root

[server1]

hostname=172.16.88.220

port=3306

[server2]

hostname=172.16.88.221

candidate_master=1

check_repl_delay=0

port=3306

[server3]

hostname=172.16.88.222

port=3306

2、在从库上关闭自动purge

在2个从节点,设置relay_log_purge=0,不自动清除relay_log,可以利用自带的purge_relay_log脚本实现定时任务自动清理relay
log

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

relay_log_purge=off

read_only=on

3、修改脚本

主库上:

在主库设置虚拟ip

[root@master etc]# ifconfig eth0:1 172.16.88.224/24

bakmas(监控机)上:

master_ip_failover

master_ip_online_change

将脚本放到/usr/bin

修改虚拟地址

[root@bakmas bin]# vim /usr/bin/master_ip_failover

my $vip = '172.16.88.224/24'; # Virtual IP

[root@bakmas bin]# vim /usr/bin/master_ip_online_change

vip=`echo '172.16.88.224/24'` # Virtual IP

manager需要使用这两个脚本,在新的主上启动漂移ip

将这两个中的所有地址改成漂移ip地址就行了

这两个脚本在manager节点上

4、改完之后加上权限

[root@bakmas bin]# chmod +x master_ip_*

上面配置好以后,就可以在 manager 上面执行相关的脚本进行测试

上面的配置就是告诉 manager,我这个集群的基本信息

5、mha检查ssh免密登录:

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

6、mha检查复制

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

7、mha状态检查

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

8、启动 manager:

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master
--ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1
&

建议:在启动manager以前,启动好主从

另开窗口查看监控日志: tail -f /var/log/masterha/app1/manager.log

再次查看监控状态:

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

如何关闭manager监控:

masterha_stop --conf=/etc/masterha/app1.cnf

一主两从

搭建两次从服务器

不建议使用半同步复制

注意几个点:

1、从库都该成read-only模式

2、从库的relay log自动删除功能要关闭

3、三个数据库的server_id必须不一致

log-bin = mysql-bin //要求所有可能成为主库的节点开启二进制日志

relay_log_purge = 0 //要求所有可能成为主库的节点都要配置此项

read_only = 1 //MHA 要求所有 slave 节点配置为 read_only = 1

server-id = 2 //注意主从节点的 server-id 不同

5、安装node和manager软件,这个属于mha软件

安装的时候,需要依赖很多的per软件和Perl库,因此可能会比较麻烦

去下载已经安装好的虚拟机

6、配置互信(配置SSH免密登录)

节点之间可以互相执行命令、拷贝数据,这些都不需要密码。

配置完成互信以后,一定要进行测试。

二、MHA在线|故障切换测试

1、手工在线测试

检查master_ip_online_change脚本中所有虚拟ip是否修改完成。

在线切换步骤:

1、手工停掉mha监控

masterha_stop --conf=/etc/masterha/app1.cnf

2、执行在线切换

masterha_master_switch --conf=/etc/masterha/app1.cnf --master_state=alive
--new_master_host=172.16.88.220 --new_master_port=3306
--orig_master_is_new_slave --running_updates_limit=10000

yes,yes

3、其中参数的意思:

--orig_master_is_new_slave 切换时加上此参数是将原 master 变为 slave
节点,如果不加此参数,原来的 master 将不启动。

--running_updates_limit=10000,故障切换时,候选 master 如果有延迟的话,mha
切换不能成功,加上此参数表示延迟在此时间范围内都可切换(单位为
s),但是切换的时间长短是由 recover 时 relay 日志的大小决定。

在备主和监控机上查看是否完成切换:show processlist;

4、启动MHA manager:

nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master
--ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log
2>&1 &

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

2、故障切换测试

直接在主库上进行failover,杀掉mysqld进程

mysql> shutdown;

Query OK, 0 rows affected (0.01 sec)

mysql> show processlist;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

ERROR 2002 (HY000): Can't connect to local MySQL server through socket
'/var/lib/mysql/mysql.sock' (2)

ERROR:

Can't connect to the server

这时候会自动完成222故障切换,vip的漂移,但是manager进程会自动关闭

注意:

1、MHA里有2个角色,一个是manager节点,一个是node节点,要实现这个MHA,最好是不少于3台机器,一主2从,1台是主,一台当备用master,另一台从机当监控机,一旦主库宕机,备主开始充当主库提供服务,如果旧主上线也不会在成为master了,除非修复完整后强制做主库。

2、一旦发生切换,manager进程将会退出,无法进行再次测试,需要将故障数据库加入到MHA环境中。

宕掉的主库需要进行恢复操作:

常情况下,旧主在修复完整后,可能想把旧主作为新主的slave,这时可以借助当时自动切换时刻的MHA日志来完成对旧主的修复。

3、在manager上查看当时的change master 信息:

# cat /var/log/masterha/app1/manager.log |grep -i "All other slaves should
start"

Fri Dec 30 18:09:35 2016 - [info] All other slaves should start replication

from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.10.51',

MASTER_PORT=3306, MASTER_LOG_FILE='mha-server.000001', MASTER_LOG_POS=154,

MASTER_USER='repl', MASTER_PASSWORD='xxx';

获取上述信息后,在旧主上执行change master to操作,重新设置为新主的从库:

启动从库,查看主从状态

无论什么测试,在切换完成后,注意检查vip的位置,主从的状态信息是否正常,read_only和relay_log_purge的值,要和真实的架构状态对应起来,并且记得在配置文件中进行相应的修改

4、修复好的旧主并没有加入到MHA监控环境中,需要手工加入:

masterha_conf_host --command=add --conf=/etc/masterha/app1.cnf
--hostname=172.16.88.220 --block=server1 --params="no_master=1;ignore_fail=1"

或者是直接手工编辑app1.cnf配置文件添加上该信息,再次检查复制环境:

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

5、Requirements and Limitations

1 这一部分做简要翻译,安装MHA的依赖和限制

2 SSH public key认证

3 仅支持Liunx操作系统

4 只有一台master能被设置成readonly=0,其他设置为只读

5如果是Master1 -> Master2->
Slave3这样的三级复制框架,在配置文件中只需要设置master1和master2这样的二级复制结构,并设置multi_tier_slave=1来支持三级复制结构。

6 MHA仅支持mysql 5.0及以后的版本

7 mysqlbinlog必须是3.3及以上版本

8 log-bin必须在每一个可称为master的mysql服务器上设置

9 所有mysql服务器的复制过滤规则必须一致

10 必须在能成为master的服务器上设置复制账户

11所有Mysql服务器上必须设置relay_log_purge=1,使得能够保存一段时间的relay log

12 基于语句的复制时,不要使用load datainfile命令

原文地址:https://www.cnblogs.com/qluzzh/p/11072194.html