如何实现主备租户的无缝切换 | OceanBase应用实践

对于DBA而言,确保数据库的高可用性、容灾等能力是其日常工作中需要持续思考和关注的重要事项。一方面,可以利用数据库自身所具备的功能来实现这些目标;若数据库本身不提供相应功能,DBA则需寻找其他工具来增强数据库的高可用性和容灾能力。OceanBase作为一款分布式数据库产品,天生就具备了高可用的特性;而在容灾方面,OceanBase也提供了主备租户的功能,通过物理日志的同步,确保两个租户之间的数据保持一致。在较早的版本,假如出现主备切换的情况,需要用户修改连接串去连接新的主租户,这会影响很多业务场景的体验。

因此,如何做到即使发生了主备切换,对业务也是透明无感知的,就成了一个迫切需求。而在最新的版本上,OceanBase 推出了 Service_name (服务名) 的功能,通过服务名连接 OceanBase 集群的业务租户,服务名会自动识别当前哪个租户是主,哪个是备,从而将请求自动路由到主租户上。具体原理如下。

原理介绍

OceanBase 数据库中主备租户路由的基本框架如下图。用户通过特定的连接串登录 OBProxy,OBProxy 识别主备租户登录,通过向 OCP 获取相关的租户信息,完成自动路由到主租户,并发往对应的 OBServer 节点。OBServer 节点将校验对应的租户信息,校验通过后 OBProxy 进行建连,完成整个登录流程。

1730875744

注意事项:

主备租户路由功能需 OCP、OBProxy、OceanBase 数据库三者配合使用,缺一不可。使用主备租户路由功能时,要求 OCP 需为 V4.3.1 或之后版本,OBProxy 需为 V4.3.1 或之后版本,OceanBase 数据库需为 V4.2.4 或之后的系列版本。

创建主备租户

那么在介绍完原理之后,具体如何使用 service_name 来实现业务的透明无感知切换呢?下面就简单创建一个环境来做个演示,帮助大家有个更深层次的理解。

这里首先需要创建一个主备租户关系,可以在不同的集群,也可以在同一个集群,关于主备租户的搭建,具体可以参考官网文档:物理备库容灾。本次实验是分别创建两个单副本的 OceanBase 集群,然后分别再创建一个主租户和备租户,具体信息如下:

角色集群名IP地址租户名
集群Aobclusterxx.xx9.12obtest
集群Bobcluster_bakxx.xx204.3obtest
OBProxyhongbo_zxxx.xx9.12、xx.xx204.3--

首先打开OCP,在集群A上创建空的主租户,租户模式为MySQL模式,租户名为obtest,这里服务名可选,我们先空着,后续再添加服务名。

1730875878

接着在集群B上创建备租户,创建备租户时,选择要同步的主集群和主租户,然后再填写租户名称为obtest,这里也可以选择不同的租户名。同样服务名这里选择后面再添加,因为主租户是空租户,因此不需要再通过备份恢复的方式来创建备租户。

1730875956

创建完成之后,可以在OCP上检查下主备租户的情况,可以看到在集群B上,租户obtest为备租户。

1730875967

主备租户同步测试

接着我们尝试测试下主备租户的同步情况,这里在主租户的test库下创建一张表,然后写入一条数据,看下在备租户上能否同步过去。

1730876268

连接备租户,然后登录到test库下,可以看到创建的oceanbase表和数据都同步过来,说明主备租户同步是正常的。

1730876494

创建OBProxy

接着,为集群A和集群B创建OBProxy,这里需要创建的OBProxy可以同时连接到集群A和集群B,因此启动方式需要为ConfigUrl模式,并选择可连接的OceanBase集群,将obcluster和obcluster_bak选中。然后填写其他OBProxy集群名、root@proxysys密码等信息。

1730876514

添加服务名

OBProxy创建完成之后,接着就给租户添加服务名,在OCP上进到主租户中,在概览页面找到添加服务名进行添加。

1730876526

这里添加服务名为 service_obtest,并且选择同步变更主备租户服务名,这样,在备租户上,也有了相同的服务名。

