分布式数据库TDSQL搭建

小白不怕黑 / 2024-12-21 / 原文

TDSQL介绍

TDSQL是腾讯基于MySQL/Mariadb社区版本打造的一款金融级分布式数据库集群方案,目前腾讯主推TDSQL MySQL版。

TDSQL MySQL版具备强一致高可用、全球部署架构、分布式水平扩展、高性能、企业级安全等特性,同时提供智能 DBA、自动化运营、监控告警等配套设施,为客户提供完整的分布式数据库解决方案。

TDSQL MySQL 版是一款兼容MySQL协议的国产分布式数据库,很好的满足了金融业务场景中对数据库的高可用、高可靠、可运维和信创的要求,同时基于MySQL和X86的软硬件平台,也能极大的降低数据库层面的IT成本,从而极大降低户均成本,非常适用互联网时代的新一代银行架构。

架构介绍

我们可以从请求处理和集群管理两个维度来理解TDSQL的架构。

  1. 请求处理

TDSQL请求通过应用层发出,经过负载均衡模块,转发到Proxy集群;Proxy收到请求后,进行请求解析,然后转发到set单元内的数据库实例节点上(写请求到master,读请求可以到master或slave);数据库实例处理好请求后,回包给Proxy集群,Proxy再通过负载均衡模块回包给应用层。

如下图1所示:

1704866992317

图1 TDSQL架构模型与SET模型

  1. 集群管理

TDSQL的一个管理单元称为一个set,每个set单元的每个数据库实例上,都会部署一个TDSQL Agent模块。Agent模块会收集所在数据库实例的所有监控信息(包括节点主备角色信息/节点存活状态/请求量/TPS/CPU负载/IO负载/慢查询/连接数/容量使用率等等),上报到ZooKeeper集群;ZooKeeper相当于整个TDSQL集群元数据存储管理中心,保存了集群所有元数据信息;TDSQL Scheduler模块会监控ZooKeeper的所存储的上报信息,并根据集群状态启动不同的调度任务,相当于TDSQL集群的大脑,负责整个集群的管理和调度。

DBA管理人员可通过赤兔管理平台实现数据库的管理工作,功能如下图2所示:

1668412223074

图2 赤兔管理平台

主备同步与主备切换

  1. 主备同步

1)同步原理

主备同步需要依赖GTID(Global transaction identifiers,事物ID),同步的过程

备机和主机建立同步时,备机将自己的gtidlist发送给主机,主机根据gtidlist扫描自己的Binlog文件,发现备机需要同步的位置;如果找不到同步的位置点,会通知拉取镜像,拉取加载完成后,再根据binlog同步点和主机建立同步连接。

2)强同步机制

TDSQL基于MySql的binlog的半同步复制机制,进行了优化,增加了强同步复制机制。

对于进入集群的每笔更新操作,都将发到对应Set的主机上,主机会将Binlog发往备机,且收到其中任意一个备机ACK后,然后才本地提交,并返回给客户端应答,这就能确保数据令丢失。

  1. 主备切换

基于TDSQL Agent和Scheduler等模块,实现了自动化的主备强一致切换,在30秒内可以完成整个主备切换流程,实现故障的秒级恢复。

在TDSQL数据库中,强一致性是必须保证的,意思就是节点可以拒绝提供服务,但不能提供错误的服务,主备切换的前提是需要保证数据的一致性。

自动扩容机制

TDSQL引入集群机制,实现了自动的容量伸缩,确保在业务访问量飙升的时候,整个集群可以自动扩容提供对外访问,这种扩容应该是动摇的,对业务应该完全透明,无需业务停机。

TDSQL有两个分支版本,一个是NO-Sharding(非分布式)版本,一个是Group-Sharding(分布式)版本,NS版本不支持自动扩容(一个Set),GS版本支持自动扩容(多个Set),但是该版本不支持跨节点事物和join。目前开源化部署仅支持非分布式部署。

分布式事务本质上还是为了解决在分布式系统中数据一致性的问题。对于分布式数据库,存在存储副本以及数据库本身的分库分表等问题使得一个事物中存在着对不同节点的操作,这就是典型的分布式事务。TDSQL基于MySQL的XA实现了分布式事务机制,在性能损失较低的情况下保证了系统中数据的一致性。

常见的部署方案

  1. 同城单中心架构

这种架构一般用作测试、异地灾备的机房或者业务不能容忍跨数据中心访问带来的网络延迟。每个数据库示例采用三个节点的模式,主备机需要垮不同的机架,主机宕机后,TDSQL会在30S内完成自动的切换,业务基本无感知。

  1. 同城三中心架构

