OceanBase中binlog service 功能的试用

OBLogProxy简介

OBLogProxy即OceanBase的增量日志代理服务,它可与OceanBase建立连接并读取增量日志,从而为下游服务提供了变更数据捕获(CDC)的功能。

 关于OBLogProxy的详尽介绍与具体的安装指引,您可以参考这篇官方OBLogProxy文档  。

此服务主要具备两种模式,分别为CDC模式与binlog模式。

CDC 模式需结合 OBLogClient 来完成数据订阅,此客户端能够将接收到的 clog 日志数据转换成 LogMessage 对象,用户可以使用它们来定制自己的处理逻辑。鉴于该模式需用户想自行编写一些代码来解析和使用这个相对不那么通用的 LogMessage,因此本次我并未尝试使用它。

binlog 模式会生成和 MySQL 兼容的 binlog,binlog 比上面提到的 LogMessage 要通用的多,下游 MySQL 生态的组件都可以直接消费 binlog。所以我们能够通过这个模式,以很低的成本去复用 MySQL 生态工具,避免重复造轮子,我这次要试用的就是这个模式。

要把 OceanBase 的 clog 转成 binlog 往下游发送,一共分三步:

  1. 我们首先要有一个标准的 OceanBase 的集群。
  2. 然后会起一个叫 Binlog Service 的服务,它可以跟每个租户之间建立一个连接,去拉每一个租户的 clog 日志,把 clog 日志拉过来之后,会把它解析成 binlog 文件,然后存储到磁盘上。
  3. 外部的订阅服务,如果有需求的话,就可以给 Binlog Service 发一个 binlog dump 的命令,Binlog Service就会基于这个 binlog dump 命令的参数,把 binlog 数据往下游去发送。

1705632409

安装过程

升级 observer 和 proxy 的版本

根据官网上写的 binlog 模式的使用限制,先得升级一下 observer 和 proxy 到比较新的版本。

我这边的 observer 版本是符合要求的,但是 proxy 版本比较老,需要在官网上下载一个最新版本的 proxy 4.2.1,把软件版上传到 ocp,再拿鼠标点一下升级 proxy。

1705632430

然后等升级任务完成就好了,升级 proxy 大概要花两分钟左右的样子。

1705632442

安装 OBLogProxy

详见官网链接。看官网的架构图,oblogproxy 需要和 proxy 进行交互,所以我这里直接把 oblogproxy 放到了 proxy 所在的节点上,版本是 2.0.0。

[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /home/xiaofeng.lby]
$sudo rpm -i oblogproxy-2.0.0-101000012023121819.el7.x86_64.rpm

安装一共分三步:配置 proxy,配置 oblogproxy,运行 oblogproxy。

配置 proxy

这里不求甚解,在安装 oblogproxy 的节点上用 proxy 连接测试集群的 sys 租户,然后直接照着官网链接和洪波博客的步骤把相关的几个配置命令都执行了一遍。

obclient -h11.124.5.45 -P2883 -uroot@proxysys#obn.xiaofeng.lby.11.158.31.20 -Dtest

 # 查询 binlog server 地址,当前为空
show proxyconfig like 'binlog_service_ip';

# 配置 binlog service 地址
alter proxyconfig set binlog_service_ip="11.124.5.45:2983";

# 开启 binlog 服务
alter proxyconfig set enable_binlog_service='True';

# 设置 init_sql,开启 show_ddl_in_compat_mode。
# 开启后,OceanBase 的 show create table 输出将完全兼容 MySQL 的语法。
alter proxyconfig set init_sql='set _show_ddl_in_compat_mode = 1;';

# 验证配置是否正确
show proxyconfig like 'binlog_service_ip';

其中有一步是设置 _show_ddl_in_compat_mode 这个东西,感觉挺有意思。官网上说:“OceanBase 的 DDL 语法与 MySQL 的 DDL 语法存在一定的差异,即 OceanBase 具有自己的一些扩展语法,因此部分 DDL 语法可能无法解析。为了解决这种问题,OceanBase 进行了兼容性支持。我们建议在 OBProxy 中设置 init_sql 来开启_show_ddl_in_compat_mode。开启后,OceanBase 的 show create table 输出将完全兼容 MySQL 的语法。”