1730876557

从OCP上可以看到,备租户上已经有了这个服务名。

1730876590

通过服务名测试连接

登录每个集群的sys租户查询系统表,可以看到service_name和业务租户已经绑定

SELECT t.tenant_id, t.tenant_name
FROM oceanbase.CDB_OB_SERVICES AS s JOIN DBA_OB_TENANTS AS t
ON s.tenant_id = t.tenant_id WHERE s.service_name = "service_obtest";

1730876614

接着,使用服务名进行数据库连接,这里的连接规则是 <用户名>@SERVICE:SERVICE_NAME, 因此根据实际情况,连接租户的用户信息部分就是 root@service:service_obtest。从下面图中可以看出,通过这个服务名连接业务租户之后,默认是连接到了集群A上的obtest租户,因为目前obtest租户的主在集群A上。

1730876631

主备切换

主备切换有两种方式,一种是failover,一种是switchover。switchover一般是无损切换,即主备租户都正常情况下,切换主备角色;failover一般是当主租户出现故障,无法快速恢复数据库,需要切换到备租户上先恢复业务服务。这种情况下,是有损的,可能会丢失一部分业务数据。

日常切换

在这里两种场景都做一个演示,首先进行switchover。在OCP上,进入到主租户的概览页面,右上角"..."中选择日常切换

1730876683

然后会提示具体切换信息,确认无误之后,点击开始切换即可

1730876692

在任务中心会生成切换的任务,可以看到10秒左右就完成了切换,这里没有持续做压测,实际对业务的影响肯定是远小于这个时间的。

1730876710

再次在OCP上检查租户状态,可以看到集群A的obtest租户,已经变成了备租户

1730876842

再次通过命令行进行连接,可以看到,此时连接obtest租户,已经是在集群B上,说明切换是成功的,连接也没有问题。

1730876861

故障切换

经过日常切换之后,obtest租户的主目前在集群B上,此时模拟集群故障,直接使用 kill -9 将集群B的进程 kill 掉,此时主租户将无法提供服务,需要将备租户切换为主,然后提供业务服务。

1730876874

在集群A的 obtest 租户下,通过在右上角"..."选择容灾切换,会强制将备租户变更为主

1730876889

此时会弹出提示框,需要输入新主租户服务名,因为要保证业务不修改连接串,所以这里服务名需保持一致,然后点容灾切换

1730876900

切换会生成一个任务,查看任务可以看到,7秒左右就将备租户拉起成功

1730876927

此时再用同样的服务名连接租户,可以看到,连接的集群已经自动切换到集群A,说明切换已经完成,业务可以正常访问

1730876935

这里需要注意一点,原主租户因为故障无法访问,当集群和租户恢复之后,此时该租户的服务名和当前新主租户的服务名是一样的,因此最好是把这个服务名删除或者修改个别的服务名,虽然OCP会做一层保护,防止通过同样的服务名连接到这个租户,但是最好还是人为做一些保护,防止出现业务同时连两个租户,出现脑裂情况。等重新配置好主备关系之后,再将服务名修改回来即可。

1730876969

OBProxy 路由

最后,再摘抄一部分官网上对于 Service Name 路由策略的介绍,让大家对整个功能有个更深入的认识:

OBProxy 支持配置 Service Name 登录后,支持主租户的自动路由能力。具体如下:

  • 路由重试:当后端发生 Switchover/Failover 时,OBProxy 根据协商的错误码,主动重试可用租户列表(支持跨集群重试)。切换到主租户重试时将不会返回错误,从而实现业务无感知的路由切换。

