MySQL高可用集群MHA架构

1
2
3
4
5
6
实验环境: Centos6.5 minimal 64位系统
服务器IP:
192.168.10.26(manager)
192.168.10.22(master)
192.168.10.27(slave1,Candicate master)
192.168.10.29(slave2)

包版本:

1
2
3
MHA:		
1、mha4mysql-manager-0.55-0.el6.noarch.rpm
2、mha4mysql-node-0.54-0.el6.noarch.rpm

实验拓扑:

PO7LWR.png

实验部署基础:

1
2
3
1、除了manager,别的机器都安装上mysql服务
2、所有机器都要安装mha4mysql-node
3、manager需要多安装mha4mysql-manager

实验介绍:

其中master对外提供写服务,备选Candicate master(实际为slave1)提供读服务,slave2也提供读服务,一旦master宕机,将会把备选master提升为新的master,slave指向新的master

MHA简介

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在10~30秒之内自动完成数据库的故障切换操作,并且在进行故障切换的过程中,MHA能在最大程度上保证数据的一致性,以达到真正意义上的高可用。

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

在MHA自动故障切换过程中,MHA试图从宕机的主服务器上保存二进制日志,最大程度的保证数据的不丢失,但这并不总是可行的。例如,如果主服务器硬件故障或无法通过ssh访问,MHA没法保存二进制日志,只进行故障转移而丢失了最新的数据。使用MySQL 5.5的半同步复制,可以大大降低数据丢失的风险。MHA可以与半同步复制结合起来。如果只有一个slave已经收到了最新的二进制日志,MHA可以将最新的二进制日志应用于其他所有的slave服务器上,因此可以保证所有节点的数据一致性。

目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,因为至少需要三台服务器,出于机器成本的考虑,淘宝也在该基础上进行了改造,目前淘宝TMHA已经支持一主一从。MHA 适合任何存储引擎,只要能主从复制的存储引擎它都支持,不限于支持事物的innodb引擎。

MHA优点

1
2
3
1、Master crash时可以快速的进行故障切换
2、Master crash时可以最大化的减少数据丢失
3、MHA适合任何存储引擎

MHA官网(需要翻墙,自备梯子)

1
https://code.google.com/archive/p/mysql-master-ha/

MHA Manager管理多组主从复制的架构

PO7vy6.png

MHA高可用集群部署

一、配置所有主机ssh免密码登录

1、创建公私钥
1
ssh-keygen -t rsa

POH9Te.png

2、发布到各个主机
1
2
3
ssh-copy-id 192.168.10.22
ssh-copy-id 192.168.10.27
ssh-copy-id 192.168.10.29
3、其他主机重复上面操作
4、所有主机都操作完之后验证是否可以无密码登录所有主机之间

POHFfA.png

二、搭建主从复制环境——master

1、创建需要同步的数据库
1
2
3
4
mysql> create database nongkaige;
mysql> use nongkaige;
mysql> create table if not exists nong(id int(10),name varchar(20));
mysql> insert into nongkaige.nong values(1,"nongkaige"),(2,"huanglihua"),(3,"nongziyi");
2、配置my.cnf
1
2
3
4
5
6
7
vim /etc/mysql/my.cnf

server-id=1 #数据库唯一ID,主从的标识号绝对不能重复
log-bin=mysql-bin-master #启用二进制日志,并指定前缀名,可自定义
binlog-do-db=nongkaige #需要同步的数据库,如果多个,则另写几行即可,如果不指定对哪个库进行同步,就去掉此行,表示同步所有库(除了ignore忽略的库)
binlog-ignore-db=mysql #不同步mysql系统库,如果多个,则另写几行即可
sync-binlog=1 #确保binlog日志写入后与硬盘同步,此参数不是强制要求写入
3、导出master需要同步的数据库,然后导入到两台slave数据库,保证双方在同步之前数据一致

(导出之前先锁定只读数据库,防止导出的时候有数据写入,unlock tables命令解除锁定)

1
2
3
4
5
mysql> flush tables with read lock;