TODO:不是特别理解官网上的这个说法,一会儿准备试试在 OceanBase 里创建一个 OceanBase 支持,但是 MySQL 不支持的 global index,看看生成的 binlog 结果是啥。

create table t1(c1 int primary key, c2 int, c3 int);
create unique index idx3 on t1(c3) partition by hash(c3);

show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  KEY `idx3` (`c3`) BLOCK_SIZE 16384 GLOBAL
 partition by hash(c3)
(partition `p0`)
)

配置 oblogproxy

这一步直接参考官网步骤,没遇到啥问题,这里略去不提。

运行 oblogproxy

这一步直接参考官网步骤,也没遇到啥问题,这里也略去不提。成功启动 oblogprxoy 之后,可以看到多了一个叫 binlog_converter 的进程。

[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /usr/local/oblogproxy]
$ps -ef | grep 'logproxy'
root      70452 131066 12 15:53 pts/7    00:00:51 ./binlog_converter binlog_converter.conf /usr/local/oblogproxy/run/obn.xiaofeng.lby.11.158.31.20/mysql
xiaofen+ 103276  76610  0 16:00 pts/4    00:00:00 grep --color=auto logproxy
root     131066 131059  2 15:39 pts/7    00:00:25 ./bin/logproxy -f ./conf/conf.json

正确性验证

参考了洪波的博客,知道了生成的 MySQL binlog 应该在 /usr/local/oblogproxy/run/cluster_name/tenant_name/data 这个路径下。

[xiaofeng.lby@obrd.80c.sqlvd-a3-n0 /usr/local/oblogproxy/run/obn.xiaofeng.lby.11.158.31.20/mysql/data]
$ls
index.LOCK  mysql-bin.000001  mysql-bin.index

因为要求 mysqlbinlog 的版本是 3.4,所以我在 MySQL 官网上下载了一个 5.7.9 版本的 MySQL,准备用这个版本的 MySQL 里自带的 mysqlbinlog 3.4 看下对应的 SQL 能否在原生 MySQL 里执行。

1705632458

这里鸡蛋里面挑下骨头,回到上面那个 global index 的问题,执行创建全局索引的 DDL,看下生成的 mysql-bin.000001 里面是什么东西,以及能否在 MySQL 下面执行。

在 OceanBase 下面执行这几条 SQL

create table t1(c1 int primary key, c2 int, c3 int);

# 估计这条 DDL 生成的 binlog 在原生 MySQL 里无法成功执行
create unique index idx3 on t1(c3) partition by hash(c3);

insert into t1 values(1, 2, 3);

update t1 set c1 = 2;

delete from t1;

这里也不求甚解直接照着洪波的命令执行。

[xiaofeng.lby@obvos-dev-d3 /home/xiaofeng.lby/work/mysql-5.7.9-linux-glibc2.5-x86_64/bin]
$./mysqlbinlog --no-defaults --base64-output=decode-rows -vv /home/xiaofeng.lby/work/mysql-bin.000001

看到的是下面这个结果:dml 部分的 update 被记录成了 delete + insert,都能对的上;ddl 部分好像有些小问题,OceanBase 里的独有的全局索引 idx3 被记录成了 create unique index idx3 on t1(c3) partition by hash(c3)。

1705632472

MySQL 里面不支持索引相对于主表有自己独立的分区,create unique index idx3 on t1(c3) partition by hash(c3) 显然是不可能执行成功的。可能需要改成 create unique index idx3 on t1(c3)?不过这样改含义好像变化的有点儿大,可能需要相关的产品同学确定清楚这里的产品行为究竟应该是怎样。

1705632482

总结

OceanBase 里和 MySQL 兼容的基础功能看上去生成的 binlog 没啥问题,但是 OceanBase 相对于 MySQL 独有的一些扩展功能,例如我测试的全局索引之类的,可能还值得产品同学和研发同学再继续打磨一下。

