OceanBase 从0到1数据库内核实战教程学习笔记 - 3.OceanBase基础架构和开发技巧

news/2024/5/16 21:42:18/文章来源:https://blog.csdn.net/chrisy521/article/details/127148907

这篇文章主要介绍王泽林老师分享的 《OceanBase 的基础架构和开发技巧》。如果您看过第一篇文章的对应视频,会发现整个系列主要分为 MiniOB 和 OceanBase 两个系列,本篇文章就是 OceanBase 系列的开篇,所以文章中会有很多 OceanBase 的概念和特点介绍,作为开篇文章为大家普及一些基础知识。

一、基础架构

首先 了解一下数据库基础架构,我们通过下面这种图,来看一下数据库普遍存在的需求:
在这里插入图片描述
最最重要的应属“稳定性”了,然后在稳定性基础上,增加了扩展性、高可用、高性能、低成本、兼容性等需求。如果单谈稳定性的话,作为一款新兴数据库无法提供太多有力的证据自证其词,只能通过大量的测试来佐证;要么就是通过数据库的发展历史,所以这里王泽林老师先介绍了一下 OceanBase 的发展历史。
在这里插入图片描述

  • 2010年,OB 起源于淘宝收藏夹业务,当时还是分布式 NoSQL 存储;
  • 2013年~2016年,OB 增加了 SQL 引擎的支持,支持了三副本高可用;到2016年支持了蚂蚁金服的所有核心业务;
  • 2017~2019年,增加了分布式事务和强一致性支持;并做了很多外部银行案例;
  • 2020年,成立商业化公司独立运营;
  • 2021年6月1日,开源并大力发展社区生态,支持社区共建。

通过上面历史的介绍,我们不难发现,OB 经历了几个大的阶段,每个阶段都会发生较大的架构调整,比如从早期的 分布式 NoSQL 存储跃升为 NewSQL 分布式数据库,再比如2022年 4.0 版本小鱼发布的单机一体化架构;每一次架构的变更都是一次顺应数据库历史发展的考量。历史发展的一些重要场景,也能充分证明 OB 的能力,比如对双十一的支持、一些世界第一打榜的结果等,这里就不展开说了,网上相关的文章太多了。

接下来就是其他架构在稳定性基础上的其他特点,包括 zone、rs、paxos 等概念,zone可以类比为一个城市、机房或者机架,同一集群尽量做到概念在一个水平线上;rs是rootservice的缩写,是集群的总控服务;paxos是副本一致性协议。

在同一个 zone 里面扩展机器可以达到提高 OB 集群性能的目的,但是扩展 zone 的数量并不能提高集群的性能而只能提高高可用性。据官方说法,TPCC测试时,集群规模有1500个节点。
在这里插入图片描述
针对“高可用”特点,OB提供双中心的架构,是一种逻辑复制的主备库模式,这种模式下,一些集群的动作,比如创建表操作,是通过 RS 的同步完成的,两边的 RS 各为其主;分区数据是 clog 的异步同步。
在这里插入图片描述
另外还有可用性更高的6副本两地三中心架构和5副本的三地五中心架构:
在这里插入图片描述
在这里插入图片描述
高性能”的特点往往值得大书特书,王泽林老师通过 OB 典型的读写场景给大家做了介绍:
在这里插入图片描述

  1. Read 分为本地读、远程读和分布式读,适应各种情况;对于读操作有以下优化手段:

    • 降低响应时间
      • obproxy 部署在 app 本地 - 可以将网络降低到1跳
      • prepared statement 及协议优化 - 可以减少很多硬解析的过程
      • fast parameterize & plan cache - 通过执行计划缓存快速命中执行计划
      • CBO 查询优化器
        • 一阶段分布式/并行执行计划生成
        • 来自大量生产实践打磨的重写规则
      • block cache & row cache - 存储引擎相关
      • fused_row cache & bloom filter - 存储引擎相关
      • static type expression - 静态类型的执行语法
      • vectorized execution engine - 向量化执行引擎
      • Px 并行执行
      • 避免不必要的 RPC:三类执行计划
    • 提升吞吐率
      • MVCC 快照读
      • 水平扩展
  2. Write 也分为本地写、远程写和分布式写;写操作也存在很多优化方法:

    • 降低响应时间
      • 内存级写入性能,小事务执行过程不落盘
      • 局部索引避免分布式事务
      • 轮转合并提升大压力下写入性能
      • PDML - DML 并行
    • 提高吞吐率
      • Transaction Set Consistency
      • 行级锁
      • 多种隔离级别
        在这里插入图片描述
  3. 高效事务提交

    • 降低响应时间
      • 避免分布式事务:分区 vs 行 vs 块
      • 全局时间戳服务优化
      • 2 PC 一阶段优化
      • 一体化设计的 clog 避免分布式状态机分层开销
      • 使用 PL/SQL 减少交互次数
    • 提升吞吐率
      • 一致性协议 multi-paxos vs raft
      • clog 日志组提交
      • 锁模型:悲观锁 vs 乐观锁
      • 热点行:提前解行锁,不需要到多数派提交,事务写下去就提前解行锁
        在这里插入图片描述
        在这里插入图片描述

