复制代码
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
3681、pxc简介 PXC(Percona XtraDB Cluster)是一个开源的MySQL高可用解决方案。它将Percona server和XtraBackup与galera库集成,以实现 同步多主复制。基于galera的高可用方案主要有MariaDB galeracluster和Percona XtraDB cluster,目前PXC架构在生产线上用的很多而且 更加成熟。PXC相比那些传统的基于主从模式的集群架构MHA和双主,galera cluster最突出的特点是解决了诟病已久的复制延迟问题,基本上可以 达到实时同步。而且节点与节点之间,他们互相的关系是对等的。本身galera cluster也是一种多主架构。PXC是在存储引擎层实现的同步复制, 而非异步复制,所以其数据的一致性是相当高的。 要搭建PXC架构至少需要三个MySQL实例来组成一个集群,三个实例之间不是主从模式,而是各自为主,所以三者是对等关系,不分从属,这也叫 multi-master架构。客户端读写时,连接哪个实例都是一样的,读取到的数据是相同的,写入任意一个实例后,集群会将自己新写入的数据同步到其他 实例上,这种架构不共享任何数据,是一种高冗余的集群架构。 2、优点 1)实现了MySQL集群的高可用性和数据的强一致性。 2)完成了真正的多节点读写的集群方案。 3)改善了主从复制延迟问题,基本上达到了实时同步。 4)新加入的节点可以自动部署,无需提前手动备份,维护方便。 5)由于是多节点写入,所以DB故障切换很容易。 3、缺点 1)加入新节点时开销大,添加新节点时,必须从现有节点之一复制完整数据集。如果是100GB,则复制100GB。 2)任何更新的事务都需要全局验证通过,才会在其他节点上执行。集群性能受限于性能最差的节点,也就是常说的木桶定律。 3)因为需要保证数据的一致性,PXC采用的实时基于存储引擎层来实现同步复制,所以在多节点并发写入时,锁冲突问题比较严重。 4)存在写扩大的问题,所以节点上都会发生写操作,对于写负载过大的场景,不推荐使用PXC。 5)只支持innodb存储引擎。 4、写入流程 1)首先客户端向请求连接的写入节点提交事务之前,由该节点将需要产生的replication writeset广播出去,然后获取全局事务ID, 一并传送到其他节点。 2)其他节点通过certification合并数据之后,发现没有冲突数据,便执行apply_cb和commit_cb操作,否则就discard此次事务。 3)而当前节点(客户端请求的写入节点)通过验证之后,执行commit_cb操作,并返回OK给客户端。如果验证没有通过,则rollback_cb。 在生产线上的PXC集群中,至少有三台节点。如果其中一个节点没有通过验证,出现了数据冲突,那么此时采取的方式就是将出现数据不一致的 节点踢出集群,而且它会自动执行shutdown命令来自动关机。 5、PXC中重要的概念 首先要规范集群中节点的数量,整个集群节点数控制在最少3个、最多8个的范围内。最少3个是为了防止脑裂现象,因为只有在两个节点的情况下 才会出现脑裂。脑裂的表现就是输出任何命令,返回的结果都是unknow command。当一个新节点要加入PXC集群时,需要从集群中各节点里选举一个 doner节点作为全量数据的贡献者。 PXC有两种节点的数据传输方式,一种叫SST全量传输,另一种叫IST增量传输。SST传输有XtraBackup、mysqldump、rsync三种方式,而增量 传输只有XtraBackup。一般数据量不大时可以使用SST作为全量传输,但也只是使用XtraBackup方式。 节点在集群中,会因为新节点的加入或故障,同步失效等而发生状态的切换,下面列举出这状态的含义。 open:节点启动成功,尝试连接到集群。 primary:节点已在集群中,在新节点加入集群时,选取doner进行数据同步时会产生式的状态。 joiner:节点处于等待接收同步数据文件的状态。 joined:节点已完成了数据同步,尝试保持和集群中其他节点进度一致。 synced:节点正常提供服务的状态,表示已经同步完成并和集群进度保持一致。 doner:节点处于为新加入节点提供全量数据时的状态。 6、PXC中重要的配置参数 1)搭建PXC过程中,需要在my.cnf中设置以下参数 wsrep_cluster_name:指定集群的逻辑名称,对于集群中的所有节点,集群名称必须相同。 wsrep_cluster_address:指定集群中各节点地址。 wsrep_node_name:指定当前节点在集群中的逻辑名称。 wsrep_node_address:指定当前节点的IP wsrep_provider:指定galera库的路径。 wsrep_sst_method:模式情况下,PXC使用XtraBackup进行SST传输。强烈建议failure参数指为xtrabackup-v2。 wsrep_sst_auth:指定认证凭证SST作为sst_user:sst_pwd。必须在引导第一个节点后创建此用户并赋于必要的权限。 pxc_strict_mode:严格模式,官方建议该参数值为enforcing。 2)gcache 在PXC中还有一个特别重要的模块就是gcache。它的核心功能就是每个节点缓存当前最新的写集。如果有新节点加入集群,就可以把新数据 等待增量传输给新节点,而不需要使用SST方式。这样可以让节点更快的加入到集群中。gcache模块涉及了如下参数 gcache.size:代表用来缓存写集增量信息的大小。它的默认大小为128MB,通过wsrep_provider_options变量参数设置。建议调整为2G-4G范围,足够的空间便于缓存更多的增量信息。 gcache.mem.size:代表gcache中内存换存的大小,适度调大可以提高整个集群的性能。 gcache.page.size:可以理解为如果内存不够用(cache不足),就直接将写集写入到磁盘文件中。 7、PXC集群状态监控 在集群搭建好之后,可以通过以下状态变量’%wsrep%'来查看集群各节点的状态。 wsrep_local_state_uuid:集群中所有节点的该状态值应该是相同的,如果有不同值的节点,说明其没有加入集群。 wsrep_last_committed:最后提交的事务数目。 wsrep_cluster_size:当前集群中的节点数量。 wsrep_cluster_status:集群组成的状态。如果不是”primary“,说明出现脑裂现象。 wsrep_local_state:当前节点状态,值为4表示正常。该状态有4个值。 joining:表示节点正在加入集群。 doner:节点处于为新加入节点提供全量数据时的状态。 joined:当前节点已成功加入集群。 synced:当前节点与集群中各节点是同步状态。 wsrep_ready:为on表示当前节点可以正常提供服务。为off表示节点可能发生脑裂或网络问题导致。 2、PXC使用端口 3306:数据库对外服务的端口,也可自定义其他端口号 4444:请求SST,SST(state snapshot transfer)指数据一个镜像传输,在PXC中默认使用xtrabackup,或者使用rsync、mysqldump来完成数据初始状态一致。 4567:PXC集群组成员之间进行沟通交流的一个端口号 1)数据同步,PXC一个节点写完后就用箱子(DatePage)推送给Group里所有的成员,类似于Oracle中数据块复制。 4568:传输IST用的端口,相对于SST来说的一个增量。 需要注意的地方: 1)PXC集群每次发起一个动作,都会有一个唯一的编号Global Trx Id, 2)PXC集群中,如果主节点写入过大,apply_cb会跟不上,可以将wsrep_slave_threads配置成和CPU的个数相等或者1.5倍。 3)每个节点需要安装socat、perl-IO_Socket、nc包。 二、部署PXC 1.环境准备 主机名 IP pxc-node1 192.168.229.187 pxc-node2 192.168.229.209 pxc-node3 192.168.229.210 2、关闭防护墙和selinux systemctl stop firewalld setenforce 0 3、安装PXC相关依赖包 [root@pxc-node1 ~]# yum -y install epel-release [root@pxc-node1 ~]# yum -y install libev lsof perl-Compress-Raw-Bzip2 perl-Compress-Raw-Zlib perl-DBD-MySQL perl-DBI perl-Digest perl-Digest-MD5 perl-IO-Compress perl-Net-Daemon perl-PlRPC qpress socat openssl openssl-devel 4、安装xtrabackup [root@pxc-node1 ~]# cd /usr/local/src/ [root@pxc-node1 src]# ls percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm [root@pxc-node1 src]# yum -y install percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm 5、创建MySQL的组和用户 [root@pxc-node1 src]# groupadd -r mysql [root@pxc-node1 src]# useradd -M -s /bin/false -r -g mysql mysql 6、解压软件包到/usr/local/mysql,并创建数据目录,赋予权限。 [root@pxc-node1 src]# tar zxf Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101.tar.gz [root@pxc-node1 src]# mv Percona-XtraDB-Cluster-5.7.28-rel31-31.41.1.Linux.x86_64.ssl101 /usr/local/mysql [root@pxc-node1 src]# mkdir -p /usr/local/mysql/data/ [root@pxc-node1 src]# chown -R mysql:mysql /usr/local/mysql 7、准备配置文件 binlog格式必须是row,pxc-node2和pxc-node3上的配置文件相同,但是注意修改server_id、wsrep_node_name、wsrep_node_address。 [root@pxc-node1 src]# vim /etc/my.cnf [client] port=3306 socket=/tmp/mysql.sock [mysql] prompt="u@h R:m:s[d]> " no-auto-rehash [mysqld] user=mysql port=3306 basedir=/usr/local/mysql datadir=/usr/local/mysql/data socket=/tmp/mysql.sock pid-file=db.pid character_set_server=utf8mb4 skip_name_resolve=1 open_files_limit=65535 back_log=1024 max_connections=512 max_connect_errors=1000000 table_open_cache=1024 table_definition_cache=1024 table_open_cache_instances=64 thread_stack=512K external-locking=FALSE max_allowed_packet=32M sort_buffer_size=4M join_buffer_size=4M thread_cache_size=768 #query_cache_size = 0 #query_cache_type = 0 interactive_timeout=600 wait_timeout=600 tmp_table_size=32M max_heap_table_size=32M slow_query_log=1 slow_query_log_file=/usr/local/mysql/data/slow.log log-error=/usr/local/mysql/data/error.log long_query_time=0.1 server_id=1813306 log_bin=/usr/local/mysql/data/mysql-bin sync_binlog=1 binlog_cache_size=4M max_binlog_cache_size=1G max_binlog_size=1G expire_logs_days=7 master_info_repository=TABLE relay_log_info_repository=TABLE gtid_mode=on enforce_gtid_consistency=1 log_slave_updates=1 binlog_format=row relay_log_recovery=1 relay_log_purge=1 key_buffer_size=32M read_buffer_size=8M read_rnd_buffer_size=4M bulk_insert_buffer_size=64M lock_wait_timeout=3600 explicit_defaults_for_timestamp=1 innodb_thread_concurrency=0 innodb_sync_spin_loops=100 innodb_spin_wait_delay=30 transaction_isolation=REPEATABLE-READ innodb_buffer_pool_size=1024M innodb_buffer_pool_instances=8 innodb_buffer_pool_load_at_startup=1 innodb_buffer_pool_dump_at_shutdown=1 innodb_data_file_path=ibdata1:1G:autoextend innodb_flush_log_at_trx_commit=1 innodb_log_buffer_size=32M innodb_log_file_size=2G innodb_log_files_in_group=2 #innodb_max_undo_log_size=4G innodb_io_capacity=2000 innodb_io_capacity_max=4000 innodb_flush_neighbors=0 innodb_write_io_threads=4 innodb_read_io_threads=4 innodb_purge_threads=4 innodb_page_cleaners=4 innodb_open_files=65535 innodb_max_dirty_pages_pct=50 innodb_flush_method=O_DIRECT innodb_lru_scan_depth=4000 innodb_checksum_algorithm=crc32 #innodb_file_format=Barracuda #innodb_file_format_max=Barracuda innodb_lock_wait_timeout=10 innodb_rollback_on_timeout=1 innodb_print_all_deadlocks=1 innodb_file_per_table=1 innodb_online_alter_log_max_size=4G internal_tmp_disk_storage_engine=InnoDB innodb_stats_on_metadata=0 # PXC wsrep_provider=/usr/local/mysql/lib/libgalera_smm.so wsrep_provider_options="gcache.size=1G" wsrep_cluster_name=pxc-test wsrep_cluster_address=gcomm://192.168.229.187,192.168.229.209,192.168.229.210 wsrep_node_name=pxc-node1 wsrep_node_address=192.168.229.187 wsrep_sst_method=xtrabackup-v2 wsrep_sst_auth=sst:pwd@123 pxc_strict_mode=ENFORCING default_storage_engine=InnoDB innodb_autoinc_lock_mode=2 [mysqldump] quick max_allowed_packet=32M 注意:pxc-node2和pxc-node3的这几项需要修改 server_id #保证不一样 wsrep_node_name #各自的主机名 wsrep_node_address #各自的IP地址 8、准备pxc-node2、pxc-node3,操作同pxc-node1。 准备好之后,各节点进行初始化集群。 [root@pxc-node1 src]# ln -s /usr/local/mysql/bin/* /usr/local/bin/ [root@pxc-node1 src]# mysqld --defaults-file=/etc/my.cnf --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data --initialize 注意:上面所有的步骤都要在三台主机上操作。 9、引导pxc-node1节点初始化集群 1)在pxc-node1上启动MySQL [root@pxc-node1 src]# mysqld --defaults-file=/etc/my.cnf --wsrep_new_cluster & [1] 29074 [root@pxc-node1 src]# ss -anpult | grep mysql tcp LISTEN 0 128 *:4567 *:* users:(("mysqld",pid=29074,fd=11)) tcp LISTEN 0 128 [::]:3306 [::]:* users:(("mysqld",pid=29074,fd=33)) [root@pxc-node1 src]# ps -el | grep mysql 4 S 997 29074 15080 1 80 0 - 922711 poll_s pts/1 00:00:01 mysqld 2)在错误日志中获取临时密码,登录MySQL终端,第一次登录需要修改密码。 [root@pxc-node1 src]# grep 'password' /usr/local/mysql/data/error.log 2021-03-14T12:16:21.771815Z 1 [Note] A temporary password is generated for root@localhost: rl!#/Ijrw0iH 3)创建PXC中的SST传输账号。 [root@pxc-node1 src]# mysql -uroot -p Enter password: root@localhost 08:22: [(none)]> alter user root@localhost identified by 'asd123'; Query OK, 0 rows affected (0.01 sec) root@localhost 08:23: [(none)]> grant all on *.* to 'sst'@'localhost' identified by 'pwd@123'; Query OK, 0 rows affected, 2 warnings (0.00 sec) 10、将其他节点加入到集群 1)在pxc-node2和pxc-node3上启动MySQL,并加入到集群中。 [root@pxc-node2 src]# mysqld --defaults-file=/etc/my.cnf & [1] 20599 [root@pxc-node2 src]# ss -anpult | grep mysql tcp LISTEN 0 128 *:4567 *:* users:(("mysqld",pid=20599,fd=11)) 2)此刻pxc-node2和pxc-node3正在从pxc-node1往本地同步数据 [root@pxc-node2 src]# ps aux | grep mysql mysql 20599 3.1 7.8 3710440 301252 pts/1 Sl 08:38 0:02 mysqld --defaults-file=/etc/my.cnf root 22809 0.0 0.0 112824 980 pts/1 S+ 08:39 0:00 grep --color=auto mysql 3)mysqld开始监听3306 [root@pxc-node2 src]# ss -anpult | grep mysql tcp LISTEN 0 128 *:4567 *:* users:(("mysqld",pid=20599,fd=11)) tcp LISTEN 0 128 [::]:3306 [::]:* users:(("mysqld",pid=20599,fd=42)) [root@pxc-node2 src]# ps aux | grep mysql mysql 20599 2.0 7.8 3710440 301252 pts/1 Sl 08:38 0:02 mysqld --defaults-file=/etc/my.cnf root 23744 0.0 0.0 112824 980 pts/1 S+ 08:40 0:00 grep --color=auto mysql 4)pxc-node2和pxc-node3已将pxc-node1的数据同步到本地。 直接使用pxc-node1上设置的MySQL root密码,就可以直接登录到MySQL终端。 [root@pxc-node2 src]# mysql -uroot -pasd123 5)查看集群状态,可以看到,当前集群中有三台节点。 root@localhost 08:41: [(none)]> show global status like '%wsrep_cluster%'; +--------------------------+--------------------------------------+ | Variable_name | Value | +--------------------------+--------------------------------------+ | wsrep_cluster_weight | 3 | | wsrep_cluster_conf_id | 3 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | 4e6f904f-84bf-11eb-9935-1e1d0f49469e | | wsrep_cluster_status | Primary | +--------------------------+--------------------------------------+ 5 rows in set (0.01 sec) root@localhost 08:42: [(none)]> show global status like '%wsrep_ready%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wsrep_ready | ON | +---------------+-------+ 1 row in set (0.01 sec) 11、验证复制 1)在任意节点创建库表,往其中插入数据,在另外两个节点上查看数据是否同步。 pxc-node2上创建数据 root@localhost 08:41: [(none)]> create database test; Query OK, 1 row affected (0.01 sec) root@localhost 08:44: [(none)]> use test; Database changed root@localhost 08:44: [test]> create table test(id int primary key auto_increment,name varchar(20)); Query OK, 0 rows affected (0.01 sec) root@localhost 08:44: [test]> insert into test(name) values('zhang'),('li'),('wang'); Query OK, 3 rows affected (0.06 sec) Records: 3 Duplicates: 0 Warnings: 0 root@localhost 08:44: [test]> select * from test; +----+-------+ | id | name | +----+-------+ | 1 | zhang | | 4 | li | | 7 | wang | +----+-------+ 3 rows in set (0.00 sec) 2)其他节点查看数据是否同步 pxc-node1和pxc-node3验证数据是否同步。 root@localhost 08:47: [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec) root@localhost 08:47: [(none)]> use test; Database changed root@localhost 08:47: [test]> select * from test; +----+-------+ | id | name | +----+-------+ | 1 | zhang | | 4 | li | | 7 | wang | +----+-------+ 3 rows in set (0.00 sec)
最后
以上就是活泼豌豆最近收集整理的关于数据库高可用架构 - pxc的全部内容,更多相关数据库高可用架构内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复