需要注意的是,在以下类型的 SQL 请求中,OBProxy 不支持切换租户/重试请求,会返回 OceanBase 数据库的错误码:

    • 事务中路由:OBProxy 不会切换租户,依然将请求发往事务开启的租户。
    • 临时表路由:OBProxy 会发往上一个请求的节点。
    • 依赖上一条 SQL 的执行结果:如 found_rows()row_count() 等函数,需要发往上一个请求的节点。
    • LOAD FILE 导数场景:不支持切换租户。
    • CURSOR/PIECES 场景:客户端使用 CURSOR/PIECES 流式获取/上传数据时,所有请求会强制路由到统一节点。
  • 自动找主:发生路由重试时,表示缓存的主租户信息错误,OBProxy 将根据租户列表,主动获取对应 OBServer 节点的租户角色,找到主租户并更新缓存信息。
  • 定时刷新:OBProxy 会间隔一段时间(由 config_server_refresh_interval 控制,默认 60s),更新 Service Name 相关路由信息,保证缓存信息不会落后太久。
  • 高可用:当用户使用 Service Name 登录后,OBProxy 会定时将缓存信息写入磁盘,在 OCP 不可用时仍然提供自动路由能力。

官方关于Service Name的介绍可参考:主备租户自动路由

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/471967.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32芯片EXIT外部中断的配置与原理

配置EXIT外部中断其实就是把GPIO刀NVIC的各个外设配置好 第一步&#xff1a;配置RCC&#xff0c;把我们涉及到的外设的时钟都打开 &#xff08;此处EXTI是默认打开的&#xff0c;而NVIC是内核外设无需配置&#xff09; 第二步&#xff1a;配置GPIO,选择端口为输入模式 第三…

栈相关算法题1|通过栈判断链表是否对称|共享栈入栈出栈|括号匹配|多种括号配对|递归求序列最大值(C)

通过栈判断链表是否对称 设单链表的表头指针为L&#xff0c;data域为字符型&#xff0c;判断该链表的全部n个字符是否中心对称 xyx&#xff0c;xyyx 算法思想 使用栈来判断链表中的数据是否中心对称&#xff0c;让链表的前一半元素依次进栈 在处理链表的后一半元素时&#x…

[Mysql] Mysql的多表查询----多表关系(上)

1、介绍 在实际开发中&#xff0c;一个项目通常需要很多张表才能完成。例如&#xff1a;一个商城项目就需要分类表、商品表、订单表等多张表。且这些表的数据之间存在一定的关系。 2、多表关系 Mysql多表之间的关系可以概括为&#xff1a;一对一、一对多/多对一、多对多关系…

【数据分享】全国农产品成本收益资料汇编(1953-2024)

数据介绍 一、《全国农产品成本收益资料汇编 2024》收录了我国2023年主要农产品生产成本和收益资料及 2018年以来六年的成本收益简明数据。其中全国性数据均未包括香港、澳门特别行政区和台湾省数据。 二、本汇编共分七个部分,即:第一部分,综合;第二部分,各地区粮食、油料;第…

使用 Prompt API 与您的对象聊天

tl;dr&#xff1a;GET、PUT、PROMPT。现在&#xff0c;可以使用新的 PromptObject API 仅使用自然语言对存储在 MinIO 上的对象进行总结、交谈和提问。在本文中&#xff0c;我们将探讨这个新 API 的一些用例以及代码示例。 赋予动机&#xff1a; 对象存储和 S3 API 的无处不在…

虎扑APP数据采集:JavaScript与AJAX的结合使用

引言 虎扑APP的数据采集涉及到前端和后端的交互&#xff0c;其中AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;技术允许在不重新加载整个页面的情况下&#xff0c;与服务器进行数据交换和更新部分网页内容。这种技术使得数据采集过程更加高效和用户友好。然而…

Flutter实现绝对定位学习