每个数据库实例采用三个节点的模式部署,分布在3个IDC。业务系统支持多活模式部署,每个IDC内的业务系统访问本IDC内LVS/TGW对应的虚拟IP,由其后端的Proxy模块将请求路由到正确的主备数据库节点。对于读写分离的请求优先访问本IDC的备机,任何一个数据库节点宕机时,TDSQL会在30S内完成自动切换,业务基本无感知。

  1. 两地三中心架构

这种架构是同城两个中心+异地中心,可以提供非常好的可用性和一致性,是TDSQL主要推荐的部署模式。每个数据库实例采用4-6个节点的模式,分布在3个IDC,业务系统支持多活模式的部署。

价格介绍

腾讯云价格:

够买时长

模式

数据库

配置

价格

1月

一主一备

Mysql 8.0

4 核 8GB 内存/500G

1176/元

1年

一主一备

Mysql 8.0

4 核 8GB 内存/500G

11712/元

1月

一主一备

TDSQL Mysql 8.0

高 IO 版 - 4 核 8GB 内存/500GB/2分片

2116/元

1年

一主一备

TDSQL Mysql 8.0

高 IO 版 - 4 核 8GB 内存/500GB/2分片

21083/元

部署过程

TDSQL 集群架构设计

组件

10.10.77.50

10.10.77.56

10.10.77.57

10.10.77.59

10.10.77.60

10.10.77.67

ZK

zk1

zk2

zk3

kafka

kafka1

kafka2

kafka3

scheduler

scheduler1

scheduler2

oss

oss1

oss2

chitu

chitu1

chitu2

monitor

monitor1

monitor2

db

db2

db1

db1

db2

proxy

proxy1

proxy2

proxy3

lvs

lvs2

lvs1

lvs1

lvs2

hdfs

hdfs

hdfs

ansible

ansible

es

es

consumer

consumer

基础部署

配置主机名

#设置主机名

10.10.77.50 hostname tdsql50

10.10.77.56 hostname tdsql56

10.10.77.57 hostname tdsql57

10.10.77.59 hostname tdsql59

10.10.77.60 hostname tdsql60

10.10.77.67 hostname tdsql67

添加主机名IP映射

vim /etc/hosts

10.10.77.50 tdsql50

10.10.77.56 tdsql56

10.10.77.57 tdsql57

10.10.77.59 tdsql59

10.10.77.60 tdsql60

10.10.77.67 tdsql67

开启时间同步

安装ntp软件包
# 所有主机都要安装,如果没有yum源需要配置yum源

yum -y install ntp

crontab -e

0 3 * * * /usr/sbin/ntpdate -u ntp.aliyun.com

规划存储目录

# 所有主机执行

mkdir -p /data

mkdir -p /data1

TDSQL下载

在主控机tdsql50上下载腾讯云独立输出TDSQL(软件介质)

cd /root/

wget https://tdsql1031730-1300276124.cos.ap-beijing.myqcloud.com/tdsql_10.3.17.3.0.zip

unzip tdsql_10.3.17.3.0.zip

TDSQL配置

配置免密登录

在主控机节点tdsql50上配置到所有主机root免密登录

cd /root/tdsql_10.3.17.3.0/tdsql_install/scripts

vim ip_passwd_lis

sh nokey.sh

执行完成后,免密登录配置完成。

修改tdsql_hosts文件

避免中文乱码,首先执行

export LANG='en_US.UTF-8'

修改tdsql_hosts文件:
cd /root/tdsql_10.3.17.3.0/tdsql_install

vim tdsql_hosts

# 填入所有机器的地址(包括主控机)

# 用于环境检测和初始化配置

# 同一个标签组内的ip地址不要重复,一个ip一行

# 序号从1递增,比如只有2台机器,那么序号保留tdsql_mac1 tdsql_mac2

# 后续如果有扩容,新扩容的机器也需要在这里补上

[tdsql_allmacforcheck]

tdsql_mac1 ansible_ssh_host=10.10.77.50

tdsql_mac2 ansible_ssh_host=10.10.77.56

tdsql_mac3 ansible_ssh_host=10.10.77.57

tdsql_mac4 ansible_ssh_host=10.10.77.59

tdsql_mac5 ansible_ssh_host=10.10.77.60

tdsql_mac6 ansible_ssh_host=10.10.77.67

# zookeeper机器ip地址

# 数量只能是1、3、5, 正式环境建议3台或者5台

# 如果是使用自己已有的zk集群,这里同样要填写正确的zk地址

[tdsql_zk]

tdsql_zk1 ansible_ssh_host=10.10.77.56

tdsql_zk2 ansible_ssh_host=10.10.77.57

tdsql_zk3 ansible_ssh_host=10.10.77.59

