MySQL集群之Galera Cluster

Posted Linux日记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL集群之Galera Cluster相关的知识,希望对你有一定的参考价值。

mysql cluster集群

Galera Cluster:集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案如下图所示:三个节点组成了一个集群,与普通的主从架构不同,它们都可以作为主节点,三个节点是对等的,称为multi-master架构,当有客户端要写入或者读取数据时,连接哪个实例都是一样的,读到的数据是相同的,写入某一个节点之后,集群自己会将新数据同步到其它节点上面,这种架构不共享任何数据,是一种高冗余架构

主要功能:

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

  • 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失。

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

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

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

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

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

缺点:

  • 每个节点独立、异步执行会导致节点不一致性(每个节点其实是维护一个队列),为了保证各个节点的最终一致性,必须使用类tcp的滑动窗口来进行限制,实现原理如下:
      整个galera cluster中,同时只有一个节点可以广播消息(数据),每个节点都会获得广播消息的机会(获得机会后也可以不广播),当慢节点的待执行队列超过一定长度后,它会广播一个FC_PAUSE消息,所以节点收到消息后都会暂缓广播消息,直到该慢节点的待执行队列长度减小到一定长度后,galera cluster数据同步又开始恢复

  • 问题1导致的下一个问题是,节点中的最大的tps值取决于速度最慢的那个节点,所以各个节点的能力平衡很重要

  • 由于galera同步复制在每个写事务提交时都增加了replicate trx和certification test的开销,因此性能远远低于异步MySQL实例(异步MySQL可以使用各种手段来提高提交tps)

Galera集群的复制功能基于Galeralibrary实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。
Galera插件保证集群同步数据,保持数据的一致性,靠的就是可认证的复制,工作原理如下图:

当客户端发出一个commit的指令,在事务被提交之前,所有对数据库的更改都会被 write-set 收集起来,并且将write-set 纪录的内容发送给其他节点。

write-set 将在每个节点进行认证测试,测试结果决定着节点是否应用write-set更改数据。

如果认证测试失败,节点将丢弃 write-set ;如果认证测试成功,则事务提交。
(可以自动解决同时写入相同数据的冲突问题,和自动增长id问题)

部署Galera Cluster

安装MariaDB集群至少需要3台服务器

  • 192.168.214.142  node-1

  • 192.168.214.134  node-2

  • 192.168.214.143  node-3

各节点配置cluster集群安装源

并且mariadb的版本也必须是特定的版本cluster集群版本

vim /etc/yum.repo.d/cluster.repo

[mariadb]
name = MariaDB
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.60/yum/centos7-amd64/
gpgcheck=0

各节点安装配置MariaDB-Galera-server

yum install MariaDB-Galera-server  -y

各节点配置集群:(配置相同)

vim /etc/my.cnf.d/server.cnf

wsrep_provider = /usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address="gcomm://192.168.214.142,192.168.214.134,192.168.214.143"
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0

启动集群

首次启动时,需要初始化集群,在其中一个节点上执行命令:

[root@node-1 mysql]# /etc/init.d/mysql start --wsrep-new-cluster
Starting MariaDB.180617 19:18:31 mysqld_safe Logging to '/var/lib/mysql/node-1.err'.
180617 19:18:31 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
.... SUCCESS! 

而后正常启动其它节点

[root@node-2 ~]# /etc/init.d/mysql start
Starting MariaDB.180617 19:18:39 mysqld_safe Logging to '/var/lib/mysql/node-2.err'.
180617 19:18:39 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
....SST in progress, setting sleep higher. SUCCESS! 
[root@node-3 ~]# /etc/init.d/mysql start
Starting MariaDB.180617 19:47:29 mysqld_safe Logging to '/var/lib/mysql/manger.err'.
180617 19:47:29 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
....SST in progress, setting sleep higher. SUCCESS! 

挑一任意节点测试写入数据

MariaDB [(none)]> create database db1;

其他节点查看:

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db1                |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.04 sec)

查看系统状态或变量

查看集群中相关系统变量和状态变量:

SHOW VARIABLES LIKE 'wsrep_%'\G
SHOW STATUS LIKE 'wsrep_%'\G
SHOW STATUS LIKE 'wsrep_cluster_size'G
MariaDB [(none)]> show status like 'wsrep_%';
+------------------------------+----------------------------------------------------------------+
| Variable_name                | Value                                                          |
+------------------------------+----------------------------------------------------------------+
|
 wsrep_local_state_uuid       | 2beb2d04-7220-11e8-b934-be2c33f68268                           |
