GoldenDB 架构解析及一键部署指南

GoldenDB架构解析及一键部署指南,快速了解这款国产分布式数据库的架构、组件和部署方法。

原文标题:数据库系列之GoldenDB整体架构和一键部署

原文作者:牧羊人的方向

冷月清谈:

GoldenDB 是一款国产分布式数据库,基于 MySQL 内核 Innodb 并进行了大量优化,尤其在中间件计算节点、全局事务 GTM 和高可用性方面具有显著优势。

其整体架构包含计算节点 (CN)、数据节点 (DN)、全局事务节点 (GTM) 和管理节点。管理节点又细分为集群管理和 Insight 运维管理平台。集群管理包含元数据管理 (MetaDataServer)、ClusterManager 和 ProxyManager,负责集群元数据、数据节点和计算节点的管理维护。

OMM (Operations, Maintenance & Monitoring Manager) 是维护管理平台,负责所有组件的管理,功能涵盖用户权限管理、监控统计、元数据管理、DBProxy 管理等等。

管理节点包含 MetaDataServer(元数据管理)、ProxyManager(计算节点管理)、ClusterManager(存储节点管理)和 LoadServer(数据导入导出)。全局事务节点协调分布式事务,负责生成和释放全局事务 ID (GTID)。计算节点负责分布式优化、执行计划、事务控制等。数据节点负责实际数据存储和本地事务控制。

客户端可以通过 JDBC/ODBC 或负载均衡连接计算节点。各组件进程间关系如下:计算节点和数据节点通过 dbagent 连接;数据节点主从复制通过 MySQL binlog;事务通过 GTM 申请 GTID;ClusterManager 管理数据节点状态和扩缩容;ProxyManager 管理计算节点;MetaDataServer 管理元数据信息,并同步到各节点内存;每台服务器上的 ommagent 执行 OMM 命令并同步告警信息;Insight 运维管理平台通过 InsightAgent 收集主机信息,Filebeat 收集日志数据,数据经 Kafka 和 Logstash 送入 Elasticsearch,Insightserver 查询 ES、RDB 和 Redis 数据进行展示分析。

一键部署 GoldenDB 集群至少需要一台计算节点、两台数据节点、一台 GTM 节点和一台 OMM 管理节点。部署步骤包括准备安装包、配置 install_senior.ini 文件、执行 init_env.py 初始化环境、执行 install_control.py 安装,最后通过 Insight 访问页面。

怜星夜思:

1、GoldenDB 和其他的分布式数据库,比如 TiDB,在架构上有什么主要区别?各自的优势和劣势是什么?
2、文章提到了 GoldenDB 的一键部署,实际操作中这个一键部署的成功率和效率如何?有没有遇到过什么坑?
3、GoldenDB 的全局事务管理机制是如何实现的?相比于其他的分布式事务解决方案,有什么优势?

原文内容

GoldenDB作为国产化分布式数据库产品,在金融行业已有广泛的应用案例。其在mysql内核innodb的基础了做了大量的优化,在中间件计算节点、全局事务GTM以及高可用层面有自己的优势和特色。本文将简单介绍GoldenDB的基本架构和组件模块,并测试一键部署集群环境。

1、GoldenDB基本架构和组件
1.1 GoldenDB整体架构

GoldenDB整体架构如下图所示包括:计算节点CN、数据节点DN、全局事务节点GTM、管理节点,其中管理节点分为集群管理和Insight运维管理平台。集群管理部分包括元数据管理Metadataserver、ClusterManager和ProxyManager,这一部分实现分布式数据库架下的整个集群元数据、数据节点和计算节点的管理和维护。

  • OMM功能

OMM(Operations, Maintenance & Monitoring Manager)是整个分布式数据库系统中用于进行维护工作的管理平台,负责所有组件的管理,主要功能包括用户和权限管理、统计监控、元数据管理、DBProxy管理、Cluster管理、操作日志查询、资源管理、FAQ管理、OMM系统配置、数据库备份管理、数据重分布等功能。

  • 管理节点

