如何在RHEL8部署MariaDB Galera集群?

Load balancing

1 基础知识

1.1 技术简介


– MariaDB Galera集群是一个同步多主集群

1.2 技术局限性

– MariaDB Galera集群仅在Linux上可用
– MariaDB Galera集群仅支持XtraDB/InnoDB存储引擎
– MariaDB Galera集群对支持MyISAM存储引擎实验性支持

1.3 集群的功能特点

– 同步复制
– Active-active的multi-master(多主)拓扑结构
– 可读取和写入任何群集节点
– 自动成员资格控制,故障节点自动从集群中删除
– 自动节点加入
– 实现数据行级别的并行复制
– 客户端连接到集群跟单机版连接无异

1.4 集群的优点

– 没有从节点滞后问题
– 没有丢失的数据传输
– 读写服务器扩展容易
– 客户端连接延迟较小

1.5 基本概念

1.5.1 wsrep接口

1.5.1.1 什么是wsrep API
– wsrep API中文称写集合复制接口
– 接口基于认证多主复制,亦适用于异步和同步主从复制
– 实现事务数据库和类似应用程序的一组应用程序回调和复制库调用(同步写集合)
– 从应用程序细节中抽象和隔离复制实现
1.5.1.2 写集合管理
– 在发送端填充写集合
– 在接收端应用写集合
注:接收到的写集合应用由高优先级别的事务先完成
1.5.1.3 SQL的隔离处理
– 提供SQL语句“完全隔离”的命令处理
– 确保群集中的每个数据库服务器以相同的顺序处理SQL语句并且不中断
– DDL语句都需要隔离处理,以保持群集中的数据一致性
1.5.1.4 支持wsrep API的版本
– 从MariaDB 10.1开始,缺省包含Galera群集wsrep API
– MariaDB 10.0和MariaDB 5.5需要单独下载

1.5.2 DBMS

– Database Management System的简称(数据库管理系统)
– 一种操纵和管理数据库的大型软件
– 用于建立、使用和维护数据库

1.6 Galera复制

1.6.1 运行机制

– Galera复制发生在事务提交时
– Galera将事务写入写集合中
– Galera将写集合广播到集群的其他可用节点
– 其他集群节点通过应用写集合保持群集节点间的数据一致性

1.6.2 同步复制与异步复制

1.6.2.1 基本概念
– 同步即群集中一个节点有数据更改,其他节点也会发生更改(或同时发生)
– 异步即节点间的数据同步变更是允许延迟的(主节点崩溃可能会丢失数据)
1.6.2.2 同步与异步复制的比较
– 同步复制其中一个节点崩溃,无数据丢失,数据副本始终保持一致
– 同步复制的事务会在所有节点上并行执行
– 同步复制的事务总会有效果,即使在另一个节点执行
1.6.3.3 实践经验
– 同步复制实施的低性能和复杂性导致异步复制仍是数据库伸缩和高可用的主要手段
– MySQL或PostgreSQL仅提供异步复制解决方案

1.6.3 基于认证的复制方法

1.6.3.1 基本概念
– 使用群组通讯和事务排序技术进行同步数据复制
– Galera复制时高度透明且可扩展的同步复制解决方案
1.6.3.2 Galera复制的特点
– 高度可用
– 高度透明
– 高度可扩展

1.6.4 泛型复制库

– Galera复制功能是作为共享库实现的
– Galera可以与任何实现wsrep API挂钩的事务处理系统链接
– Galera复制库是一个协议栈,提供用于准备,复制和应用事务写集合功能

2 实践部分

2.1 环境配置

2.1.1 群集环境信息

OS = RHEL 8.x x86_64
IP Address = 10.168.0.7[1-3] hostname = node[1-3].cmdschool.org

2.1.2 部署单机版MariaDB

请按如下链接部署MariaDB(请使用service,不推荐使用systemd方式启动),
https://www.cmdschool.org/archives/5841

2.1.3 安装依赖的工具包

In node[1-3].cmdschool.org

yum install -y rsync lsof

2.1.4 SELinux配置

In node[1-3].cmdschool.org

sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0

2.1.5 开启防火墙端口