| wsrep_protocol_version       | 8                                                              |
|
 wsrep_last_committed         | 1                                                              |
| wsrep_replicated             | 1                                                              |
|
 wsrep_replicated_bytes       | 440                                                            |
| wsrep_repl_keys              | 1                                                              |
|
 wsrep_repl_keys_bytes        | 32                                                             |
| wsrep_repl_data_bytes        | 343                                                            |
|
 wsrep_repl_other_bytes       | 0                                                              |
| wsrep_received               | 3                                                              |
|
 wsrep_received_bytes         | 501                                                            |
| wsrep_local_commits          | 0                                                              |
|
 wsrep_local_cert_failures    | 0                                                              |
| wsrep_local_replays          | 0                                                              |
|
 wsrep_local_send_queue       | 0                                                              |
| wsrep_local_send_queue_max   | 1                                                              |
|
 wsrep_local_send_queue_min   | 0                                                              |
| wsrep_local_send_queue_avg   | 0.000000                                                       |
|
 wsrep_local_recv_queue       | 0                                                              |
| wsrep_local_recv_queue_max   | 1                                                              |
|
 wsrep_local_recv_queue_min   | 0                                                              |
| wsrep_local_recv_queue_avg   | 0.000000                                                       |
|
 wsrep_local_cached_downto    | 1                                                              |
| wsrep_flow_control_paused_ns | 0                                                              |
|
 wsrep_flow_control_paused    | 0.000000                                                       |
| wsrep_flow_control_sent      | 0                                                              |
|
 wsrep_flow_control_recv      | 0                                                              |
| wsrep_cert_deps_distance     | 1.000000                                                       |
|
 wsrep_apply_oooe             | 0.000000                                                       |
| wsrep_apply_oool             | 0.000000                                                       |
|
 wsrep_apply_window           | 1.000000                                                       |
| wsrep_commit_oooe            | 0.000000                                                       |
|
 wsrep_commit_oool            | 0.000000                                                       |
| wsrep_commit_window          | 1.000000                                                       |
|
 wsrep_local_state            | 4                                                              |
| wsrep_local_state_comment    | Synced                                                         |
|
 wsrep_cert_index_size        | 1                                                              |
| wsrep_causal_reads           | 0                                                              |
|
 wsrep_cert_interval          | 0.000000                                                       |
| wsrep_incoming_addresses     | 192.168.214.142:3306,192.168.214.134:3306,192.168.214.143:3306 |
|
 wsrep_desync_count           | 0                                                              |
| wsrep_evs_delayed            |                                                                |
|
 wsrep_evs_evict_list         |                                                                |
| wsrep_evs_repl_latency       | 0/0/0/0/0                                                      |
|
 wsrep_evs_state              | OPERATIONAL                                                    |
| wsrep_gcomm_uuid             | 445f59d7-7225-11e8-9abd-6eb6acd52d18                           |
|
 wsrep_cluster_conf_id        | 15                                                             |
| wsrep_cluster_size           | 3                                                              |
|
 wsrep_cluster_state_uuid     | 2beb2d04-7220-11e8-b934-be2c33f68268                           |
| wsrep_cluster_status         | Primary                                                        |
|
 wsrep_connected              | ON                                                             |
| wsrep_local_bf_aborts        | 0                                                              |
|
 wsrep_local_index            | 1                                                              |
| wsrep_provider_name          | Galera                                                         |
|
 wsrep_provider_vendor        | Codership Oy <info@codership.com>                              |
| wsrep_provider_version       | 25.3.23(r3789)                                                 |
|
 wsrep_ready                  | ON                                                             |
| wsrep_thread_count           | 2                                                              |
+------------------------------+----------------------------------------------------------------+
58 rows in set (0.01 sec)

上面的信息中需要关注的几个参数:


以上是关于MySQL集群之Galera Cluster的主要内容,如果未能解决你的问题,请参考以下文章

基于galera cluster集群实现mysql数据库的高可用

超详细,多图文使用galera cluster搭建mysql集群并介绍wsrep相关参数

Mariadb Galera Cluster 部署

关于Oracle的rac集群和mysql Galera Cluster的想法

mysql借助Galera Cluster构建多主集群

Galera Cluster mysql+keepalived集群部署