广州总部电话:020-85564311
广州总部电话:020-85564311

广州网站建设-小程序商城开发-广州小程序开发-企业微信开发公司-网站建设高端品牌-优网科技

20年
互联网应用服务商
请输入搜索关键词
知识库 知识库

优网知识库

探索行业前沿,共享知识宝库

MySQL 高可用:Galera Cluster
发布日期:2025-04-17 17:45:25 浏览次数: 830 来源:SRE运维派


1 MySQL 集群

1.6 MySQL 高可用

1.6.3 Galera Cluster

1.6.3.1 Galera Cluster 介绍

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

Galera Cluster 特点

  • 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的

  • 同步复制:改善了主从复制延迟问题,基本上达到了实时同步

  • 并发复制:从节点APPLY数据时,支持并行执行,更好的性能

  • 故障切换:在出现数据库故障时,因支持多点写入,切换容易

  • 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小

  • 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致

  • 对应用透明:集群的维护,对应用程序是透明的


Galera Cluster 缺点

  • 任何更新事务都需要全局验证通过,才会在其他节点执行,则集群性能由集群中最差性能节点决定(一般集群节点配置都是一样的)

  • 新节点加入或延后较大的节点重新加入需全量拷贝数据 (SST,State Snapshot Transfer),作为 donor ( 贡献者,如:同步数据时的提供者) 的节点在同步过程中无法提供读写

  • 只支持 innodb 存储引擎的表


Galera Cluster 复制工作原理

Galera复制是一种基于验证的复制,基于验证的复制使用组通信和事务排序技术实现同步复制。它通过广播并发事务之间建立的全局总序来协调事务提交。简单说就是事务必须以相同的顺序应用于所有实例。事务在本节点乐观执行,然后在提交时运行一个验证过程以保证全局数据一致性。所谓乐观执行是指,事务在一个节点提交时,被认为与其它节点上的事务没有冲突,首先在本地执行,然后再发送到所有节点做冲突检测,无冲突时在所有节点提交,否则在所有节点回滚。

当客户端发出 commit 命令时,在实际提交之前,对数据库所做的更改都将被收集到一个写集中,写集中包含事务信息和所更改行的主键。然后,数据库将此写集发送到所有其它节点。节点用写集中的主键与当前节点中未完成事务的所有写集(不仅包括当前节点其它事务产生的写集,还包括其它节点传送过来的写集)的主键相比较,确定节点是否可以提交事务。

如果操作同时符合以下三个条件,则会认为此次提交存在冲突(验证失败)

  • 两个事务来源于不同节点。

  • 两个事务包含相同的主键。

  • 老事务对新事务不可见,即老事务未提交完成。新老事务的划定依赖于全局事务总序,即GTID。


验证失败后,节点将删除写集,集群将回滚原始事务。对于所有的节点都是如此,每个节点单独进行验证。因为所有节点都以相同的顺序接收事务,它们对事务的结果都会做出相同的决定,要么全成功,要么都失败。成功后自然就提交了,所有的节点又会重新达到数据一致的状态。节点之间不交换 “是否冲突” 的信息,各个节点独立异步处理事务。由此可见,Galera 本身的数据也不是严格同步的,很明显在每个节点上的验证是异步的,这就是 “虚拟同步”。

最后,启动事务的节点可以通知客户端应用程序是否提交了事务。

Galera Cluster 官方文档

http://galeracluster.com/documentation-webpages/galera-documentation.pdfhttp://galeracluster.com/documentation-webpages/index.htmlhttps://www.percona.com/doc/percona-xtradb-cluster/LATEST/index.htmlhttps://mariadb.com/kb/en/library/getting-started-with-mariadb-galera-cluster/

Galera Cluster 包括两个组件

  • Galera replication library (galera-3)

  • WSREP:MySQL extended with the Write Set Replication


WSREP 实现

  • PXC:Percona XtraDB Cluster,是 Percona 对 Galera 的实现

  • MariaDB Galera Cluster

