如何实现主备租户的无缝切换 | 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.mzph.cn/bicheng/61232.shtml

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

相关文章

超越GPT-4o-mini | 北大开源「国产o1」大模型,{多阶段自主推理}让小模型也能“放大招“!

01、LLaVA-o1背景简介 以OpenAI o1为代表的大型语言模型展示了强大的推理能力&#xff0c;这充分的验证了语言模型推理时间缩放的有效性。然而&#xff0c;视觉对于使模型能够充分理解世界并扩展其认知能力同等重要。因此&#xff0c;开发一个融合语言和视觉的多模态模型&#…

Unity类银河战士恶魔城学习总结(P126 Item ToolTip物品提示)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址&#xff1a;https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了把鼠标放到物品上面就会显示物品属性 UI_ItemTooltip.cs 功能实现&#xff1a;该脚本的核心功能是展示和隐藏物品的工具提示…

11.13机器学习_线性回归

十 集成学习方法之随机森林 机器学习中有一种大类叫集成学习&#xff08;Ensemble Learning&#xff09;&#xff0c;集成学习的基本思想就是将多个分类器组合&#xff0c;从而实现一个预测效果更好的集成分类器。集成算法可以说从一方面验证了中国的一句老话&#xff1a;三个…

【机器学习】数学知识:欧式距离(Euclidean Distance)和曼哈顿距离(Manhattan Distance)

欧式距离和曼哈顿距离是两种常用的距离度量方法&#xff0c;用于衡量两点之间的相似性或差异性。它们在几何分析、数据挖掘、机器学习等领域有广泛应用。 1. 欧式距离 概念 欧式距离&#xff08;Euclidean Distance&#xff09;是最常见的直线距离度量方法&#xff0c;源于欧…

hydra基础知识

hydra基础知识 1、yaml的使用 1.1 基础介绍 主要是用来写配置文件 优势: 层级式可以写注释安装: pip install pyyaml1.2 语法 2、omegaconf 2.1 基础介绍 为什么需要omegaconf? omegaconf主要是对python原生的字典,列表类型的增强,通过omegaconf能够更好的处理yaml…

递归(3)----力扣40组合数2,力扣473火柴拼正方形

给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意&#xff1a;解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,1…

RPC-健康检测机制

什么是健康检测&#xff1f; 在真实环境中服务提供方是以一个集群的方式提供服务&#xff0c;这对于服务调用方来说&#xff0c;就是一个接口会有多个服务提供方同时提供服务&#xff0c;调用方在每次发起请求的时候都可以拿到一个可用的连接。 健康检测&#xff0c;能帮助从连…

Android WMS概览

WMS&#xff08;WindowManagerService&#xff09;是 Android 系统的核心服务&#xff0c;负责管理应用和系统的窗口&#xff0c;包括窗口的创建、销毁、布局、层级管理、输入事件分发以及动画显示等。它通过协调 InputManager 和 SurfaceFlinger 实现触摸事件处理和窗口渲染&a…

4.STM32之通信接口《精讲》之USART通信---实验串口发送程序

本节将进行实战&#xff0c;基础了解请查看第1&#xff0c;2&#xff0c;3节&#xff08;Whappy&#xff09; 开始背&#xff01;&#xff01; USART ---》全双工 异步/同步 点对点 C语言基础printf用法&#xff0c;这节将用到printf的重定向&#xff0c;来打印到串口助手上…

Kotlin return与return@forEachIndexed