In node[1-3].cmdschool.org

firewall-cmd --permanent --add-service mysql
firewall-cmd --permanent --add-port 4567-4568/tcp
firewall-cmd --permanent --add-port 4444/tcp
firewall-cmd --permanent --add-port 4567/udp
firewall-cmd --reload
firewall-cmd --list-all

2.1.6 配置名称解析

In node[1-3].cmdschool.org

echo '10.168.0.71 node1 node1.cmdschool.org' >> /etc/hosts
echo '10.168.0.72 node2 node2.cmdschool.org' >> /etc/hosts
echo '10.168.0.73 node3 node3.cmdschool.org' >> /etc/hosts

2.1.7 配置公钥认证(可选)

In node1.cmdschool.org
2.1.7.1 生成公钥和私钥

ssh-keygen

注:以上一路回车,不需要设置任何参数
2.1.7.2 复制公钥到群集中的其他机器

ssh-copy-id -i ~/.ssh/id_rsa.pub node2
ssh-copy-id -i ~/.ssh/id_rsa.pub node3

2.1.7.3 测试公钥认证

ssh root@node2
ssh root@node3

2.2 准备集群配置

In node[1-3].cmdschool.org

2.2.1 配置同步用户

mysql -uroot -p
grant all privileges on *.* to sst@'%' identified by 'abc123';
flush privileges;
quit;

2.2.2 确认wsrep模块位置

find /usr/local/mysql/ -name libgalera_smm.so

命令显示如下:

/usr/local/mysql/lib/galera/libgalera_smm.so
/usr/local/mysql/lib/libgalera_smm.so

2.2.3 增加wsrep配置文件

cp /usr/local/mysql/support-files/wsrep.cnf /etc/my.cnf.d/

2.3 配置集群首个节点

In node1.cmdschool.org

2.3.1 修改wsrep配置

vim /etc/my.cnf.d/wsrep.cnf

修改如下参数

wsrep_provider=/usr/local/mysql/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://"
wsrep_sst_auth=sst:abc123

另外,官方建议配置的参数如下,

wsrep_provider — Path to the Galera library
wsrep_cluster_address — see cluster connection URL
binlog_format=ROW — see Binary Log Formats
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_doublewrite=1 (the default) when using Galera provider of version >= 2.0.
query_cache_size=0 (only for versions prior to 5.5.40-galera, 10.0.14-galera and 10.1.2)
wsrep_on=ON — Enable wsrep replication (starting 10.1.1)

2.3.2 重启服务使配置生效

/etc/init.d/mysqld restart

重启后我们建议按如下方法检查日志,

egrep -i "error|failed" /var/log/mysqld/mysqld.log

如果发现如下错误提示,

2019-06-17 22:53:35 0 [ERROR] WSREP: wsrep_load(): dlopen(): libssl.so.10: cannot open shared object file: No such file or directory
2019-06-17 22:53:35 0 [ERROR] WSREP: wsrep_load(/usr/local/mysql/lib/galera/libgalera_smm.so) failed: Invalid argument (22). Reverting to no provider.
2019-06-17 23:27:18 0 [ERROR] WSREP: wsrep_load(): dlopen(): libcrypto.so.10: cannot open shared object file: No such file or directory
2019-06-17 23:27:18 0 [ERROR] WSREP: wsrep_load(/usr/local/mysql/lib/galera/libgalera_smm.so) failed: Invalid argument (22). Reverting to no provider.

你可能需要手动编译部署openssl的1.0.1e版的so文件(RHEL8适用),

cd ~
wget --no-check-certificate https://www.openssl.org/source/openssl-1.0.1e.tar.gz
tar -xf openssl-1.0.1e.tar.gz
cd openssl-1.0.1e/
./config --prefix=/usr/local/openssl-1.0.1e --openssldir=/usr/local/openssl-1.0.1e shared zlib-dynamic
make
make install
cp /usr/local/openssl-1.0.1e/lib/libssl.so /usr/lib64/libssl.so.10
cp /usr/local/openssl-1.0.1e/lib/libcrypto.so /usr/lib64/libcrypto.so.10

如果以上编译提示如下错误,

