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服务
[[email protected] ~]# yum install MariaDB-Galera-server -y
(2)编辑其配置文件
[[email protected] ~]# rpm -ql galera ##查看相关文件 /usr/lib64/galera/libgalera_smm.so [[email protected] ~]# 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)首次启动时,需要初始化集群
[[email protected] ~]# /etc/rc.d/init.d/mysql start --wsrep-new-cluster ##在某一个节点上启动mysql服务
2、部署节点2
(1)安装MariaDB-Galera-server服务
[[email protected] ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[[email protected] ~]# service mysql start Starting MySQL....SST in progress, setting sleep higher. SUCCESS!
3、部署节点3
(1)安装MariaDB-Galera-server服务
[[email protected] ~]# yum install MariaDB-Galera-server -y
(2)启动服务
[[email protected] ~]# service mysql start Starting MySQL....SST in progress, setting sleep higher. SUCCESS!
4、三个节点都连接mysql服务,随后创建一个数据库,查看其它两个节点是否复制
[[email protected] ~]# mysql ##节点1连接mysql服务 MariaDB [(none)]> create database MaGeRepo; ##在节点1上创建数据库“MaGeRepo”,并查看 MariaDB [(none)]> show databases; +--------------------+ | Database +--------------------+ | information_schema | MaGeRepo | mysql | performance_schema | test +--------------------+ [[email protected] ~]# mysql ##节点2连接至mysql服务 MariaDB [(none)]> show databases; ##查看数据库 +--------------------+ | Database +--------------------+ | information_schema | MaGeRepo | mysql | performance_schema | test +--------------------+ [[email protected] ~]# 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服务器,并查看其数据库
[[email protected] ~]# service mysql start ##启动节点2 Starting MySQL.....SST in progress, setting sleep higher. SUCCESS! [[email protected] ~]# mysql ##连接至mysql服务 MariaDB [MaGeRepo]> select * from MaGe; ##查看表中的数据 +----+-------+ | ID | Name +----+-------+ | 1 | MaGe | 3 | Lweim | 4 | Wtc | 6 | Wzx +----+-------+
由此可见,当其中某一台服务器宕机后,即使数据发生改变,重新上线之后也可同步数据,但需要注意的是ID并不是按自动增长次序增长的,解决办法如下:
a:设定一个全局分配ID生成器,解决数据插入时ID顺序不一致问题
b:手动指定ID号,不让其自动生成
二、基于MHA实现MySQL的高可用
准备环境:CentOS 7
MHA Manager节点 | IP:172.18.42.200 |
MHA Node Master节点 | IP:172.18.42.201 |
MHA Node Slave1节点 | IP:172.18.42.202 |
MHA Node Slave2节点 | IP:172.18.42.203 |
前提:基于MHA实现MySQL高可用时,各节点之间需要基于ssh秘钥进行通信
[[email protected] ~]# ssh-keygen -t rsa -P ‘‘ ##在Manager节点上基于rsa算法生成秘钥,密码为空 [[email protected] ~]# cat .shh/id_rsa.pub &>> .shh/authorized_keys ##先要确认能与本地进行通信 [[email protected] ~]# chmod 600 .ssh/id_rsa .ssh/authorized_keys ##更改秘钥权限 [[email protected] ~]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/ ##Manager节点把秘钥、公钥发送给每个节点,使各个节点可以进行秘钥通信(第一此通信需要秘钥,后续不需要) [[email protected] ~]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/ [[email protected] ~]# scp -p .ssh/id_rsa .ssh/authorized_keys [email protected]:/root/.ssh/ [[email protected] ~]# ssh 172.18.42.201 ‘ifconfig‘ ##可基于此命令让各个节点之间进行测试是否建立连接 Are you sure you want to continue connecting (yes/no)? yes ##第一次建立连接需要认证 [email protected]‘s password:
1、部署MHA Manager节点
(1)安装mha4mysql-manager、mha4mysql-node
[[email protected] ~]# yum install mha4mysql-node-0.56-0.el6.noarch.rpm mha4mysql-manager-0.56-0.el6.noarch.rpm -y
(2)创建配置文件,并编辑
[[email protected] ~]# vim /etc/masterha/app1.cnf [server default] user=wtc ##能远程连接至各mysql节点的用户管理账号,需要mysql节点创建此用户 password=wtc manager_workdir=/data/masterha/app1 ##管理节点的工作目录 manager_log=/data/masterha/app1/manager.log ##管理节点的日志文件路径 remote_workdir=/data/masterha/app1 ##远程的每个mysql节点为Manager节点提供工作目录,会自动创建 ssh_user=root ##以root用户远程管理,,基于秘钥认证无需密码;如果不基于密码,需要指明密码 repl_user=repluser ##复制权限用户账号 repl_password=replpass ping_interval=1 ##每隔多长时间探测一次Master节点是否在线 [server1] ##定义mysql节点 hostname=172.18.42.201 candidate_master=1 ##当主节点宕机以后,这个节点是否可以成为新的主节点 ##no_master=1 ##当主节点宕机后,这个节点不会成为新的主节点 [server2] hostname=172.18.42.202 candidate_master=1 [server3] hostname=172.18.42.203 candidate_master=1
2、部署Master节点
(1)安装mariadb-server、mha4mysql-node服务
[[email protected] ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)编辑其配置文件
[[email protected] ~]# vim /etc/my.cnf [mysqld] innodb_file_per_table = ON skip_name_resolve = ON log_bin=mysql-bin relay-log=relay-log server-id=1 [[email protected] ~]# systemctl start mariadb.service MariaDB [(none)]> show master status; mysql-bin.000003 245 MariaDB [(none)]> grant replication slave,replication client on *.* to ‘repluser‘@‘172.18.%.%‘ identified by ‘replpass‘; ##创建具有复制权限的用户
3、部署Slave1
(1)安装mariadb-server、mha4mysql-node服务
[[email protected] ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)编辑其配置文件
[[email protected] ~]# vim /etc/my.cnf [mysqld] innodb_file_per_table = ON skip_name_resolve = ON log_bin=mysql-bin relay-log=relay-log server-id=2 read_only=1 ##MHA通过这个来判断那个是mysql主服务器 relay_log_purge=0 [[email protected] ~]# systemctl start mariadb.service MariaDB [(none)]> change master to master_host=‘172.18.42.201‘,master_user=‘repluser‘,master_password=‘replpass‘,master_log_file=‘mysql-bin.000003‘,master_log_pos=245; ##连接至Master节点 MariaDB [(none)]> start slave; MariaDB [(none)]> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes
4、部署Slave2
(1)安装mariadb-server、mha4mysql-node服务
[[email protected] ~] yum install mariadb-server mha4mysql-node-0.56-0.el6.noarch.rpm -y
(2)编辑其配置文件
[[email protected] ~]# vim /etc/my.cnf innodb_file_per_table = ON skip_name_resolve = ON log_bin=mysql-bin relay-log=relay-log server-id=3 read_only=1 relay_log_purge=0 [[email protected] ~]# systemctl start mariadb.service MariaDB [(none)]> change master to master_host=‘172.18.42.201‘,master_user=‘repluser‘,master_password=‘replpass‘,master_log_file=‘mysql-bin.000003‘,master_log_pos=245; ##连接至Master节点 MariaDB [(none)]> start slave; MariaDB [(none)]> show slave status\G; Slave_IO_Running: Yes Slave_SQL_Running: Yes
5、在Master节点创建管理用户账号,在Manager节点检测各检点之间的连接
MariaDB [(none)]> grant all on *.* to ‘wtc‘@‘172.18.%.%‘ identified by ‘wtc‘; ##实现了主从复制,在Msater节点创建的同时,slave节点也会创建 [[email protected] ~]# masterha_check_ssh --conf=/etc/masterha/app1.cnf ##测试各节点之间ssh互相通信是否ok Wed Apr 20 10:17:40 2016 - [info] All SSH connection tests passed successfully. [[email protected] ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf ##检查各个节点之间主从复制是否ok 172.18.42.201(172.18.42.201:3306) (current master) ##201是主节点,202、203是从节点 +--172.18.42.202(172.18.42.202:3306) +--172.18.42.203(172.18.42.203:3306) MySQL Replication Health is OK.
6、启动Manager节点服务,把Master节点宕机,查看是否转换
[[email protected] ~]# masterha_manager --conf=/etc/masterha/app1.cnf ##启动Manager服务 Wed Apr 20 10:27:35 2016 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping. Wed Apr 20 10:27:35 2016 - [info] Reading application default configuration from /etc/masterha/app1.cnf.. Wed Apr 20 10:27:35 2016 - [info] Reading server configuration from /etc/masterha/app1.cnf.. [[email protected] ~]# systemctl stop mariadb.service ##关掉节点2的mariadb服务 MariaDB [(none)]> show slave status\G; ##查看Slave2节点的复制线程状态 Master_Host: 172.18.42.202 ##Master节点转为Slave1节点了 Slave_IO_Running: Yes Slave_SQL_Running: Yes
7、现在我们开启Master节点,看其是否成为从节点
[[email protected] ~]# systemctl start mariadb.service ##开启Master节点的mariadb服务 MariaDB [(none)]> change master to master_host=‘172.18.42.202‘,master_user=‘repluser‘,master_password=‘replpass‘,master_log_file=‘mysql-bin.000003‘,master_log_pos=245; ##此时“master_host”应该指向Slave1的IP ##使用的二进制日志文件、事件是事先备份好的(在实现主从复制之前,备份一份) MariaDB [(none)]> start slave; ##启动复制线程 MariaDB [(none)]> show slave status\G; Master_Host: 172.18.42.202 ##此时IP为Slave1的IP Slave_IO_Running: Yes Slave_SQL_Running: Yes [[email protected] ~]# masterha_check_repl --conf=/etc/masterha/app1.cnf ##在Manager节点上查看一次,主从复制是否ok 172.18.42.202(172.18.42.202:3306) (current master) ##此时,主节点成为了Slave1 +--172.18.42.201(172.18.42.201:3306) +--172.18.42.203(172.18.42.203:3306) MySQL Replication Health is OK.
问题小结:
1、masterha_manager运行时是工作于前台的,而且不能断开,一旦进行主从切换后,就停止工作,我们需要手动把它开启,这时需要脚本来实现自行监控
2、在使用MHA方法时,启动Manager节点的服务有可能会失败,可以尝试一下先把Manager节点的日志文件路径创建好"/data/masterha/app1"
3、在配置mysql各节点的配置文件时,主从都需要开启中继日志、二进制日志
主节点开启中继日志和二进制日志,是因为主节点宕机以后启用时会变为从节点
从节点需要开启中继日志和二进制日志,是因为主节点宕机以后,任何一个从节点都有可能转移称为主节点