#pxc 国内源https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch

注意:两者都需要至少三个节点,不能安装 mysql server 或 mariadb-server

1.6.3.2 PXC 原理

PXC 最常使用如下4个端口号:

  • 3306:数据库对外服务的端口号

  • 4444:请求SST的端口号

  • 4567:组成员之间进行沟通的端口号

  • 4568:用于传输IST的端口号


PXC 中涉及到的重要概念和核心参数:

集群中节点的数量

整个集群中节点数量应该控制在最少3个,最多8个的范围内。最少3个节点是为了防止出现脑裂现象,因为只有在2个节点下才会出现此现象。脑裂现象的标志就是输入任何命令,返回的结果都是 unknown command。节点在集群中,会因新节点的加入或故障、同步失效等原因发生状态的切换。

节点状态的变化阶段

  • open:节点启动成功,尝试连接到集群时的状态

  • primary:节点已处于集群中,在新节点加入并选取donor进行数据同步时的状态

  • joiner:节点处于等待接收同步文件时的状态

  • joined:节点完成数据同步工作,尝试保持和集群进度一致时的状态

  • synced:节点正常提供服务时的状态,表示已经同步完成并和集群进度保持一致

  • donor:节点处于为新加入的节点提供全量数据时的状态


备注:donor 节点就是数据的贡献者,如果一个新节点加入集群,此时又需要大量数据的 SST 数据传输,就有可能因此而拖垮整个集群的性能,所以在生产环境中,如果数据量较小,还可以使用 SST 全量数据传输,但如果数据量很大就不建议使用这种方式,可以考虑先建立主从关系,然后再加入集群。

节点的数据传输方式

  • SST:State Snapshot Transfer,全量数据传输

  • IST:Incremental State Transfer,增量数据传输


SST 数据传输有 xtrabackup、mysqldump 和 rsync 三种方式,而增量数据传输就只有一种方式 xtrabackup,但生产环境中一般数据量较小时,可以使用SST全量数据传输,但也只使用 xtrabackup 方法。

GCache 模块

在 PXC 中一个特别重要的模块,它的核心功能就是为每个节点缓存当前最新的写集。如果有新节点加入进来,就可以把新数据的增量传递给新节点,而不需要再使用 SST 传输方式,这样可以让节点更快地加入集群中,涉及如下参数:

  • gcache.size:缓存写集增量信息的大小,它的默认大小是 128MB,通过 wsrep_provider_options 参数设置,建议调整为2GB~4GB范围,足够的空间便于缓存更多的增量信息。

  • gcache.mem_size:GCache 中内存缓存的大小,适度调大可以提高整个集群的性能

  • gcache.page_size:如果内存不够用(GCache不足),就直接将写集写入磁盘文件中


1.6.3.3 Percona XtraDB Cluster 实现

主机清单

主机IP 
主机名 
角色 
操作系统 
PXC版本
10.0.0.200 
pxc-1 
node-1 
CentOS7 
Percona-XtraDB-Cluster-57
10.0.0.201 
pxc-2 
node-2 
CentOS7 
Percona-XtraDB-Cluster-57
10.0.0.202 
pxc-3 
node-3 
CentOS7 
Percona-XtraDB-Cluster-57

Percona XtraDB Cluster 在 el8 的系统中还没有推出正式版。

前置工作

Percona XtraDB 是一种特殊形态的 MySQL 数据库,与 MySQL 官方的发行版及 MariaDB 是两种不同的产品,要求安装节点上没有 MySQL 和 MariaDB。另外提前关闭 SElinux,关闭防火墙,保证时间同步。

安装软件,三个节点都要执行安装操作