管理节点包含四个主要的功能模块:
  1. MetaDataServer主要功能是管理分布式数据库的元数据信息,对外提供操作接口;持久化数据以及进行相应的任务管理工作。

  2. ProxyManager(PM)主要功能包括:管理计算节点,管理连接实例,收集计算节点状态、统计告警信息和对计算节点的异常进行处理。

  3. ClusterManager(CM) 在分布式数据库系统中主要用于存储节点安全组的管理,协同计算节点控制对数据库的访问。

  4. LoadServer 主要功能是在存储节点间批量导入导出数据。

  • 全局事务节点

全局事务协调中心,用于协助计算节点进行分布式事务管理,主要包括生成、释放全局事务ID(GTID)、维护活跃事务以及当前活跃GTIDs的快照。在GoldenDB中,只有跨分片的写操作才会申请GTID,其它读查询操作和单分片的写操作都不会申请GTID。

  • 计算节点

计算节点主要负责分布式优化、执行具体的分布式计划、分布式事务控制、存储节点负载均衡、用户认证与鉴权等任务。

  • 数据节点

数据节点用于实际存储数据、执行原子Sql操作和本地事务控制。每个数据节点对应一个MySQL节点,多个数据节点组成一个安全组Group。在安全组Group中,数据节点按照一主多备进行快同步数据复制。多个Group组成一个数据库集群,数据在Group之间按照用户设计的策略进行水平分布。

  • 连接方式

应用客户端可以通过JDBC或者ODBC直接连接到计算节点,也可以经过负载均衡F5或loadbalance或LVS的方式连接到计算节点,达到流量均衡的目的。

1.2 GoldenDB组件和进程关系
  • GoldenDB中各组件模块和进程列表

  • 各个功能组件之间的访问关系如下图所示:

  1. 计算节点和数据节点之间通过dbagent建立长连接,所有的副本都需要建立

  2. 数据节点主节点和从节点之间通过mysql的binlog同步复制原理,实现数据的同步

  3. 事务访问计算节点,如果需要申请全局事务ID,会通过GTM管理节点申请GTID

  4. 管理节点中ClusterManager会统一管理数据节点,比如数据节点的状态、扩容缩容,并协同计算节点控制数据的访问

  5. 管理节点中的ProxyManager实现对计算节点的统一管理,会和每个计算节点进行连接

  6. 管理节点中的Metadataserver管理元数据信息,有DDL相关的变更会在这里同步更新,元数据会保存在RDB中。同时为了优化执行效率,元数据信息也会同时同步到每个计算节点和数据节点的内存中,业务访问的时候优先从本地读取元数据信息。

  7. 每台服务器会部署ommagent,用于执行OMM管理节点下发的命令,并将告警信息同步到OMM管理节点
  • Insight运维管理平台访问关系

  1. InsightAgent是主机代理,每台主机上部署,执行insightserver下发的命令,并将数据收集推送到kafka

  2. Filebeat是日志采集代理,用于收集每台服务器的日志数据

  3. 运维性能数据经过kafka消息队列后通过logstash采集到elasticsearch中存储

  4. Insightserver会查询ES中的性能数据、RDB中的集群信息以及Redis中的缓存信息进行展示和汇总分析

2、GoldenDB集群环境部署
2.1 环境准备
GoldenDB集群环境部署至少需要一台计算节点、2台数据节点(主从)、1台GTM节点和1台OMM管理节点,配置如下:

2.2 GoldenDB一键安装
2.2.1 安装包准备
1)将ZXCLOUD-GoldenDB-ALL-RHV*.zip软件安装包上传至服务器

2)解压ZXCLOUD-GoldenDB-ALL-RHV*.zip, 进入目录oneKeyInstallUpdate/install/config

2.2.2 配置文件

以单管理节点配置文件为例:

# 适用Goldendb资深者, 对各组件及其配置项有详细了解
[GENERAL]
# 安装机器登录用户,具有root权限的高权用户
root_user=root
# 安装机器用于登录用户
root_pwvalue=xxxx

# 管理组件(OMM, CM, PM, MDS), GTM, Proxy, DB, LOADSERVER等用户名的前缀信息
# (同一节点上有多个时,末尾采用从1开始的数字进行区分)
user_prefix=gz

# 安装路径
install_path=/goldendb

#企业版License.dat文件
#license_dat_path=/home/OneInstall/License.dat

#安装模式(针对管理节点):
# 0代表单管理节点,需要配置[Nodes][Manager-Single][GTM][DBPROXY][CLUSTER][LOADSERVER];
# 1代表HA 需要配置[Nodes][Manager-HA] [GTM][DBPROXY][CLUSTER][LOADSERVER];
# 2代表ZK, 需要配置[Nodes][Manager-ZK] [GTM][DBPROXY][CLUSTER][LOADSERVER];
install_type=0

# 多租户安装,0代表非多租户安装,1代表多租户安装(不安装dbproxy、不组建集群、不配置互信)
install_tenancy=0

# OMM domain name: ommserver机器地址(固定IP、浮动IP或域名), 用户访问OMM网页用的域名
# 单管理节点配置本机ip, HA配置浮动ip或者域名, ZK配置本机ip
omm_domain_name=192.168.112.125

# omm listen port for ommangent.
omm_listen_port=6471
# rdb port,默认是3309
rdb_port=3309

# 所有服务器
[NODES]
# 配置项的名称格式如下,不允许修改:
# local_room表示本地机房,city_room表示同城机房,remote_room1表示异地机房1remote_room2表示异地机房2
# 配置值的格式如下:
# 城市|机房|服务器ip列表
# 说明:服务器ip列表中可以有一个ip或者多个ip(多个ip之间用英文逗号分隔),
# 连续ip使用-连接,起始IP-同网段截止IP中最后一段:例如10.0.0.11-20,代表10.0.0.1110.0.0.20内所有连续ip
# 没有相应服务器则置为空比如remote_room2=
local_room=广州|广州机房1|192.168.112.121-125
city_room=
remote_room1=
remote_room2=

# 单管理节点安装, install_type=0时此配置生效
[MANAGER_SINGLE]
# [Nodes]配置段中选取,用于配置 本地,同城,异地
# 本地,只允许一个IP
# 同城、异地如果没有,可以保留为空值,如果有值,也是只允许一个IP
local_room_ip=192.168.112.125
city_room_ip=
remote_room_ip=

# HA安装, install_type=1时此配置生效, 最多支撑两地三中心即本地同城异地
[MANAGER_HA]
# 配置管理节点,配置项的名称格式如下,不允许修改:
# local_room表示本地机房,city_room表示同城机房,remote_room表示异地机房
# 配置值的格式如下:
# ip1,ip2|float_ip
# ip1,ip2|float_ip/16
# 说明:每个机房配置两台manager(其中安装OMM, CM, PM, MDS),且只能为两台,从[Nodes]配置段中选取
# float_ip是浮动ip,它应该是当前机房所属局域网未被其他机器占用的ip
# float_ip后可以采用/n来指定掩码,如10.10.10.88/24。不指定掩码时,为24
local_room_ip=
city_room_ip=
remote_room_ip=

# zk安装, install_type=2时此配置生效
[MANAGER_ZK]
# 配置管理节点ip,配置项的名称为ip,不允许修改。
# 配置值的格式如下:
# ip1,ip2,...
# 说明:从[Nodes]配置段中选取,英文逗号分隔
# 连续ip使用-连接,起始IP-同网段截止IP中最后一段:例如10.0.0.11-20,代表10.0.0.1110.0.0.20内所有连续ip
local_room_ip=
city_room_ip=
remote_room1_ip=
remote_room2_ip=