在“低成本”方面,通过多副本和多租户上的不同组合方案,达到降本的目的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、开发技巧

“工欲善其事,必先利其器” 这一部分,介绍了一些 OceanBase 开发技巧。这一部分包括以下内容:

  • OBD 部署 OceanBase
  • 使用源代码编译 OceanBase
  • 设置开发 IDE
  • 代码编写风格与自动化风格格式工具
  • 代码调试
  • 如何用自己的二进制部署 OceanBase
  • 编写 mysqltest
  • 编写 unittest
  • 如何向 OceanBase 贡献代码

2.1 OBD 部署 OceanBase

该操作可以参考:https://github.com/oceanbase/obdeploy

另外可以通过 obd 命令帮助信息进行一些操作的了解:obd -h, obd cluster -h

2.2 使用源代码编译 OceanBase

源码编译可以参考:https://github.com/oceanbase/OceanBase/wiki/Build-from-source-code

下图展示了当前兼容的操作系统和 CPU 架构,可以看到 MacOS 还是不支持的,其他大多数主流操作系统均得到了支持。
在这里插入图片描述
操作步骤中一些步骤的作用解释如下:

  • sh build.sh --init - init操作是为了下载一些平台依赖,可以帮助大家更顺滑的准备编译环境; ash build.sh
  • debug --init --make - 其中的 debug 或 release 相当于 cmake 操作

2.3 设置开发 IDE

IDE 设置可以参考:https://github.com/oceanbase/oceanbase/wiki/how_to_set_ide_with_ccls

在源码开发过程中,推荐的几款 IDE 分别为:Vim、Visual Studio Code 和 CLion。

推荐安装 ccls 插件,方便函数之间的跳转。

还要注意将生成的 compile_commands.json 文件 移动到项目根目录下面。

在这里插入图片描述

2.4 代码编写风格与自动化风格格式工具

代码风格这部分,可以参考文档:https://www.oceanbase.com/docs/community-code-style-cn-10000000000018872 ,这里面论述的很详细,建议每个人都好好的看看。

另外,源码中提供了一个 format.sh,在目录 sh tools/scripts/format.sh 下,使用方法及其他 IDE 如何配置请参考网页:https://github.com/oceanbase/oceanbase/wiki/How_to_set_code_format

2.5 代码调试

代码调试,可以参考文档:https://github.com/oceanbase/oceanbase/wiki/how_to_debug 。

文档里面有很多代码调试的方法,最建议的还是使用 gdb 进行调试

最传统的方式是通过 gdb attach 上去调试,也可以使用 obd,如下:

$ ./obd.sh gdb -h
>>> obd tool command --help
Usage: obd tool command <deploy name> <command> [options]Options:-c COMPONENTS, --components=COMPONENTSThe components used by the command. The firstcomponent in the configuration will be used by defaultin interactive commands, and all available componentswill be used by default in non-interactive commands.-s SERVERS, --servers=SERVERSThe servers used by the command. The first server inthe configuration will be used by default ininteractive commands, and all available servers willbe used by default in non-interactive commands.-h, --help            Show help and exit.-v, --verbose         Activate verbose output.

2.6 如何用自己的二进制部署 OceanBase

用自己的二进制部署的话,可以采用 obd 来 change repo 的方式,参考命令 obd cluster change-repo 进行。

另外大家也可以使用 tools/deploy/obd.sh 进行配置部署,例如:

sudo ./obd.sh prepare
sudo ./obd.sh deploy -c single.yaml

如果出现以下问题,说明权限不够,请使用 sudo 权限:

$ ./obd.sh prepare
./obd.sh: line 8: /tools/deploy/activate_obd.sh: No such file or directory
>>> obd devmode enable
./obd.sh: line 14: //deps/3rd/usr/bin/obd: No such file or directory
Exec obd cmd failed. If your branch is based on 3.1_opensource_release, please go to the deps/3rd directory and execute 'bash dep_create.sh all' to install obd.
grep: /tools/deploy/.obd/.obd_environ: No such file or directory

如果出现以下问题,可能是 LD_LIBRARY_PATH 设置有问题,可以参考如下解决方法:

$ ./obd.sh deploy -c distributed-with-proxy.yaml
Deploy name: distributed-with-proxy
/home/chris/OceanBase/oceanbase/tools/deploy/bin/observer not found
# chris @ ob-allinone in ~/OceanBase/oceanbase/tools/deploy on git:master x [15:09:47]
$ /home/chris/OceanBase/oceanbase/tools/deploy/bin/observer
/home/chris/OceanBase/oceanbase/tools/deploy/bin/observer: error while loading shared libraries: libmariadb.so.3: cannot open shared object file: No such file or directory# chris @ ob-allinone in ~/OceanBase/oceanbase/tools/deploy on git:master x [15:10:18] C:127
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/chris/OceanBase/oceanbase/deps/3rd/usr/local/oceanbase/deps/devel/lib/mariadb/# chris @ ob-allinone in ~/OceanBase/oceanbase/tools/deploy on git:master x [15:10:40]
$ /home/chris/OceanBase/oceanbase/tools/deploy/bin/observer
/home/chris/OceanBase/oceanbase/tools/deploy/bin/observer

其实上面主要就是判断已存在的 observer 为什么没法执行,发现是缺少 so 文件,所以重设了一下环境变量就可以了。

或者也可以直接使用 ./observer 指定参数的方法来执行,可以参考官方文档中的手动安装 observer 并初始化部分

2.7 编写 mysqltest

mysqltest 部分章节主要参考文档:https://github.com/oceanbase/oceanbase/wiki/Run-mysql-test 。

当我们写了一些比较复杂的功能时,可以通过 mysqltest 来测试一下编写的是否存在问题。这个过程需要写一个 test和一个result结果集文件。通过 obd test mysqltest xxxx 来进行测试,对比结果是否在预期范围内。当然要注意写对位置哦。
在这里插入图片描述

2.8 编写 unittest

编写 unittest 可以参考文档:https://github.com/oceanbase/oceanbase/wiki/Run-unit-test。如果要进行 unittest,需要先编译。

正常编译 oceanbase 不会编译 unittest,所以这里有一个手工编译的动作。

编译完成后,可以通过 ./run_tests.sh 运行所有单元测试,或者自己编写一个单独的测试,然后执行。

2.9 如何向 OceanBase 贡献代码

贡献代码部分就比较简单了,注意以下几点:

  1. 首先签署 CLA;
  2. 可以给 OB 提 issue;
  3. 如果功能改变比较大,可以开 discussion,然后 OB 的开发会与大家一起讨论;
  4. 如果要提交 pr 的话,需要提前做好 mysqltest 和 unittest;
  5. 也可以在一些 pr 上进行评论;
  6. 也可以做一些代码 review 的操作。
    在这里插入图片描述