c_zlib.c:25:10: fatal error: zlib.h: No such file or directory

则需要安装如下包解决依赖关系,

yum install -y zlib-devel

如果以上编译安装提示如下错误,

POD document had syntax errors at /usr/bin/pod2man line 69.
make: *** [Makefile:640: install_docs] Error 255

则需要按如下命令处理,

mv /usr/bin/pod2man /usr/bin/pod2manSave

2.3.3 确认新集群创建成功

mysql -uroot -p -e "show status like 'wsrep_cluster_size';"

显示如下则成功,

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 1     |
+--------------------+-------+

2.3.4 确认启动的端口

netstat -antp | grep mysqld

显示如下则成功,

tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      18211/mysqld
tcp        0      0 0.0.0.0:4567            0.0.0.0:*               LISTEN      18211/mysqld

2.4 将其他节点加入集群

2.4.1 修改配置文件

In node[2-3].cmdschool.org

vim /etc/my.cnf.d/wsrep.cnf

修改如下参数

wsrep_provider=/usr/local/mysql/lib/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://node1"
wsrep_sst_auth=sst:abc123

住:留意“wsrep_cluster_address”参数的配置方法
另外,官方建议配置的参数如下,

wsrep_provider — Path to the Galera library
wsrep_cluster_address — see cluster connection URL
binlog_format=ROW — see Binary Log Formats
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
innodb_doublewrite=1 (the default) when using Galera provider of version >= 2.0.
query_cache_size=0 (only for versions prior to 5.5.40-galera, 10.0.14-galera and 10.1.2)
wsrep_on=ON — Enable wsrep replication (starting 10.1.1)

2.4.2 重启服务使配置生效

/etc/init.d/mysqld restart

2.4.3 确认新集群创建成功

In node[2-3].cmdschool.org

mysql -uroot -p -e "show status like 'wsrep_cluster_size';"

当所有节点配置完,显示如下则成功,

+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

2.5 测试集群

In node3.cmdschool.org

2.5.1 节点3创建数据库

mysql -uroot -p
create database test1;

In node[1-3].cmdschool.org

2.5.2 检查所有节点的数据库创建结果

mysql -uroot -p
show databases;

每个节点显示如下则配置有效,

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test1              |
+--------------------+
4 rows in set (0.00 sec)

In node3.cmdschool.org

2.5.3 节点1删除数据库

mysql -uroot -p
drop database test1;

In node[1-3].cmdschool.org

2.5.4 检查所有节点的数据库删除结果

mysql -uroot -p
show databases;

每个节点显示如下则配置有效,

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

参阅文档:
==============
配置MariaDB Galera集群的防火墙
—————————–
http://galeracluster.com/documentation-webpages/firewallsettings.html

配置MariaDB Galera集群
————————
https://mariadb.com/kb/en/library/getting-started-with-mariadb-galera-cluster/
http://galeracluster.com/documentation-webpages/

配置MariaDB Galera集群的SELinux
———————————
http://galeracluster.com/library/documentation/selinux.html?highlight=selinux

如何确定集群最先进的节点
———————–
https://mariadb.com/kb/en/library/getting-started-with-mariadb-galera-cluster/

Galera Cluster
————————
http://galeracluster.com/products/

MariaDB Galera Cluster
———————–
https://mariadb.com/kb/en/library/galera-cluster/

wsrep API
———————–
https://launchpad.net/wsrep

MariaDB Documentation
———————–
https://mariadb.com/kb/en/library/documentation/

如何手动安装openssl
———————–
https://www.cmdschool.org/archives/5740

没有评论

发表评论

MySQL & MariaDB
如何开启Mariadb或MySQL Binlog?

1 前言 一个问题,一篇文章,一出故事。 笔者需要备份Mariadb的binlog,于是整理此文。 …

MySQL & MariaDB
如何迁移MariaDB或MySQL数据目录?

1 前言 一个问题,一篇文章,一出故事。 笔者之前的数据库使用默认部署在根目录下,现在想迁移至专用的 …

Elastic Stack
如何部署Elasticsearch集群?

1 基础知识 1.1 集群的介绍 – Elasticsearch集群允许节点单点故障 & …