#配置yum 源[root@pxc-1 ~]# cat /etc/yum.repos.d/percona.repo[percona]name=perconabaseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/7/RPMS/x86_64/gpgcheck=0enabled=1
#安装[root@pxc-1 ~]# yum install -y Percona-XtraDB-Cluster-57
#查看,安装了 server 包和 client 包[root@pxc-1 ~]# rpm -q Percona-XtraDB-Cluster-57 Percona-XtraDB-Cluster-server-57 Percona-XtraDB-Cluster-client-57Percona-XtraDB-Cluster-57-5.7.41-31.65.1.el7.x86_64Percona-XtraDB-Cluster-server-57-5.7.41-31.65.1.el7.x86_64Percona-XtraDB-Cluster-client-57-5.7.41-31.65.1.el7.x86_64
[root@pxc-1 ~]# rpm -qi Percona-XtraDB-Cluster-57
#server 包的配置文件[root@pxc-1 ~]# rpm -qc Percona-XtraDB-Cluster-server-57/etc/logrotate.d/mysql/etc/my.cnf/etc/percona-xtradb-cluster.cnf/etc/percona-xtradb-cluster.conf.d/mysqld.cnf/etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf/etc/percona-xtradb-cluster.conf.d/wsrep.cnf/etc/sysconfig/mysql.bootstrap/etc/xinetd.d/mysqlchk

修改配置

[root@pxc-1 ~]# cat /etc/my.cnf## The Percona XtraDB Cluster 5.7 configuration file.# ## * IMPORTANT: Additional settings that can override those from this file!# The files must end with '.cnf', otherwise they'll be ignored.# Please make any edits and changes to the appropriate sectional files# included below.#!includedir /etc/my.cnf.d/!includedir /etc/percona-xtradb-cluster.conf.d/[root@pxc-1 ~]# ls /etc/my.cnf.d/[root@pxc-1 ~]# ls /etc/percona-xtradb-cluster.conf.d/mysqld.cnf mysqld_safe.cnf wsrep.cnf
#/etc/my.cnf 为主配置文件,当前版本中,其余的配置文件都放在 /etc/percona-xtradbcluster.conf.d 目录里,包括 mysqld.cnf,mysqld_safe.cnf,wsrep.cnf 三个文件#修改配置文件,每个节点都要修改[root@pxc-1 ~]# vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf[mysqld]# Path to Galera library 基于galera库来实现wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# Cluster connection URL contains IPs of nodes 集群连接URL,包含每个节点IP#If no IP is found, this implies that a new cluster needs to be created,#in order to do that you need to bootstrap this nodewsrep_cluster_address=gcomm://10.0.0.200,10.0.0.201,10.0.0.202 #三个节点IP
# In order for Galera to work correctly binlog format should be ROW 二进制日志文件格式binlog_format=ROW
# MyISAM storage engine has only experimental support 存储引擎default_storage_engine=InnoDB
# Slave thread to usewsrep_slave_threads= 8wsrep_log_conflicts
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galerainnodb_autoinc_lock_mode=2
# Node IP addresswsrep_node_address=10.0.0.200 #当前节点IP,每个节点惟一
# Cluster namewsrep_cluster_name=pxc-m53-cluster #集群名称
#If wsrep_node_name is not specified, then system hostname will be usedwsrep_node_name=pxc-cluster-node-1 #当前节点惟一标识,每个节点惟一
#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTERpxc_strict_mode=ENFORCING
# SST methodwsrep_sst_method=xtrabackup-v2
#Authentication for SST methodwsrep_sst_auth="sstuser:s3cretPass" #SST 数据同步账号:密码

尽管 Galera Cluster 不再需要通过 binlog 的形式进行同步,但还是建议在配置文件中开启二进制日志功能,原因是后期如果有新节点需要加入,旧的节点通过 SST 全量传输的方式向新节点传输数据,很可能会拖垮集群性能,所以让新节点先通过 binlog 方式完成同步后再加入集群会是一种更好的选择

/etc/percona-xtradb-cluster.conf.d/wsrep.cnf 配置文件说明

配置项 
默认值 
说明
wsrep_provider 
/usr/lib64/galera3/libgalera_smm.so 
指定 Galera 库的路径
wsrep_cluster_address 
gcomm:// 
集群中各节点地址
binlog_format 
ROW 
二进制日志格式
default_storage_engine 
InnoDB 
默认存储引擎
wsrep_slave_threads 
默认工作线程数
wsrep_log_conflicts