参考文档:https://github.com/oceanbase/oceanbase/wiki/Contribute-to-OceanBase。

今天的内容大概就这些~

最后的最后,如果大家感兴趣,可以多关注和参与 OB 的活动:https://ask.oceanbase.com/t/topic/35601006。

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

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

相关文章

Java类的成员方法的创建以及调用|在使用时有何意义|附运行方式及题目

&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d;&#x1f51d; &#x1f947;博主昵称&#xff1a;Jovy. &#x1f35f;博客主页…

遥感航拍影像25篇CVPR39个数据集

摘要 本文讲解了39个数据集&#xff0c;关于高空卫星图和低空无人机航拍图像。 本文汇总了25篇CVPR2020年和2021年的论文。 本文详细介绍了这25篇论文的任务是什么&#xff0c;难点是什么&#xff0c;场景是什么。 同时&#xff0c;本文在需要的地方解释了一些卫星图和航拍…

Vue学习第35天——模拟项目上线基本流程

一、打包 将.vue文件生成为.html、.css、.js文件 npm run build执行完之后&#xff0c;会在项目中生成一个dist文件&#xff08;执行的速度取决于项目的大小以及电脑的配置&#xff09; 二、创建服务器 没有后端服务器&#xff0c;这里我们使用node.js express 搭建一个服…

(附源码)计算机毕业设计ssm餐厅管理系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 4.1.2系统的主要的功能结构 餐厅管理系统的主要功能的结构如图4-1所示。 图4-1系统功能结构图 4.2系统设计 4.2.1数据表E-R图 菜谱信息属性图如图4-2所示。 图4-2菜谱信息实体属性图 账单信息…

3、数据类型中的数据位置,stograge、memory、calldata