# GTM组件
[GTM]
# 配置项:
# 系统级GTM集群部署:
# 格式为 sys_gtmg<num>_team<num>
# 例如:sys_gtmg1_team1, 表示系统级GTM集群,group编号1team编号1,一个gtm集群暂时只支持一个group
# 配置值:
# 格式为 gtm1,role;gtm2,role;...;gtmn,role
# role: M - master, S - slave
# 可以多次配置相同IP,因为一个IP上可以使用不同端口安装多个GTM
# 连续ip使用-连接,起始IP-同网段截止IP中最后一段:例如10.0.0.11-20,代表10.0.0.1110.0.0.20内所有连续ip
# 配置项由使用者来增加,不要与已经有的配置项重复。配置项如果重复,使用后一个。多余配置项请删除
sys_gtmg1_team1=192.168.112.124,M;192.168.112.123,S

# increment_persistenceGTM增量持久化配置:
# 1表示仅主机做增量持久化;
# 2表示主备机均不做增量持久化;
# 3表示主备机均做增量持久化
increment_persistence=1

# is_master_count为主GTM是否计数:
# 1表示计数;
# 0表示不计数
is_master_count=1

# response_numGTMteam响应数:
# 当主GTM不计数时,GTMteam响应数不能大于GTMteam中的备机数量;
# 当主GTM计数时,GTMteam响应数不能大于GTMteam中的GTM数量总数量
response_num=1

# hwlw分别为GTMteam高水位和低水位信息
hw=1
lw=1

# auto_switch_between_different_room为跨机房自动切换配置:
# 1表示开启;
# 0表示不开启
auto_switch_between_different_room=1

[DBPROXY]
#dbproxy:#一个IP上装多个服务,则配置多次相同IP
# 连续ip使用-连接,起始IP-同网段截止IP中最后一段:例如10.0.0.11-20,代表10.0.0.1110.0.0.20内所有连续ip
ip=192.168.112.123, 192.168.112.124

# 集群信息
[CLUSTER]
# 配置集群、groupteam:
# 配置项:
# 集群字符集:utf8mb4 gbk gb18030 latin1 utf8
# 格式为c<num>_character_set_server=utf8mb4
# 集群分片模式:
# 格式为c<num>_group_mode=<num>
# 例如:c1_group_mode=1表示集群1的分片模式,0表示多分片;1表示单分片
# 集群部署:
# 格式为 c<num>_g<num>_team<num>
# 例如:c1_g2_team1, 表示集群编号1group编号2team编号1,一个gtm集群暂时只支持一个group
# 配置值:
# 格式为 db1,role;db2,role;...;dbn,role
# role: M - master, S - slave, L - logic master
# 配置项:
# 专属级GTM集群部署:
# 格式为 c1_gtmg<num>_team<num>
# 例如:c1_gtmg1_team1, 表示专属c1GTM集群,group编号1team编号1
# 配置值:
# 格式为 gtm1,role;gtm2,role;...;gtmn,role
# role: M - master, S - slave
# 配置项由使用者来增加,不要与已经有的配置项重复。配置项如果重复,使用后一个。多余配置项请删除
# 连续ip使用-连接,起始IP-同网段截止IP中最后一段:例如10.0.0.11-20,代表10.0.0.1110.0.0.20内所有连续ip
# 暂时只支持一个集群绑定一个proxy,多配置的proxy只安装,不绑定
# 除单分片集群(单分片集群不配置gtm集群)外,一个DB集群绑定一个GTM集群,没有配置专属级GTM集群则使用系统级GTM集群

# cluster_1
c1_character_set_server=utf8mb4
c1_group_mode=1
c1_g1_team1=192.168.112.121,M;192.168.112.122,S
# cluster_1专属级gtm集群
c1_gtmg1_team1=192.168.112.124,M;192.168.112.123,S

# loadserver组件
[LOADSERVER]
#一个IP上装多个服务,则配置多次相同IP
# 连续ip使用-连接,起始IP-同网段截止IP中最后一段:例如10.0.0.11-20,代表10.0.0.1110.0.0.20内所有连续ip
ip=192.168.112.125


