Mysql Galera集群搭建

  • 目录
  • wsrep简介
  • Galera集群搭建

wsrep简介

wsrepwriteset replication的简称,是一种API,在底层调用各库实现数据库同步写.通过wsrep协议在全局实现复制,任何一节点都可读写.

基于wsrep协议提供的一种底层复制机制,实现了Galera cluster数据库集群。因此Galera cluster需要特定研发的一个数据库版本,只有支持了特别的研发版本,才能借住于wsrep协议实现复制机制.

多个节点之上有了信息层,上层应用完成高可用,研发时调用信息层所提供的api去开发,并基于这个api去完成集群事务决策,不然就要自行加入中间层称资源管理器crm,如pacemaker

galera cluster不是专为数据库提供的,只是一个工作在较为底层能够为你的服务提供数据复制功能的底层组件.

mysql只有在研发时调用了galera cluster api写的mysql才能利用galera cluster完成复制,它的复制不再是让其它节点通过读取主节点二进制日志文件在本地重放,而是你指明了复制哪个数据库文件,由galera cluster自己在底层完成同步,mysql本身不感知.

1
2
percona-cluster 版本支持galera cluster
MariaDB-cluster 版本支持galera cluster

复制的问题和解决方案:
(1) 数据损坏或丢失

1
2
3
4
语句或行记录二进制日志,从而在从服务器上重放,重放机制也可能主从不一致的情况硬件故障、软件bug也会有数据损坏或丢失
Master: MHA + semi replication(至少有一个从节点接收到了提交的binlog事件才返回成功,也是半同步复制)
如果主节点数据损坏或丢失,就必须手动在从节点通过gtid来判断出己经提交的所有应用或事务,然后合并出一个较新的从节点提升为主节点
Slave: 重新复制数据即可

(2) 运维部署注意事项:

1
2
3
4
5
关键业务监控
重要数据要备份和冗余
不能混合使用存储引警
MyISM: 不支持事务
InnoDB: 支持事务

(3) 设置了不唯一的server ID

1
2
不唯一,整个复制集群数据产生错乱,每一个服务节点都不会在本地重放由同一个server ID 所产生的事件
会导致重新复制数据

(4) 复制延迟

1
2
3
4
5
需要额外监控工具的辅助
自写一些脚本监控
从节点有一个落后于主节点的时间判定,这个时间不为0时,尝试重启从节点服务
对于从服务器延迟,主节点的事务是可以并发的,往二进制写入是单线程的,有先有后,从服务器重放也是单线程的,从服务器延迟落后也是必然的
mysql5.6/mariadb 10以后引入了多线程复制机制,三节点集群可设置wsrep_slave_threads = 4

数据库服务衡量指标

1
2
qps : query per second 查询量
tps: transaction per second 事务量

Galera集群搭建

最新文档请参考Galera 集群官方链接

一 准备工作

1 关闭防火墙
2 关闭selinux
3 同步主机时间
4 设置hosts文件

二 MariaDB源

在MariaDB 10.1以前需要卸载mariadb包,单独准备MariaDB-Galera-server源来安装MariaDB-Galera-server包
例:

1
2
3
4
5
6
7
8
9
10
11
12
yum list all | grep -i galera
yum remove mariadb*
yum -y install MariaDB-Galera-server.rpm galera-25.3
rpm -ql MariaDB-Galera-server
rpm -qa | grep MariaDB
MariaDB-common-10.0.32-1.el7.centos.x86_64
MariaDB-shared-10.0.32-1.el7.centos.x86_64
MariaDB-Galera-server-10.0.32-1.el7.centos.x86_64
MariaDB-client-10.0.32-1.el7.centos.x86_64
vim /etc/my.cnf.d/server.cnf
[galera]
...

而在MariaDB 10.1以后MariaDB-server己经自带Galera集群了,不必单独安装MariaDB-Galera-server包,只需准备如下源

编辑/etc/yum.repos.d/Mariadb.repo

1
2
3
4
5
6
7
# MariaDB 10.2 CentOS repository list - created 2017-11-07 12:07 UTC
# http://downloads.mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.2/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

三 软件安装

1
yum install MariaDB-server MariaDB-client

四 修改配置

编辑/etc/my.cnf.d/server.cnf

1
2
3
4
5
6
7
8
9
10
11
12
[galera]
#Mandatory settings
wsrep_provider=/usr/lib64/galera/libgalera_smm.so # 可查rpm -ql galera | grep -i smm.so
wsrep_cluster_address = 'gcomm://172.16.100.67,172.16.100.68,172.16.100.69'
wsrep_cluster_name = 'cluster'
wsrep_node_name = 'node1'
wsrep_node_address= '172.16.100.67'
binlog_format = row
default_storage_engine = InnoDB
innodb_autoinc_lock_mode = 2
bind-address = 0.0.0.0
wsrep_on=ON

五 启动服务

任意一个节点启动

1
2
3
/etc/init.d/mysql start --wsrep-new-cluster
或service mysql bootstrap
或systemctl start mariadb --wsrep-new-cluster

然后在其它节点正常启动即可

1
2
systemctl  start mariadb
MariaDB [(none)]> show status like '%wsrep%';

简单验证

1
2
3
4
5
6
7
create database mydb;
use mydb
create table tb1 (id int, name char(10));
desc tb1;
create table tb2 (id int unsigend auto_increment not null primary key, name char(30));
insert into tb2(name) values ('hi', 'hello')
select * from tb2;

有关认证及集群检测自行研究

1
2
3
4
wsrep_sst_method = xtrabackup-v2
wsrep_sst_auth = root:NtEXLlZGF9KeXYUE79e7H8N5C9Vdy0EkHlBfFPtr
wsrep_slave_threads = 4
wsrep_notify_cmd = /usr/local/bin/wsrep-notify.sh # 注意定义这个脚本