PXC 能提供高可用,高读,多写支持
最重要的优点就是高可能,在3个及以上节点时,其中一个挂了,完全不影响业务。
最大的缺点是多写问题,最短板性能上限问题。
在我们硬件水平是256G内存,32核CPU,SSD硬件,单行数据大概1K,单表1千万,512表。 QPS在2.5k写+5K读时,就会有节点同步阻塞问题。当时我们临时切成只读(不执行写SQL)10分钟后,才缓解过来。写queue配置参数在下面。
基本第3点,我们的应用场景是:低写QPS的DB,使用PXC集群,以防硬件故障,达到高可用。
MySQL的slave 能直接转换把PXC,不用导数据。
详细的方法是参考英文原文PXC-install-getting-started
简单说过程就是:
stop mysqld
yum remove mysql-server与client,还是shard库。注意,remove时会把my.cnf备份。
安装官方的yum源仓库,直接yum 安装 PXC。
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
sudo yum list | grep XtraDB-Cluster|grep 5.7
Percona-XtraDB-Cluster-57.x86_64
Percona-XtraDB-Cluster-57-debuginfo.x86_64
Percona-XtraDB-Cluster-client-57.x86_64
Percona-XtraDB-Cluster-devel-57.x86_64
Percona-XtraDB-Cluster-full-57.x86_64
Percona-XtraDB-Cluster-garbd-57.x86_64
Percona-XtraDB-Cluster-server-57.x86_64
Percona-XtraDB-Cluster-shared-57.x86_64
Percona-XtraDB-Cluster-test-57.x86_64
4.修改原来my.cnf配置文件,添加PXC配置如下,加到[mysqld]下,原来的不用动。
binlog_format=ROW
log_slave_updates=1
#################################
#Percona xtradb cluster config
#
# galary库路径
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
# wsrep_cluster_address为节点地址(不需要端口),第一个节点启动时配置为: gcomm://
# 第二个节点启动时配置为: gcomm://{节点1 IP},{节点2 IP}
wsrep_cluster_address=gcomm://
# 并行复制线程数 4*cpu, 当24个CPU使用
wsrep_slave_threads=94
# 集群名字
wsrep_cluster_name=roaming1
# gcache.size 是硬盘缓存值大小。
# gcache.page_size 硬盘缓存页大小。
# gcs.fc_limit 允许多少条写sql未同步执行, 超过这个值 ,就会阻塞写入请求,直接队列少于
# gcs.fc_factor*gcs.fc_limit的值。
# gcs.fc_factor 当阻塞发生时,允许写请求继续执行的百分比因子:阻塞的写队列长度百分比。
# while (get_write_queue() >= fc_limit ){
# block_all_sql()
# while( get_write_queue() <= fc_limit*fc_factor){
# allow_all_sql()
# }
wsrep_provider_options = "gcache.size=32G; gcache.page_size=4G; gcs.fc_limit = 256; gcs.fc_factor = 0.8;"
# 节点名:
wsrep_node_name = node240
wsrep_sst_method = xtrabackup-v2
# 需要建一个专门的用户用做sst/ist。要先授权,授权在localhost执行。
wsrep_sst_auth="sst:!admin8888"
# 不允许读延迟数据,会影响读性能, ON/OFF
wsrep_causal_reads = OFF
innodb_autoinc_lock_mode = 2
innodb_locks_unsafe_for_binlog = 1
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
在添加my.cnf配置是,唯一 要注意的是wsrep_cluster_address的值:
第一个节点启动时配置为: gcomm://
第二个节点启动时配置为: gcomm://{节点1 IP},{节点2 IP}
第三个节点启动时类推,至少配置一个已有数据的节点IP,最后配置一个自己的IP
如:wsrep_cluster_address=gcomm://172.16.8.239,172.16.8.240
1
2
3
4
第一个节点启动时,无需拖拉数据,直接start slave, 能从原来的master拉binlog继续执行,本身它还是slave角色。
# 授权一个叫sst用户,用于节点2加入时同步数据。
# 建议直接授权为all,否则第二个加入时好易权限问题,反正只是对localhost的授权,
# 因此,wsrep_sst_auth直接配置为root用户也可以。
GRANT ALL ON *.* TO 'sst'@'localhost' IDENTIFIED BY '!admin8888';
1
2
3
4
第二个节点启动时,注意看error-log,正常的话,会清空datadir,并且从 node1 拉数据,主要通过 sst,所以node1要配置一个sst用户,这时可能出来一个bug,sst类似xtrabckup通过网络传输数据过来到datadir/.sst目录下,此目录中的文件归属有可能全是root,此时要全改成mysql用户,才能正确启动每二个节点。而方法是取巧:使用watch
使用watch命令,把sst copy过来的文件全改成mysql用户的。必需这样做,mysql正确启动。
watch -n 1 'chown mysql:mysql datadir/.sst -R'
1
2
我们数据量比较大,800多G,千兆网卡,要2~3小时 才能传输完,启动第二个节点。
---------------------
https://blog.csdn.net/toontong/article/details/79026150