这篇文章主要介绍王泽林老师分享的 《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。

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

  1. OceanBase 从0到1数据库内核实战教程学习笔记 - 8.MiniOB Drop Table 解析

    本文将带领大家从源码层面过一下 Drop Table 的实现,下面我们先回顾一下之前介绍过的 MiniOB 框架,SQL 语句的解析过程中,当前已经实现的只有 Parser.Resolver 和 Ex ...

  2. 【编程不良人】MongoDB最新实战教程学习笔记

    简介 视频链接:01.简介和历史_哔哩哔哩_bilibili 文档地址: https://docs.mongodb.com/manual/ MongoDB教程:MongoDB 教程 | 菜鸟教程 注意 ...

  3. 【数据库内核】01——从0到1数据库内核实战,挑战数据库领域最强大脑

    前 言

  4. Django入门+实战教程+个人笔记+实时更新+基础知识 ->(个人学习记录笔记)

    文章目录 1.初识 2.登录,登录首页实现步骤 3.GET方式_登录功能 1.post请求的请求报文 2.post响应报文 3.GET和POST请求区别 4.GET请求方式 5.POST请求方式 6. ...

  5. db4o_8.0对象数据库官方文档翻译_学习笔记三

    紧接上篇:db4o_8.0对象数据库官方文档翻译_学习笔记二 3. Object Manager Enterprise Overview(OME视图)即OME插件的使用 If you did not  ...

  6. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  7. Python3《机器学习实战》学习笔记(三):决策树实战篇

    转载请注明作者和出处: http://blog.csdn.net/c406495762  运行平台: Windows  Python版本: Python3.x  IDE: Sublime text3 ...

  8. Python3《机器学习实战》学习笔记(三):决策树实战篇之为自己配个隐形眼镜

    转载请注明作者和出处: http://blog.csdn.net/c406495762 运行平台: Windows Python版本: Python3.x IDE: Sublime text3 一 前 ...

  9. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 1)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第一讲 博主博客文章内容导航(实时更新) 更多优质文章推荐: 收藏!最详细的P ...

最新文章

  1. 跳跃游戏(判断是否可以跳到最后一个下标)
  2. 柳传志大声对iphone说:这是在中国!
  3. Ajax兼容处理+发送请求+接收返回信息
  4. centos 7 安装 mantisbt-2.12.0 —— 安装LAMP环境、安装mantisbt-2.12.0
  5. java删除第一个节点_访问单个节点的删除(Java)
  6. ajax的常见几种写法以及用法
  7. 一个栈桢对应着一个方法
  8. python千位分隔符_python – 为pandas数据帧中的整数设置千位分隔符
  9. codeigniter 辅助函数 - 敏感词过滤
  10. Error:File read error (source insight 4.0错误)
  11. 在python中的使用Libsvm
  12. 盲打打字php,盲打键盘指法图顺口溜及练习方法
  13. kubuntu18.04 重装显卡驱动后无法进入桌面
  14. 博科光纤交换机IP+端口策略应用
  15. 如何在CAD中实现影像与矢量叠加套合(四参数法)
  16. 机械专业热门选题 论文+图纸+PPT
  17. 前端三大主流框架的区别
  18. 台式电脑怎么调出计算机,台式电脑连接笔记本显示器的方法步骤
  19. Neo4j使用记录--APOC和GDS的安装【实践】
  20. pppd详解_pppd拨号脚本说明文档

热门文章

  1. 1076. Wifi密码 (15)
  2. typora笔记去除英文下面的红色波浪线
  3. 独家首发!舱驾一体芯片要来了?这家企业传来量产消息
  4. 【Python】抓取电影海报并下载
  5. 双一流大学名单--仅供参考
  6. 文件资源管理器卡死现象解决方法
  7. ACQPS计算 AD采样保持电路 DSP2833x
  8. 从拳皇97中浅谈C#委托与事件
  9. 什么是托管资源,什么是非托管资源
  10. 牛客NC22206<乘法表>