Kotlin return与returnforEachIndexed fun main() {val data arrayOf(0, 1, 2, 3, 4)println("a")data.forEachIndexed { index, v ->if (v 2) {//类似while循环中的continue//跳过&#xff0c;继续下一个forEachIndexed迭代returnforEachIndexed}println("…

Cherno OpenGL(28 ~ 33)

批量渲染-介绍 在这里我们将在一个drawcall打包多个几何体。即 batch geometry。 我们在这里将聚焦于2d渲染&#xff0c;我们如何渲染一堆2d的quads或者说rectangles呢&#xff1f; 一种情况是比如一个2d游戏有很多个tile组成&#xff0c;要去渲染这些tile&#xff1b;另一种…

缺失值异常值的处理导入数据插值拟合工具箱

文章目录 1.构造数据2.缺失值的处理3.异常值的处理4.导入数据的注意事项5.插值拟合工具箱使用 1.构造数据 下面的这个就是生成这个正态分布的数据&#xff0c;这个时候我们的这个数据里面是没有这个异常的数据的&#xff0c;因此这个时候我们可以自己创造这个异常的数据&#…

FPGA开发流程

注&#xff1a;开发板&#xff1a;小梅哥的ACX720。本实验可直接运行在小梅哥的ACX720开发板上&#xff0c;后续的实验都可直接运行在小梅哥的ACX720上。 一、打开VIVADO并创建工程 1、双击VIVADO图标&#xff0c;打开vivado。 2、打开vivado界面打&#xff0c;点击有 Create …

知识库管理系统:企业数字化转型的加速器

在数字化转型的大潮中&#xff0c;知识库管理系统&#xff08;KBMS&#xff09;已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性&#xff0c;以及如何快速搭建企业知识库。 知识库管理系统是什么&#xff1f; 知识库管理系统…

.NET桌面应用架构Demo与实战|WPF+MVVM+EFCore+IOC+DI+Code First+AutoMapper

目录 .NET桌面应用架构Demo与实战|WPFMVVMEFCoreIOCDICode FirstAutoPapper技术栈简述项目地址&#xff1a;功能展示项目结构项目引用1. 新建模型2. Data层&#xff0c;依赖EF Core&#xff0c;实现数据库增删改查3. Bussiness层&#xff0c;实现具体的业务逻辑4. Service层&am…

ReactPress vs VuePress vs RectPress

ReactPress&#xff1a;重塑内容管理的未来 在当今数字化时代&#xff0c;内容管理系统&#xff08;CMS&#xff09;已成为各类网站和应用的核心组成部分。ReactPress作为一款融合了现代Web开发多项先进技术的开源发布平台&#xff0c;正以其卓越的性能、灵活性和可扩展性&…

为以人工智能为中心的工作负载重新设计的全局控制台

MinIO 控制台多年来一直是一个不断发展的产品。每次学习时&#xff0c;我们都会思考如何改进交互框架中这个非常重要的部分。首先是控制台&#xff0c;它在推出后的一年内就被广泛采用。更具体地说&#xff0c;超过 10K 个组织。接下来是企业控制台。这从对象存储与其 GUI 之间…

Django5 2024全栈开发指南(三):数据库模型与ORM操作

目录 一、模型的定义二、数据迁移三、数据表关系四、数据表操作4.1 Shell工具4.2 数据新增4.3 数据修改4.4 数据删除4.5 数据查询4.6 多表查询4.7 执行SQL语句4.8 数据库事务 Django 对各种数据库提供了很好的支持&#xff0c;包括 PostgreSQL、MySQL、SQLite 和 Oracle&#x…

Java通过calcite实时读取kafka中的数据

引入maven依赖 <dependency> <groupId>org.apache.calcite</groupId> <artifactId>calcite-kafka</artifactId> <version>1.28.0</version> </dependency> 测试代码 import java.sql.Connection; import java.sql.DriverMan…

RDIFramework.NET CS敏捷开发框架 V6.1发布(.NET6+、Framework双引擎、全网唯一)

RDIFramework.NET C/S敏捷开发框架V6.1版本迎来重大更新与调整&#xff0c;全面重新设计业务逻辑代码&#xff0c;代码量减少一半以上&#xff0c;开发更加高效。全系统引入全新字体图标&#xff0c;整个界面焕然一新。底层引入最易上手的ORM框架SqlSugar&#xff0c;让开发更加…