MariaDB集群Galera Cluster的研究与测试 MariaDB集群Galera Cluster的研究与测试
Galera Cluster是MariaDB的一个双活多主集群,其可以使得MariDB的所有节点保持同步,Galera为MariaDB提供了同步复制(相对于原生的异步复制),因此其可以保证HA,且其当前仅支持XtraDB/InnoDB存储引擎(扩展支持MyISAM),并且只可在Linux下使用。
Galera Cluster拥有以下特性:
- 真正的多主架构,任何节点都可以进行读写
- 同步复制,各节点间无延迟且节点宕机不会导致数据丢失
- 紧密耦合,所有节点均保持相同状态,节点间无不同数据
- 无需主从切换操作或使用VIP
- 热Standby,在Failover过程中无停机时间(由于不需要Failover)
- 自动节点配置,无需手工备份当前数据库并拷贝至新节点
- 支持InnoDB存储引擎
- 对应于透明,无需更改应用或是进行极小的更改
- 无需进行读写分离
Galera使用基于认证的复制,其流程如下:
其主要思想是在不出现冲突的背景下事务正常执行并持续到commit为止;当客户端发起commit命令时(此时仍然没有发生真正的commit),所有本事务内对数据库的改动与改动数据行的主键都会被搜集到一个写入集(writeset)中,该写入集随后会被复制到其他节点,该写入集会在每个节点上使用搜集到的主键进行确认性认证测试(包括被“提交”事务的当前节点)来判断该写入集是否可以被应用。如果认证测试失败,写入集会被丢弃并且原始事务会被回滚,如果认证成功,事务会被提交并且写入集会被在剩余节点进行应用。
以上的认证测试在Galera集群中的实现取决于全局事务顺序,每个事务在复制期间都会被指派一个全局顺序序列;当一个事务到达提交点时,该事务会知道当前与该事务不冲突的最新已提交事务的顺序序号,在这两个事务的全局顺序序列之间的间隔是不确定区域,在该区域间的事务相互是“看不到”对方的影响的,但所有在这间隔之间的唯物都会被进行主键冲突检测(如果发现冲突认证测试就会失败)。
以下演示如何配置Galera Cluster:
1、首先在各节点上安装MariaDB Galera:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
# ls -lhtr
123M
1.el6.rf.x86_64.rpm
.rpm
.rpm
.rpm
.rpm
.rpm
.rpm
.rpm
.rpm
1.rhel6.x86_64.rpm
# yum localinstall socat-1.7.2.4-1.el6.rf.x86_64.rpm
1.rhel6.x86_64.rpm
fastestmirror
Process
.
|
2、初始化MariaDB数据库并启动MariaDB服务:
1
2
3
4
5
6
7
8
9
10
11
12
|
# mysql_install_db
.
init
'none'
_init
_disconnect
.
.
dummy_free
OK
.
.
|
初始化完成后启动MariaDB:
1
2
3
|
# /etc/init.d/mysql start
!
#
|
此时可以查看到Galera相关的配置选项,可以看出Galera相关的配置参数有36个之多:
1
2
3
4
5
|
;
-
)
>
|
3、在MariaDB实例上创建用于Galera集群的用户,第一个节点建立即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
'password';
sec)
'password';
sec)
'password';
sec)
privileges;
sec)
>
|
4、先在一个节点上配置Galera Cluster:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
# ip addr show eth0 | grep 'inet.*scope global' | awk '{print $2}'
24
# cat /etc/my.cnf.d/galera.cnf
]
0
ROW
innodb
2
.so
#wsrep_cluster_address=gcomm://192.168.192.133,192.168.192.134
/
'example_cluster'
'192.168.192.129'
'nd1'
rsync
#wsrep_sst_method=xtrabackup
password
# /etc/init.d/mysql bootstrap
!
# ps -ef | grep mysqld | grep -v grep | wc -l
2
#
|
补充:后续过程发现bootstrap模式初始化后并启动的MariaDB实例不能正常的处理其他节点请求,因此需要重启MariaDB实例;
注意:wsrep_node_address和wsrep_node_name需是相对应的用于指定当前Galera节点主机及IP信息;当第一个节点启动完成后便可以调换以上配置文件中的wsrep_cluster_address参数了;参数wsrep_sst_method可以使用rsync方式或Percona提供的Xtrabackup;
经测发现wsrep_sst_method=xtrabackup时不能正常工作,有待进一步测试;
5、向之前配置的Galera集群(即IP为192.168.192.129的节点)中加入其他新节点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
# ip addr show eth0 | grep 'inet.*scope global' | awk '{print $2}'
24
# cat /etc/my.cnf.d/galera.cnf
0
ROW
innodb
2
.so
192.168.192.134
'example_cluster'
'192.168.192.133'
'nd2'
#wsrep_sst_method=xtrabackup
rsync
password
#
|
第三节点:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
# cat /etc/my.cnf.d/galera.cnf
]
0
ROW
innodb
2
.so
192.168.192.133
'example_cluster'
'192.168.192.134'
'nd3'
rsync
password
#
|
6、依次启动其他节点,其他节点会根据配置自动加入集群并同步数据:
1
2
3
|
# /etc/init.d/mysql start
!
#
|
7、在Galera上查看各集群状态:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
'wsrep_cluster%';
+--------------------------+--------------------------------------+
|
+--------------------------+--------------------------------------+
|
|
|
|
+--------------------------+--------------------------------------+
sec)
'wsrep_cluster%';
+--------------------------+--------------------------------------+
|
+--------------------------+--------------------------------------+
|
|
|
|
+--------------------------+--------------------------------------+
sec)
'wsrep_cluster%';
+--------------------------+--------------------------------------+
|
+--------------------------+--------------------------------------+
|
|
|
|
+--------------------------+--------------------------------------+
sec)
>
|
从此处可以看出当有其他节点加入到集群中时,wsrep_cluster_size可以反映出当前集群节点数量;
8、在一节点上新建表并插入数据以在其他实例上观测数据是否同步:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
galera;
sec)
t_galera(
primary key,
varchar(10));
sec)
rand());
sec)
rand());
sec)
0
t_galera;
+----+------------+-------------------+
|
+----+------------+-------------------+
|
|
|
|
|
+----+------------+-------------------+
sec)
>
|
在其他节点上观测数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
t_galera;
+----+------------+-------------------+
|
+----+------------+-------------------+
|
|
|
|
|
+----+------------+-------------------+
sec)
>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
t_galera;
+----+------------+-------------------+
|
+----+------------+-------------------+
|
|
|
|
|
+----+------------+-------------------+
sec)
>
|
8、测试节点故障机恢复:
首先停止nd1节点(已调整过该节点的wsrep_cluster_address配置):
1
2
3
|
# /etc/init.d/mysql stop
]
#
|
在nd2节点上删除并更新数据:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
t_galera;
+----+------------+-------------------+
|
+----+------------+-------------------+
|
|
|
|
|
+----+------------+-------------------+
sec)
12;
sec)
(10,12);
sec)
0
t_galera;
+----+------------+-------------------+
|
+----+------------+-------------------+
|
+----+------------+-------------------+
sec)
>
|
在nd3节点上查看数据是否一致:
1
2
3
4
5
6
7
8
9
|
t_galera;
+----+------------+-------------------+
|
+----+------------+-------------------+
|
+----+------------+-------------------+
sec)
>
|
启动停止的nd1节点:
1
2
3
|
# /etc/init.d/mysql start
]
#
|
在nd1节点上查看数据是否自动同步:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
t_galera;
away
reconnect...
8
galera
+----+------------+-------------------+
|
+----+------------+-------------------+
|
+----+------------+-------------------+
sec)
>
|
关于更多的INSERT、UPDATE、DELETE测试道理是相同的,各位可自行完成;当然,如果要在生产环境中使用的话还需要进行更复杂功能性、逻辑性测试。也欢迎各位一起探讨Galera Cluster的使用及测试经验。