MariaDB Galera Cluster是MariaDB的同步多主集群。它仅在Linux上可用,并且仅支持xtraDB/InnoDB存储引擎,对MyISAM也有一定的支持(https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/#wsrep_replicate_myisam),
特征:
- 同步复制
- 多主可同时读写 Active-active multi-master
- 任何节点成员可读写
- 自动成员控制,故障节点从群集中删除
- 节点可自动加入(基于配置)
- 真正的并行复制,在行级复制
- 使用者在客户端连接,在使用和感官上和mysql一样
优点:
- 没有从库延迟
- 不会丢失事物
- 读写扩展高(后续文章会加入读写分离)
- 多主,不存在slave 延迟,也不以来binlog
- 具有同步复制,故障切换和重新同步的高可用性解决方案
- 所有服务器都具有最新数据(无滞后)
- 跨数据中心的高可用性
它依赖于wsrep API(https://launchpad.net/wsrep):
wsrep API定义了一组应用程序回调和复制库调用,以实现事务数据库和类似应用程序的同步写入复制。在从应用程序详细信息中抽象和分离复制实现。虽然此接口的主要目标是基于认证的多主机复制,但同样适用于异步和同步主/从复制。
它的复制过程也是基于认证的,基于WSREP API,大量的配置参考:
https://mariadb.com/kb/en/mariadb/galera-cluster-system-variables/#wsrep_replicate_myisam
Galera可以利用四个端口:
- 3306 数据库端口
- 4567 对于Galera Cluster复制,组播复制在此端口上同时使用UDP传输和TCP。
- 4568 增量数据同步IST,节点下线、重启后使用该端口,增量同步数据,增量状态转移。
- 4444 镜像数据传输SST,集群数据同步端口,全量同步,新节点加入时起作用
三台机器:10.0.1.49,10.10.240.113,10.0.1.61
其实用起来可以是这样的:
前面使用LVS等进行调度,当然在中间可以使用中间件进行读写分离
I. yum安装选择
https://downloads.mariadb.org/mariadb/repositories/
centos7 yum如下:
[root@LinuxEA ~]# cat > /etc/yum.repos.d/mariadb.repo << EOF
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
[root@LinuxEA ~]# yum install socat MariaDB-Galera-server MariaDB-client rsync galera
其他版本tar包安装下载地址:
https://downloads.mariadb.org/mariadb-galera/+releases/
本次使用二进制安装:
mariadb-galera安装:http://download.nus.edu.sg/mirror/mariadb//mariadb-galera-10.0.30/bintar-linux-x86_64/mariadb-galera-10.0.30-linux-x86_64.tar.gz
galera安装:http://releases.galeracluster.com/centos/7/x86_64/galera-3-25.3.20-2.el7.x86_64.rpm
防火墙添加:
iptables -I INPUT 4 -p tcp -m tcp -m state --state NEW -m multiport --dports 3306,4444,4567,4568 -m comment --comment "mariadb-galera" -j ACCEPT
其他依赖包:
yum install socat MariaDB-client rsync galera lsof
文档参考
- 编译参考:https://mariadb.com/kb/en/mariadb/installating-galera-from-source/
- 理解参考:https://www.percona.com/blog/2014/09/01/galera-replication-how-to-recover-a-pxc-cluster/
- 其他教程:https://severalnines.com/resources/tutorials/galera-cluster-mysql-tutorial
- http://galeracluster.com/products/technology/
- Galera Cluster 局限:https://mariadb.com/kb/en/mariadb/mariadb-galera-cluster-known-limitations/
II. node1
解压
[root@LinuxEA /data]# tar xf mariadb-galera-10.0.30-linux-x86_64.tar.gz -C /usr/local/
[root@LinuxEA /data]# cd /usr/local/
[root@LinuxEA /usr/local]# ln -s mariadb-galera-10.0.30-linux-x86_64/ mysql
安装
[root@LinuxEA /usr/local]# useradd mysql -s /sbin/nologin -M
[root@LinuxEA /usr/local]# mkdir -p /data/mysql
[root@LinuxEA /usr/local]# chown -R mysql.mysql /data/mysql
[root@LinuxEA /usr/local]# /usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/ --basedir=/usr/local/mysql
复制启动脚本
[root@LinuxEA /usr/local]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
[root@LinuxEA /usr/local]# systemctl enable mysqld
mysqld.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig mysqld on
[root@LinuxEA /usr/local]#
安装jemalloc内存分配器
[root@LinuxEA /]# wget https://github.com/jemalloc/jemalloc/releases/download/4.2.1/jemalloc-4.2.1.tar.bz2
[root@LinuxEA /]# yum install -y gcc lsof
[root@LinuxEA /]# tar xf jemalloc-4.2.1.tar.bz2
[root@LinuxEA /]# cd jemalloc-4.2.1/
[root@LinuxEA /jemalloc-4.2.1]# ./configure
[root@LinuxEA /jemalloc-4.2.1]# make
[root@LinuxEA /jemalloc-4.2.1]# make install
授权用户:
grant all privileges on *.* to 'tb'@'%' identified by 'password';
flush privileges;
III. 配置文件部分说明:
- wsrep_cluster_address=gcomm:// 如下:
这条命令,gcomm://是一个特殊的参数,在启动第一台数据库时需要使用这个参数来启动,否则会启动失败
-
wsrep_cluster_address=”gcomm://10.0.1.49,10.10.240.113,10.0.1.61″如下:
gcomm://后的是集群成员的ip地址
-
wsrep_sst_auth=tb:password如下:这里的sst需要安装lsof依赖包
这个参数就是我们之前设定的用来同步的用户名和密码
-
wsrep_node_name=’node1′ 如下:
当前node
-
wsrep_node_address=’10.0.1.49′ 如下:
当前node ip地址
IV. 部分配置文件如下
galera
[galera]
##https://www.percona.com/doc/percona-xtradb-cluster/5.6/wsrep-system-index.html
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
#wsrep_cluster_address="gcomm://"
wsrep_cluster_address="gcomm://10.0.1.49,10.10.240.113,10.0.1.61"
wsrep_cluster_name='cluster'
wsrep_node_address='10.0.1.49'
wsrep_node_name='node1'
#wsrep_replicate_myisam=1
####wsrep_slave_threads = 8
#wsrep_slave_threads = 16
##wsrep_provider_options="gcs.fc_limit=512"
#wsrep_provider_options="gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128;cert.log_conflicts=yes"
##wsrep_notify_cmd='/data/galeranotify/galeranotify.py'
#wsrep_log_conflicts=1
#wsrep_forced_binlog_format=ROW
#wsrep_drupal_282555_workaround=1
#wsrep_max_ws_size=2147483647
##wsrep_dirty_reads=0 #当值是1的时候这个节点是只读节点
##wsrep_sst_method=[mysqldump|xtrabackup|xtrabackup-v2|rsync|rsync_wan]
#wsrep_sst_method=xtrabackup-v2
wsrep_sst_method=rsync
wsrep_sst_auth=tb:password
V. 启动第一台:
这里需要注意的是,第一次启动使用–wsrep-new-cluster,如果此时集群中这台故障,需要修改配置文件打开:wsrep_cluster_address=”gcomm://10.0.1.49,10.10.240.113,10.0.1.61″这一项,如过其他两天数据已经和这台不同步,这需要删除目录数据后进行同步恢复并加入集群
[root@LinuxEA /data/mysql]# /etc/init.d/mysqld start --wsrep-new-cluster
做一些简单的优化:
DELETE FROM mysql.user WHERE User='';
DELETE FROM mysql.db WHERE Db LIKE 'test%';
DROP DATABASE test;
UPDATE mysql.user SET password = password('abc123') WHERE user = 'root';
VI. 启动第二台:
第二台的mariadb安装完成后,直接删掉/data/mysql下的文件,从10.0.1.49同步
[root@LinuxEA-2 /data/mysql]# rm -rf *
[root@LinuxEA-2 /data/mysql]# /etc/init.d/mysqld start
Starting MySQL.170524 17:43:41 mysqld_safe Adding '/usr/local/lib/libjemalloc.so' to LD_PRELOAD for mysqld
170524 17:43:41 mysqld_safe Logging to '/data/mysql/mysql-error.log'.
170524 17:43:41 mysqld_safe Starting mysqld daemon with databases from /data/mysql
..........SST in progress, setting sleep higher.... SUCCESS!
部分配置文件:
[galera]
##https://www.percona.com/doc/percona-xtradb-cluster/5.6/wsrep-system-index.html
wsrep_on=ON
wsrep_cluster_address="gcomm://10.0.1.49,10.10.240.113,10.0.1.61"
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='cluster'
wsrep_node_address='10.0.1.61'
wsrep_node_name='node2'
#wsrep_replicate_myisam=1
#wsrep_node_name='node1'
#wsrep_replicate_myisam=1
####wsrep_slave_threads = 8
#wsrep_slave_threads = 16
##wsrep_provider_options="gcs.fc_limit=512"
#wsrep_provider_options="gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128;cert.log_conflicts=yes"
##wsrep_notify_cmd='/data/galeranotify/galeranotify.py'
#wsrep_log_conflicts=1
#wsrep_forced_binlog_format=ROW
#wsrep_drupal_282555_workaround=1
#wsrep_max_ws_size=2147483647
##wsrep_dirty_reads=0 #当值是1的时候这个节点是只读节点
##wsrep_sst_method=[mysqldump|xtrabackup|xtrabackup-v2|rsync|rsync_wan]
#wsrep_sst_method=xtrabackup-v2
wsrep_sst_method=rsync
wsrep_sst_auth=tb:password
VII. 启动第三台
同样删除/data/mysql下的文件,从10.0.1.49同步
[root@LinuxEA-3 /data/mysql]# rm -rf *
[root@LinuxEA-3 /data/mysql]# /etc/init.d/mysqld start
Starting MySQL.170524 18:58:34 mysqld_safe Adding '/usr/local/lib/libjemalloc.so' to LD_PRELOAD for mysqld
170524 18:58:34 mysqld_safe Logging to '/data/mysql/mysql-error.log'.
170524 18:58:34 mysqld_safe Starting mysqld daemon with databases from /data/mysql
.....SST in progress, setting sleep higher.. SUCCESS!
[root@LinuxEA-3 /data/mysql]#
部分配置文件:
[galera]
##https://www.percona.com/doc/percona-xtradb-cluster/5.6/wsrep-system-index.html
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://10.0.1.49,10.10.240.113,10.0.1.49"
#wsrep_cluster_address="gcomm://"
wsrep_cluster_name='cluster'
wsrep_node_address='10.10.240.113'
wsrep_node_name='node3'
#wsrep_replicate_myisam=1
####wsrep_slave_threads = 8
#wsrep_slave_threads = 16
##wsrep_provider_options="gcs.fc_limit=512"
#wsrep_provider_options="gcache.page_size=128M;gcache.size=2G;gcs.fc_limit=512;gcs.fc_factor=0.9;evs.send_window=256;evs.user_send_window=128;cert.log_conflicts=yes"
##wsrep_notify_cmd='/data/galeranotify/galeranotify.py'
#wsrep_log_conflicts=1
#wsrep_forced_binlog_format=ROW
#wsrep_drupal_282555_workaround=1
#wsrep_max_ws_size=2147483647
##wsrep_dirty_reads=0 #当值是1的时候这个节点是只读节点
##wsrep_sst_method=[mysqldump|xtrabackup|xtrabackup-v2|rsync|rsync_wan]
#wsrep_sst_method=xtrabackup-v2
wsrep_sst_method=rsync
wsrep_sst_auth=tb:password
三台启动完成状态:
[root@LinuxEA /data/mysql]# mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"
+--------------------+-------+
| Variable_name | Value |
+--------------------+-------+
| wsrep_cluster_size | 3 |
+--------------------+-------+