mysqldump -u root -p123456 -B nongkaige > nongkaige.sql
scp nongkaige.sql 192.168.10.27:/root/
scp nongkaige.sql 192.168.10.29:/root/
4、设置数据同步权限
1
2
mysql> grant replication slave on *.* to slave@'192.168.10.%' identified by "123456";
mysql> flush privileges;
5、重启master数据库,查看主服务器master状态(注意,是重启,reload也不顶用)
1
service mysqld restart

POHV6P.png

三、搭建主从复制环境——slave1(Candicate master)

1、配置my.cnf
1
2
3
4
5
6
vim /etc/mysql/my.cnf

log-bin=mysql-bin-slave1
server-id=2
slave-skip-errors=all #跳过所有的错误,继续执行复制操作,此参数不是必须写入参数。
log_slave_updates=1 #只有开启log_slave_updates,从库binlog才会记录主库同步的操作日志
2、重启slave数据库
1
service mysqld restart
3、导入从master传过来的数据

(要先创建nongkaige库,和master上的一样,否则一会导入会报错)

1
2
3
mysql> create database nongkaige;
mysql> use nongkaige;
mysql> source /root/nongkaige.sql;
4、配置主从同步命令

(执行同步之前,要先关闭slave)

1
2
3
4
mysql> stop slave;
mysql> change master to master_host='192.168.10.22',master_user='slave',master_password='123456';
mysql> start slave;
mysql> show slave status \G

POHn0S.png

四、搭建主从复制环境——slave2

1、配置my.cnf
1
2
3
4
5
6
vim /etc/mysql/my.cnf

log-bin=mysql-bin-slave2
server-id=3
slave-skip-errors=all #跳过所有的错误,继续执行复制操作,此参数不是必须写入参数。
log_slave_updates=1 #只有开启log_slave_updates,从库binlog才会记录主库同步的操作日志
2、重启slave数据库
1
service mysqld restart
3、导入从master传过来的数据

(要先创建nongkaige库,和master上的一样,否则一会导入会报错)

1
2
3
mysql> create database nongkaige;
mysql> use nongkaige;
mysql> source /root/nongkaige.sql;
4、配置主从同步命令

(执行同步之前,要先关闭slave)

1
2
3
4
mysql> stop slave;
mysql> change master to master_host='192.168.10.22',master_user='slave',master_password='123456';
mysql> start slave;
mysql> show slave status \G

POHQYj.png

五、主从同步配置完成,解锁master数据库只读数据

1
mysql> unlock tables;

六、两台slave服务器设置read_only

从库对外提供读服务,之所以没有写进配置文件,是因为slave随时会提升为master

1
mysql -u root -p123456 -e 'set global read_only=1'

七、两台slave服务器授权复制用的用户和密码

1
2
mysql> grant replication slave on *.* to 'repl'@'192.168.10.%' identified by '123456';
mysql> flush privileges;

八、在master上创建监控用户

1
2
mysql> grant all privileges on *.* to nong@'192.168.10.%' identified by '123456';
mysql> flush privileges;

九、所有服务器上安装mha4mysql-node

1、先安装epel源

Centos6安装源:

1
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Centos7安装源:

1
rpm -ivh http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm
2、安装依赖
1
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager --skip-broken
3、安装mha4mysql-node
1
rpm -ivh mha4mysql-node-0.54-0.el6.noarch.rpm
4、查看一下安装完成后会在/usr/bin/目录下生成以下脚本文件
1
2
3
4
5
6
7
cd /usr/bin/
ll app* filter* purge* save*

-rwxr-xr-x. 1 root root 15977 Dec 1 2012 apply_diff_relay_logs
-rwxr-xr-x. 1 root root 4807 Dec 1 2012 filter_mysqlbinlog
-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

十、manager服务器上安装mha4mysql-manager

1、先安装epel源(上边已经安装)
2、安装依赖
1
yum -y install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Time-HiRes
3、安装mha4mysql-manager
1
rpm -ivh mha4mysql-manager-0.55-0.el6.noarch.rpm