通过 Stack Positioned实现Flutter绝对定位学习。 简单Demo import package:flutter/material.dart;class MyPositionedDemoPage extends StatelessWidget {const MyPositionedDemoPage({super.key});overrideWidget build(BuildContext context) {return Scaffold(appBar: …

《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性

一、论文简介 论文讨论了大规模预训练产生的视觉基础模型在处理任意图像时的强大能力&#xff0c;这些模型不仅能够完成训练任务&#xff0c;其中间表示还对其他视觉任务&#xff08;如检测和分割&#xff09;有用。研究者们提出了一个问题&#xff1a;这些模型是否能够表示物体…

【C++】深入理解自定义 list 容器中的 list_iterator:迭代器实现详解

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 &#x1f4cc; 引言&#x1f4cc; 1. 为什么 list 容器需要 list_iterator…

昆明华厦眼科医院举办中外专家眼科技术研讨会

9月13日&#xff0c;“睿智迭代&#xff0c;增效赋能”Menicon Z Night中外专家研讨会在昆明华厦眼科医院成功举办。此次会议由目立康公司与昆明华厦眼科医院携手共筑&#xff0c;标志着双方合作迈向新的高度。 昆明华厦眼科医院总经理王若镜首先发表了热情洋溢的致辞&#xff…

FreeRTOS的列表与列表项

目录 1.为什么要学列表&#xff1f; 2.什么是列表和列表项&#xff1f; 2.1 列表 2.2列表项 2.3&#xff0c;迷你列表项 3.列表与列表项的初始化 3.1 列表初始化 3.2列表项初始化 4.列表项的“增删查”&#xff08;插入、删除、遍历&#xff09; 4.1列表项的插入 4.1.1…

前端(3)——快速入门JaveScript

参考&#xff1a; 罗大富 JavaScript 教程 | 菜鸟教程 JavaScript 教程 1. JaveScript JavaScript 简称 JS JavaScript 是一种轻量级、解释型、面向对象的脚本语言。它主要被设计用于在网页上实现动态效果&#xff0c;增加用户与网页的交互性。作为一种客户端脚本语言&#…

使用阿里云快速搭建 DataLight 平台

使用阿里云快速搭建 DataLight 平台 本篇文章由用户 “闫哥大数据” 分享&#xff0c;B 站账号&#xff1a;https://space.bilibili.com/357944741?spm_id_from333.999.0.0 注意&#xff1a;因每个人操作顺序可能略有区别&#xff0c;整个部署流程如果出现出入&#xff0c;以…

H.265流媒体播放器EasyPlayer.js H.264/H.265播放器chrome无法访问更私有的地址是什么原因

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS、WEBRTC、FMP4视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、MP3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方…

QT_CONFIG宏使用

时常在Qt代码中看到QT_CONFIG宏&#xff0c;之前以为和#define、DEFINES 差不多&#xff0c;看了定义才发现不是那么回事&#xff0c;定义如下&#xff1a; 看注释就知道了QT_CONFIG宏&#xff0c;其实是&#xff1a;实现了一个在编译时期安全检查&#xff0c;检查指定的Qt特性…

centos7安装Chrome使用selenium-wire

背景&#xff1a;在centos7中运行selenium-wire爬虫&#xff0c;系统自带的Firefox浏览器不兼容&#xff0c;运行报错no attribute ‘set_preference’&#xff0c;应该是selenium-wire和Firefox的驱动不兼容 查了半天不知道怎么解决&#xff0c;就想在centos7上安装Chrome来跑…

医院信息化与智能化系统(21)

医院信息化与智能化系统(21) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

《FreeRTOS任务控制块篇》

Task control block, 即任务控制块。任务控制块&#xff08;TCB&#xff09;是一个结构体&#xff0c;它会分配给每个任务&#xff0c;其中存储着任务的状态信息&#xff0c;包括指向任务上下文&#xff08;任务的运行时环境&#xff0c;包括寄存器值&#xff09;的指针。任务控…

Queuing 表(buffer表)的优化实践 | OceanBase 性能优化实践

案例问题描述 该案例来自一个金融行业客户的问题&#xff1a;他们发现某个应用对一个数据量相对较小的表&#xff08;仅包含数千条记录&#xff09;访问时&#xff0c;频繁遇到性能下降的情况。为解决此问题&#xff0c;客户向我们求助进行分析。我们发现这张表有频繁的批量插…

ssh登陆服务器后支持Tab键命令补全

在服务器上新建了用户后&#xff0c;通过ssh登录到服务器后发现不能使用Tab键来进行命令补全 截图如下&#xff1a; 以为没有配置.bashrc 此时输入 source 发现无此命令 细心的可以发现 -sh 于是输入命令echo $SHELL 确认此时的shell为sh&#xff0c; 只要输入命令bash即可切…