工作不是让你用来妥协的,你退缩的越多,那么可以让你喘息的空间也就会越少。-- 佚名
上面这个模型就是在我入职xx公司之前,针对基础组件服务的架构,以下简称模型一;其中 dms 是自研的,负责选主、主从切换、健康检测的服务。
ha 采用静态配置
ha 采用的是静态配置,通过向 dms 监听的各个端口发起探测,来触发 dms 对后端组件服务的健康检测;这种模型将 dms 作为 midware 来使用,其中定制化了一些与组件控制和访问相关的逻辑;
dms 作为控制中间件而存在
dms 作为组件访问的控制中间件而存在,运行在 single-point 和 master-slave 两种模式下(虽然之前也号称支持 cluster 模式,但那部分代码根本就没有被使用过);具体表现为只允许访问 dms master 下管理的组件服务,不支持读写分离式访问;
虽说上面吐槽了半天,但还有一点必须提及,就是 dms 作为基础资源管理的“大脑”,居然没有“独立自主”做决策的能力,反而要依赖外部一个叫做 radar 的服务来提供关于组件“生死”的信息,没有形成真正的管理闭环,这于我而言简直就是……如芒在背……如鲠在喉……如坐针毡……
- single-point 模式很简单,因为基本上就是让 dms 处于不做任何控制的空跑状态
- master-slave 模式复杂一些,主要涉及
- 两个 dms 之间角色的确定:需要解决初始状态下以什么角色启动;同时存在两个 master 或两个 slave 时要如何处理;master 和 slave 之间发生脑裂后分别如何处理;脑裂状态恢复后如何处理;master 挂了一段时间,slave 切换成了 master ,之后 master 又重新上线了,此时应该如何处理,等等
- 被 dms 所管理组件的角色的确定:这里出现了大量(打脸)的“妥协”处理方案,对于支持 master-slave 运行模式的组件,如 redis 和 mysql,在业务规模、行业场景,开发人员能力有限的背景下,我司强烈建议(强制)组件角色必须和 dms 角色保持一致,这种“要求”的背景其实是,如果 mysql 的 master 和 redis 的 master 不同时处于 dms master 的管理下,则一旦发生“不可描述之事”后(各种异常),则可能…大概…也许…数据修复起来会更麻烦……因为这要求 dms 在 master 和 slave 角色下都能够正确处理“切换”问题,这……dms 做不到啊,因此 mysql 和 redis 的命运(角色)只能嫁鸡随鸡嫁狗随狗,任由 dms 翻手为云覆手为雨;而对于 zk 这种基于 Paxos 的,有最低节点数量要求的、强一致服务,是无法正常运行于该模式下的,那这么办呢?只能将 zk 按热备形式单点运行,这就“确保”了,zk 上的数据一定……是不同步的(咳咳,你没看错),一旦发生主从切换,则……,麻烦业务同学不要对 zk 数据有任何关于可用性的非分之想哦!!对了,我们还有一种类型的特殊服务,即只能冷备运行的服务,对于这种类型的服务,则严格要求冷备小弟“紧跟”带头大哥 dms 的步伐,要你生(dms master)那就生(冷备业务启动),要你死(dms slave),就便死(冷备业务停止);总之,我们对各种不同使用方式(冷备、主从、集群,单机)的组件提供的是……7*24 小时受限运行模式;
- cluster 模式,存在相应代码,但从来没有使用过,后续也不会被使用;简单来说,该模式“鸡肋”的原因在于其基于 zk 实现,而 zk 具有一定的“运行要求”,而实际使用场景必定会出现无法满足“运行要求”的情况,所以可以预期,一定会出现在 cluster 模式,master-slave 模式,以及 single-point 模式之间来回切换的使用场景,呵呵,幸亏没使用,光想蛋都疼,于是时常用感恩的心默念“不用 cluster 模式,真是它好我也好”
rabbitmq 未接入 dms
模型一中虽然有 rabbitmq 出镜,但在实际使用时,并没有将其接入 dms ,主要由于在该模型下,通过 ha 这个入口无法将请求“合理”转发到集群模式下 rabbitmq 的多个节点上,会出现所有请求都只发给 dms master 所管理的那个 rabbitmq 节点上的情况,而该问题在当前架构下也是无解的;
冷备服务管理问题
modb 服务的冷备管理问题:受限于业务的特殊性,modb 只能通过冷备方式来使用,而针对这种类型服务的管理,也需要依靠外部其他服务的协助才能完成;
问题小结
-
在当前架构下,即使是无状态服务,也不支持水平扩展。
-
各种基础组件以“组”为单位受 dms 管控,同时也反过来对 dms 的行为产生影响,即“组”中任意一种组件处于不可用状态达到一定时间后,就会触发 dms 对所有组件做整体“主从”切换,也就是传说中的“连坐”;
最后补充一下:我接手前,dms 源码中充斥着各种奇怪的,一直未解的 bug ,经过我一段时间的排查,改造,重写,终于能够稳定运行了,基本运行在无 bug 状态,于是……我闲了下来……
(未完待续)
原创不易,添加关注,点赞,在看,分享是最好的支持, 谢谢~
更多精彩内容,欢迎关注微信公众号 西风冷楼阙