4、查看一下安装完成后会在/usr/bin/目录下生成以下脚本文件

1
2
3
4
5
6
7
8
9
10
11
ll /usr/bin/master*

-rwxr-xr-x. 1 root root 1995 Dec 13 2012 /usr/bin/masterha_check_repl
-rwxr-xr-x. 1 root root 1779 Dec 13 2012 /usr/bin/masterha_check_ssh
-rwxr-xr-x. 1 root root 1865 Dec 13 2012 /usr/bin/masterha_check_status
-rwxr-xr-x. 1 root root 3201 Dec 13 2012 /usr/bin/masterha_conf_host
-rwxr-xr-x. 1 root root 2517 Dec 13 2012 /usr/bin/masterha_manager
-rwxr-xr-x. 1 root root 2165 Dec 13 2012 /usr/bin/masterha_master_monitor
-rwxr-xr-x. 1 root root 2373 Dec 13 2012 /usr/bin/masterha_master_switch
-rwxr-xr-x. 1 root root 3879 Dec 13 2012 /usr/bin/masterha_secondary_check
-rwxr-xr-x. 1 root root 1739 Dec 13 2012 /usr/bin/masterha_stop

十一、在manager服务器上配置MHA

1、创建MHA工作目录、日志目录、配置文件目录
1
2
3
mkdir -p /a01/apps/mysql-mha
mkdir -p /var/log/mysql-mha
mkdir -p /etc/mysql-mha
2、创建MHA配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
vim /etc/mysql-mha/mha.conf

[server default]
manager_workdir=/a01/apps/mysql-mha #设置manager的工作目录
manager_log=/var/log/mysql-mha/mha_manager.log #设置manager的日志
master_binlog_dir=/a01/apps/mysql/data/ #设置master保存binlog的位置
password=123456 #监控用户的密码
user=nong #监控用户
ping_interval=1 #设置监控主库发送ping包的时间间隔,默认是3秒,尝试3次没有回应的时候自动进行切换主库
remote_workdir=/tmp #设置远端mysql在发生切换时binlog的保存位置
repl_password=123456 #复制用户的密码
repl_user=repl #复制用户
ssh_user=root #ssh的登录用户


[server1]
hostname=192.168.10.22
port=3306

[server2]
hostname=192.168.10.27
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

[server3]
hostname=192.168.10.29
port=3306

十二、在两台slave服务器上设置relay log的清除方式

1
mysql -u root -p123456 -e 'set global relay_log_purge=0'

MHA在发生切换的过程中,从库的恢复过程中依赖于relay log的相关信息,所以这里要将relay log的自动清除设置为OFF,采用手动清除relay log的方式。在默认情况下,从服务器上的中继日志会在SQL线程执行完毕后被自动删除。但是在MHA环境中,这些中继日志在恢复其他从服务器时可能会被用到,因此需要禁用中继日志的自动删除功能。定期清除中继日志需要考虑到复制延时的问题。在ext3的文件系统下,删除大的文件需要一定的时间,会导致严重的复制延时。为了避免复制延时,需要暂时为中继日志创建硬链接,因为在Linux系统中通过硬链接删除大文件速度会很快。(在mysql数据库中,删除大表时,通常也采用建立硬链接的方式)

十三、检查MHA Manager到所有MHA Node的SSH连接状态

1
masterha_check_ssh --conf=/etc/mysql-mha/mha.conf

POHlfs.png

十四、检查整个复制环境状况

1
masterha_check_repl --conf=/etc/mysql-mha/mha.conf

POHdk4.png

1
[error][/usr/share/perl5/vendor_perl/MHA/ServerManager.pm, ln394] Binlog filtering check failed on 192.168.10.27(192.168.10.27:3306)! All log-bin enabled servers must have same binlog filtering rules (same binlog-do-db and binlog-ignore-db). Check SHOW MASTER STATUS output and set my.cnf correctly.

