ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

TiKV 分布式事务键值数据库:架构原理、核心特性与快速部署实战指南

TiKV 分布式事务键值数据库:架构原理、核心特性与快速部署实战指南 TiKV 分布式事务键值数据库架构原理、核心特性与快速部署实战指南【免费下载链接】tikvDistributed transactional key-value database, originally created to complement TiDB项目地址: https://gitcode.com/GitHub_Trending/ti/tikvTiKV 是一个用 Rust 实现的开源分布式事务键值数据库由 Raft 共识算法驱动最初由 PingCAP 为分布式 HTAP 数据库 TiDB 而创建现已成长为 CNCF 毕业项目。本文以仓库根目录 README.md 为主线系统讲解 TiKV 的架构设计Raft、Placement Driver、Region 分片、五大核心特性并结合仓库源码给出从单机 playground、二进制部署、Docker Compose 到 TiUP 生产集群的完整实操方案。读完本文你将掌握 TiKV 的部署方式、命令行参数语义、软件栈层次以及如何用 Python 客户端完成一次真实的读写验证。一、TiKV 是什么不止是键值存储TiKV 是开源、分布式、事务型的键值数据库distributed transactional key-value database。与传统 NoSQL 系统不同TiKV 不仅提供经典的键值 APIKey-Value API还提供满足 ACID 语义的事务 API。整个项目使用 Rust 编写、以 Raft 共识算法为一致性基础最初由 PingCAP 创建用于补齐 TiDB——一个兼容 MySQL 协议的分布式 HTAP 数据库——的底层存储能力。名字中的 Ti 代表钛titanium。TiKV 的设计灵感来自 Google 多个著名的分布式系统BigTable、Spanner 与 Percolator并结合了学术界近年来的重要成果尤其是 Raft 共识算法。从项目演进看TiKV 已在 2020 年 9 月成为云原生计算基金会CNCF的毕业项目其治理、社区与合规体系在 README.md 中有完整描述维护者视角的代码阅读与评审上下文可参考 doc/maintenance-guides/README.md。从源码结构看TiKV 的核心存储与复制逻辑位于 components/raftstore事务类型定义位于 components/txn_types事务执行路径则在 src/storage/txn共同构成了这个分布式事务存储引擎的实现主体。二、整体架构与核心设计2.1 一致性、存储与调度三要素TiKV 在架构上有三个关键支柱README 对其做了清晰概括Raft 共识 RocksDB 存储TiKV 用 Rust 实现了 Raft 共识算法共识状态存放在 RocksDB 中以此保证数据一致性。每个 Store 内部都有一个 RocksDB将数据持久化到本地磁盘。Placement DriverPD实现自动分片PD 被引入用于实现 auto-sharding使 TiKV 具备自动数据迁移能力。PD 是集群管理器定期检查副本约束replication constraints自动均衡负载与数据。Percolator 式事务模型事务模型与 Google 的 Percolator 类似并做了若干性能改进。TiKV 提供快照隔离Snapshot IsolationSI、带锁的快照隔离对应 SQL 的SELECT ... FOR UPDATE以及分布式事务中的外部一致性读写externally consistent reads and writes。2.2 软件栈四层抽象上图展示了 TiKV 的软件栈层次README 将其抽象为四个核心概念Placement DriverPD集群管理器定期检查副本约束自动均衡负载与数据同时也是集群元数据与 Region 路由信息的权威来源。Store每个 Store 内有一个 RocksDB负责把数据持久化到本地磁盘。Region键值数据移动的基本单元。每个 Region 会被复制到多个节点上这些副本共同构成一个 Raft 组Raft group。Node集群中的物理节点。一个节点内有一个或多个 Store一个 Store 内又包含许多 Region。2.3 节点启动与状态上报流程README 描述了集群的注册与心跳机制当一个节点启动时Node、Store 和 Region 的元数据会被记录到 PD 中随后每个 Region 和 Store 的状态会定期上报给 PD。正是这套启动注册 周期上报机制让 PD 能够实时掌握集群拓扑进而执行副本调度与负载均衡。三、关键特性一览README 归纳了 TiKV 的五大关键特性Geo-Replication跨地域复制借助 Raft 协议和 Placement DriverTiKV 天然支持多地域部署与数据复制。水平扩展Horizontal scalability基于 PD 与精心设计的 Raft 组TiKV 在水平扩展方面表现出色官方 README 声称可以轻松扩展到 100 TB 的数据规模。一致的分布式事务Consistent distributed transactions与 Google Spanner 类似TiKV 支持外部一致性externally consistent的分布式事务。Coprocessor 支持与 HBase 类似TiKV 实现了 coprocessor 框架以支持分布式计算。这一框架的实现在 src/coprocessor 与 components/tidb_query_executors 中均有体现。与 TiDB 协同得益于内部优化TiKV 与 TiDB 协同工作时能构成一个兼具高可扩展性、外部一致性事务、RDBMS 支持与 NoSQL 设计模式的数据解决方案。四、快速开始从单机到完整集群4.1 用 TiUP 部署 playground最快上手最快体验 TiKV TiDB 的方式是使用 TiUP——TiDB 生态的组件管理器。通过 TiUP playground 可以在本地拉起一个包含 TiKV、TiDB、PD 的开发环境适合快速验证与学习。4.2 二进制部署最小化 PD TiKV 双进程TiKV 可以与 PD 独立运行这是所需的最小编排。以下四步来自 README.md 的完整流程。第一步下载并解压二进制$ export TIKV_VERSIONv7.5.0 $ export GOOSdarwin # only {darwin, linux} are supported $ export GOARCHamd64 # only {amd64, arm64} are supported $ curl -O https://tiup-mirrors.pingcap.com/tikv-$TIKV_VERSION-$GOOS-$GOARCH.tar.gz $ curl -O https://tiup-mirrors.pingcap.com/pd-$TIKV_VERSION-$GOOS-$GOARCH.tar.gz $ tar -xzf tikv-$TIKV_VERSION-$GOOS-$GOARCH.tar.gz $ tar -xzf pd-$TIKV_VERSION-$GOOS-$GOARCH.tar.gz第二步启动 PD 实例$ ./pd-server --namepd --data-dir/tmp/pd/data --client-urlshttp://127.0.0.1:2379 --peer-urlshttp://127.0.0.1:2380 --initial-clusterpdhttp://127.0.0.1:2380 --log-file/tmp/pd/log/pd.log第三步启动 TiKV 实例$ ./tikv-server --pd-endpoints127.0.0.1:2379 --addr127.0.0.1:20160 --data-dir/tmp/tikv/data --log-file/tmp/tikv/log/tikv.log第四步安装 Python 客户端并验证需要 Python 3.5$ pip3 install -i https://test.pypi.org/simple/ tikv-clientfrom tikv_client import RawClient client RawClient.connect([127.0.0.1:2379]) client.put(bfoo, bbar) print(client.get(bfoo)) # bbar client.put(bfoo, bbaz) print(client.get(bfoo)) # bbaz上述tikv-server的各启动参数均可在 cmd/tikv-server/src/main.rs 中溯源。结合源码各参数语义如下参数源码中的说明默认/示例值--addr/-A设置监听地址listening address127.0.0.1:20160--advertise-addr对外宣告的客户端通信监听地址默认与--addr一致--status-addr状态上报服务的 HTTP 监听地址如127.0.0.1:20180--advertise-status-addr状态上报服务对外宣告的地址默认与--status-addr一致--data-dir/-s别名--store数据存储目录/tmp/tikv/data--capacity设置 Store 容量不设置则使用整个分区例如800GB--pd-endpoints别名--pd、--pd-endpoint设置 PD 端点多个 PD 用逗号分隔127.0.0.1:2379--labels别名--label设置服务器标签逗号分隔键值对如zonecn,diskssd--config/-C指定配置文件见下文第五节--config-check仅校验配置文件合法性后退出打印config check successful--config-info以指定格式打印配置信息目前仅支持json输出组件、版本与参数 JSON--print-sample-config向 stdout 打印一份示例配置与 etc/config-template.toml 同源--log-level/-L别名--log日志级别trace/debug/info/warn/error/critical/fatal默认info--log-file/-f日志文件路径不设置则输出到 stderr/tmp/tikv/log/tikv.log--metrics-addrPrometheus Pushgateway 地址留空禁用 push可选项此外src/lib.rs 中的tikv_version_info/tikv_build_version为--version与--config-info提供版本信息main 入口在启动早期调用fips::maybe_enable()开启 OpenSSL FIPS 模式并依据config.storage.engine选择RaftKvsrc/server/server.rs 对应的run_tikv还是RaftKv2引擎启动服务。4.3 用 Docker Compose 部署 3 PD 3 TiKV 集群如果想在单机上运行一套完整集群3 个 PD 3 个 TiKV用于开发与测试Docker Compose 是最省事的方式。它直接使用 Docker Hub 上预构建的 TiKV/PD nightly 镜像无需本地编译。注意macOS 上请用docker compose空格替代docker-compose连字符。启动集群$ docker-compose up -d # On macOS, use: docker compose up -d检查集群状态$ docker-compose ps # On macOS, use: docker compose ps访问集群PD 端点127.0.0.1:23791、127.0.0.1:23792、127.0.0.1:23793TiKV 状态http://localhost:20181/status、http://localhost:20182/status、http://localhost:20183/status对应到仓库中的 docker-compose.yml每个 PD 容器暴露 Client API映射2379x:2379与 Peer 通信端口映射2380x:2380每个 TiKV 容器暴露服务端口映射2016x:20160与状态端口映射2018x:20180并通过healthcheck定期探测http://localhost:2379/pd/api/v1/health与http://localhost:20180/status。TiKV 容器通过depends_on: condition: service_healthy等待全部 3 个 PD 就绪后再启动数据与日志则分别挂载到独立的 Docker volume如tikv1-data、pd1-logs。更多端口映射、日志查看docker-compose logs -f tikv1、docker exec tikv-pd1 cat /logs/pd.log、数据清理docker-compose down -v与故障排查细节见 docker-compose.README.md。一个常见疑问是PD 启动日志中会出现 server not started 或 cluster is not bootstrapped 告警。这是正常现象——PD 集群需要由第一个接入的 TiKV 节点完成 bootstrap在 TiKV 启动前 PD 没有 Region 可管理待 TiKV 节点接入并 bootstrap 集群后这些告警会自动消失。4.4 用 TiUP 部署生产级集群生产环境官方推荐使用 TiUP 部署。仓库中 doc/deploy.md 给出了完整流程确保 tiup 所在机器与各目标节点之间的 SSH 连通编写topo.yaml拓扑文件示例见 doc/deploy.md在其中分别声明pd_servers、tikv_servers、monitoring_servers、grafana_servers与alertmanager_servers的主机列表执行部署与启动$ tiup cluster deploy foobar v4.0.0 ./topo.yaml --user ubuntu -i ~/.ssh/id_rsa $ tiup cluster start foobar4.5 从源码构建若想从源码构建 TiKV 或参与贡献请参考 CONTRIBUTING.md其中包含了环境准备与构建流程可通过git clone https://gitcode.com/GitHub_Trending/ti/tikv获取仓库后按文档操作。五、配置与运维要点生产部署时建议用配置文件承载参数。仓库提供了完整的配置模板 etc/config-template.toml可通过tikv-server --print-sample-config在任意环境直接输出一份相同结构的示例配置。结合该模板几个高频配置项值得关注日志相关[log]段设置级别debug/info/warn/error与格式text/json[log.file]段设置filename、max-size单文件上限最高 4096MB、max-days与max-backups。另有独立的slow-log-file与slow-log-threshold默认1s用于慢日志。内存控制memory-usage-limit默认不配置此时系统按可用内存的 75% 设定在单机部署多个 TiKV 时会按5/3 * block-cache.capacity计算。模板中还给出了不同内存规格的默认配额示例如 8G 系统对应 block-cache 3.6G、memory-usage-limit 6G。[memory]段支持堆分析enable-heap-profiling与采样间隔profiling-sample-per-bytes默认 512KB仅接受 2 的幂。读写资源配额[quota]段可对前后台请求设置 CPU单位 millicpu与读写带宽限制如foreground-cpu-time、foreground-write-bandwidth、background-read-bandwidth等默认 0 表示不限max-delay-duration默认500msenable-auto-tune默认关闭。读线程池[readpool.unified]设置统一读线程池的min-thread-count、max-thread-count默认max(4, LOGICAL_CPU_NUM * 0.8)、stack-size默认 10MB与max-tasks-per-worker默认 2000[readpool.storage]的use-unified-pool控制存储请求是否走统一线程池。配置模板顶部还给出了大数字的书写约定文件大小按二进制单位支持 KB/MB/GB/TB/PB如1_048_576 1MB时间基于毫秒支持 ms/s/m/h如78_000 1.3m运维时可直接套用。部署后的常规健康检查包括curl http://localhost:23791/pd/api/v1/health检查 PD 健康、curl http://localhost:20181/status查看 TiKV 状态端点。六、客户端驱动TiKV 提供了多语言客户端驱动详见 README.md 的 Client drivers 一节Go最稳定且使用最广泛JavaRustC。其中 Go 客户端被官方作为主要推荐入口。上文 Python 客户端的RawClient则是快速验证部署是否成功的最轻量方式——put写入、get读取的语义与普通键值存储一致。七、安全、社区与许可安全审计TiKV 曾由第三方安全机构 Cure53 执行安全审计完整报告见 security/Security-Audit.pdf漏洞报告邮箱为 TiKV-security处理流程与政策见 SECURITY.md。社区规范社区沟通须遵守 CODE_OF_CONDUCT.md其核心承诺是让所有贡献者与维护者在参与项目时获得无骚扰的体验。许可证TiKV 采用 Apache 2.0 许可证详见 LICENSE。结语从 README 的定位看TiKV 的价值在于把强一致的分布式事务与水平可扩展的键值存储合二为一Raft 与 RocksDB 保证一致性PD 负责自动分片与调度Region 作为数据移动的基本单元Percolator 式事务模型提供 ACID 与外部一致性。本文覆盖了其架构、特性与四套部署路径TiUP playground、二进制、Docker Compose、TiUP 生产集群并给出了命令行参数与配置模板的源码级说明。建议读者按需选取部署方式用 Python 客户端完成一次真实的put/get验证再结合 doc/maintenance-guides/README.md 与 CONTRIBUTING.md 深入源码世界。【免费下载链接】tikvDistributed transactional key-value database, originally created to complement TiDB项目地址: https://gitcode.com/GitHub_Trending/ti/tikv创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表