这篇文章主要介绍王泽林老师分享的 《OceanBase 的基础架构和开发技巧》。如果您看过第一篇文章的对应视频,会发现整个系列主要分为 MiniOB 和 OceanBase 两个系列,本篇文章就是 OceanBase 系列的开篇,所以文章中会有很多 OceanBase 的概念和特点介绍,作为开篇文章为大家普及一些基础知识。
首先 了解一下数据库基础架构,我们通过下面这种图,来看一下数据库普遍存在的需求:
最最重要的应属“稳定性”了,然后在稳定性基础上,增加了扩展性、高可用、高性能、低成本、兼容性等需求。如果单谈稳定性的话,作为一款新兴数据库无法提供太多有力的证据自证其词,只能通过大量的测试来佐证;要么就是通过数据库的发展历史,所以这里王泽林老师先介绍了一下 OceanBase 的发展历史。
通过上面历史的介绍,我们不难发现,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 典型的读写场景给大家做了介绍:
Read 分为本地读、远程读和分布式读,适应各种情况;对于读操作有以下优化手段:
Write 也分为本地写、远程写和分布式写;写操作也存在很多优化方法:
高效事务提交
在“低成本”方面,通过多副本和多租户上的不同组合方案,达到降本的目的:
“工欲善其事,必先利其器” 这一部分,介绍了一些 OceanBase 开发技巧。这一部分包括以下内容:
该操作可以参考:https://github.com/oceanbase/obdeploy
另外可以通过 obd 命令帮助信息进行一些操作的了解:obd -h
, obd cluster -h
源码编译可以参考:https://github.com/oceanbase/OceanBase/wiki/Build-from-source-code
下图展示了当前兼容的操作系统和 CPU 架构,可以看到 MacOS 还是不支持的,其他大多数主流操作系统均得到了支持。
操作步骤中一些步骤的作用解释如下:
IDE 设置可以参考:https://github.com/oceanbase/oceanbase/wiki/how_to_set_ide_with_ccls
在源码开发过程中,推荐的几款 IDE 分别为:Vim、Visual Studio Code 和 CLion。
推荐安装 ccls 插件,方便函数之间的跳转。
还要注意将生成的 compile_commands.json 文件 移动到项目根目录下面。
代码风格这部分,可以参考文档: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
代码调试,可以参考文档: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=COMPONENTS
The components used by the command. The first
component in the configuration will be used by default
in interactive commands, and all available components
will be used by default in non-interactive commands.
-s SERVERS, --servers=SERVERS
The servers used by the command. The first server in
the configuration will be used by default in
interactive commands, and all available servers will
be used by default in non-interactive commands.
-h, --help Show help and exit.
-v, --verbose Activate verbose output.
用自己的二进制部署的话,可以采用 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 并初始化部分。
mysqltest 部分章节主要参考文档:https://github.com/oceanbase/oceanbase/wiki/Run-mysql-test 。
当我们写了一些比较复杂的功能时,可以通过 mysqltest 来测试一下编写的是否存在问题。这个过程需要写一个 test和一个result结果集文件。通过 obd test mysqltest xxxx
来进行测试,对比结果是否在预期范围内。当然要注意写对位置哦。
编写 unittest 可以参考文档:https://github.com/oceanbase/oceanbase/wiki/Run-unit-test。如果要进行 unittest,需要先编译。
正常编译 oceanbase 不会编译 unittest,所以这里有一个手工编译的动作。
编译完成后,可以通过 ./run_tests.sh
运行所有单元测试,或者自己编写一个单独的测试,然后执行。
贡献代码部分就比较简单了,注意以下几点:
参考文档:https://github.com/oceanbase/oceanbase/wiki/Contribute-to-OceanBase。
今天的内容大概就这些~
最后的最后,如果大家感兴趣,可以多关注和参与 OB 的活动:https://ask.oceanbase.com/t/topic/35601006。