开发者学堂课程【PolarDB-X 开源系列课程:PolarDB-X集群运维1:升降配、扩缩容_与备份恢复(二)】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/1032/detail/15145
PolarDB-X集群运维1:升降配、扩缩容_与备份恢复(二)
三、升降配
1、技术细节
(1)分区迁移。将老dn的数据迁移到新的dn,由于polarDB-x是一款分布式数据库,存储的数据量往往较大,迁移的数据量比较大,因此在迁移的过程中尽可能采用并行的策略来提高迁移效率,迁移过程中比较消耗CPU以及io资源,如果迁移的速度过快,也会对正常的业务业务请求造成一定的影响。
因此polarDB-x支持自适应的流控策略,一方面能够允许用户自定义控制迁移任务的启停以及迁移速率的上限,另一方面也会根据实际节点的资源情况来自适应控制迁移的速率。从而能够既保障迁移效率,也能够减少对业务的影响。
(2)切换过程。当完成数据迁移,需要从旧的dn切换到新的dn访问时,由于polarDB-x是一款分布式节点,会有多个cn节点存在。直接切流方式,由于polarDB-x有多个Cn,不可能同时切流,可能会有一前一后的延迟,假如需要将老的cn1上的数据迁移到cn2,数据迁移完成发起切换。
这时cn2完成切换过程,对新的分配数据发起删除操作,将数据删除,但是cn1的流量还没有切换到cn2,这时有select的请求过来,仍然会读到原来cn1上的这条数据,这时候便会出现数据的不一致。
简单解法是直接通知所有的cn停写进行切换,切换完成后,再把写入流量放开。但由于是分布式数据库,需要保证所有的cn节点都能被通知到,假如某一个cn节点发生异常或是有网络延迟,便会有协调开销。长时间的停写也会对业务造成一定的影响。
(3)针对上述两种问题,polarDB-x采用透明切换方式,将切换过程看成是ddl操作,将新dn2上的数据看成主表的数据,将DN2上的数据看成是主表的索引表。
切流操作就是将索引表的数据进行下线,有了抽象之后,参考GOOGLE的那篇papper,将整个切换过程分成四个步骤。
可以理解成do流量,insert流量还有delete,update流量以及剩下的所有的流量,在这个过程中保证任意一个时刻,所有的cn节点只会出现相邻的两个状态。
举个例子,在一开始切流后需要通知cn节点,这时只会出现部分节点ready public,读写请求还在访问老的cn节点,同时数据同步还在保持,部分节点只会将读请求切换到新的cn,写请求还在老的cn上,只会出现这一种状态。
等所有的cn节点全部达到step7即only状态后,才会发起向step8状态切换的步骤,直到所有的cn全部到step8后才会发起向step9切换的操作,通过这种方式能够保证不会出现数据的不一致,同时也没有长时间浪费,减少对业务的影响。
2、操作
(1)ecs提前通过kubectl安装好k84集群。这是由四个节点构成的minikube集群,polarDB-X的实例已经创建好。它由gms,cn,dn和cdc组成,通过命令拿到登录密码。
polarDB-X实例的密码会放到k84的cicol对象里,通过拿到对象里面相应密码的字段,将其进行贝斯六十四的解码,就可以拿到密码。把密码输出出来,将polarDB-X的端口转发到设备上,即可从本地进行登录。
(2)将3306端口转发到本地,接下来通过命令行的方式登录。在my cercle上登录后,已经提前创建好数据库,开启压测流量,对polarDB-X进行操作,观察过程中的变化。
(3)数据库的数据导入十六行的数据,接下来将对实例开启压测流量。压测流量的脚本是yaml文件,有几个关键的部分。使用的容器是目前公开的容器。在二次部分配置pxC实例的用户名密码以及网络的连接串。主要的区别是使用二十五个连接来进行压测,压测时使用的是slect场景。
(4)用kubecrl apply方式创建job。有一个叫 的pall正在运行,日志流量基本上稳定下来,实例按现在的资源规格,kps是三千多,接下来进行扩容。
(5)进行申配,通过yaml文件进行编辑,将cn的CPU的limite改成2,dn的CPU的limite也改成2,保存文件。apply对象,成功后观察polarDB-X的状态,已经进入upgreating。
qPS已经上来,最初三千多,现在已经到五六千。申配过程还在继续。
(6)sisbench的流量跌到0有几个因素,在申配过程中,CN需要进行申配,中间必然会有老cn下线和新cn上线的过程,会导致切换。
由于压测流量,sisbench的流量和polarDB-X在ecs上做模拟,两个进程之间的资源会有一定的互相影响就会导致这种现象,如果单独在k84集群使用的话不会有这个问题,闪断不会这么慢。
3、原理
(1)升降配可以看成两个部分,第一个是cn、cdc这种无状态的组件,升降配其实就是把节点的资源,例如CPU内存资源更改,需要用新的pod替换老的pod。
为了保证相对的平衡,会选rolling up great的方式,按要求配置的新的CN节点,创建好节点,举个例子,三个cn的CPU限制都是1,现在需要改成2,就会创建三个CPU limite是2的节点,创建完成后会将老的pod下线,替换原来的cn节点。
(2)对于dn这样有状态的过程,给出每一个dn内部的状态,分别是leader、FOLLOWer和logger,在这个过程中,leader对外提供请求,响应请求,follower和logger主要做数据迁移之后的保障。
因此,会首先对FOLLOWer和logger进行升降配更改配置,换成新的pod,完成后将原来的leader切换到follower,由原来已经升配完的follower做leader,对老的leader进行升降配来达到最终的升配过程,这是轮转的过程,可以尽量减少对业务的影响。中间有一次流量的切换,就是主备的切换。