# insight安装配置
[INSIGHT]
# zk安装服务器列表,可以有一个ip或者多个ip(多个ip之间用英文逗号分隔,zkip应该包括omm_domain_name
# 连续ip使用-连接,起始IP-同网段截止IP中最后一段:例如10.0.0.11-20,代表10.0.0.1110.0.0.20内所有连续ip
zk_server_ip=192.168.112.125
# zookeeper客户端连接端口
zk_server_port=32181
2.2.3 一键安装GoldenDB

1)上传产品包到tango-GDB-OMM01并解压,修改ini文件为unix格式

cd /home/OneInstall
unzip ZXCLOUD-GoldenDB-ALL-RHV*.zip
cd oneKeyInstallUpdate/install/config
sed -i 's/\r//' *.ini

2)编辑安装配置文件

[root@tango-GDB-OMM01 config]# cd /home/OneInstall/oneKeyInstallUpdate/install/config
[root@tango-GDB-OMM01 config]# vi install_senior.ini

3)进入/home/OneInstall/oneKeyInstallUpdate/install,执行init_env.py脚本进行本机环境初始化。

#cd /home/OneInstall/oneKeyInstallUpdate/install
#python init_env.py
[root@tango-GDB-OMM01 install]# python init_env.py
2021-04-09 00:19:22,704 [INFO] init_env.py(234) - **************** start to initializing environment ****************
2021-04-09 00:19:23,302 [INFO] init_env.py(89) - start check python dependent lib and install it
2021-04-09 00:43:58,093 [INFO] init_env.py(119) - install tqdm-4.45.0 success
2021-04-09 00:43:58,517 [INFO] init_env.py(119) - install requests-toolbelt-0.9.1 success
2021-04-09 00:43:58,908 [INFO] init_env.py(119) - install PyMySQL-master success
2021-04-09 00:44:00,365 [INFO] init_env.py(119) - install kazoo-2.6.1 success
2021-04-09 00:44:00,369 [INFO] init_env.py(244) - **************** done environment initialization ****************

4)安装本机omm、insight、生成安装配置文件(/home/OneInstall/oneKeyInstallUpdate/install/generated_config_files/detail_conf.json),此步骤可定制化修改生成的安装配置文件

#cd /home/OneInstall/oneKeyInstallUpdate/install
#python install_control.py --type install --product_pkg "/home/OneInstall/ZXCLOUD-GoldenDB-ALL-RHV5.1.05.zip" --ini "/home/OneInstall/oneKeyInstallUpdate/install/config/install_senior.ini" --g "yes"

附参数意义:
--type,help='install or update' 安装模式:安装还是升级
--product_pkg,help='goldendbproductpackage' 安装包存放路径
--ini,help='install config file path' 配置文件存放路径
--g,help='by the end of generate Config, yes for sure' 是否需要在生成配置文件后停止程序

5)进入/home/OneInstall/oneKeyInstallUpdate/install,执行install_control.py脚本进行安装