数据位置 所有的复杂类型,即 数组 和 结构 类型,都有一个额外属性,“数据位置”,说明数据是保存在 内存memory 中还是 存储storage 中。 根据上下文不同,大多数时候数据有默认的位置,但也可以通过在类型名后增加关键字 storage 或 memory 进行修改。 函数参数(包括返回的…

Day11 栈和队列

150. 逆波兰表达式求值 解法一&#xff1a;将计算部分抽象成一个函数&#xff0c;使代码更加简洁&#xff0c;避免了很多冗余操作。对比下面解法二&#xff08;我自己写的&#xff09;&#xff0c;此解法&#xff08;参考别人的&#xff09;的代码更加精简。核心思想都是利用栈…

Linux学习 -- Shell面试题练习

1、使用Linux命令查询file1中空行所在的行号 awk /^$/ {print NR} file1 // 使用正则表达式^$ 来表示空行 2、使用Linux命令计算文件a.txt的第二列的和并输出 张三 40 李四 50 王五20 cat a.txt | awk -F " " {sum$2} END {print sum} 3、Shell脚本中如何检查一个文…

欧拉函数的power

在算数基本定理中有 $ N = p_{1}^{a1} p_{2}^{a2} p_{3}^{a3} ..... p_{k}^{ak} $ wuw在y总的课中是用了容斥原理进行推导得到了 $ \phi(x) = N * (1 - \frac{1}{p1}) * (1 - \frac{1}{p2}) * .... * ( 1 - \frac{1}{pk}) $ 所以就可以得到依靠该公式得出的欧拉公式的算法 #in…

基本语法

输入输出输入: 输出:字符串: System.out.println("hello world!"); 字符串+数值 System.out.println("a =" + 8);import java.util.Scanner; //Scanner 是一个简单的文本扫描器public class MyInput {public static void main(String[] Args) {Scanne…

cat笔记

0.学习目标 能够知道什么是CAT能够搭建CAT服务端环境能够进行CAT客户端的集成能够使用CAT监控界面进行服务监控能够完成CAT和常用框架集成了解CAT告警配置了解CAT客户端和服务端原理 1.CAT入门 在这一部分我们主要介绍以下3部分内容&#xff1a; 什么是调用链监控 什么是CA…

【虚幻引擎UE】UE5 阴影异常与优化解决方案合集

一、消除阴影锯齿 异常效果&#xff1a; 模型锯齿状阴影。 解决方案&#xff1a; ① 确定打开虚拟阴影贴图。 虚拟阴影贴图&#xff08;VSM&#xff09;是一种全新的阴影贴图方法&#xff0c;可以提供稳定的高分辨率阴影。通过与虚幻引擎5的Nanite虚拟几何体、Lumen全局光照和…

Seata安装

文章目录一、下载二、MySQL配置三、Nacos配置四、启动参考一、下载 从Seata下载地址下载 https://github.com/seata/seata/releases 这里下载的是seata-server-1.5.2.tar.gz 解压&#xff1a; tar -xvf seata-server-1.5.2.tar.gz修改配置&#xff1a;conf/application.ym…

Python实战——全球疫情数据采集, 并做可视化

前言 大家早好、午好、晚好吖~ 知识点: 爬虫基本流程 requests 发送请求 re 正则表达式 json 结构化数据解析 开发环境: python 3.8: 解释器 pycharm: 代码编辑器 requests 发送请求 pyecharts 绘制图表 pandas 读取数据 基本原理: 模拟成 浏览器/客户端 向 服务器…

React-Hooks源码深度解读

useState 解析 useState 使用 通常我们这样来使用 useState 方法 function App() {const [num, setNum] useState(0);const add () > {setNum(num 1);};return (<div><p>数字: {num}</p><button onClick{add}> 1 </button></div>…

I2C 时序、速率计算及intel I2C驱动

目录 速率 信号 时序定义 START ACK NACK STOP 时序实战 速率计算 数据解读 异常时序 上拉电阻 I2C的设备驱动 速率 主要支持的速率如下&#xff1a; 100Kbps 400Kbps 1Mbps 3.4Mbps 信号 SDA 数据 SCL 时钟 时序定义 START SCL为高电平时&#xff0c;SD…

【FineReport企业日常问题 1.0】帆软决策服务端管理员密码忘记怎么办?

文章目录企业问题描述分析问题加密方式分类原理问题解决企业问题描述 有的时候我们在进行帆软部署的时候&#xff0c;设置管理密码的不小心忘记(当然这个是属于小概率事件) 其实是有相应的办法解决的~ 分析问题 首先&#xff0c;我们来了解一下帆软的加密算法 加密方式分类…

Angr学习 00_angr_find

Angr学习 00_angr_find1. github下载angr项目2. angr安装3. IDA静态分析4. angr使用说明5. exp6.运行结果1. github下载angr项目 点击前往github 2. angr安装 网上的教程都是要安装什么虚拟环境我也安装了但是可能因为我是初学者不知道这个虚拟环境有什么用我直接在shell中用…

grpc介绍(二)——认证方式

前言 HTTP是明文传输的&#xff0c;即客户端与服务端之间通信的信息是可见的&#xff0c;这就存在被窃听、冒充或篡改的风险。HTTPS在HTTP和TCP之间加入了TLS协议&#xff0c;如图所示&#xff1a; TLS协议主要解决了以下三个网络安全问题&#xff1a; 信息加密&#xff1a; …

cannot import name ‘TimedJSONWebSignatureSerializer‘ from ‘itsdangerous‘

该库在2.0.0版本之后就将TimedJSONWebSignatureSerializer类弃用了,引导用户使用直接支持JWS/JWT的库,如authlib。 解决方案:要么使用2.0.0版本之前的itsdangerous库,继续使用该类,要么换用authlib库来生成token。

LeetCode刷题复盘笔记—1373. 二叉搜索子树的最大键值和

今日主要总结一下&#xff0c;1373. 二叉搜索子树的最大键值和 题目&#xff1a;1373. 二叉搜索子树的最大键值和 Leetcode题目地址 题目描述&#xff1a; 给你一棵以 root 为根的 二叉树 &#xff0c;请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下&…