报错了,我们来解决一下,意思是在我的两台slave服务器中,没有配置binlog-do-db和binlog-ignore-db,那既然这样,就去配置上呗,修改一下两台slave的配置文件为:

1
2
3
4
5
6
log-bin=mysql-bin-slave1
server-id=2
slave-skip-errors=all
log_slave_updates=1
binlog-do-db=nongkaige
binlog-ignore-db=mysql

再执行一次masterha_check_repl –conf=/etc/mysql-mha/mha.conf

POHqHS.png

1
2
Can't exec "mysqlbinlog": No such file or directory at /usr/share/perl5/vendor_perl/MHA/BinlogManager.pm line 99.
mysqlbinlog version not found!

又报别的错误了,这次的意思是mysql的binlog版本找不到,识别不到,这个就弄了我好久了,最终终于知道原因,由于我的三台mysql服务器,都是编译安装的,虽然配置了环境变量,但是mysqlbinlog命令没有识别到,好了,知道原因之后就好办了:

三台mysql服务器上分别执行:

1
ln -s /a01/apps/mysql/bin/mysqlbinlog /usr/bin/mysqlbinlog

接下来再执行一次检测

1
masterha_check_repl --conf=/etc/mysql-mha/mha.conf

POHx9s.png

1
2
Testing mysql connection and privileges..sh: mysql: command not found
mysql command failed with rc 127:0!

还是有报错,不要急,我们一个一个来解决,这个报错的大概意思是mysql这个命令找不到,what?什么鬼,那应该就是和上边一样的情况,三台服务器mysql都是编译安装的,mysql这个命令MHA Manager识别不到,那好办,再去三台mysql服务器上分别执行:

1
ln -s /a01/apps/mysql/bin/mysql /usr/bin/mysql

再相信我一次吧,哈哈

1
masterha_check_repl --conf=/etc/mysql-mha/mha.conf

POb3Ue.png

十五、开启MHA Manager监控

1
nohup masterha_manager --conf=/etc/mysql-mha/mha.conf --remove_dead_master_conf --ignore_last_failover< /dev/null > /var/log/mysql-mha/mha_manager.log 2>&1 &

POb84H.png

启动参数说明:

1
2
3
4
5
6
7
8
--remove_dead_master_conf
该参数代表当发生主从切换后,老的主库的ip将会从配置文件中移除。

--manger_log
日志存放位置

--ignore_last_failover
在缺省情况下,如果MHA检测到连续发生宕机,且两次宕机间隔不足8小时的话,则不会进行Failover,之所以这样限制是为了避免ping-pong效应。该参数代表忽略上次MHA触发切换产生的文件,默认情况下,MHA发生切换后会在日志目录,也就是上面我设置的/a01/apps/mysql-mha/产生mha.failover.complete文件,下次再次切换的时候如果发现该目录下存在该文件将不允许触发切换,除非在第一次切换后收到删除该文件,为了方便,这里设置为--ignore_last_failover。

十六、检查MHA Manager的状态

1
masterha_check_status --conf=/etc/mysql-mha/mha.conf

PObtgI.png

查看一下日志:

1
tail -f /var/log/mysql-mha/mha_manager.log

PObNvt.png

十七、MHA Manager关闭命令

1
masterha_stop --conf=/etc/mysql-mha/mha.conf

MHA高可用集群测试

1、先动态检测MHA Manager的日志
1
tail -f /var/log/mysql-mha/mha_manager.log
2、先在从服务器上查看,现在的master是谁

PObaKP.png

3、模拟主库master宕机
1
service mysqld stop
4、第三步执行的同时,我们动态查看到的日志如下图,说明已经切换主库成功

PObwb8.png

5、那MHA Manager说成功了,我们去slave服务器上边看看,到底他们的主变了没有呢

PObBVS.png

博主QQ:1012405802
技术交流QQ群:830339411
版权声明:网站内容有原创和转载,如有侵权,请联系删除,谢谢!!
感谢打赏,93bok因你们而精彩!!(支付宝支持花呗)
0%