大家好,我是吃萝卜不吐葡萄皮,可以叫我皮哥。
这几年国产数据库 OceanBase 非常火,身边好多朋友都在提,我也充满兴趣,下班抽空学习一段时间了,想通过笔记的形式分享一下学习进程,部分内容是官方资料的摘录或整合,希望方便更多朋友学习与参考,一起交流。
学习笔记第8篇。
数据库连接包括物理连接和逻辑连接。物理连接主要是指网络连接部分,逻辑连接主要是 ODP 与 OceanBase 数据库之间的 Session 部分。
路由是 OceanBase 分布式数据库中的一个重要功能,是分布式架构下,实现快速访问数据的利器。
Partition 是 OceanBase 数据存储的基本单元。当我们创建一张 Table 时,就会存在表和 Partition 的映射。非分区表中,不考虑主备时,一张 Table 对应一个 Partition;分区表中一个 Table 会对应多个 Partition。
路由实现了根据 OBServer 的数据分布精准访问到数据所在的机器。同时还可以根据一定的策略将一致性要求不高的读请求发送给副本机器,充分利用机器的资源。路由选择输入的是用户的 SQL、用户配置规则、和 OBServer 状态,路由选择输出的是一个可用 OBServer 地址。其路由逻辑如下图所示:
解析 SQL 模块使用的是 OBProxy 自己定制的 Parser 模块,只需要解析出 DML 语句中的数据库名、表名和 Hint,不需要通过其他复杂的表达式推演。
确定路由规则模块中,OBProxy 需要根据不同情况确定最佳的路由规则。比如:强一致性读的 DML 请求期望发到副本 Leader 的 OBServer 上,弱一致性读的 DML 请求和其他请求则不要求,Leader 和 Follower 均衡负载即可。如果 OceanBase 集群是多地部署,OBProxy 还提供了 LDC 路由,优先发给同机房的 OBServer,其次是同城的 OBServer,最后才是其他城市的 OBServer。如果 OceanBase 集群是读写分离部署,OBProxy 还提供了读 Zone 优先、只限读 Zone、非合并优先等规则供业务按照自身特点配置。上述的几种情况在路由选择中是组合关系,输出是一个确定的路由规则。
获取路由表是指 OBProxy 根据用户的请求 SQL 获取该 SQL 涉及的副本位置。OBProxy 每次首先会尝试从本地线程缓存中获取路由表,其次是全局缓存,最后才是发起异步任务去向 OBServer 查询路由表。对于路由表的更新,OBProxy 采用触发更新机制。OBProxy 每次根据路由表转发给 OBServer 的请求,当 OBServer 不能本地执行时,会在回包时反馈给 OBProxy。OBProxy 根据反馈决定是否下次强制更新本地缓存路由表。通常是在 OBServer 合并或者负载均衡导致切主时,路由表才会发生变化。
选择目标 OBServer 则是根据确定的路由规则从上一步获取的路由表中选择最佳的 OBServer,在经过黑名单、灰名单检查通过后作为最终的目标 OBServer 进行请求转发。