MariaDB Galera Cluster 集群介绍
MariaDB Galera Cluster(下文简称MGC集群),是一套在MySQL innodb存储引擎上面实现多主、数据实时同步以及强一致性的关系存储架构,业务层面无需做读写分离工作,数据库读写压力都能按照既定的规则分发到 各个节点上去,在数据方面完全兼容 MariaDB 和 MySQL。
MGC 是基于 Galera 协议的高可用方案:Galera 是 Codership 提供的多主数据同步复制机制,可以实现多个节点间的数据同步复制以及读写,并且可保障数据库的服务高可用及数据一致性。MGC 集群是由节点组成的,推荐配置至少 3 个节点,但是也可以运行在 2 个节点上。每个节点都包含完整的数据副本。
MGC 最大的优势:强一致性、无同步延迟
MGC 的优点:1、同步复制 Synchronous replication
2、Active-active multi-master 拓扑逻辑
3、可对集群中任一节点进行数据读写
4、自动成员控制,故障节点自动从集群中移除
5、自动节点加入
6、真正并行的复制,基于行级
7、直接客户端连接,原生的 MySQL 接口
8、每个节点都包含完整的数据副本
9、多台数据库中数据同步由 wsrep 接口实现
MGC 的缺点:
1、目前的复制仅仅支持InnoDB存储引擎,任何写入其他引擎的表,包括mysql.*表将不会复制,但是DDL语句会被复制,因此创建用户将会被复制,但是insert intomysql.user…将不会被复制
2、DELETE操作不支持没有主键的表,没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集.
3、在多主环境下LOCK/UNLOCK TABLES不支持,以及锁函数GET_LOCK(), RELEASE_LOCK()…
4、查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。
5、允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。
6、由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对 于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
7、XA事务不支持,由于在提交上可能回滚。
8、整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。
9、集群节点建议最少3个。
10、如果DDL语句有问题将破坏集群。
MGC 原理描述MGC 会使用大概4 个端口号
3306:数据库对外服务的端口号
4444:请求 SST。 SST: 指数据镜象传输端口,使用方法 xtrabackup , rsync ,mysqldump
4567: 组成员之间进行沟通的一个端口号
4568: 传输 IST 用的。相对于 SST 来说的一个增量。
PXC 的架构示意图
部署 MGC 高可用集群
集群 统一使用CentOS 7.9首先配置好主机名、静态IP、关闭 firewalld 防火墙、SElinux、交换分区 swap、修改内核参数、配置阿里云 repo 源、配置时间同步等等
安装 MGC 集群
Installing MariaDB with yum/dnf - MariaDB Knowledge BaseMGC 属于 Multi-master Replication(多主复制)。多主复制意味着支持对任意节点的读写,数据会同步复制到其他节点。
配置 yum 源
分别在mysql1 、mysql2 和 mysql3 上做如下操作:
vim /etc/yum.repos.d/MariaDB.repo
[mariadb]name = MariaDBbaseurl = /10.7/centos7-amd64gpgkey=/RPM-GPG-KEY-MariaDBgpgcheck=1或者使用国内yum源[mariadb]name=mariadbbaseurl=https://mirrors.tuna./mariadb/yum/10.7/centos7-amd64/gpgkey=/RPM-GPG-KEY-MariaDBgpgcheck=1
导入 KEY
rpm --import /RPM-GPG-KEY-MariaDB
#安装 qpress
yum -y install /yum/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm
yum -y install MariaDB-server galera-4 MariaDB-client MariaDB-shared MariaDB-backup MariaDB-common MariaDB-server-debuginfo MariaDB-client-debuginfo MariaDB-shared-debuginfo MariaDB-backup-debuginfo MariaDB-common-debuginfo
修改数据库 root 密码
三个节点都安装完软件包之后,接下来只对第一个节点 mysql1 进行修改密码操作。#先启动 maridbd服务。
systemctl start mysqld
使用空密码登录 MySQL
mysql -u root -p
更改 root 用户的密码,之后退出。
mysql> alter user 'root'@'localhost' identified by 'NEWPASSWORD';
mysql> exit
关闭 MySQL 服务。
systemctl stop mysqld
注意:以上修改密码操作只需在第一个节点进行即可。配置好第二个和第三个节点,启动服务操作后会自动复制到其他节点中。
mysql2和 mysql3上的 mysql 服务,现在不需要启动。
配置 MGC 集群第 1 个节点配置第一个节点 mysql1 的 /etc/f.d/f
vim /etc/f.d/f
[client]socket=/var/lib/mysql/mysql.sock[mysqld]server-id=1datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socklog-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pidbinlog_expire_logs_seconds=604800skip-external-lockingskip-name-resolvemax_connections=5000connect_timeout=5wait_timeout=600max_allowed_packet=16Mthread_cache_size=128sort_buffer_size=4Mbulk_insert_buffer_size=16Mtmp_table_size=32Mmax_heap_table_size=32Mcharacter-set-client-handshake = FALSEcharacter-set-server = utf8mb4collation-server = utf8mb4_unicode_ciinit_connect='SET NAMES utf8mb4'wsrep_causal_reads=ONwsrep_provider_options="gcache.size=128M"wsrep_certify_nonPK=ONlog-bin=/data/mariadb/data/mysql-binlog_slave_updates=1query_cache_size=0wsrep_on=ONwsrep_provider=/usr/lib64/galera-4/libgalera_smm.sowsrep_cluster_name=MGC-Clusterwsrep_cluster_address=gcomm://192.168.1.231,192.168.1.232,192.168.1.233wsrep_node_name=mysql1wsrep_node_address=192.168.1.231wsrep_sst_method=xtrabackup-v2wsrep_sst_method=rsyncbinlog_format=row default_storage_engine=InnoDB innodb_autoinc_lock_mode=2wsrep_slave_threads=8innodb_flush_log_at_trx_commit=0innodb_buffer_pool_size=500M
/etc/f.d/f 增加的参数说明:
# 集群通讯地址
wsrep_cluster_address=gcomm://192.168.1.231,192.168.1.232,192.168.1.233
# 本节点的地址
wsrep_node_address=192.168.1.231
# 本节点的名称
wsrep_node_name= mysql1
这些内容也同样对 mysql2.和 mysql3 进行配置,只有两个参数wsrep_node_name, wsrep_node_address配置的值需要修改一下
扩展:主配置文件 f 其他参数说明
wsrep_provider #指定 Galera 库的路径。
wsrep_cluster_name #指定集群的逻辑名称,集群内的所有节点,这个名称必须一致。
wsrep_cluster_address #指定集群内节点的 IP 地址,建议将集群节点都配上。
wsrep_node_name #指定单个节点的逻辑名称,如果没有指定,将使用 hostname 作为逻辑名称。
wsrep_node_address #指定此特定节点的 IP 地址。
wsrep_sst_method #默认的使用 Percona Xtrabackup 进行 State Snapshot Transfer
(SST),强烈建议使用 wsrep_sst_method=xtrabackup-v2
binlog_format #Galera 只支持 row-level replication,默认设置为 binlog_format=ROW。
innodb_autoinc_lock_mode #Galera 只支持 lock mode 为 2 的 InnoDB 引擎,默认设置为 innodb_autoinc_lock_mode=2。
引导 GRC 集群启动并将其他节点加到集群中
1、在第一个节点上引导 GRC 集群启动
在第一个节点 mysql1 使用如下命令引导 PXC 集群启动
galera_new_cluster
为确保初始化完成,可以使用如下命令查看
登录 MySQL
mysql -u root -p
mysql> show status like 'wsrep%';
可以看到集群数量是 1,本节点为Synced状态,表示连接成功,并且准备好进行 write-setreplication。
注意:所有其他节点的数据和配置都会被第一个节点的数据覆盖,不要同时加入多个节点,避免数据或网络开销过大。等一个节点加入成功后,再加入另一个新节点。
启动第二个节点
systemctl start mysqld
启动完成后,mysql2 会接到 mysql1的数据,可以使用如下命令查看状态
mysql -u root -p
登录到 MySQL 后,输入如下命令
mysql> show status like 'wsrep%';
可以看到 wsrep_cluster_size 的值是 2 表示集群已经有 2 个节点了。
wsrep_local_state_comment 的值是 Synced 表示已经同步了。
注意 如果 wsrep_local_state_comment 的状态是 Joiner,表示正在同步,请不要启动第三个节点的服务。
启动第三个节点
注意:确认好第二个节点的状态为Synced后,再启动第三个节点。步骤与启动第二个节点相同
systemctl start mysqld
启动完成后,mysql3会接到集群,可以使用如下命令查看状态
mysql -u root -p
登录到 MySQL 后,输入如下命令
mysql> show status like 'wsrep%';
测试数据同步
在 mysql3 上删除 test 库drop database test;
模拟故障
测试 单点故障
首先停止 mysql3在 mysql2 上观察停止 mysql1
测试 全部故障
这时候直接 start 发现无法启动
因为是同时关闭,seqno 号无法提供有效的信息,无从判断最后的有效节点
在任意节点
模拟 2台故障
MGC 集群只有有任意节点存活,其他节点即可加入。
seqno 选择数值大的优先启动
全新节点加入
配置好主机名、静态IP、关闭 firewalld 防火墙、SElinux、交换分区 swap、修改内核参数、配置阿里云 repo 源、配置时间同步等等所有节点都要添加 新节点的 IP和主机名准备工作做完后,在新节点安装 MGC
yum -y install MariaDB-server MariaDB-Galera-server galera-4 MariaDB-client MariaDB-shared MariaDB-backup MariaDB-common MariaDB-server-debuginfo MariaDB-client-debuginfo MariaDB-shared-debuginfo MariaDB-backup-debuginfo MariaDB-common-debuginfo启动 mysql加入 slave 节点
创建 slave 复制用户
垣份手游 娱乐平台-手游公益服
如果觉得《Linux 搭建 MariaDB Galera Cluster 高可用集群》对你有帮助,请点赞、收藏,并留下你的观点哦!