0%

Mariadb(MHA)高可用集群搭建

MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的高可用软件。在MySQL故障切换过程中,MHA能做到在0~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工作原理总结为以下几条:

  • 从宕机崩溃的master保存二进制日志事件(binlog events);
  • 识别含有最新更新的slave;
  • 应用差异的中继日志(relay log) 到其他slave;
  • 应用从master保存的二进制日志事件(binlog events);
  • 提升一个slave为新master;
  • 使用其他的slave连接新的master进行复制。

配置基础环境

mysql主充复制集群搭建

mha的环境是基于mysql主从复制环境上搭建的,主从复制请参考http://islocal.cc/arlo/b48c6366/ ,本文搭建的为一主三从环境

配置互相无密码验证

配置hosts

复制到到其他几台机器

1
2
3
4
5
cat /etc/hosts
192.168.6.126 mysql_a #从库 #node
192.168.6.127 mysql_b #主库 #node
192.168.6.128 mysql_c #备用主库 #node
192.168.6.102 vm02 #从库 #manager

mysql_a

1
2
3
4
ssh-keygen 
ssh-copy-id mysql_b
ssh-copy-id mysql_c
sssh-copy-id vm02

mysql_b

1
2
3
4
ssh-keygen 
ssh-copy-id mysql_a
ssh-copy-id mysql_c
sssh-copy-id vm02

mysql_c

1
2
3
4
ssh-keygen 
ssh-copy-id mysql_a
ssh-copy-id mysql_b
ssh-copy-id vm02

vm02

1
2
3
4
ssh-keygen 
ssh-copy-id mysql_a
ssh-copy-id mysql_b
ssh-copy-id mysql_c

mysql 配置

建立mysql用户,赋予权限

在3台mysql服务器上分别新建mha用户,并授权

1
2
3
4
MariaDB [test_repl]> grant all privileges on *.* to 'mha'@'mysql_a' identified by '222222';
MariaDB [test_repl]> grant all privileges on *.* to 'mha'@'mysql_b' identified by '222222';
MariaDB [test_repl]> grant all privileges on *.* to 'mha'@'mysql_c' identified by '222222';
MariaDB [test_repl]> grant all privileges on *.* to 'mha'@'vm02' identified by '222222';

修改mysql参数

在2台slave上修改

1
2
mysql -e 'set global read_only=1'
mysql -uroot -pffffff -e 'show slave status\G'|egrep 'Slave_IO|Slave_SQL'

安装mha manager

安装mha manager

1
2
3
4
5
6
[root@vm02 src]# yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y
[root@vm02 src]# cd mha4mysql-manager-0.56/
[root@vm02 mha4mysql-manager-0.56]# perl Makefile.PL
[root@vm02 mha4mysql-manager-0.56]# make && make install
[root@vm02 ~]# cp /usr/local/src/mha4mysql-manager-0.56/samples/scripts/master_ip_failover /usr/local/bin/
[root@vm02 ~]# cp /usr/local/src/mha4mysql-manager-0.56/samples/scripts/master_ip_online_change /usr/local/bin/

主配置文件

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
30
31
32
33
34
35
36
37
38
39
[server default]
user=mha
password=222222
ping_interval=1
remote_workdir=/tmp
repl_user=repl
repl_password=111111
ssh_user=root

manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
master_binlog_dir= /var/lib/mysql/
master_ip_failover_script= /usr/local/bin/master_ip_failover
master_ip_online_change_script= /usr/local/bin/master_ip_online_change
report_script=/usr/local/send_report
secondary_check_script= /usr/local/bin/masterha_secondary_check -s mysql_b -s mysql_c --master_host=mysql_b --master_ip=192.168.6.127 --master_port=3306
shutdown_script=""


[server1]
hostname=mysql_b
port=3306

[server2]
master_binlog_dir=/var/lib/mysql
hostname=mysql_c
port=3306
candidate_master=1
check_repl_delay=0

[server3]
master_binlog_dir=/var/lib/mysql
hostname=mysql_a
port=3306

