中间件及运维管理
我们基于 K8s CRD 和 Operator 来进行 NebulaGraph 的部署,同时通过服务集成到现有的部署配置页面和运维管理页面,来获得对 Pod 的执行和迁移的控制能力。基于 sidecar
模式监控、收集 NebulaGraph 的核心指标并通过 Telegraf 发送到携程自研的 Hickwall 集中展示,并设置告警等一系列相关工作。
此外,我们集成了跨机房的域名分配功能,为节点自动分配域名用于内部访问(域名只用于集群内部,集群与外部连通是通过 IP 直连的),这样做是为了避免节点漂移造成 IP 变更,影响集群的可用性。
在客户端上,相比原生客户端,我们主要做了以下几个改进和优化:
Session 管理功能
原生客户端 Session 管理比较弱,尤其是 v2.x 早期几个版本,多线程访问 Session 并不是线程安全的,Session 过期或者失效都需要调用方来处理,不适合大规模使用。同时,虽然官方客户端创建的 Session 是可以复用的,并不需要 release,官方也鼓励用户复用,但是却没有提供统一的 Session 管理功能来帮助用户复用。因此,我们增加了 Session Pool 的概念来实现复用。
其本质上是管理一个或多个 Session Object Queue,通过 borrow-and-return
的方式(下图),确保了一个 Session 在同一时间只会由一个执行器在使用,避免了共用 Session 产生的问题。同时通过对队列的管理,我们可以进行 Session 数量和版本的管理,比如:预生成一定量的 Session,或者在管理中心发出消息之后变更 Session 的数量或者访问的路由。
蓝绿部署(包括读写分离)
上面章节中介绍了蓝绿部署,相应的客户端也需要改造以支持访问 2 个集群。由于生产中,读和写的逻辑往往不同,比如:读操作希望可以由 2 个集群共同提供数据,而写的时候只希望影响单边,所以我们在进行蓝绿处理的时候也增加了读写分离(下图)。