下一代pulsar元数据存储Oxia

Posted by 梁远鹏 on 2023-05-03 | 阅读 |,阅读约 3 分钟

TOC

Oxia 是什么?

简单来说呢 oxia 是一个 streamnative 开源的基于 kubernetes 的可扩展的元数据存储和协调系统,设计的目标是为了成为Apache Pulsar 的关键组件,也就是元数据中心,取代Zookeeper/Etcd.

集群模式下依赖于 kubernetes,同时也提供 standalone 模式的启动方式,也就是可以脱离 kubernetes 直接单进程启动的方式。

验证系统正确性

由于 Oxia 是希望作为 Apache Pulsar 的核心组件元数据中心存在,那么正确性是非常重要的,因此校验服务的分布式逻辑正确性是必须的,Oxia 使用三种方式来做测试:

TLA

Maelstrom / Jepsen 测试

Chaos Mesh

由于 Oxia 基于 kubernetes 实现,因此很容易就想到使用基于 kubernetes 的混沌工程来做测试,目前在 CNCF 项目列表中有 Chaosmesh、litmus、chaosblade 这三个项目是混沌工程的,而 Oxia 选择使用 Chaos Mesh.

Oxia 使用了 Chaosmesh 来验证系统在注入故障后的正确性,以及针对注入故障后降级的性能是否合适.

简单食用一下!

编译oxia

可以简单的通过两种方式启动:

  • 通过源码编译出二进制
  • 通过已经发布的 docker 容器镜像

这里使用编译源码构建二进制的方式:

git clone git@github.com:streamnative/oxia.git
cd oxia
make

编译成功后oxia二进制文件会出现在bin目录下.

启动oxia服务

lan@lan:~/oxia$ bin/oxia standalone
May  3 09:35:38.181877 INF Starting Oxia standalone config={"DataDir":"./data/db","InMemory":false,"InternalServiceAddr":"","MetricsServiceAddr":"0.0.0.0:8080","NotificationsRetentionTime":3600000000000,"NumShards":1,"PublicServiceAddr":"0.0.0.0:6648","WalDir":"./data/wal","WalRetentionTime":3600000000000}
May  3 09:35:38.186955 INF Created leader controller component=leader-controller namespace=default shard=0 term=-1
May  3 09:35:38.188805 INF Leader successfully initialized in new term component=leader-controller last-entry={"offset":"-1","term":"-1"} namespace=default shard=0 term=0
May  3 09:35:38.189097 INF Applying all pending entries to database commit-offset=-1 component=leader-controller head-offset=-1 namespace=default shard=0 term=0
May  3 09:35:38.189151 INF Started leading the shard component=leader-controller head-offset=-1 namespace=default shard=0 term=0
May  3 09:35:38.190240 INF Started Grpc server bindAddress=[::]:6648 grpc-server=public
May  3 09:35:38.190386 INF Serving Prometheus metrics at http://localhost:8080/metrics

使用oxia客户端读写数据

编译出来的 oxia 二进制文件中包含了客户端的逻辑,可以使用 oxia client进入客户端模式:

lan@lan:~/oxia$ bin/oxia client put -k /hello -v world
{"version":{"version_id":0,"created_timestamp":1683106558058,"modified_timestamp":1683106558058,"modifications_count":0}}
lan@lan:~/oxia$ bin/oxia client get -k /hello
{"binary":false,"value":"world","version":{"version_id":0,"created_timestamp":1683106558058,"modified_timestamp":1683106558058,"modifications_count":0}}

oxia 压测

除了普通的客户端之外,oxia 二进制还包含了压测的功能:

lan@lan:~/oxia$ bin/oxia perf --rate 10000
May  3 09:39:09.376491 INF Starting Oxia perf client config={"BatchLinger":5000000,"KeysCardinality":1000,"MaxRequestsPerBatch":1000,"Namespace":"default","ReadPercentage":80,"RequestRate":10000,"RequestTimeout":30000000000,"ServiceAddr":"localhost:6648","ValueSize":128}
May  3 09:39:19.380180 INF Stats - Total ops: 10994.9 ops/s - Failed ops:    0.0 ops/s
                        Write ops 2197.9 w/s  Latency ms: 50%   8.9 - 95%  24.5 - 99%  38.9 - 99.9%  38.9 - max   38.9
                        Read  ops 8797.0 r/s  Latency ms: 50%   5.2 - 95%  15.4 - 99%  29.6 - 99.9%  29.6 - max   29.6
May  3 09:39:29.379691 INF Stats - Total ops: 9996.8 ops/s - Failed ops:    0.0 ops/s
                        Write ops 1999.6 w/s  Latency ms: 50%   8.8 - 95%  13.1 - 99%  27.0 - 99.9%  27.0 - max   27.0
                        Read  ops 7997.2 r/s  Latency ms: 50%   4.5 - 95%   7.2 - 99%  15.5 - 99.9%  15.5 - max   15.5
May  3 09:39:39.380111 INF Stats - Total ops: 10001.3 ops/s - Failed ops:    0.0 ops/s
                        Write ops 2001.7 w/s  Latency ms: 50%   8.8 - 95%  13.5 - 99%  25.5 - 99.9%  25.5 - max   25.5
                        Read  ops 7999.6 r/s  Latency ms: 50%   4.6 - 95%   7.1 - 99%  15.1 - 99.9%  15.1 - max   15.1

上述通过 oxia 命令行本身提供的client模式来使用了一下,你也可以使用官方提供的 go client 来通过代码了解oxia。 Go 客户端文档

最后说两句

上述只是简单的试用了一下 oxia 单机版,oxia 还提供了通过 helm 和 operator 的方式部署在 kubernetes 之上,后续有可能会在本文更新这部分内容。

oxia 的设计目标是成为 apache pulsar 的关键组件之一,但就目前还说还在早期,oxia 本身还没有 GA 不谈,另一个重要的点是将组件应用到 apache pulsar 中还需要 java 客户端,而目前 oxia 还没有 java 客户端。

但就 oxia 的研发团队来看,oxia 还是很有前景的,由 apache pulsar 的 PMC 之一 merlimat 主导,并且设计目标就是为了 apache pulsar 而存在,因此在设计上会将 pulsar 相关内容考虑进去,而不是一个偏通用的分布式元数据存储。

微信公众号

扫描下面的二维码关注我们的微信公众号,第一时间查看最新内容。同时也可以关注我的Github,看看我都在了解什么技术,在页面底部可以找到我的Github。

wechat-qrcode

温馨提示

本文还在持续创作中,如果你对本文主题感兴趣可以加我微信好友进行催更,博客下方可以找到我的微信联系方式 :)