【20180408】MySQL集群PXC的一些随笔

PXC验证不经过只有俩个状况

  1. 快照太久
    • SQL语句执行时间太长,或者UNDO表空间太小,或者事务量过大,或者过于频繁的提交,致使执行SQL过程当中进行一致性读时,SQL执行后修改的前镜像(即UNDO数据)在UNDO表空间中已经被覆盖,不能构造一致性读块(CR blocks)。 这种状况最多。
    • SQL语句执行过程当中,访问到的块,在进行延迟块清除时,不能肯定该块的事务提交时间与SQL执行开始时间的前后次序。 这种状况不多。
  2. 对同一行数据进行修改

PXC其余node节点apply应用失败通常是硬件层次出现问题node

  1. 失败以后通常进行IST增量补全
  2. 如果IST失败则会被T出集群

PXC没有lock tablemysql

  • 进行alter table DDL操做的时候会升级为全局锁,将整个实例锁住。因此最好建议是DDL操做的时候不能进行online DDL,最好是使用pt-osc或者gh-ost等

PXC的IST

  1. 当一个节点加入,它当前的UUID于现集群相同,而且缺失的数据可以在donor的writeset的cache中找到,则能够进行IST,不然只能所有初始化数据,而且进行SST
    • gcache.size默认是128M,能够根据高峰时期binlog一个小时内生成的binlog大小设置
  2. 须要注意的是,IST所须要的cache是临时存在的,因此一个集群彻底关闭,可是各个节点关闭的时候seqno不一致,则即便先启动最新sequo的节点,其余落后的节点任然不可以作IST,只能SST。因此,若是须要彻底关闭整个集群,须要先中断外部连接,而后在集群相对静止的状况下来关闭,才能避免SST。
  3. PXC之间的IST和SST数据的传输主要有三种方式:
    • mysqldump逻辑备份,会锁表。
    • rsync 会存在文件锁
    • xtrabackup 通常建议使用这个

脑裂

  1. 俩个节点发生脑裂的话,那么就不能针对整个集群进行操做,任何命令都是显示"unkown command"
    • pc.ignore_db = yes 忽略脑裂,继续操做

PXC的局限性

  1. 仅仅工做在InnoDB引擎表上面,所以对mysql库下面的系统表的修改不能复制,可是DDL操做时能够被复制的,因此能够经过create user,grant等方式操做系统表。
  2. 不支持在没有主键的表上面的DELETE操做,select...limit也会在不一样节点返回不一样的值。(仅仅只是在没有主键的状况下limit会返回不一样的结果集么?)
  3. 不支持的操做:LOCK/UNLOCK TABLES,lock functions(GET_LOCKS(),RELEASE_LOCK()...)
  4. query log日志不能存放在表里,必须存放在文件中。
  5. 最大的事务大小由wsrep_max_ws_rows,wrsep_max_ws_size定义,LOAD DATA INFILE 每10K行提交一次,这种事务被分割为成数个小事务。(XtraDB Cluster 自动分割,仍是操做时手动分割?)
    • wsrep_max_ws_rows,wrsep_max_ws_size 谁先触发,谁先进行拆分
  6. 因为集群是基于乐观的并发控制(optimistic consurrency control),事务冲突的状况可能哎commit阶段发生,当多个节点修改同一行数据的时候,只有一个节点可以成功,失败的节点将终止,而且返回死锁错误码 Error:1213 SQLSTATE:4001(ER_LOCK_DEADLOCK).(这样是否太不稳定了?动不动就会有某个节点终止刮掉的状况?并且这种状况如何处理?)
  7. 不支持XA事务,由于XA事务有可能在commit的时候出现异常rollback.(参考http://www.infoq.com/cn/articles/xa-transactions-handle)
  8. 整个集群的吞吐量/性能取决于最慢的那个节点,由于须要在全部的节点上面certification,同时还取决于节点之间的网络性能,所以须要全部的节点都有相同的硬件配置,而且网络,磁盘等性能要尽量的高,例如使用SSD。

流控

  1. 什么是流控?
    • 流控简而言之就是流量控制,在PXC虽然是属于同步复制,可是它也只是在逻辑或者说虚拟的同步复制,在apply和commit并非同步而是异步的,存在某些缘由会致使apply和commit会落后于集群中的其余节点,一旦落后的事务过多,这个时候就会启动流控,在整个流控的过程当中,集群是不对外提供写功能,可是并不会影响读。
  2. fc.limit=1
    • 控制流控的阀值,一旦node落后这个值则会发起流控,这个值并非固定的。会根据集群中节点的数量动态调整的。
  3. fc_master_slave=NO
    • 是否开启动态调整流控的阀值。通常默认是NO
  4. fc_factor = 0.0~1.0
    • 控制流控何时回复正常,通常默认是0.5 便是fc.limit的50%的值就会恢复正常,流控结束。

引用

部分信息来自于知数堂课件总结sql

相关文章
相关标签/搜索