MYSQL高可用集群

post thumb
Mysql
作者 Louis 发表于 2018年6月15日

摘要:MySQL的高可用,Cluster,Galera Cluster的应用。

MySQL的高可用

Master HA或多主模型 MMM: Multi Master MySQL,基于主从复制实现 MHA: Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从,MHA是由Prel语言编写。 官网下载MHA Galera Cluster:wresp 通过wresp协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主可读可写

MHA工作原理

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

MHA软件由两部分组成,Manager工具包和Node工具包

Manager工具包主要包括以下几个工具:

  • masterha_check_ssh 检查MHA的SSH配置状况

  • masterha_check_repl 检查MySQL复制状况

  • masterha_manger 启动MHA

  • masterha_check_status 检测当前MHA运行状态

  • masterha_master_monitor 检测master是否宕机

  • masterha_master_switch 故障转移(自动或手动)

  • masterha_conf_host 添加或删除配置的server信息

Node工具包:这些工具通常由MHA Manager的脚本触发,无需人为操作)主要包括以下几个工具:

  • save_binary_logs 保存和复制master的二进制日志
  • apply_diff_relay_logs 识别差异的中继日志事件并将其差异的事件应用于其他的slave
  • filter_mysqlbinlog 去除不必要的ROLLBACK事件(MHA已不再使用此工具)
  • purge_relay_logs 清除中继日志(不会阻塞SQL线程)
  • 注意:为了尽可能的减少主库硬件损坏宕机造成的数据丢失,因此在配置MHA的同时建议配置成MySQL 5.5的半同步复制

实现MHA的搭建

原理图如下:至少需要4台主机。

1529411868746

准备工作

  • nptdate :保证时间同步,在/etc/ntp.conf ,加上 server 172.20.0.1 ibrust,重启服务 systemctl restart ntpd

  • 安装包:

    Manager上安装mha4mysql-node-0.56-0.el6.noarch.rpm,mha4mysql-manager-0.56-0.el6.noarch.rpm,需要启用epel源下载安装依赖 其余节点:安装mha4mysql-node-0.56-0.el6.noarch.rpm

  • selinux,iptables需要关闭.

  • 四台主机的IP配置模拟

Manager:192.168.1.6
master:192.168.1.7
slave1:129.168.1.8
slave2: 192.168.1.17

Manager主机

​ 实现四台主机的基于key验证,$ip为上面四台主机的ip配置。

ssh-genkey
ssh-copy-id 192.168.1.6
scp -rp .ssh $ip:/root/.ssh

​ 安装mha4mysql-node-0.56-0.el6.noarch.rpm,mha4mysql-manager-0.56-0.el6.noarch.rpm,需要启用epel源下载安装依赖文件。

$ yum install -y  mha4mysql-node-0.56-0.el6.noarch.rpm
$ yum install -y  mha4mysql-manager-0.56-0.el6.noarch.rpm

​ 在Manager配置MHA的配置文件/etc/mha/app1.cnfserver1中的candidate_master=1,是可能变成主服务器的键值对选项。

vim /etc/mha/app1.cnf
[server default]
user=mhauser
password=centos
manager_workdir=/data/mha/app1/
manager_log=    /data/mha/app1/manager.log
remote_workdir= /data/mha/app1/
ssh_user=root
repl_user=repluser
repl_password=centos
ping_interval=1
[server1]
hostname=192.168.1.7
candidate_master=1
[server2]
hostname=192.168.1.8
candidate_master=1
[server3]
hostname=192.168.1.17

​ 开启集群,注意:在开启集群之前,要保证masterslave1,和slave2全部配置成主从复制架构。

masterha_check_ssh  --conf=/etc/mha/app1.cnf
masterha_check_repl --conf=/etc/mha/app1.cnf
#前台运行
masterha_manager    --conf=/etc/mha/app1.cnf
#排错日志/data/mastermha/app1/manager.log

Master主机

$ yum install -y  mha4mysql-node-0.56-0.el6.noarch.rpm
$ vim /etc/my.cnf
server_id=1
log_bin
binlog_format=row
skip_name_resolve
$ systemctl restart mariadb
grant replication slave on *.* to repluser@'192.168.1.%' identified by 'centos';
show master logs;
grant all on *.* to mhauser@'192.168.1.%' identified by 'centos';
show grants for mhauser@'192.168.1.%'

slave1

$ yum install -y  mha4mysql-node-0.56-0.el6.noarch.rpm
$ vim /etc/my.cnf
log_bin
server_id=2
read_only=1
relay_log_purge=0
skip_name_resolve=1
$ systemctl restart mariadb
$ mysql
CHANGE MASTER TO   
	MASTER_HOST='192.168.1.7',   
	MASTER_USER='repluser',   MASTER_PASSWORD='centos',   
	MASTER_PORT=3306,   
	MASTER_LOG_FILE='master-bin.000001',   
	MASTER_LOG_POS=245;
start slave;

slave2

$ yum install -y  mha4mysql-node-0.56-0.el6.noarch.rpm
$ vim /etc/my.cnf
log_bin
server_id=3
read_only=1
relay_log_purge=0
skip_name_resolve=1
$ systemctl restart mariadb
$ mysql
CHANGE MASTER TO   
	MASTER_HOST='192.168.1.7',   
	MASTER_USER='repluser',   MASTER_PASSWORD='centos',   
	MASTER_PORT=3306,   
	MASTER_LOG_FILE='master-bin.000001',   
	MASTER_LOG_POS=245;
start slave;

Galera Cluster

Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案。

官方参考文档参考如下:

http://galeracluster.com/documentation-webpages/galera-documentation.pdf

http://galeracluster.com/documentation-webpages/index.html

https://mariadb.com/kb/en/mariadb/getting-started-with-mariadb-galera-cluster/

Galera Cluster 的实现

注意:安装基于Galera的mariadb-5.5.60,不能安装mariadb-server三个节点的配置原理 三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构。

1529408788984

配置过程

下载安装MariaDB-Galera-server,国外yum源速度太慢,提供清华源下载。

vim /etc/yum.repos.d/base.repo
[mariadb]
name = MariaDB
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
gpgcheck=0
$ yum install -y MariaDB-Galera-server
$ rpm -ql MariaDB-Galera-server
$ rpm -qf /usr/lib64/galera/libgalera_smm.so

配置文件的修改

三台主机都需要修改,wsrep_providerwsrep_cluster_addressbinlog_format,主要改着三个键值对。

$ vim /etc/my.cnf.d/server.cnf
wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.1.7,192.168.1.8,192.168.1.17"
binlog_format=row
#default_storage_engine=InnoDB
#innodb_autoinc_lock_mode=2
#bind-address=0.0.0.0

启动相关

首次启动需要添加--wsrep-new-cluster,其他节点正常启动

/etc/init.d/mysql start --wsrep-new-cluster
Starting MariaDB.180619 19:24:40 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
180619 19:24:40 mysqld_safe Starting mysqld daemon with databases from /data/mysql
... SUCCESS! 
/etc/init.d/mysql start
Starting MariaDB.180619 19:24:53 mysqld_safe Logging to '/var/log/mariadb/mariadb.log'.
180619 19:24:53 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
...SST in progress, setting sleep higher.. SUCCESS! 

测试及查询状态

数据会及时同步,如果三台服务器在相同数据表的相同行同时执行增删改,则只有一台节点会成功。

SHOW STATUS LIKE '%wsrep%'\G
SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |	#cluster共有3台服务器
+--------------------+-------+
1 row in set (0.00 sec)