quniMdejiangyou 2016-07-05
MHA:Master HA;是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover功能。MHA在监控到master节点故障时,会将拥有最新数据的slave节点升为新的master节点,在此期间,MHA会通过于slave节点获取额外信息来避免一致性方面的问题。MHA还提供了master节点在线切换功能,即按需切换master/slave节点
MHA服务有两种角色:管理节点(MHA Manager)和数据节点(MHA Node)
MHA Manager:通常单独部署在一台独立服务器上管理多个master/slave集群,每个master/slave集群称为一个application
MHA Node:运行在每台MySQL服务器上(master/slave/manager),他通过监控具备解析和清理logs功能的脚本来加快故障转移
Galera Cluster
基于wsrep协议在全局实现复制,任何一节点都可实现读写操作,无延迟复制,不会产生数据丢失,当某台服务器宕机后,备用服务器会自动接管。
一、基于Galera Cluster实现MySQL高可用
准备环境:CentOS 7
节点1 | IP:172.18.42.200 |
节点2 | IP:172.18.42.201 |
节点3 | IP:172.18.42.202 |
1、部署节点1
(1)安装Galera服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)编辑其配置文件
[root@node0 ~]# rpm -ql galera ##查看相关文件
/usr/lib64/galera/libgalera_smm.so
[root@node0 ~]# vim /etc/my.cnf.d/server.cnf
[galera]
# Mandatory settings ##强制设置
wsrep_provider=/usr/lib64/galera/libgalera_smm.so ##wsrep的提供者,一般是一个插件,不同的安装版本有可能不一样
wsrep_cluster_address="gcomm://172.18.42.200, 172.18.42.201, 172.18.42.202" ##指明Galera-Cluster的各个节点
binlog_format=row ##二进制日志格式,默认是row格式,不建议更改
default_storage_engine=InnoDB ##指明使用的引擎
innodb_autoinc_lock_mode=2 ##锁格式
bind-address=0.0.0.0 ##wsrep在工作时监听的地址
wsrep_cluster_name='mycluster' ##指明Galera集群的名称
(3)首次启动时,需要初始化集群
[root@node0 ~]# /etc/rc.d/init.d/mysql start --wsrep-new-cluster ##在某一个节点上启动mysql服务
2、部署节点2
(1)安装MariaDB-Galera-server服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[root@node2 ~]# service mysql start
Starting MySQL....SST in progress, setting sleep higher. SUCCESS!
3、部署节点3
(1)安装MariaDB-Galera-server服务
[root@node0 ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[root@node2 ~]# service mysql start
Starting MySQL....SST in progress, setting sleep higher. SUCCESS!
4、三个节点都连接mysql服务,随后创建一个数据库,查看其它两个节点是否复制
[root@node0 ~]# mysql ##节点1连接mysql服务
MariaDB [(none)]> create database MaGeRepo; ##在节点1上创建数据库“MaGeRepo”,并查看
MariaDB [(none)]> show databases;
+--------------------+
| Database
+--------------------+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+--------------------+
[root@node1 ~]# mysql ##节点2连接至mysql服务
MariaDB [(none)]> show databases; ##查看数据库
+--------------------+
| Database
+--------------------+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+--------------------+
[root@node2 ~]# mysql ##节点3连接至mysql服务
MariaDB [(none)]> show databases; ##查看数据库
+--------------------+
| Database
+--------------------+
| information_schema
| MaGeRepo
| mysql
| performance_schema
| test
+--------------------+
##数据库实现了同步
5、把节点2宕机,随后在数据库“MaGeRepo”中创建表“MaGe“;
MariaDB [MaGeRepo]> create table MaGe (ID int unsigned auto_increment not null primary key,Name char(10)); ##在节点1上创建表“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values ('MaGe'),('Lweim'); ##在节点1中插入数据“Lweim”、“MaGe”
MariaDB [MaGeRepo]> insert into MaGe (Name) values ('Wtc'),('Wzx'); ##在节点3中插入数据“Wtc”、“Wzx”
6、节点2开启mysql服务器,并查看其数据库
[root@node1 ~]# service mysql start ##启动节点2
Starting MySQL.....SST in progress, setting sleep higher. SUCCESS!
[root@node1 ~]# mysql ##连接至mysql服务
MariaDB [MaGeRepo]> select * from MaGe; ##查看表中的数据
+----+-------+
| ID | Name
+----+-------+
| 1 | MaGe
| 3 | Lweim
| 4 | Wtc
| 6 | Wzx
+----+-------+
由此可见,当其中某一台服务器宕机后,即使数据发生改变,重新上线之后也可同步数据,但需要注意的是ID并不是按自动增长次序增长的,解决办法如下:
a:设定一个全局分配ID生成器,解决数据插入时ID顺序不一致问题
b:手动指定ID号,不让其自动生成