mysql之MHA架构
角色 成都创新互联公司-专业网站定制、快速模板网站建设、高性价比铜鼓网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式铜鼓网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖铜鼓地区。费用合理售后完善,10年实体公司更值得信赖。 | Ip地址 | 主机名 | Server id | 类型 |
master | 192.168.1.131 | master1 | 1 | 主(写) |
Master(candicate) | 192.168.1.132 | Master2 | 2 | 从(读) |
Slave | 192.168.1.133 | Slave1 | 3 | 从(读) |
Manager | 192.168.1.134 | Manager | 管理节点 |
准备基础环境:
1.在配置好IP地址后检查selinux,iptables设置,关闭selinux,iptables服务以便后期主从同步不出错,时间要同步
2. 在四台机器上配置epelyum和用到perl包
[root@master1 ~]# yum -y install epel-rpm-macros.noarch
[root@master1 ~]# yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Config-IniFiles ncftp perl-Params-Validate perl-CPAN perl-Test-Mock-LWP.noarch perl-LWP-Authen-Negotiate.noarch perl-devel perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
3. 配置hosts环境
[root@master1 ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.131 master1
192.168.1.132 master2
192.168.1.133 slave1
192.168.1.134 manager
[root@master1 ~]# for i in master2 slave1 manager; do scp /etc/hosts $i:/etc/ ;done
4. 建立ssh交互登录环境,四台都要做
[root@master1 ~]# ssh-keygen -t rsa
[root@master1 ~]# for i in master1 master2 slave1 manager ;do ssh-copy-id -i ~/.ssh/id_rsa.pub $i;done
配置mysql的半同步复制
为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置 MHA 的同时建议配置成MySQL的半同步复制。
注:mysql 半同步插件是由谷歌提供,具体位置/usr/local/mysql/lib/plugin/下,一个是master
用的 semisync_master.so,一个是slave用的semisync_slave.so,下面我们就来具体配置一下。如果不清楚Plugin的目录,用如下查找:
mysql> show variables like '%plugin_dir%';
+---------------+------------------------------+
| Variable_name | Value |
+---------------+------------------------------+
| plugin_dir | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+
1 row in set (0.01 sec)
1、 分别在主从节点上安装相关的插件(master, Candicate master,slave)
在 MySQL 上安装插件需要数据库支持动态载入。检查是否支持,用如下检测
mysql> show variables like '%have_dynamic_loading%';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| have_dynamic_loading | YES |
+----------------------+-------+
所有 mysql 数据库服务器,安装半同步插件(semisync_master.so,semisync_slave.so)
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
检查 Plugin 是否已正确安装:
mysql> show plugins;
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| ngram | ACTIVE | FTPARSER | NULL | GPL |
| rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL |
| rpl_semi_sync_slave | ACTIVE | REPLICATION | semisync_slave.so | GPL |
+----------------------------+----------+--------------------+--------------------+---------+
或
mysql> select * from information_schema.plugins;
查看半同步相关信息
mysql> show variables like '%rpl_semi_sync%';
+-------------------------------------------+------------+
| Variable_name | Value |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled | OFF |
| rpl_semi_sync_master_timeout | 10000 |
| rpl_semi_sync_master_trace_level | 32 |
| rpl_semi_sync_master_wait_for_slave_count | 1 |
| rpl_semi_sync_master_wait_no_slave | ON |
| rpl_semi_sync_master_wait_point | AFTER_SYNC |
| rpl_semi_sync_slave_enabled | OFF |
| rpl_semi_sync_slave_trace_level | 32 |
+-------------------------------------------+------------+
2. 修改mysql配置文件,设置主从同步
[root@master1 ~]# vim /etc/my.cnf
server-id = 1
log-bin=mysql-bin
binlog_format=mixed
log-bin-index=mysql-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
relay_log_purge=0
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
rpl_semi_sync_master_enabled=1 1 表是启用,0表示关闭
rpl_semi_sync_master_timeout=10000:毫秒单位 ,该参数主服务器等待确认消息10秒后,
不再等待,变为异步方式。
[root@master2 ~]# vim /etc/my.cnf
server-id = 2
log-bin=mysql-bin
binlog_format=mixed
log-bin-index=mysql-bin.index
relay_log_purge=0
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=10000
rpl_semi_sync_slave_enabled=1
注:relay_log_purge=0,禁止SQL线程在执行完一个relay log后自动将其删除,对于MHA
场景下,对于某些滞后从库的恢复依赖于其他从库的 relay log,因此采取禁用自动删除功能
[root@slave1 ~]# vim /etc/my.cnf
Server-id = 3
log-bin = mysql-bin
relay-log = relay-bin
relay-log-index = slave-relay-bin.index
read_only = 1
rpl_semi_sync_slave_enabled=1
在master上查看半同步相关信息
mysql> show variables like '%rpl_semi_sync%';
查看半同步状态:
mysql> show status like '%rpl_semi_sync%';
rpl_semi_sync_master_status :显示主服务是异步复制模式还是半同步复制模式
rpl_semi_sync_master_clients :显示有多少个从服务器配置为半同步复制模式
rpl_semi_sync_master_yes_tx :显示从服务器确认成功提交的数量
rpl_semi_sync_master_no_tx :显示从服务器确认不成功提交的数量
rpl_semi_sync_master_tx_avg_wait_time :事务因开启semi_sync,平均需要额外等待的时间
rpl_semi_sync_master_net_avg_wait_time :事务进入等待队列后,到网络平均等待时间
主从同步
Master1主机
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';
mysql> show master status;
第一条 grant 命令是创建一个用于主从复制的帐号,在master和candicate master的主机上创建即可。
第二条 grant 命令是创建MHA管理账号,所有mysql服务器上都需要执行。MHA会在配置文件里要求能远程登录到数据库,所以要进行必要的赋权。
Master2主机
mysql> grant replication slave on *.* to rep@'192.168.1.%' identified by '123';
mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';
mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;
mysql> start slave;
mysql> show slave slave;
Slave1主机
mysql> grant all privileges on *.* to manager@'192.168.1.%' identified by '123';
mysql> change master to master_host='192.168.1.131',master_port=3306,master_user='rep',master_password='123',master_log_file='mysql-bin.000001',master_log_pos=739;
mysql> start slave;
mysql> show slave status\G;
查看 master1 服务器的半同步状态
mysql> show status like '%rpl_semi_sync%';
配置mysql-mha
在所有数据库节点上安装 mha4mysql-node-0.56.tar.gz
[root@master1 ~]# tar zxf mha4mysql-node-0.56.tar.gz
[root@master1 ~]# cd mha4mysql-node-0.56/
[root@master1 mha4mysql-node-0.56]# perl Makefile.PL
[root@master1 mha4mysql-node-0.56]# make &&make install
其他两个数据节点也安装 mha4mysql-node-0.56.tar.gz(过程略)
在管理节点需要两个都安装:mha4mysql-node-0.56.tar.gz 和mha4mysql-manager-0.56.tar.gz
[root@manager ~]# tar zxf mha4mysql-node-0.56.tar.gz
[root@manager ~]# cd mha4mysql-node-0.56/
[root@manager mha4mysql-node-0.56]# perl Makefile.PL
[root@manager mha4mysql-node-0.56]# make && make install
[root@manager mha4mysql-node-0.56]# cd
[root@manager ~]# tar zxf mha4mysql-manager-0.56.tar.gz
[root@manager ~]# cd mha4mysql-manager-0.56/
[root@manager mha4mysql-manager-0.56]# perl Makefile.PL
[root@manager mha4mysql-manager-0.56]# make &&make install
[root@manager mha4mysql-manager-0.56]# mkdir /etc/masterha
[root@manager mha4mysql-manager-0.56]# mkdir -p /masterha/app1
[root@manager mha4mysql-manager-0.56]# mkdir /scripts
[root@manager mha4mysql-manager-0.56]# cp samples/conf/* /etc/masterha/
[root@manager mha4mysql-manager-0.56]# cp samples/scripts/* /scripts/
[root@manager mha4mysql-manager-0.56]# vim /etc/masterha/app1.cnf
[server default]
manager_workdir=/masterha/app1
manager_log=/masterha/app1/manager.log
user=manager
password=123
ssh_user=root
repl_user=rep
repl_password=123
ping_interval=1
[server1]
hostname=192.168.1.131
port=3306
master_binlog_dir=/usr/local/mysql/data
candidate_master=1
[server2]
hostname=192.168.1.132
port=3306
master_binlog_dir=/usr/local/mysql/data
candidate_master=1
[server3]
hostname=192.168.1.133
port=3306
master_binlog_dir=/usr/local/mysql/data
no_master=1
保存退出
[root@manager mha4mysql-manager-0.56]# > /etc/masterha/masterha_default.cnf
manager_workdir=/masterha/app1 //设置manager的工作目录
manager_log=/masterha/app1/manager.log //设置manager的日志
user=manager //设置监控用户manager
password=123456 //监控用户manager的密码
ssh_user=root //ssh 连接用户
repl_user=mharep //主从复制用户
repl_password=123.abc //主从复制用户密码
ping_interval=1 //设置监控主库,发送ping包的时间间隔,默认是3秒,尝试三次没有回
应的时候自动进行 railover
master_binlog_dir=/usr/local/mysql/data //设置master保存binlog的位置,以便MHA可
以找到 master 的日志,我这里的也就是mysql的数据目录
candidate_master=1 //设置为候选master,如果设置该参数以后,发生主从切换以后将会
将此从库提升为主库。
ssh有效性验证:
[root@manager mha4mysql-manager-0.56]# masterha_check_ssh --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
正确显示结果没有报错
集群复制的有效性验证(mysql必须都启动):
[root@manager mha4mysql-manager-0.56]# masterha_check_repl --global_conf=/etc/masterha/masterha_default.cnf --conf=/etc/masterha/app1.cnf
命令执行完最后报错的地方
解决办法在所有服务器上执行:
[root@manager mha4mysql-manager-0.56]# ln -s /usr/local/mysql/bin/* /usr/local/bin/
启动manger
[root@manager ~]# nohup masterha_manager --conf=/etc/masterha/app1.cnf &> /tmp/mha_mager.log &
[1] 1319
状态检查
[root@manager ~]# masterha_check_status --conf=/etc/masterha/app1.cnf
app1 (pid:1319) is running(0:PING_OK), master:192.168.1.131
故障转移验证:
1. 停掉master1
[root@master1 mha4mysql-node-0.56]# service mysqld stop
2. 查看MHA日志
[root@manager ~]# tail -f /masterha/app1/manager.log
3. 登录slave1的mysql查看slave状态
mysql> show slave status\G;
MHA Manager 端日常主要操作步骤
1)检查是否有下列文件,有则删除。
发生主从切换后,MHAmanager 服务会自动停掉,且在manager_workdir(/masterha/app1)
目录下面生成文件 app1.failover.complete,若要启动MHA,必须先确保无此文件)
[root@manager ~]# ll /masterha/app1/
total 24
-rw-r--r-- 1 root root 0 Aug 8 02:02 app1.failover.complete
-rw-r--r-- 1 root root 20955 Aug 8 02:02 manager.log
[root@manager ~]# rm -rf /masterha/app1/app1.failover.complete
2)检查MHA复制检查:(需要把master1设置成candicatade的从服务器)
mysql> CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='123';
mysql> start slave;
3)停止MHA:masterha_stop --conf=/etc/masterha/app1.cnf
4)启动MHA:
#nohup masterha_manager --conf=/etc/masterha/app1.cnf &>/tmp/mha_manager.log &
当有 slave 节点宕掉时,默认是启动不了的,加上--ignore_fail_on_start即使有节点宕掉也
能启动 MHA,如下:
#nohup masterha_manager --conf=/etc/masterha/app1.cnf --ignore_fail_on_start
&>/tmp/mha_manager.log &
5) 检查状态:
# masterha_check_status --conf=/etc/masterha /app1.cnf
6) 检查日志:
#tail -f /masterha/app1/manager.log
7)主从切换后续工作
重构:
重构就是你的主挂了,切换到 Candicate master 上,Candicate master变成了主,因此重构的一种方案原主库修复成一个新的slave主库切换后,把原主库修复成新从库,然后重新执行以上5步。原主库数据文件完整的情况下,可通过以下方式找出最后执行的CHANGE MASTER命令:
[root@manager ~]# grep "CHANGE MASTER TO MASTER" /masterha/app1/manager.log | tail -1
Wed Aug 8 02:02:40 2018 - [info] All other slaves should start replication from here. Statement should be: CHANGE MASTER TO MASTER_HOST='192.168.1.132', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=739, MASTER_USER='rep', MASTER_PASSWORD='xxx';
定期删除中继日志
在配置主从复制中,slave 上设置了参数relay_log_purge=0,所以slave节点需要定期删除中继日志,建议每个slave节点删除中继日志的时间错开。
corntab -e
0 5 * * * /usr/local/bin/purge_relay_logs --user=root --password=pwd123 --port=3306 --disable_relay_log_purge >> /var/log/purge_relay.log 2>&1
网站题目:mysql之MHA架构
URL网址:http://myzitong.com/article/iihpjh.html