open 节点启动成功,准备加入集群
primary 节点已经在集群中,且可以对外提供服务,新节点加入时,可以被选择为donor节点传输数据
joiner 节点处于等待接收同步文件的状态
jonied 节点完成数据同步,尝试保持和集群一致的状态
synced 节点正常提供服务,表使已经完成同步,并和集群一致
donor 节点处于提供全量数据的状态
3306 数据库服务默认端口
4444 节点间SST全量同步端口
4567 节点间通讯端口
4568 节点间IST增量传输端口
如上图(来自官网)数据操作首先在本地进行,当本地commit时,会把事务+全局ID广播出去,各节点进行检查,检查通过,各节点执行apply_cb和commit_cb操作,如果检查不通过,节点取消本次事务操作。local节点本地检查通过,进行commit并返回客户端OK,检查不通过则回滚数据。如果集群中有节点检查不通过,会返回客户端一个error,冲突节点就会执行shutdown操作。因此一个集群中为防止出现脑裂,最少3个机器。
多节点同步存在两个问题:
1. 多节点写入时,集群使用optimistic locking model 管理资源,在数据提交之前不会校验资源的锁定情况,如果冲突会在commit时,出现error,这种情况在innodb引擎(pxc 仅支持的引擎)中不是严重的行为,所有的资源争用会被DEADLOCK和LOCK TIMEOUT自动解决,如果争用严重可以适当调整timeout 的值。
2. 读数据延迟。在集群中一个节点的数据变更较快,同步到其他节点时有延迟,出现无法读取最新的remote节点的数据。调整wsrep_slave_threads
开启并行复制;或者时调整参数wsrep_causal_reads=ON在数据应用完之后再读取,此方式会增加读取的相应时间。
SST
pxc 全量传输的方式有三种 :rsync、mysqldump、xtrabackup。一般使用xtrabackup(结合备份)。
rsync 和 mysqldumper 都会使整个集群锁住,会执行FLUSH TABLES WITH READ LOCK锁定
xtrabackup 不加读锁
可以使用SHOW STATUS LIKE 'wsrep_local_state_comment'; 检查当前节点的同步状态,Synced 使同步完成的状态。
IST
增量传输只是用xtrabackup。
Record-Set Cache 当一个节点执行事务时,会为每一条操作的值产生一个唯一值,记录到out-write-set 中,同时事务操作的binlog日志也会记录到out-write-file中,当事务提交的时候,该文件会发送到集群组中。record-set cache 无法调整,默认的page大小时64K,总大小4M。wsrep_max_ws_size
可以设置write set 的最大大小。当内存不够用的时候,在数据目录下生成xxxx_keys
和 xxxx_data
文件
GCache 用来缓存write-set数据用于应用,当一个新节点添加到集群的时候,会检查local节点的数据和集群中donor的数据差异,如果donor节点的gcache中存在足够的数据用户进行IST,则新节点很快就可以跟上集群的数据,如果gcache不足够大,就会产生SST进行全量数据传输,在生产环境中,这是不能接受的。
gcache 的大小通过参数wsrep_provider_options="gcache.size = 5G" 调整
record-set 的数据在事务提交时,就可以删除,gcache 事务提交时不会删除。
wsrep_local_state_uuid 集群的uuid ,同一个集群中的所有的uuid必须一致
wsrep_cluster_size 集群中的节点数,如果节点数不是配置的集群节点总数,则说明集群状态有问题
wsrep_cluster_status 所有节点都应该是primary
wsrep_local_state 4表示正常。joining 节点正在加入集群,donor 节点正在为新加入的同步数据,joined 成功加入,synced 当前节点已经与集群同步。
wsrep_last_committed 整个集群提交的事务的数量,累计值
wsrep_ready ON为正常提供服务的状态,如果为OFF 则可能出现脑裂后者是网络问题
向现有的PXC(两节点)集群中添加新节点。使用IST方式传输数据。
进行一下操作之前按照https://blog.csdn.net/u010311722/article/details/84953312 搭建基础的环境。
现有环境
pxc集群 | dbatest1 | 12.3.10.155 |
dbatest2 | 12.3.10.156 | |
新节点 | dbatest3 | 12.3.11.154 |
innobackupex --user=root --password=123456 --port=3306 --no-timestamp --slave-info --stream=tar /tmp|gzip|ssh dbatest3 "cat ->/soft/bak/mysqlbak.tar.gz"
/usr/bin/innobackupex --apply-log /soft/bak/
/usr/bin/innobackupex --copy-back /soft/bak/
chown mysql:mysql -R /data/
./bin/mysqld_safe --defaults-file=/etc/my.cnf &
- dbatest1 创建同步用户repl@'12.3.11.%'
- CHANGE MASTER TO
MASTER_HOST='12.3.10.155',
MASTER_USER='repl',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000009',
MASTER_LOG_POS=154,
MASTER_CONNECT_RETRY=10;
master_log_file 和 master_log_pos 来自于 备份中的xtrabackup_binlog_pos_innodb 这个文件
# cat xtrabackup_binlog_pos_innodb
mysql-bin.000009 154- start slave
- show slave status \G
insert into t (name) values ('ddd');
切换主从同步为pxc新节点
> stop slave;
> show slave satus \G
mysql-bin.000009 2141
# mysqladmin shutdown -uroot -p123456
# mysqlbinlog -v -v /data/mysql/mysql-bin.000009 |grep 2141
#181218 15:38:03 server id 1013306 end_log_pos 2141 CRC32 0x5bdea1fc Xid = 46
# at 2141
# vim /data/mysql/grastate.dat
# GALERA saved state
version: 2.1
uuid: b0df8222-fdef-11e8-9136-8669ef80570a
seqno: 46
cert_index:
/etc/init.d/mysql start
489 2018-12-18T08:44:25.921606Z 0 [ERROR] WSREP: Could not open state file for writing: '/data/mysql//grastate.dat'. Check permissions and/or di sk space.: 13 (Permission denied)
490 at galera/src/saved_state.cpp:SavedState():53
491 2018-12-18T08:44:25.921648Z 0 [ERROR] WSREP: wsrep::init() failed: 7, must shutdown
492 2018-12-18T08:44:25.921670Z 0 [ERROR] Aborting
由于grastate.dat 是从dbatest1 拷贝的,所以文件的权限不对,改成mysql:mysql 就可以了