innodb_autoinc_lock_mode 
存储引擎加锁方式,当前只能是2
wsrep_node_address 
192.168.70.63 
当前节点IP
wsrep_cluster_name 
pxc-cluster 
集群名称
wsrep_node_name 
pxc-cluster-node-1 
当前节点名称
pxc_strict_mode 
ENFORCING 
是否使用测试功能,默认不使用
wsrep_sst_method 
xtrabackup-v2 
数据同步方式mysqldump|rsync|xtrabackup
wsrep_sst_auth 
sstuser:s3cretPass 
sst 数据传输的用户名和密码

启动第一个节点

#启动第一个节点,集群中任何节点都可以做第一个节点,只是启动命令会有不同[root@pxc-1 ~]# systemctl start mysql@bootstrap.service
#查看端口,使用了4567和3306端口[root@pxc-1 ~]# ss -tnlp
#查找初始用户名和密码进行连接[root@pxc-1 ~]# cat /var/log/mysqld.log | grep password2023-04-23T14:54:04.803437Z 1 [Note] A temporary password is generated forroot@localhost: +dbRl-qg:8uM
#用客户端连接[root@pxc-1 ~]# mysql -uroot -p'+dbRl-qg:8uM'
#当前无任何权限,要先修改密码mysql> show databases;ERROR 1820 (HY000): You must reset your password using ALTER USER statementbefore executing this statement.
mysql> alter user root@'localhost' identified by '123456';Query OK0 rows affected (0.01 sec)
#用新密码重新登录,创建 sst 用户并授权[root@pxc-1 ~]# mysql -uroot -p'123456'mysql> grant RELOAD,LOCK TABLES,PROCESS,REPLICATION CLIENT ON *.* to sstuser@'localhost' identified by 's3cretPass';Query OK0 rows affected, 1 warning (0.00 sec)
#查看相关变量mysql> SHOW VARIABLES LIKE 'wsrep%'\G
#集群状态mysql> SHOW STATUS LIKE 'wsrep%';
#wsrep_cluster_size 当前集群中节点数#wsrep_local_state_comment SST同步状态 Synced:数据己同步完成,Joiner:SST没有完成,所有节点都是Synced 才能加入新节点#wsrep_cluster_status 已经完全连接并准备好

启动后续节点,只要启动成功,pxc-1 的数据就会同步过来

[root@pxc-2 ~]# systemctl start mysql #pxc-2[root@pxc-2 ~]# mysql -uroot -p'123456' #使用pxc-1 中的用户名和密码连接
[root@pxc-3 ~]# systemctl start mysql #pxc-3[root@pxc-2 ~]# mysql -uroot -p'123456' #使用pxc-1 中的用户名和密码连接
#在任意节点上查询此变量,值为当前集群中的节点数mysql> SHOW STATUS LIKE 'wsrep_cluster_size';+--------------------+-------+| Variable_name      | Value |+--------------------+-------+| wsrep_cluster_size | 3     |+--------------------+-------+1 row in set (0.00 sec)

数据同步测试

