pxc集群增删节点

PXC节点的各种状态

open 节点启动成功,准备加入集群

primary 节点已经在集群中,且可以对外提供服务,新节点加入时,可以被选择为donor节点传输数据

joiner 节点处于等待接收同步文件的状态

jonied 节点完成数据同步,尝试保持和集群一致的状态

synced 节点正常提供服务,表使已经完成同步,并和集群一致

donor 节点处于提供全量数据的状态

PXC的默认端口

3306 数据库服务默认端口

4444 节点间SST全量同步端口

4567 节点间通讯端口

4568 节点间IST增量传输端口

PXC事务操作的原理

pxc集群增删节点_第1张图片

如上图(来自官网)数据操作首先在本地进行,当本地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。

GCACHE

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 事务提交时不会删除。

PXC状态监控

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

 

 

 

实验步骤

搭建主从

  • 选择的dbatest1 为数据提供节点,进行备份

innobackupex --user=root --password=123456 --port=3306 --no-timestamp --slave-info --stream=tar /tmp|gzip|ssh dbatest3 "cat ->/soft/bak/mysqlbak.tar.gz"

  • dbatest3 恢复数据

/usr/bin/innobackupex --apply-log /soft/bak/

/usr/bin/innobackupex --copy-back /soft/bak/

  • 修改data目录权限

chown mysql:mysql -R /data/

  • 启动dbatest3

./bin/mysqld_safe --defaults-file=/etc/my.cnf &

  • 配置主从同步
  1. dbatest1 创建同步用户repl@'12.3.11.%'
  2. 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
  3. start slave
  4. show slave status \G
  • dbatest1进行数据操作,检查主从同步是否正常(生产环境部署,可以使用pt-table-checksum 校验数据)

insert into t (name) values ('ddd');

切换主从同步为pxc新节点

  • dbatest3 停止主从复制,记录pos号,停止mysql服务

> stop slave; 

> show slave satus \G

mysql-bin.000009 2141

# mysqladmin shutdown -uroot -p123456

  • dbatest1 查找pos对应的Xid

# 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
 

  • 修改dbatest3 的grastate.dat文件

# vim /data/mysql/grastate.dat

# GALERA saved state
version: 2.1
uuid:    b0df8222-fdef-11e8-9136-8669ef80570a
seqno:   46
cert_index:
 

  • 启动pxc

/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 就可以了

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(mysql)