#cd /home/OneInstall/oneKeyInstallUpdate/install
[root@tango-GDB-OMM01 install]# python install_control.py --type install --product_pkg "/home/OneInstall/ZXCLOUD-GoldenDB-ALL-RHV5.1.05.zip" --ini "/home/OneInstall/oneKeyInstallUpdate/install/config/install_senior.ini"
2021-04-09 04:37:10,528 [INFO] global_args.py(109) - Global param:
2021-04-09 04:37:10,529 [INFO] global_args.py(110) - product pkg: /home/OneInstall/ZXCLOUD-GoldenDB-ALL-RHV5.1.05.zip
2021-04-09 04:37:10,529 [INFO] global_args.py(111) - ini file: /home/OneInstall/oneKeyInstallUpdate/install/config/install_senior.ini
2021-04-09 04:37:10,529 [INFO] global_args.py(112) - execute_type: install
2021-04-09 04:37:10,569 [INFO] doExcuteLog.py(80) - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
2021-04-09 04:37:10,570 [INFO] doExcuteLog.py(81) - 一键安装全流程说明:总共分成9个步骤:
2021-04-09 04:37:10,570 [INFO] doExcuteLog.py(88) - 步骤1:本机OMM安装 步骤2:insight安装 步骤3:生成安装配置文件 步骤4:发送脚本
2021-04-09 04:37:10,570 [INFO] doExcuteLog.py(92) - 步骤5:其他管理节点OMM安装 步骤6:安装组件 步骤7:组建集群 步骤8:启动组件 步骤9:配置互信环境
2021-04-09 04:37:10,571 [INFO] doExcuteLog.py(93) - >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
可以看到整个安装过程分为几步:
  1. 步骤1:本机OMM安装

  2. 步骤2:insight安装

  3. 步骤3:生成安装配置文件

  4. 步骤4:发送脚本

  5. 步骤5:其他管理节点OMM安装

  6. 步骤6:安装组件

  7. 步骤7:组建集群

  8. 步骤8:启动组件

  9. 步骤9:配置互信环境

6)安装完成后,可以通过以下信息登录Insight访问页面:

至此,完成了GoldenDB一键部署流程。其中OMM和insight节点涉及到很多大数据组件,相当的消耗资源,安装过程中也需要准备充足的测试资源,并且准备好yum源。

参考资料:

  1. GoldenDB_OnekeyInstall_Redhat

一键部署确实方便,但环境复杂的情况下还是会有各种各样的问题。我之前部署的时候就遇到过网络问题导致安装失败,还有依赖包冲突的问题。建议仔细检查配置文件,特别是网络相关的配置。

GoldenDB 使用 GTM(全局事务管理器)来协调分布式事务,原理上有点类似于两阶段提交,但做了很多优化。相比于其他的分布式事务解决方案,GTM 的优势在于性能比较高,而且可以保证数据的一致性。

全局事务管理这块 GoldenDB 用了 GTM,有点像中心化的协调器,负责全局事务的分配和管理。相比于其他方案,好处是性能比较好,而且对应用透明,用起来比较方便。

个人感觉 GoldenDB 更偏向于传统的关系型数据库的思路,在 MySQL 的基础上做分布式扩展,对金融行业用户来说迁移成本更低。TiDB 那种原生分布式的设计理念更激进一些,扩展性可能是更好,但稳定性和成熟度还需要时间考验。

从架构上看,GoldenDB更像是一个增强版的MySQL集群,而TiDB更像是一个全新的分布式数据库系统。GoldenDB的优势在于对MySQL的兼容性比较好,迁移成本低,劣势在于扩展性可能不如TiDB。TiDB的优势在于扩展性好,性能高,劣势在于兼容性不如GoldenDB,学习成本也比较高。

GoldenDB是基于mysql内核深度改造的,计算存储分离架构,更适合金融行业对数据库高性能、高可用、一致性的要求,和TiDB这种原生分布式数据库不太一样,TiDB是完全分布式的share nothing架构,理论上扩展性会更好一些,但金融行业用得少,稳定性有待进一步验证。

GoldenDB 的 GTM 类似于一个全局的协调器,所有的事务都需要通过它来获取全局唯一的 ID。这种中心化的设计好处是实现简单,性能也比较高。但是缺点也很明显,就是 GTM 单点故障的风险。不过 GoldenDB 也提供了 GTM 的高可用方案,可以有效地解决这个问题。

理论上来说一键部署肯定比手动部署效率高,但实际情况还得看具体的环境。我部署过几次,感觉还行,成功率还可以,但前提是你的环境配置正确,并且资源充足。我遇到过一次资源不足导致安装失败的情况。

一键部署用起来还可以,比手动部署省事多了。不过也别太指望完全自动化,有些配置还是需要手动调整的。我遇到过一次配置文件里的IP地址写错,导致安装失败,检查了半天才发现。