# scheduler机器的ip地址,正式环境建议2个

[tdsql_scheduler]

tdsql_scheduler1 ansible_ssh_host=10.10.77.56

tdsql_scheduler2 ansible_ssh_host=10.10.77.57

# oss机器的ip地址, 正式环境建议2个

[tdsql_oss]

tdsql_oss1 ansible_ssh_host=10.10.77.56

tdsql_oss2 ansible_ssh_host=10.10.77.57

# 赤兔机器的ip地址, 正式环境建议2个

[tdsql_chitu]

tdsql_chitu1 ansible_ssh_host=10.10.77.56

tdsql_chitu2 ansible_ssh_host=10.10.77.57

# 监控采集模块的IP地址,正式环境建议2个

[tdsql_monitor]

tdsql_monitor1 ansible_ssh_host=10.10.77.56

tdsql_monitor2 ansible_ssh_host=10.10.77.57

# db机器地址

# 有多少台就填多少个ip地址

# 注意tdsql_db序号逐个递增,不要跳跃

[tdsql_db]

tdsql_db1 ansible_ssh_host=10.10.77.59

tdsql_db2 ansible_ssh_host=10.10.77.60

tdsql_db3 ansible_ssh_host=10.10.77.67

# proxy机器地址

[tdsql_proxy]

tdsql_proxy1 ansible_ssh_host=10.10.77.56

tdsql_proxy2 ansible_ssh_host=10.10.77.57

tdsql_proxy2 ansible_ssh_host=10.10.77.59

# hdfs机器地址

# 机器数量只能是1台或者3台

# 如果单节点部署,则只保留tdsql_hdfs1,其他删除

# 正式环境建议高可用部署,初始安装数量只能3台

[tdsql_hdfs]

tdsql_hdfs1 ansible_ssh_host=10.10.77.50

# lvs机器地址,数量固定2台

[tdsql_lvs]

tdsql_lvs1 ansible_ssh_host=10.10.77.56

tdsql_lvs2 ansible_ssh_host=10.10.77.57

# kafka机器地址,数量固定3台

[tdsql_kafka]

tdsql_kafka1 ansible_ssh_host=10.10.77.56

tdsql_kafka2 ansible_ssh_host=10.10.77.57

tdsql_kafka3 ansible_ssh_host=10.10.77.59

# 多源同步消费者服务ip地址,数量固定1台

[tdsql_consumer]

tdsql_consumer1 ansible_ssh_host=10.10.77.50

# es机器地址

[tdsql_es]

tdsql_es1 ansible_ssh_host=10.10.77.50

[tdsql_mc]

tdsql_mc1 ansible_ssh_host=1.1.1.1

tdsql_mc2 ansible_ssh_host=1.1.1.1

tdsql_mc3 ansible_ssh_host=1.1.1.1

[tdsql_newdb]

tdsql_newdb1 ansible_ssh_host=1.1.1.1

tdsql_newdb2 ansible_ssh_host=2.2.2.2

tdsql_newdb3 ansible_ssh_host=3.3.3.3

[tdsql_ansible_test]

tdsql_ansible_test1 ansible_ssh_host=1.1.1.1

tdsql_ansible_test2 ansible_ssh_host=2.2.2.2

tdsql_ansible_test3 ansible_ssh_host=3.3.3.3

修改ansible变量

cd /root/tdsql_10.3.17.3.0/tdsql_install/group_vars

vim all

# scheduler,oss机器网卡

tdsql_sche_netif: ens192

# 操作系统账号tdsql的明文密码

# 如果有规划要部署两个集群做DCN同步, 则这两个集群的tdsql密码要一致

tdsql_os_pass: a+complex+password

# tdsql在zk上的根路径, 保持默认不允许修改

tdsql_zk_rootdir: /tdsqlzk

# zk机器的域名配置, 会写入各配置文件, 并将域名配置到/etc/hosts中

# 正式环境必须用机房或者地区的关键字, 有意义的关键字来命名

# 如果部署多套TDSQL集群, 则名字需要唯一

# 例如: 深圳机房zk的域名可以定义为tdsql_sz_zk

tdsql_zk_domain_name: tdsql_bj_zk

# zk端口配置, 保持默认不要改,如果是自建的zk, 则和已有zk端口保持一致

tdsql_zk_clientport: 2118

tdsql_zk_serverport1: 2338

tdsql_zk_serverport2: 2558

# 赤兔监控库配置, 赤兔初始化完成后需要将监控库信息在这里更新

tdsql_metadb_ip: 10.10.77.56

tdsql_metadb_port: 15001

tdsql_metadb_ip_bak: 10.10.77.57

