8.3.2 客户端
OceanBase客户端与MergeServer通信,目前主要支持如下几种客户端:
●MySQL客户端:MergeServer兼容MySQL协议,MySQL客户端及相关工具(如 Java数据库访问方式JDBC)只需要将服务器的地址设置为任意一台Merge-Server的地址,就可以直接使用。
●Java客户端:OceanBase内部部署了多台MergeServer,Java客户端提供对 MySQL标准JDBC Driver的封装,并提供流量分配、负载均衡、MergeServer异常处理等功能。简单来讲,Java客户端首先按照一定的策略定位到某台MergeServer,接着调用MySQL JDBC Driver往这台MergeServer发送读写请求。Java客户端实现符合JDBC标准,能够支持Spring、iBatis等Java编程框架。
●C客户端:OceanBase C客户端的功能和Java客户端类似。它首先按照一定的策略定位到某台MergeServer,接着调用MySQL标准C客户端往这台MergeServer发送读写请求。C客户端的接口和MySQL标准C客户端接口完全相同,因此,能够通过LD_PRELOAD的方式将应用程序依赖的MySQL标准C客户端替换为OceanBase C客户端,而无需修改应用程序的代码。
OceanBase集群有多台MergeServer,这些MergeServer的服务器地址存储在OceanBase服务器端的系统表(与Oracle的系统表类似,存储OceanBase系统的元数据)内。OceanBase Java/C客户端首先请求服务器端获取MergeServer地址列表,接着按照一定的策略将读写请求发送给某台MergeServer,并负责对出现故障的MergeServer进行容错处理。
Java/C客户端访问OceanBase的流程大致如下:
1)请求RootServer获取集群中MergeServer的地址列表。
2)按照一定的策略选择某台MergeServer发送读写请求。客户端与MergeServer之间的通信协议兼容原生的MySQL协议,因此,只需要调用MySQL JDBC Driver或者MySQL C客户端这样的标准库即可。客户端支持的策略主要有两种:随机以及一致性哈希。一致性哈希的主要目的是将相同的SQL请求发送到同一台MergeServer,方便MergeServer对查询结果进行缓存。
3)如果请求MergeServer失败,则从MergeServer列表中重新选择一台MergeServer重试;如果请求某台MergeServer失败超过一定的次数,将这台MergeServer加入黑名单并从MergeServer列表中删除。另外,客户端会定期请求RootServer更新MergeServer地址列表。
如果OceanBase部署多个集群,客户端还需要处理多个集群的流量分配问题。使用者可以设置多个集群之间的流量分配比例,客户端获取到流量分配比例后,按照这个比例将请求发送到不同的集群。
OceanBase程序升级版本时,往往先将备集群的读取流量调整为0,这时所有的读写请求都只发往主集群,接着升级备集群的程序版本。备集群升级完成后将流量逐步切换到备集群观察一段时间,如果没有出现异常,则将所有的流量切到备集群,并将备集群切换为主集群提供写服务。原来的主集群变为新的备集群,升级新的备集群的程序版本后重新分配主备集群的流量比例。