#在pxc-1节点上创建库和表mysql> create database db1;Query OK, 1 row affected (0.00 sec)
mysql> use db1;Database changed
mysql> CREATE TABLE `stu` (    -> `id` int UNSIGNED NOT NULL AUTO_INCREMENT,    -> `name` varchar(255CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',    -> `age` int NULL DEFAULT 0,    -> PRIMARY KEY (`id`) USING BTREE    -> ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;Query OK, 0 rows affected (0.01 sec)
#在pxc-2节点上写入数据mysql> insert into db1.stu(name,age)values('tom',10),('jerry',20),('spike',30);Query OK, 3 rows affected (0.00 sec)Records: 3 Duplicates: 0 Warnings: 0
#在pxc-1节点上查看mysql> select * from db1.stu;+----+-------+------+| id | name  | age  |+----+-------+------+| 1  | tom   | 10   || 4  | jerry | 20   || 7  | spike | 30   |+----+-------+------+3 rows in set (0.00 sec)
#在pxc-3节点上查看mysql> select * from db1.stu;+----+-------+------+| id | name  | age  |+----+-------+------+| 1  | tom   | 10   || 4  | jerry | 20   || 7  | spike | 30   |+----+-------+------+3 rows in set (0.00 sec)
#在pxc-3节点上修改,新增,删除mysql> update db1.stu set age=100 where id=1;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0
mysql> insert into db1.stu(name,age)values('zhangsan',50),('lisi',60);Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0
mysql> delete from db1.stu where id=4;Query OK, 1 row affected (0.00 sec)
#在pxc-1节点上查看mysql> select * from db1.stu;+----+----------+------+| id | name     | age  |+----+----------+------+| 1  | tom      | 100  || 7  | spike    | 30   || 8  | zhangsan | 50   || 11 | lisi     | 60   |+----+----------+------+4 rows in set (0.00 sec)

测试性能

#在pxc-1节点上执行存储过程mysql> use db1;Database changed
mysql> source /root/testlog.sql;Query OK, 0 rows affected (0.01 sec)Query OK, 0 rows affected (0.01 sec)
mysql> show tables;+---------------+| Tables_in_db1 |+---------------+| stu           || testlog       |+---------------+2 rows in set (0.00 sec)
mysql> select count(*from testlog;+----------+| count(*|+----------+| 0        |+----------+1 row in set (0.00 sec)
#一次调用写入1W条数据,耗时1分钟mysql> call sp_testlog();Query OK, 1 row affected (3 min 1.00 sec)
mysql> select count(*from testlog;+----------+| count(*|+----------+| 100000   |+----------+1 row in set (0.02 sec)
#在pxc-2上以事务的方式执行,写入1W条,耗时2Smysql> begin;call sp_testlog();commit;Query OK, 0 rows affected (0.00 sec)Query OK, 1 row affected (1.50 sec)Query OK, 0 rows affected (0.42 sec)
mysql> select count(*from db1.testlog;+----------+| count(*|+----------+| 200000   |+----------+1 row in set (0.02 sec)

在单机上执行

mysql> use db1Database changed
mysql> source /root/testlog.sqlQuery OK, 0 rows affected (0.00 sec)Query OK, 0 rows affected (0.00 sec)
#执行存储过程,写1W条数据mysql> call sp_testlog();Query OK, 1 row affected (19.29 sec)
#以事务方式写1W条数据mysql> begin;call sp_testlog();commit;Query OK, 0 rows affected (0.00 sec)Query OK, 1 row affected (0.86 sec)Query OK, 0 rows affected (0.01 sec)

冲突测试

同时在三个节点执行 insert 语句,并指定相同主键,只有一个节点执行成功,然后将该条数据同步到了其它节点,则另外节点无法写入。

#在 pxc-3 节点上查看mysql> select * from db1.stu;+-----+----------+------+| id  | name     | age  |+-----+----------+------+| 1   | tom      | 100  || 7   | spike    | 30   || 8   | zhangsan | 50   || 11  | lisi     | 60   || 123 | user123  | 123  |+-----+----------+------+5 rows in set (0.00 sec)

往 pxc 集群中加入新节点

#前置条件:安装 Percona-XtraDB-Cluster-57,关闭防火墙,关闭 selinux#将其它节点的 /etc/percona-xtradb-cluster.conf.d/wsrep.cnf 文件拷贝到新节点进行修改#修改配置项,在当节点修改配置,其它节点不用修改,但为了保证后续重启等操作,将每个节点中的 wsrep_cluster_address 都进行修改
[root@pxc-4 ~]# cat /etc/percona-xtradb-cluster.conf.d/wsrep.cnf......wsrep_cluster_address=gcomm://10.0.0.200,10.0.0.201,10.0.0.202,10.0.0.203wsrep_node_address=10.0.0.203wsrep_node_name=pxc-cluster-node-4
#启动[root@pxc-4 ~]# systemctl start mysql
#查看[root@pxc-4 ~]# mysql -uroot -p'123456'mysql> SHOW STATUS LIKE '%wsrep_incoming_addresses%';+--------------------------+-----------------------------------------------------------------+| Variable_name            | Value                                                           |+--------------------------+-----------------------------------------------------------------+| wsrep_incoming_addresses | 10.0.0.201:3306,10.0.0.200:3306,10.0.0.202:3306,10.0.0.203:3306 |+--------------------------+-----------------------------------------------------------------+1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE '%wsrep_cluster_size%';+--------------------+-------+| Variable_name      | Value |+--------------------+-------+| wsrep_cluster_size | 4     |+--------------------+-------+1 row in set (0.01 sec)
#在新节点插入数据mysql> select * from stu;+----+----------+------+| id | name     | age  |+----+----------+------+| 1  | tom      | 100  || 7  | spike    | 30   || 9  | zhangsan | 50   || 12 | lisi     | 60   |+----+----------+------+4 rows in set (0.00 sec)
mysql> insert into db1.stu(name,age)values('new-node',100);Query OK, 1 row affected (0.01 sec)
#在pxc-1上查看mysql> select * from db1.stu where name like '%node%';+----+----------+------+| id | name     | age  |+----+----------+------+| 16 | new-node | 100  |+----+----------+------+1 row in set (0.00 sec)

一个节点加入到 Galera 集群有两种情况:新节点加入集群、暂时离组的成员再次加入集群。

新节点加入 Galera 集群

新节点加入集群时,需要从当前集群中选择一个Donor节点来同步数据,也就是所谓的state_snapshot_tranfer(SST)过程。SST同步数据的方式由选项 wsrep_sst_method 决定,一般选择的是 xtrabackup。

必须注意,新节点加入Galera时,会删除新节点上所有已有数据,再通过 xtrabackup (假设使用的是该方式)从 Donor 处完整备份所有数据进行恢复。所以,如果数据量很大,新节点加入过程会很慢。而且,在一个新节点成为 Synced 状态之前,不要同时加入其它新节点,否则很容易将集群压垮。如果是这种情况,可以考虑使用 wsrep_sst_method=rsync 来做增量同步,既然是增量同步,最好保证新节点上已经有一部分数据基础,否则和全量同步没什么区别,且这样会对 Donor 节点加上全局 readonly锁。

旧节点加入 Galera 集群

如果旧节点加入Galera集群,说明这个节点在之前已经在Galera集群中待过,有一部分数据基础,缺少的只是它离开集群时的数据。这时加入集群时,会采用IST(incremental snapshot transfer)传输机制,即增量传输。

但注意,这部分增量传输的数据源是Donor上缓存在GCache文件中的,这个文件有大小限制,如果缺失的数据范围超过已缓存的内容,则自动转为SST传输。如果旧节点上的数据和Donor上的数据不匹配 (例如这个节点离组后人为修改了一点数据),则自动转为SST传输。

在除第一个节点离线之外,其它节点离线后直接使用 systemctl start mysql 恢复即可

1.6.3.4 MariaDB Galera Cluster 实现

主机清单

主机IP 
主机名 
角色 
操作系统 
PXC版本
10.0.0.177 
node-1 
node-1 
Rocky8 
Percona-XtraDB-Cluster-57
10.0.0.183 
node-2 
node-2 
Rocky8 
Percona-XtraDB-Cluster-57
10.0.0.186 
node-3 
node-3 
Rocky8 
Percona-XtraDB-Cluster-57

前置工作

Percona XtraDB 是一种特殊形态的 MySQL 数据库,与MySQL官方的发行版及 MariaDB 是两种不同的产品,要求安装节点上没有 MySQL 和 MariaDB。另外提前关闭 SElinux,关闭防火墙,保证时间同步。

安装软件,三个节点都要执行安装操作

[root@node-1 ~]# yum install -y mariadb-server-galera
#查看配置文件[root@node-1 ~]# ls /etc/my.cnf/etc/my.cnf
[root@node-1 ~]# ls /etc/my.cnf.d/auth_gssapi.cnf client.cnf enable_encryption.preset galera.cnf mariadb-server.cnf mysql-clients.cnf
#修改配置,三个节点都需要修改[root@node-1 ~]# vim /etc/my.cnf.d/galera.cnf#wsrep_cluster_address="dummy://"wsrep_cluster_address="gcomm://10.0.0.177,10.0.0.183,10.0.0.186" #所有节点IP
#wsrep_node_name=wsrep_node_name=node-1 #当前节点名
#wsrep_node_address=wsrep_node_address=10.0.0.177 #当前节点IP
wsrep_sst_auth=root:123456 #SST数据传输用户名和密码

启动服务

#首个节点启动[root@node-1 ~]# galera_new_cluster
#创建用户并授权[root@node-1 ~]# mysqlMariaDB [(none)]> create user root@'10.0.0.%' identified by '123456';Query OK, 0 rows affected (0.003 sec)
MariaDB [(none)]> grant all privileges on *.* to root@'10.0.0.%';Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> flush privileges;Query OK, 0 rows affected (0.003 sec)
#其它节点启动[root@node-2 ~]# systemctl start mariadb.service[root@node-3 ~]# systemctl start mariadb.service

查看状态

#在 node-1 上查看[root@node-1 ~]# ss -tnp | grep 4567
MariaDB [(none)]> SHOW STATUS LIKE 'wsrep_cluster_size';+--------------------+-------+| Variable_name      | Value |+--------------------+-------+| wsrep_cluster_size | 3     |+--------------------+-------+1 row in set (0.001 sec)
MariaDB [(none)]> show status like "wsrep_incoming_addresses";+--------------------------+-------------------------------------------------+| Variable_name            | Value                                           |+--------------------------+-------------------------------------------------+| wsrep_incoming_addresses | 10.0.0.186:3306,10.0.0.177:3306,10.0.0.183:3306 |+--------------------------+-------------------------------------------------+1 row in set (0.001 sec)
#在 node-2,node-3 上查看MariaDB [(none)]> show status like "wsrep%";

测试数据同步

#在 node-1 上创建库和表MariaDB [(none)]> create database db1;Query OK, 1 row affected (0.003 sec)
MariaDB [(none)]> use db1;Database changed
MariaDB [db1]> CREATE TABLE `stu` (    -> `id` int UNSIGNED NOT NULL AUTO_INCREMENT,    -> `name` varchar(255CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '',    -> `age` int NULL DEFAULT 0,    -> PRIMARY KEY (`id`) USING BTREE    -> ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;Query OK, 0 rows affected (0.010 sec)
#在 node-2 上写入数据MariaDB [(none)]> insert into db1.stu(name,age)values('tom',10),('jerry',20);Query OK, 2 rows affected (0.003 sec)Records: 2 Duplicates: 0 Warnings: 0
#在 node-3 上写入,修改,删除MariaDB [(none)]> insert into db1.stu(name,age)values('zhangsan',30),('lisi',40);Query OK, 2 rows affected (0.003 sec)Records: 2 Duplicates: 0 Warnings: 0
MariaDB [(none)]> update db1.stu set age=100 where id=3;Query OK, 1 row affected (0.003 sec)Rows matched: 1 Changed: 1 Warnings: 0
MariaDB [(none)]> delete from db1.stu where name='jerry';Query OK, 1 row affected (0.003 sec)
#node-1 上查看MariaDB [db1]> select * from db1.stu;+----+----------+------+| id | name     | age  |+----+----------+------+| 3  | tom      | 100  || 7  | zhangsan | 30   || 10 | lisi     | 40   |+----+----------+------+3 rows in set (0.000 sec)

1.6.4 TIDB 介绍

TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP(HybridTransactional and Analytical Processing)数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 和 MySQL 几乎完全兼容。

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展,ACID 事务,标准 SQL,MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。TiDB 年可用性达到 99.95%。

TiDB 的目标是为 OLTP(Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。

TiDB 核心特点

  • 高度兼容 MySQL 大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。

  • 水平弹性扩展 通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景。

  • 分布式事务 TiDB 100% 支持标准的 ACID 事务。

  • 真正金融级高可用 相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可实现故障的自动恢复(autofailover),无需人工介入。

  • 一站式 HTAP 解决方案 TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能,配合 TiSpark,可提供一站式 HTAP解决方案,一份存储同时处理 OLTP & OLAP(OLAP,OLTP 的介绍和比较 )无需传统繁琐的 ETL 过程。

  • 云原生 SQL 数据库 TiDB 是为云而设计的数据库,同 Kubernetes 深度耦合,支持公有云、私有云和混合云,使部署、配置和维护变得十分简单。TiDB 的设计目标是 100% 的 OLTP 场景和 80%的 OLAP 场景,更复杂的 OLAP 分析可以通过 TiSpark 项目来完成。TiDB 对业务没有任何侵入性,能优雅的替换传统的数据库中间件、数据库分库分表等 Sharding 方案。同时它也让开发运维人员不用关注数据库 Scale 的细节问题,专注于业务开发,极大的提升研发的生产力


TiDB 整体架构

TiDB Server

TiDB Server 负责接收 SQL 请求,处理 SQL 相关的逻辑,并通过 PD 找到存储计算所需数据的 TiKV 地址,与 TiKV 交互获取数据,最终返回结果。TiDB Server 是无状态的,其本身并不存储数据,只负责计算,可以无限水平扩展,可以通过负载均衡组件(LVS、HAProxy或F5)对外提供统一的接入地址。

PD Server

Placement Driver(简称PD)是整个集群的管理模块,其主要工作有三个:一是存储集群的元信息(某个Key存储在那个TiKV节点);二是对TiKV集群进行调度和负载均衡(如数据的迁移、Raft group leader的迁移等);三是分配全局唯一且递增的事务 ID。

PD 是一个集群,需要部署奇数个节点,一般线上推荐至少部署 3 个节点。PD在选举的过程中无法对外提供服务,这个时间大约是 3 秒。

TiKV Server

TiKV Server 负责存储数据,从外部看 TiKV 是一个分布式的提供事务的 Key-Value 存储引擎。存储数据的基本单位是 Region,每个Region负责存储一个 Key Range。从StartKe数据,每个TiKV节点会负责多个Region。TiKV 使用 Raft 协议做复制,保持数据的一致性和容灾。副本以 Region 为单位进行管理,不同节点上的多个 Region 构成一个 Raft Group,互为副本。数据在多个 TiKV 之间的负载均衡由 PD 调度,这里也就是以 Region 为单位进行调度。


— END —

优网科技,优秀企业首选的互联网供应服务商

优网科技秉承"专业团队、品质服务" 的经营理念,诚信务实的服务了近万家客户,成为众多世界500强、集团和上市公司的长期合作伙伴!

优网科技成立于2001年,擅长网站建设、网站与各类业务系统深度整合,致力于提供完善的企业互联网解决方案。优网科技提供PC端网站建设(品牌展示型、官方门户型、营销商务型、电子商务型、信息门户型、DIY体验、720全景展厅及3D虚拟仿真)、移动端应用(手机站APP开发)、微信定制开发(微信官网、微信商城、企业微信)、微信小程序定制开发等一系列互联网应用服务。


我要投稿

姓名

文章链接

提交即表示你已阅读并同意《个人信息保护声明》

专属顾问 专属顾问
扫码咨询您的优网专属顾问!
专属顾问
马上咨询
扫一扫马上咨询
扫一扫马上咨询

扫一扫马上咨询