今天由于时间关系只是做了一个基本的小验证,还没来得及用下游的 canal、flink-cdc 等其他 mysql 生态工具向 proxy 执行 binlog dump 命令去测试,to be continue。

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

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

相关文章

【深度学习笔记】9_8 区域卷积神经网络(R-CNN)系列

注:本文为《动手学深度学习》开源内容,部分标注了个人理解,仅为个人学习记录,无抄袭搬运意图 9.8 区域卷积神经网络(R-CNN)系列 区域卷积神经网络(region-based CNN或regions with CNN feature…

Unreal发布Android在刘海屏手机上不能全屏显示问题

Unreal 4.27发布Android在刘海屏手机上不能全屏显示问题 Android设置全屏刘海屏全屏设置4.27设置刘海屏在部分手机不能显示问题 Android设置全屏 AndroidManifest.xml文件配置 ...<activity android:name"com.epicgames.ue4.GameActivity" android:label"st…

Spring基础——使用注解开发SpringMVC

目录 配置SpringMVC的初始化信息配置ServletWebApplicationContext配置RootWebApplicationContext配置ServletContext 创建Controller控制器配置Controller响应路径接收用户传递参数接收JSON数据接收简单类型对象封装参数 接收数组类型 Restful 文章源码仓库&#xff1a;Spring…

bootstrap企业网站前端模板

介绍 企业网站前端模板 软件架构 前端所用技术html/css/js/jquery 前端框架bootstrap 安装教程 浏览器本地路径访问发布到服务器比如&#xff08;tomcat/nginx等&#xff09;云服务器/虚拟机 网站效果图 网站预览 点击预览 源码地址 https://gitee.com/taisan/company…

【镜像转存】利用交互式学习平台killercoda转存K8S镜像至Docker私人仓库

文章目录 1. 镜像转存需求2. 注册并登陆 killercoda URL3. 打开playground4. 在线拉取K8S镜像并打上标签5. 推送K8S镜像到Docker私有仓库6. 登陆Docker私有仓库查看 1. 镜像转存需求 因K8S镜像在不开代理的情况下&#xff0c;拉取超时、下载缓慢&#xff0c;导致镜像拉取不下来…

【分布式websocket】群聊中的各种难点以及解决推拉结合【第16期】

前言 群聊中未读消息如何设计&#xff0c;以及是推消息还是拉去消息如何选择是需要讨论的。推送消息是推送全量消息还是推送信号消息让客户端再去拉取。其中方案如何选型会比较纠结。 首先基本的推拉结合思路是在线用户推送消息。用户离线的话上线去拉取消息。这是简单的推拉结…

WPF —— TabControl、StackPanel 控件详解

1 TabControl简介 表示包含多个项的控件&#xff0c;这些项共享屏幕上的同一空间。 TabControl有助于最大程度地减少屏幕空间使用量&#xff0c;同时允许应用程序公开大量数据。 TabControl包含共享同一屏幕空间的多个 TabItem 对象。一次只能看到 TabControl 中的一个 Ta…

交换机/路由器的存储介质-华三

交换机/路由器的存储介质-华三 本文主要介绍网络设备的存储介质组成。 ROM(read-only memory&#xff0c;只读存储器) 用于存储 BootROM程序。BootROM程序是一个微缩的引导程序&#xff0c;主要任务是查找应用程序文件并引导到操作系统&#xff0c;在应用程序文件或配置文件出…

AJAX 01 AJAX 概念和 axios 使用

2.27 AJAX 学习 AJAX 1 入门01 AJAX 概念和 axios 使用axios 使用案例 02 认识 URLURL组成 03 URL 查询参数axios&#xff0d;查询参数案例 &#xff1a;地区查询 04 常用请求方法和数据提交axios 请求配置axios 错误处理 05 HTTP协议-报文① 请求报文作用&#xff1a;错误排查…

uniapp微信小程序_自定义交费逻辑编写

一、首先看最终效果 先说下整体逻辑,选中状态为淡紫色,点击哪个金额,充值页面上就显示多少金额 二、代码 <view class"addMoney"><view class"addMoneyTittle">充值金额</view><view class"selfaddmoney" :class"{…

力扣日记3.14-【贪心算法篇】376. 摆动序列

力扣日记&#xff1a;【贪心算法篇】376. 摆动序列 日期&#xff1a;2024.3.14 参考&#xff1a;代码随想录、力扣 376. 摆动序列 题目描述 难度&#xff1a;中等 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;…

【总结】服务器无法连接外网,设置http代理解决

问题 某天想要在服务器上下载编译github上某开源项目&#xff0c;结果发现访问不了外网。 于是找运维&#xff0c;运维给了个http代理服务器地址。简单操作后&#xff0c;就可以访问外网了。 解决 在需要访问外网的机器上&#xff0c;执行以下命令&#xff1a;http_proxyhtt…

rust学习(简单链表)

编写一个简单链表&#xff0c;主要遇到的问题就是next指针&#xff08;按照C的写法&#xff09;的数据如何定义。按照网上的建议&#xff0c;一般定义如下&#xff1a; struct Node {pub value:u32,pub next:Option<Rc<RefCell<Node>>>, //1 }1.用Option主要…

GoLang:云原生时代致力于构建高性能服务器的后端语言

Go语言的介绍 概念 Golang&#xff08;也被称为Go&#xff09;是一种编程语言&#xff0c;由Google于2007年开始设计和开发&#xff0c;并于2009年首次公开发布。Golang是一种静态类型、编译型的语言&#xff0c;旨在提供高效和可靠的软件开发体验。它具有简洁的语法、高效的编…

外卖小程序-购物车模块表结构设计和后端代码

表结构设计 添加购物车代码 Service public class ShoppingCartServiceImpl implements ShoppingCartService {Autowiredprivate ShoppingCartMapper shoppingCartMapper;Autowiredprivate DishMapper dishMapper;Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物…

在浏览器的控制台定义变量,清除后还是报错变量已声明

报错&#xff1a;Uncaught SyntaxError: Identifier words has already been declared 在浏览器的控制台&#xff08;Console&#xff09;中定义的变量是全局变量&#xff0c;它们会保留在当前的浏览器窗口或标签页的生命周期中。即使你清除了控制台的内容&#xff08;例如通过…

[云原生] Prometheus自动服务发现部署

一、部署服务发现 1.1 基于文件的服务发现 基于文件的服务发现是仅仅略优于静态配置的服务发现方式&#xff0c;它不依赖于任何平台或第三方服务&#xff0c;因而也是最为简单和通用的实现方式。 Prometheus Server 会定期从文件中加载 Target 信息&#xff0c;文件可使用 YAM…

基于Java的海南旅游景点推荐系统(Vue.js+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户端2.2 管理员端 三、系统展示四、核心代码4.1 随机景点推荐4.2 景点评价4.3 协同推荐算法4.4 网站登录4.5 查询景点美食 五、免责说明 一、摘要 1.1 项目介绍 基于VueSpringBootMySQL的海南旅游推荐系统&#xff…

使用stream流合并多个List(根据实体类特定属性合并)

开发情景 现有多个List集合,其中都是一样的实体类,这里我想根据实体类的特定属性将它们合并在一起,形成一个最终的List集合。 这里主要用到了Stream流的flatMap方法与reduce方法。 flatMap:可以将多个Stream流合并在一起,形成一个Stream流。 reduce:可以将Stram流中的元…

Oracle登录错误ERROR: ORA-01031: insufficient privileges解决办法

这个问题困扰了我三个星期&#xff0c;我在网上找的解决办法&#xff1a; 1.控制面板->管理工具->计算机管理->系统工具->本地用户和组->ORA_DBA组。 但我电脑上根本找不到。 2.在oracle安装目录下找到oradba.exe运行。 最开始我都不到这个oradba.exe文件在哪…