[server4]
master_binlog_dir=/var/lib/mysql
hostname=vm02
port=3306

安装mha node

1
2
3
4
# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker  perl-DBD-MySQL 
[root@mysql_a mha4mysql-node-0.56]# ansible mysql -a 'perl Makefile.PL chdir=/usr/local/src/mha4mysql-node-0.56/'
[root@mysql_a mha4mysql-node-0.56]# ansible mysql -a 'make chdir=/usr/local/src/mha4mysql-node-0.56/'
[root@mysql_a mha4mysql-node-0.56]# ansible mysql -a 'make install chdir=/usr/local/src/mha4mysql-node-0.56/'

测试ssh连通性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@vm02 ~]# masterha_check_ssh --conf=/etc/mastermha/app1.cnf
Wed Aug 2 17:12:59 2017 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Wed Aug 2 17:12:59 2017 - [info] Reading application default configurations from /etc/mastermha/app1.cnf..
Wed Aug 2 17:12:59 2017 - [info] Reading server configurations from /etc/mastermha/app1.cnf..
Wed Aug 2 17:12:59 2017 - [info] Starting SSH connection tests..
Wed Aug 2 17:13:00 2017 - [debug]
Wed Aug 2 17:13:00 2017 - [debug] Connecting via SSH from root@mysql_a(192.168.6.126:22) to root@mysql_b(192.168.6.127:22)..
Wed Aug 2 17:13:00 2017 - [debug] ok.
Wed Aug 2 17:13:00 2017 - [debug] Connecting via SSH from root@mysql_a(192.168.6.126:22) to root@mysql_c(192.168.6.128:22)..
Wed Aug 2 17:13:00 2017 - [debug] ok.
Wed Aug 2 17:13:01 2017 - [debug]
Wed Aug 2 17:13:00 2017 - [debug] Connecting via SSH from root@mysql_b(192.168.6.127:22) to root@mysql_a(192.168.6.126:22)..
Wed Aug 2 17:13:00 2017 - [debug] ok.
Wed Aug 2 17:13:00 2017 - [debug] Connecting via SSH from root@mysql_b(192.168.6.127:22) to root@mysql_c(192.168.6.128:22)..
Wed Aug 2 17:13:00 2017 - [debug] ok.
Wed Aug 2 17:13:01 2017 - [debug]
Wed Aug 2 17:13:01 2017 - [debug] Connecting via SSH from root@mysql_c(192.168.6.128:22) to root@mysql_a(192.168.6.126:22)..
Wed Aug 2 17:13:01 2017 - [debug] ok.
Wed Aug 2 17:13:01 2017 - [debug] Connecting via SSH from root@mysql_c(192.168.6.128:22) to root@mysql_b(192.168.6.127:22)..
Wed Aug 2 17:13:01 2017 - [debug] ok.
Wed Aug 2 17:13:01 2017 - [info] All SSH connection tests passed successfully.

mariadb

测试主从复制

1
[root@vm02 ~]# masterha_check_repl --conf=/etc/mastermha/app1.cnf

报错

1
2
3
4
Thu Aug  3 17:10:16 2017 - [info] MHA::MasterMonitor version 0.56.
Thu Aug 3 17:10:18 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln401] Error happend on checking configurations. Use of uninitialized value in string eq at /usr/local/share/perl5/MHA/Server.pm line 236.
Thu Aug 3 17:10:18 2017 - [error][/usr/local/share/perl5/MHA/MasterMonitor.pm, ln500] Error happened on monitoring servers.
Thu Aug 3 17:10:18 2017 - [info] Got exit code 1 (Not master dead).

解决方法还没找到,所以就卡在这里了,网上也没找到有效的解决方法;好悲催,有知道的可以知道我一下,联系方式关于里边有;我怀疑是不是因为我mha0.56和Mariadb10.2.7版本不匹配,或者Mariadb太新导致的;先放一放,后期找到解决方法了再处理吧。

参考:http://www.cnblogs.com/gomysql/p/3675429.html