tdsql_metadb_port_bak: 15001

tdsql_metadb_user: hanlon

tdsql_metadb_password: hanlon

# hdfs机器的ssh端口

tdsql_hdfs_ssh: 22

# hdfs数据目录, 正式环境要求mount挂载比较大的数据盘

tdsql_hdfs_datadir: /data2/hdfs,/data3/hdfs,/data4/hdfs

# kafka日志目录,正式环境要求mount挂载比较大的数据盘

tdsql_kafka_logdir: /data2/kafka,/data3/kafka,/data4/kafka

# 多源同步消费服务的机器网卡

tdsql_consumer_netif: ens192

# es7配置

tdsql_es7_mem: 4

tdsql_es7_base_path: /data1/es

tdsql_helper_cluster_name: tdsql

# 一致性读MC机器的网卡, 需要安装MC时配置

tdsql_mc_netif: ens192

update_tdsqlinstall_packet: mysqlagent

安装ansible

在主控机安装ansible

cd /root/tdsql_10.3.17.3.0/tdsql_install/scripts

source environment_set

sh install_ansible.sh

验证ansible安装是否成功

TDSQL安装

cd /root/tdsql_10.3.17.3.0/tdsql_install

ansible-playbook -i tdsql_hosts playbooks/tdsql_part1_site.yml

安装大约需要9分钟,日志在/var/log/ansible.log,最终显示failed任务数为0表示安装成功。

赤兔初始化

网页访问安装chitu模块的机器地址,进行chitu初始化

http://10.10.77.56/tdsqlpcloud

勾选同意,下一步

环境检测

安装完成后,环境检测都是“通过”的,然后下一步

集群配置

第一步:集群命名,这个名称是全局唯一的,这里我命名为TdSqlCluster

第二步:配置OSS服务列表,前面配置了几个OSS节点,这里就填几个,格式如提示那样“IP:PORT”形式

第三步:测试OSS服务连接,点击旁边的“测试服务连接”按钮,zookeeper列表会自动显示,zookeeper节点目录也会自动显示

第四步:检查集群信息,点击“测试服务连接”后,集群信息也是自动显示,这里检查一下

第五步:点击下一步

集群初始化

接下来对每一项内容初始化

新增IDC配置

命名规则可以这样定义:城市+机房+房间号+机架号

IDC是策略上的配置,要对应到实际的机架信息上。比如有2个DB机器,为了保证DB实例跨机架,新增2个IDC

IDC权重:IDC权重皆使用默认值100

新增db机器的机型

机型:TS80,根据实际情况设定。(机型的名字要全部大写)

CPU、内存和磁盘:设置机型的时候要依据实际的机器配置

CPU:设置为实际机器一致

内存:设置为实际机器的75%

磁盘:设置为实际机器的90%

磁盘包括:数据盘和日志盘,比例为3:1

目录结构

数据目录:/data1/tdengine/data

日志目录:/data1/tdengine/log

安装包目录:/data/home/tdsql/tdsqlinstall

数据库安装目录:/data/tdsql_run

预留资源百分比:固定不变

新增网关机器的机型

网关机型已经自动创建好,不需要手动创建,请勿修改!!!

7.上报db设备资源

IP:填写实际的DB机器的通信ip地址

机型:选择刚才创建的机型,如DELL750

IDC:根据实际情况,选择其归属于哪一个IDC(不同DB机器要划分到不同IDC中

fenceid、frame、zone:默认

1698396360938

8.上报网关资源

IP:填写实际的PROXY机器的通信ip地址

IDC:同一网关组内的网关可以划分在不同的IDC中,或者相同的IDC中

9.新增网关组

因为之前上报了3台proxy机器,且这3台proxy机器划分在不同的IDC中,所以这里选择“从3个IDC中取3台机器”

10.建实例

创建一个监控库实例

基础设置如下

 容灾设置如下

这里选择“一主一备”为初始化db,新增IDC分布,依据之前设置的IDC分布,如果设置的是一个IDC,则关闭IDC校验

开始创建:

创建完成后初始化实例,选择“初始化”

11.配置数据库

密码和账号一致

TDSQL配套提供了赤兔管理平台系统,来支持整个TDSQL集群的可视化、自动化的监控和运维功能。如图3所示,为TDSQL赤兔管理平台的运行界面。

图3 TDSQL赤兔管理平台

通过TDSQL赤兔管理平台,可以实现监控数据的采集与显示,告警和策略配置,日常运维操作(主备切换,节点替换,配置更改等),数据库备份与恢复,慢查询分析,性能分析等一系列功能,极大的提升了运维效率和运维准确性。

admin 123456

普通用户密码:

Umpay01!@#