分布式数据库
聊起分布式数据库,大家第一印象估计是 谷歌的 Spanner ,以及 TiDB。其实还有另外一种分布式 Postgres-XC (目前已经迭代到 PostgreSQL-X2 ),Postgres-XC 数据库系统主要是基于水平可伸缩的share nothing 架构,支持全局事务,表分区,复制以及查询计划在各个节点并行执行。
国内的代表作是鹅厂的 TBase 基于Postgres-XC 二次开发并且做了很大改进,在性能和功能上有比较大提升。
Postgres-XC主要组件有gtm(Global Transaction Manager) , gtm_standby , gtm_proxy, Coordinator 和Datanode。
基于postgres-xc 的 tbase 架构图
从上图可以看出Coordinator和Datanode节点可以配置为多个,并且可以位于不同的主机上。只有Coordinator节点直接对应用服务,Coordinator节点将数据分配存储在多个数据节点datanode上。
gtm:全局事务管理器(Global transaction manager.), 是 Postgres-XC 的核心组件,用于全局事务控制以及tuple的可见性控制。gtm 为分配GXID和管理PGXC MVCC的模块 , 在一个集群中只能有一台主gtm。gtm_standby 为gtm的备机 。
gtm_proxy
用于对coordinator节点提交的任务进行分组等操作。一个XC 集群中可以存多个gtm_proxy 节点。
coordinator:协调节点(简称CN),对外提供接口,负责数据的分发和查询规划,多个节点位置对等,每个节点都提供相同的数据库视图;在功能上CN上只存储系统的全局元数据,并不存储实际的业务数据。
datanode:处理存储本节点相关的元数据,每个节点还存储业务数据的分片,简称DN。在功能上,DN节点负责完成执行协调节点分发的执行请求。表数据在DN存储方式分为分片(distributed)和完全复制(replicated)两种。数据节点只存储本地的数据。
在这个架构下,集群具有下面几个能力:
多活/多主:每个coordinator提供相同的集群视图,可以从任何一个CN进行写入,业务无需感知集群拓扑;
读/写扩展:数据被分片存储在了不同的DN,集群的读/写能力,随着集群规模的扩大做而得到提升;
集群写一致:业务在一个CN节点发生的写事务会一致性的呈现在其他的CN节点,就像这些事务是本CN节点发生的一样;
集群结构透明:数据位于不同的数据库节点中,当查询数据时,不必关心数据位于具体的节点;Postgres-XC 的share nothing集群架构方便了业务接入,降低了业务接入的门槛。
数据在集群中的分布分为以下三种情况
复制表:复制表中的每个存储节点都有完整的数据副本,适用于变化较少的小表,可以加速关联查询。
HASH 分布: 将数据按照分布列进行 hash,把数据打散在各个存储节点中,当然如果 hash key 选择不当,则可能造成数据倾斜的情况。
RANGE分布: RANGE 分布会将数据按照分段打散成小的分片,和 hash 相比分布上不会特别严格,对上层的节点弹性有比较好的支持。但它在计算的时候,相对 hash 的效果不会特别好。
前面说了postgres-xc 的原理,接下来,我们动手实践安装部署开源的TBase
提前准备tbase 账号以及安装目录
useradd -d /home/tbase tbase mkdir /opt/tbase mkdir -p /data/tbase
获取源代码
git clone https://github.com/Tencent/TBase.git
编译
提前安装基础软件
yum install -y uuid uuid-devel readline-devel flex
编译源代码
cd TBase
rm -rf /opt/tbase
chmod +x configure*
./configure --prefix=/opt/tbase/ --enable-user-switch --with-openssl --with-ossp-uuid CFLAGS=-g
make clean
make -sj
make install
chmod +x contrib/pgxc_ctl/make_signature
cd contrib
make -sj
make install
配置文件
可以根据 https://github.com/Tencent/TBase/wiki/0-TBase_Quick_Start.EN
提供的配置文件模板编写自己的 pgxc_ctl.config
,替换掉里面的角色变量 名称,ip ,端口即可。生产上请结合实际情况修改相关参数。
部署
本文是最小化安装tbase集群,没有 dn的从节点, gtm的从节点 。
节点 | Center Aligned | 角色 | 目录 |
---|---|---|---|
gtm | 172.16.78.32 | master | /tbase/pgxc/nodes/gtm |
cn001 | 172.16.78.32 | master | /tbase/pgxc/nodes/cn_master |
cn002 | 172.16.78.33 | master | /tbase/pgxc/nodes/cn_master |
dn001 | 172.16.78.32 | master | /tbase/pgxc/nodes/dn001 |
dn002 | 172.16.78.33 | master | /tbase/pgxc/nodes/dn002 |
接下来可以使用 pgxc_ctl 命令进行部署 ,安装 ,初始化集群。切换到 tbase 系统账号。然后 执行
pgxc_ctl 进入交互命令行 如下图所示
deploy all 部署拷贝软件到对应目录
init all 初始化 tbase集群
start all 启动所有节点
monitor all 观察监控各个节点的运行状态
create default node group default_group with (dn001,dn002); create sharding group to group default_group;
到此就安装完毕,大家可以进行各种测试。
总体感受下来
postgres-xc 的分布式架构没有使用基于raft/paxos协议管理分布式数据写入,dn节点使用主从方式,在性能上会有一些优势,不过具体多少还没完全测试,这个和机器规格,参数配置有关。
TBase 开源是一个值得肯定的事情,文档,社区支持等有一些列的支持动作,但是没有像某些开源分布式数据库做的那么活跃,社区,微信群,各种互联网公司试/使用,考试认证。TBase 群里只有一个人支持答疑,github的答疑也是 她一个人,挺辛苦的,Tbase的朋友要给她加鸡腿儿。
TBase 开源版本和商业版本在功能上还是有很大差异的,比如管控功能,闪回功能,如果你想用更好的功能,那么
其实还有很多功能没有在本文提到,比如HTAP 能力,支持列存,冷热数据存储等,具体可以参考官方文档或者鹅厂相关分享。