数据库层高可用
OceanBase 数据库基于高性价比的普通服务器采用 Paxos 协议,同一份数据写到多台(>= 3)节点的半数以上,因此当少数派节点发生故障时不会有任何数据丢失,保证 RPO = 0;Leader 副本发生故障后,剩余的 Follower 副本能够在短时间内自动选出新 Leader 继续提供服务,无需外部介入,保证 RTO < 8 秒,从而达到强一致和高可用的平衡。用户也可以采用灵活的部署模式,例如,同城三中心、两地三中心、三地五中心等,从而达到各级无损容灾能力,例如同城容灾和异地容灾。
Root Service
在 OceanBase 数据库中,Root Service 负责集群的节点管理,各 OBServer 通过心跳数据包(heartbeat)的方式,定期(每 2s)向 Root Service 汇报自己的进程状态,Root Service 通过监测 OBServer 的心跳数据包,来获取当前 OBServer 进程的工作状态。
OBServer 心跳状态相关的配置项如下:
-
lease_time集群级配置项
lease_time用于设置心跳租约时长。该配置项的默认值为 10s。有关该配置项的详细信息,参见 lease_time。当 Root Service 累计超过
lease_time时间没有收到过某 OBServer 的任意心跳数据包时,Root Service 认为该 observer 进程短暂断线,Root Service 会标记该 OBServer 服务器的心跳状态为lease_expired。 -
server_permanent_offline_time集群级配置项
server_permanent_offline_time用于设置节点心跳中断的时间阈值,即节点心跳中断多久后认为其被永久下线,永久下线的节点上的数据副本需要被自动补足。该配置项的默认值为 3600s。有关该配置项的更多详细信息,参见 server_permanent_offline_time。当 Root Service 累计超过
server_permanent_offline_time时间没有收到过某 OBServer 的任意心跳数据包时,Root Service 认为该 observer 进程断线,Root Service 会标记该 OBServer 的心跳状态为permanent_offline。
说明
您可以通过 SHOW PARAMETERS 语句查看以上集群级配置项的值,例如,SHOW PARAMETERS LIKE 'server_permanent_offline_time';。
Root Service 根据心跳数据包可以获得 OBServer 如下的工作状态:
- OBServer 心跳数据包存在,心跳数据包中的 OBServer 磁盘状态正常。此种状态下,Root Service 认为 OBServer 处于正常工作状态。
- OBServer 心跳数据包存在,心跳数据包中的 OBServer 磁盘状态异常。此种状态下,Root Service 认为 observer 进程还在,但 OBServer 磁盘故障。此种状态下,Root Service 会尝试将该 OBServer 上的全部 leader 副本切走。
- OBServer 心跳数据包不存在,OBServer 心跳数据包的丢失时间还比较短,OBServer 心跳状态为 lease_time,此种状态下,Root Service 仅将 OBServer 的工作状态设置为 inactive,不做其他处理。
- OBServer 心跳数据包不存在,OBServer 心跳数据包丢失时间超过
server_permanent_offline_time,OBServer 的心跳状态为permanent_offline,此种情况下,Root Service 会对该 OBServer 上的数据副本进行处理,将该 OBServer 上包含的数据副本从 Paxos 成员组中删除,并在其他可用 OBServer 上补充数据,以保证数据副本 Paxos 成员组完整。
隔离节点
ODP 会感知 OBServer 的异常状态,例如 stopped(ACTIVE 状态且 stop_time 字段大于 0)状态、INACTIVE 状态等,从而避免将应用流量路由到异常节点上。
如果某个节点不稳定,可能时不时提供服务,存在响应慢等各种不正常情况。如果客户端连接到该节点,将导致客户端感受到不稳定。OceanBase 数据库提供了 STOP SERVER 命令用于隔离节点。隔离后,该节点不会对外提供服务,ODP 也不会把请求路由到该节点上,可以安全的进行诊断/替换/维修等动作,是运维和应急的利器。Stop Server 会检查所有剩余副本是否满足多数派、是否日志同步,当条件不满足的时候 Stop Server 操作会返回失败;条件满足的情况下等待故障节点上的 Leader 全部切走后系统会返回成功。Stop Server 成功后保证能够做任何运维动作,包括 Kill observer 进程。Stop Server 的详细操作请参见 隔离节点。
节点隔离适用于单机房故障场景:
- 非通断型故障(例如网卡丢包导致的机器不稳定)强依赖节点隔离,否则会发生反复切主而影响应用。
- 通断型故障(例如机器直接宕机)不强依赖节点隔离,其会在
oceanbase.DBA_OB_SERVERS视图标记节点状态为INACTIVE而隔离应用流量。
在节点隔离或者 Leader 出现故障时,会触发选举。选举服务的优先级机制会考虑用户指定的 Primary Zone,考虑机器的异常状态等,从而保证选择更优的副本作为主副本。
手动切主
除了隔离节点,您还可以主动切主,切换日志流副本的主备角色。
主动切主的操作步骤如下:
-
使用
root用户登录到集群的sys租户。连接示例如下,连接数据库时请以实际环境为准。
obclient -h10.xx.xx.xx -P2883 -uroot@sys#obdemo -p***** -A有关更加详细的连接数据库的操作指引,参见 连接数据库概述(MySQL 模式) 和 连接数据库概述(Oracle 模式)。
-
获取租户的 Zone、Server 及日志流副本信息。
obcllient [(none)]> SELECT a.TENANT_ID,a.LS_ID,a.SVR_IP,a.SVR_PORT,a.ZONE,a.role,b.TENANT_NAME,b.TENANT_TYPE FROM oceanbase.CDB_OB_LS_LOCATIONS a, oceanbase.DBA_OB_TENANTS b WHERE a.TENANT_ID=b.TENANT_ID; +-----------+-------+----------------+----------+-------+----------+-------------+-------------+ | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | ZONE | role | TENANT_NAME | TENANT_TYPE | +-----------+-------+----------------+----------+-------+----------+-------------+-------------+ | 1 | 1 | xx.xx.xx.237 | 2882 | zone1 | LEADER | sys | SYS | | 1 | 1 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | sys | SYS | | 1 | 1 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | sys | SYS | | 1001 | 1 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | META$1002 | META | | 1001 | 1 | xx.xx.xx.237 | 2882 | zone1 | LEADER | META$1002 | META | | 1001 | 1 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | META$1002 | META | | 1002 | 1 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | mysql001 | USER | | 1002 | 1 | xx.xx.xx.237 | 2882 | zone1 | LEADER | mysql001 | USER | | 1002 | 1 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | mysql001 | USER | | 1002 | 1001 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | mysql001 | USER | | 1002 | 1001 | xx.xx.xx.237 | 2882 | zone1 | LEADER | mysql001 | USER | | 1002 | 1001 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | mysql001 | USER | | 1009 | 1 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | META$1010 | META | | 1009 | 1 | xx.xx.xx.237 | 2882 | zone1 | LEADER | META$1010 | META | | 1009 | 1 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | META$1010 | META | | 1010 | 1 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | oracle001 | USER | | 1010 | 1 | xx.xx.xx.237 | 2882 | zone1 | LEADER | oracle001 | USER | | 1010 | 1 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | oracle001 | USER | | 1010 | 1001 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | oracle001 | USER | | 1010 | 1001 | xx.xx.xx.237 | 2882 | zone1 | LEADER | oracle001 | USER | | 1010 | 1001 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | oracle001 | USER | | 1035 | 1 | xx.xx.xx.218 | 2882 | zone3 | FOLLOWER | META$1036 | META | | 1035 | 1 | xx.xx.xx.237 | 2882 | zone1 | LEADER | META$1036 | META | | 1035 | 1 | xx.xx.xx.238 | 2882 | zone2 | FOLLOWER | META$1036 | META | +-----------+-------+----------------+----------+-------+----------+-------------+-------------+ 24 rows in set有关
CDB_OB_LS_LOCATIONS视图的更多信息,参见 CDB_OB_LS_LOCATIONS。 -
根据实际情况,选择合适的命令切主。
-
修改指定租户的某一个日志流副本的角色。
ALTER SYSTEM SWITCH REPLICA role LS [=] ls_id SERVER [=] 'ip:port' TENANT = tenant_name;相关参数说明如下:
role:副本角色,用于指定日志流副本的角色为 LEADER 或 FOLLOWER。ls_id:待修改的日志流副本的 ID。ip:port:待修改的日志流副本所在主机的 IP 和 RPC 端口。tenant_name:待修改的日志流副本所属的租户。
示例如下:
obclient [(none)]> ALTER SYSTEM SWITCH REPLICA LEADER LS = 1001 SERVER = 'xx.xx.xx.218:2882' TENANT = oracle001; -
修改某台 OBServer 上所有副本的角色。
ALTER SYSTEM SWITCH REPLICA role SERVER [=] 'ip:port' [TENANT = tenant_name];相关参数说明如下:
role:副本角色,用于指定日志流副本的角色为 LEADER 或 FOLLOWER。ip:port:待修改的日志流副本所在主机的 IP 和 RPC 端口。tenant_name:待修改的日志流副本所属的租户,可选。
示例如下:
obclient [(none)]> ALTER SYSTEM SWITCH REPLICA LEADER SERVER = 'xx.xx.xx.218:2882' TENANT = oracle001; -
修改某个 Zone 中所有副本的角色。
ALTER SYSTEM SWITCH REPLICA role ZONE [=] zone_name [TENANT = tenant_name];相关参数说明如下:
role:副本角色,用于指定日志流副本的角色为 LEADER 或 FOLLOWER。zone:待修改的日志流副本所属的 Zone。tenant_name:待修改的日志流副本所属的租户,可选。
obclient [(none)]> ALTER SYSTEM SWITCH REPLICA LEADER ZONE = zone1 ;
-
-
操作结束后,可以再次查询视图,确认副本角色是否修改成功。
obclient [(none)]> SELECT * FROM oceanbase.CDB_OB_LS_LOCATIONS WHERE TENANT_ID = 1010; +----------------------------+----------------------------+-----------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+ | CREATE_TIME | MODIFY_TIME | TENANT_ID | LS_ID | SVR_IP | SVR_PORT | SQL_PORT | ZONE | ROLE | MEMBER_LIST | PAXOS_REPLICA_NUMBER | REPLICA_TYPE | +----------------------------+----------------------------+-----------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+ | 2022-12-26 18:28:49.389751 | 2023-01-11 12:02:38.275763 | 1010 | 1 | xx.xx.xx.218 | 2882 | 2881 | zone3 | FOLLOWER | NULL | NULL | FULL | | 2022-12-26 18:28:49.389601 | 2022-12-26 18:28:54.441143 | 1010 | 1 | xx.xx.xx.237 | 2882 | 2881 | zone1 | LEADER | xx.xx.xx.218:2882:1,xx.xx.xx.237:2882:1,xx.xx.xx.238:2882:1 | 3 | FULL | | 2022-12-26 18:28:49.390567 | 2023-01-11 12:02:37.970540 | 1010 | 1 | xx.xx.xx.238 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | | 2022-12-26 18:29:01.334732 | 2023-01-11 11:59:31.899581 | 1010 | 1001 | xx.xx.xx.218 | 2882 | 2881 | zone3 | LEADER | xx.xx.xx.218:2882:1,xx.xx.xx.237:2882:1,xx.xx.xx.238:2882:1 | 3 | FULL | | 2022-12-26 18:29:01.335629 | 2023-01-11 12:02:37.709677 | 1010 | 1001 | xx.xx.xx.237 | 2882 | 2881 | zone1 | FOLLOWER | NULL | NULL | FULL | | 2022-12-26 18:29:01.335822 | 2023-01-11 12:02:37.970540 | 1010 | 1001 | xx.xx.xx.238 | 2882 | 2881 | zone2 | FOLLOWER | NULL | NULL | FULL | +----------------------------+----------------------------+-----------+-------+----------------+----------+----------+-------+----------+-------------------------------------------------------------------+----------------------+--------------+ 6 rows in set
主动切主适用于机房容灾和城市容灾场景,您可以将 Leader 切换到指定的 Zone 或者 Region,从而更加契合应用流量的分布。




