如何实现主备租户的无缝切换 | 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的介绍可参考:主备租户自动路由

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

壁仞科技上市前最后一波 校招 社招 内推

随着美国大选结束&#xff0c;国内GPU 产业得到空前的的发展空间&#xff0c;国内芯片相关股票一片飘红。 国内大型 GPU厂商壁仞科技&#xff0c;摩尔线程等正紧锣密鼓地加紧上市。 GPGPU 芯片赛道来到了史无前例的红利点&#xff0c;抓住机会&#x1f4aa; 壁仞科技正在火热…

前端监控之sourcemap精准定位和还原错误源码

一、概述 在前端开发中&#xff0c;监控和错误追踪是确保应用稳定性和用户体验的重要环节。 随着前端应用的复杂性增加&#xff0c;JavaScript错误监控变得尤为重要。在生产环境中&#xff0c;为了优化加载速度和性能&#xff0c;前端代码通常会被压缩和混淆。这虽然提升了性…

使用Web Push Notifications提升用户参与度和留存率

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Push Notifications提升用户参与度和留存率 使用Web Push Notifications提升用户参与度和留存率 使用Web Push Notifica…

量化选股日常操作日记-11-ai眼镜-润欣科技

用 微信小程序 梦想兔企业智能风险分析助手 &#xff0c;选择AI眼镜板块&#xff0c;挖掘了几个合适的股&#xff0c;分析下来感觉 润欣科技 比较安全些适合观察&#xff0c;几块到十几块波动&#xff0c;企业基本面也没有特别大问题。就是现在价位在周期波动高位&#xff0c;下…

【WPF】Prism学习(五)

Prism Commands 1.错误处理&#xff08;Error Handling&#xff09; Prism 9 为所有的命令&#xff08;包含AsyncDelegateCommand&#xff09;提供了更好的错误处理。 避免用try/catch包装每一个方法根据不同遇到的异常类型来提供特定的逻辑处理可以在多个命令之间共享错误处…

Intern大模型训练营(八):Llamaindex RAG 实践

1. 基于 LlamaIndex 构建自己的 RAG 知识库 首先在Intern Studio中申请30% A100的开发机。 进入开发机后&#xff0c;创建新的conda环境&#xff0c;命名为 llamaindex&#xff0c;在命令行模式下运行&#xff1a; conda create -n llamaindex python3.10 复制完成后&#…

台式电脑没有声音怎么办?台式电脑没有声音解决详解

台式电脑一般来说都是没有内置扬声器的&#xff0c;需要连接耳机或者是音响才可以播放音乐。那么如果遇到台式电脑没有声音的问题&#xff0c;我们也需要确认这些设备硬件有没问题&#xff0c;知道原因才可以进行处理。下面本文将为你介绍台式电脑没有声音的可能原因和解决方法…

vue2项目中在线预览csv文件

简介 希望在项目中&#xff0c;在线预览.csv文件&#xff0c;本以为插件很多&#xff0c;结果都只是支持excel&#xff08;.xls、.xlsx&#xff09;一到.csv就歇菜。。。 关于文件预览 vue-office&#xff1a;文档、 查看在线演示demo&#xff0c;支持docx、.xlsx、pdf、ppt…

H.265流媒体播放器EasyPlayer.js视频流媒体播放器关于直播流播放完毕是否能监听到

EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;无须安装任何插件&#xff0c;起播快、延迟低、兼容性强&#xff0c;使用非常便捷。 EasyPlayer.js播放器不仅支持H.264与H.265视频编码格式&#xff0c;也能支持WebS…

WordPress设置自动更新CSS版本号

WordPress 通常会在引用 CSS 文件时添加版本号参数&#xff08;?verx.x.x&#xff09;。如果版本号未更新&#xff0c;浏览器可能继续加载旧的文件。 解决方法&#xff1a;确保你在 functions.php 文件中正确加载了 CSS 文件&#xff0c;并动态更新版本号。例如在functions.p…

【Linux】监控系统Zabbix的安装与配置

文章目录 一、前期准备1、安装LAMP2、配置SELinux与防火墙3、测试Apache4、配置数据库5、创建zabbix数据库及应用 二、server端安装配置1、软件包安装2、配置数据库3、zabbix访问测试4、配置web界面 三、Agent端安装配置1、安装zabbix-agent2、配置3、启动zabbix-agent4、配置防…

Springboot基于GIS的旅游信息管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

HarmonyOs鸿蒙开发实战(17)=>沉浸式效果第二种方案一组件安全区方案

1.沉浸式效果的目的 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感&#xff0c;从而使用户获得最佳的UI体验。 2.组件安全区方案介绍 应用在默认情况下窗口背景绘制范围是全屏&#xff0c;但UI元素被限制在安全区内…

微知-DOCA ARGP参数模块的相关接口和用法(config单元、params单元,argp pipe line,回调)

文章目录 1. 背景2. 设置参数的主要流程2.1 初始化2.2 注册某个params的处理方式以及回调函数2.4 定义好前面的params以及init指定config地点后start处理argv 3. 其他4. DOCA ARGP包相关4.1 主要接口4.2 DOCA ARGP的2个rpm包4.2.1 doca-sdk-argp-2.9.0072-1.el8.x86_64.rpm4.2.…

Linux之vim模式下全选命令

在Linux系统中&#xff0c;使用Vim编辑器进行全选操作可以通过以下几种方式实现&#xff1a; 1.使用键盘快捷键 按下 ”ggVG”&#xff08;先按下”g”&#xff0c;再按下”g”&#xff0c;再按下”V”&#xff0c;最后按下”G”&#xff09;可以全选当前文件内容。其中 ”g…

SQL复杂数据类型处理

背景 数据处理中&#xff0c;经常碰到复杂数据类型&#xff0c;需要将他们进行解析才能利用。 复杂数据类型 1、MAP结构转为列 WITH tmp AS ( SELECT {"Users":{"4418":{"UserId":4418,"Score":0,"IsStudent":true},&q…

下一代以区域为导向的电子/电气架构

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

CSS盒子的定位>(上篇)#定位属性#相对定位-附练习

一、定位属性 1.定位方式 position属性可以选择4种不同类型的定位方式。 语法格式&#xff1a;position&#xff1a;relation | absolute | fixed参数&#xff1a;①relative生成相对定位的元素&#xff0c;相对于其正常位置进行定位。 ②absolute生成绝对定位的…

Matlab信号处理:短时傅里叶变换

短时傅里叶变换&#xff08;简称STFT&#xff09;是傅里叶变换在时频域的扩展&#xff0c;它是为分析频域随时间变化的非平稳信号。本文模拟一个啁啾信号&#xff08;一个线性调频的信号&#xff09;&#xff0c;借助matlab的短时傅里叶变换函数stft&#xff0c;分析其时频特性…

Linux网络:基于文件的网络架构

Linux网络&#xff1a;基于文件的网络架构 网络架构TCP全连接队列 网络架构 在Linux中提供了多种系统调用&#xff0c;完成网络操作。比如TCP连接的建立&#xff0c;各种报文的收发等等。但是所有的Linux网络操作&#xff0c;都源于系统调用socket&#xff0c; 在Linux的man手…