头图

在项目应用过程中,经常会遇到因存储和运算能力的不足而增加gnode节点的需求,此时可能需要对原有节点上的数据进行重分布,并且在重分布的同时不影响业务SQL的执行。此处对数据重分布工具rebalance的并发原理进行说明,以便于分析数据重分布场景并发业务SQL时,业务SQL的执行响应时间是否符合正常预期。

一.名词解释

追加写动作:insert values,insert select,load data

非追加写DML:update,delete,merge

非追加写DDL:全部DDL

二.并发原理描述

  1. 同表Rebalance可以与追加写并发操作,非追加写操作不能并发写操作。
  2. Rebalance进度在90%之前允许追加写。而在90%及以后Rebalance与其他一切写操作均排斥。
  3. Rebalance策略决定Rebalance并发方式:

策略一:分片搬移策略从Rebalance开始进度就显示90%,不允许追加写。对应的表分片分布规则:hash 分布表或随机分布表,多主分片到少主分片且分片个数为倍数关系;分片数不变,分片在节点间位移;复制表

策略二:快速Rebalance策略从Rebalance开始就对表加写锁,即Rebalance开始进度就显示90%,不允许追加写。对应的表分片分布规则:随机分布表参数gcluster_rebalancing_random_table_quick_mode=1(默认)rebalance时只在新分布规则增加的节点上创建分片,不做数据的转移。

策略三:select into server策略分为Rebalance90%以前允许追加写并发;90%之后不允许追加写。对应的表分片分布规则:hash分布表少主分片到多主分片;随机分布表开启gcluster_rebalancing_random_table_quick_mode=0时。

  1. 在等待Rebalance队列中的表,即状态为starting时,不会阻塞非追加写。
  2. 当表级Rebalance被互斥锁阻塞,Rebalance命令会挂起,不会返回query ok;当互斥锁释放后Rebalance获得锁后返回query ok,表Rebalance进入执行队列,开始执行。
  3. 当库级/实例级Rebalance部分表被互斥锁阻塞,Rebalance命令会立即返回query ok,库下/实例下全部表进入等待队列;同时Rebalance会跳过持有互斥锁的表,该表状态在互斥锁释放前一直为starting状态;Rebalance会根据gcluster_rebalancing_concurrent_count参数值选取等待队列中其它等数据量的表进行Rebalance;当互斥锁释放后,Rebalance重新轮询表进入执行队列时,可将跳过表重新加入执行队列。

三.并发相容性矩阵

Rebalance

Rebalance_ex_Lock

Starting

Running

90%--Completed

Select

Insert

X

Load

X

Update

X

X

X

Delete

X

X

X

Merge

X

X

X

Ddl

X

X

X

状态迁移顺序为表格从左到右是状态转化顺序。客户端发rebalance命令后,集群接收命令放入执行等待队列即对rebalance表加互斥锁Rebalance_ex_Lock;在切换到starting状态的同时释放Rebalance_ex_Lock;当表开始真正开始执行数据重分布时进入running状态;当数据分布完成时显示完成比例为90%;后续清理动作和切换动作等完成后显示completed状态。


GBase数据库
1 声望2 粉丝

GBase数据库知识分享