ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Kubernetes 上运行 Vitess 分片 MySQL 集群:完整实战指南(基于 Kubernetes 官方 examples 仓库)

Kubernetes 上运行 Vitess 分片 MySQL 集群:完整实战指南(基于 Kubernetes 官方 examples 仓库) 示例工程【免费下载链接】examplesKubernetes application example tutorials项目地址https://gitcode.com/gh_mirrors/examp/examples点击查看免费下载导读本指南以 Kubernetes 官方 examples 仓库中_archived/storage/vitess/目录下的完整示例为核心系统讲解如何在 Kubernetes 集群中一键部署一个包含etcd 拓扑服务、vtctld 管理控制面、vttablet 分片数据节点与 vtgate 路由网关的 Vitess 集群并在此基础上运行一个演示范围分片 一致性哈希能力的改造版 Guestbook 应用。读完本文你将掌握 Vitess 在 Kubernetes 上的完整部署链路、备份存储GCS 与 file 两种模式的配置方法、vtctlclient的初始化命令序列SetKeyspaceShardingInfo/RebuildKeyspaceGraph/InitShardMaster/ApplySchema以及如何通过模板化 YAML shell 脚本实现一份模板、多参数实例化的 Kubernetes 编排思路。Vitess 是什么为 MySQL 分片而生的集群系统Vitess 是 YouTube 开源的 MySQL 集群化解决方案。其核心价值在于让分片sharding对应用层透明应用只需面向一个统一的 SQL 入口vtgate发起查询无需感知数据实际落在哪个分片把 MySQL 的横向扩容变成启动更多 Pod在 Kubernetes 中新增分片或增加副本只需按模板创建新的 vttablet Pod扩容路径与 Kubernetes 的声明式模型天然契合内置拓扑管理、主从复制reparenting、备份恢复、在线 schema 变更等生产级运维能力。本示例在仓库中位于_archived/storage/vitess/README.md它完整演示了一套2 分片数据库 分片化 Guestbook 应用的搭建流程。Guestbook 应用由仓库内的web/guestbook-go/示例移植而来但后端被替换为 Vitess并新增了多个页面以展示 Vitess 的基于范围的range-based分片能力。示例架构总览整个示例由以下几类 Kubernetes 资源组成组件角色对应文件etcdglobal 每 cellVitess 拓扑元数据存储etcd-controller-template.yaml、etcd-service-template.yamlvtctld管理控制面Web UI gRPC 管理接口vtctld-controller-template.yaml、vtctld-service.yamlvttablet mysql数据节点每分片多副本vttablet-pod-template.yamlvtgate应用访问网关SQL 路由vtgate-controller-template.yaml、vtgate-service.yamlguestbook示例前端应用guestbook-controller.yaml、guestbook-service.yaml数据流大致为Guestbook → vtgate → 按 keyspace_id 路由到对应分片的 vttablet → 本地 MySQL 实例。拓扑信息则统一由 etcd 保存vtctld 负责执行分片初始化、reparent 与 schema 下发等管理操作。前置条件在开始部署前需要满足以下条件Go 1.4用于构建vtctlclientVitess 的命令行管理工具。在vitess-up.sh中通过go get -u github.com/youtube/vitess/go/cmd/vtctlclient自动下载安装并将其二进制放置于$GOPATH/bin下。运行中的 Kubernetes 集群 配置好的kubectl集群需具备足够的 CPU 与内存资源。示例默认要求集群总计至少 6 个虚拟 CPU 和 10 GiB 内存各 YAML 文件中的resources.limits段可自行调整例如 vttablet/mysql 容器各限memory: 1Gi、cpu: 500mvtctld 与 guestbook 容器各限memory: 128Mi、cpu: 100m可见于 vttablet-pod-template.yaml 与 guestbook-controller.yaml。防火墙放行端口30000-30001供 Vitess 管理守护进程vtctld使用——其中30000为 Web UI30001为 gRPC 管理端口80供 Guestbook 应用访问。 两个端口的映射关系定义在 vtctld-service.yaml15000端口以nodePort: 30000暴露 Web15001端口以nodePort: 30001暴露 gRPC。第一步配置站点本地参数configure.sh进入示例目录后首先运行配置脚本生成config.sh./configure.sh该脚本configure.sh的核心职责是选择并配置备份存储实现并最终把结果写入config.sh该文件不会被纳入源码管理。支持两种备份存储模式GCSGoogle Cloud Storage模式脚本默认选项为gcs会依次交互式询问Google Developers Console 项目名默认从gcloud config list project自动读取用于存放 Vitess 备份的 GCS bucket 名称若尚未创建可用gsutil mb gs://bucket创建。最终生成的备份参数形如backup_flags-backup_storage_implementation gcs -gcs_backup_storage_project project -gcs_backup_storage_bucket bucket重要前提使用 GCS 模式时Kubernetes 集群必须运行在具备storage-rwscope 的实例上。若使用 Google Container Engine 创建集群需在创建命令中显式传入gcloud container clusters create cluster-name --scopes storage-rwfile 模式挂载网络卷对于其他平台非 GCS需要选择file备份存储插件并把一个可读写的网络卷挂载进vttablet与vtctldPod。典型做法是把任意可通过 NFS 访问的存储服务挂载为 Kubernetes 卷然后把挂载路径提供给配置脚本。交互时需输入备份根目录通常是 NFS 挂载点生成的参数形如backup_flags-backup_storage_implementation file -file_backup_storage_root file_root注意选择file模式时必须按 Kubernetes 官方文档的做法把 NFS 卷添加到 vtctld-controller-template.yaml 与 vttablet-pod-template.yaml 中。只想跑通示例、跳过备份卷配置可以直接选file模式并把路径设为/tmp。配置脚本生成的参数如何生效configure.sh将backup_flags写入config.shenv.sh 在脚本启动时会检查config.sh是否存在不存在则提示Please run ./configure.sh first并source该文件。随后vtctld-up.sh 通过sed把模板中的{{backup_flags}}替换为实际值注入到 vtctld 容器启动命令中vttablet-up.sh 同样将其注入 vttablet 的-restore_from_backup {{backup_flags}}参数实现按需从备份恢复。第二步一键启动 Vitess 集群vitess-up.sh运行./vitess-up.sh根据脚本注释vitess-up.sh它会依次完成以下步骤创建 etcd 集群global 每 cell创建 vtctld Pod创建 vttablet Pod执行 vtctl 初始化SetKeyspaceShardingInfo、RebuildKeyspaceGraph、Reparent Shard、ApplySchema创建 vtgate Pod。可调参数来自 env.shenv.sh 定义了全部环境变量均带默认值可通过环境变量覆盖变量默认值含义KUBECTLkubectlkubectl 命令历史上 GKE 曾需gcloud beta container kubectlVTCTLD_PORT30001vtctld nodePort须与 vtctld-service.yaml 一致SHARDS-80,80-分片定义-80与80-构成两个范围分片TABLETS_PER_SHARD2每个分片的 tablet 数量RDONLY_COUNT0每分片 rdonly tablet 数量MAX_TASK_WAIT_RETRIES300等待 Pod 进入 Running 的最大重试次数MAX_VTTABLET_TOPO_WAIT_RETRIES180等待 tablet 出现在拓扑中的最大重试次数VTGATE_COUNT1vtgate 数量CELLStest拓扑 cell 名称可逗号分隔多个ETCD_REPLICAS3每个 etcd 集群的副本数分片与 tablet 数量推导脚本会依据SHARDS、TABLETS_PER_SHARD、CELLS计算总 tablet 数total_tablet_count num_shards × TABLETS_PER_SHARD × num_cells例如默认配置下2 个分片 × 2 个 tablet × 1 个 cell 4 个 vttablet。若VTGATE_COUNT为 0则按total_tablet_count/4下限 3自动推算。等待就绪与初始化命令vitess-up.sh通过wait_for_running_tasks轮询kubectl get pods统计名称前缀匹配且状态为Running的 Pod 数量依次等待 3 个etcd-global、每 cell 3 个etcd-cell、1 个vtctld、全部vttablet与vtgate。随后用vtctlclient别名kvtctl执行核心初始化序列# 设置 keyspace 分片信息uint64 keyspace_id2 个分片时 split_shard_count2 $kvtctl SetKeyspaceShardingInfo -force -split_shard_count 2 test_keyspace keyspace_id uint64 # 重建 keyspace 拓扑图 $kvtctl RebuildKeyspaceGraph test_keyspace # 为每个分片指定主节点master $kvtctl InitShardMaster -force test_keyspace/-80 test-0000000100 $kvtctl InitShardMaster -force test_keyspace/80- test-0000000200 # 下发建表 schema $kvtctl ApplySchema -sql $(cat create_test_table.sql) test_keyspace说明单分片unsharded场景下split_shard_count会被置为 0示例默认 2 分片因此传入 2。InitShardMaster中 tablet 别名形如cell-0000000序号00由 vttablet-up.sh 中uid基于UID_BASE100累加生成。部署完成时脚本会打印类似如下的提示**************************** * Complete! * Use the following line to make an alias to kvtctl: * alias kvtctl$GOPATH/bin/vtctlclient -server 104.197.47.173:30001 * See the vtctld UI at: http://104.197.47.173:30000 ****************************其中 IP 为任一节点的 ExternalIP由kubectl get nodes解析此后即可用kvtctl执行管理命令并在浏览器打开 vtctld Web UI。模板化 Pod 的实例化机制vttablet 详解vttablet-up.sh 展示了模板 sed 替换的批量部署范式对每个 shard、每个 cell、每个 uid 组合脚本计算aliascell-10位uid、tablet_subdir、shard_label、tablet_type前TABLETS_PER_SHARD - RDONLY_COUNT个为replica其余为rdonly等变量通过 sed 将 vttablet-pod-template.yaml 中的{{alias}}、{{uid}}、{{keyspace}}、{{shard}}、{{port}}、{{grpc_port}}、{{backup_flags}}等占位符逐一替换后管道送入kubectl create -f -。该 Pod 模板本身也是一个双容器 Podsidecar 模式mysql 容器运行mysqlctld用镜像内置的 MariaDB 空数据目录归档mysql-db-dir_10.0.13-MariaDB.tbz完成初始化监听$VTDATAROOT/mysqlctl.sockvttablet 容器先轮询等待mysql.sock出现再以vt_dba身份创建vt_keyspace数据库随后启动vttablet进程通过-topo_implementation etcd、-etcd_global_addrs http://$ETCD_GLOBAL_SERVICE_HOST:$ETCD_GLOBAL_SERVICE_PORT连接拓扑以-tablet-path {{alias}}注册自身并开启-enable-rowcache基于 memcached 的行缓存与-restore_from_backup {{backup_flags}}。两个容器共享emptyDir卷vtdataroot挂载于/vt/vtdataroot并通过本地 socket 协同工作。etcd 服务的ETCD_GLOBAL_SERVICE_HOST/ETCD_GLOBAL_SERVICE_PORT环境变量由 Kubernetes Service 自动注入。第三步启动 Guestbook 应用guestbook-up.sh运行./guestbook-up.sh该脚本将 guestbook-controller.yaml3 副本 ReplicationController镜像vitess/guestbook:v2.0.0-alpha5容器内监听 8080 端口与 guestbook-service.yaml 提交到集群。Guestbook Service 的关键配置是type: LoadBalancer让 Kubernetes 为其分配外部 IP。创建后可能需要一分钟左右完成负载均衡器配置届时可用如下命令查看$ kubectl get service guestbook NAME LABELS SELECTOR IP(S) PORT(S) guestbook none nameguestbook 10.67.253.173 80/TCP 104.197.151.132上面的内部 IP 之下会出现外部 IP。在浏览器中访问外部 IP 即可使用 Guestbook。分片演示与仓库内原始 guestbook-go 不同此版本包含多个页面用于演示 Vitess 的 range-based 分片——每个页码依据**一致性哈希consistent hashing**方案被分配到某一个分片-80或80-不同页面上的留言会持久化到不同分片对应的 MySQL 中。第四步卸载与清理运行./guestbook-down.sh ./vitess-down.shguestbook-down.sh 负责删除 Guestbook 的 ReplicationController 与 Servicevitess-down.sh 负责删除 vtgate、vttablet、vtctld 及所有 etcd 集群资源。此外建议一并删除之前为示例创建的防火墙规则避免残留端口暴露。脚本家族一览与运行顺序目录中所有.sh脚本构成完整编排链路运行顺序与职责如下脚本职责运行时机configure.sh生成config.sh备份存储参数首次运行前etcd-up.sh创建 global 与各 cell 的 etcd 集群基于 etcd discovery 服务自动发现成员vitess-up.sh 内部vtctld-up.sh创建 vtctld Service 与 ReplicationControllervitess-up.sh 内部vttablet-up.sh按分片/副本展开创建 vttablet 双容器 Podvitess-up.sh 内部vtgate-up.sh创建 vtgate Service 与 ReplicationControllervitess-up.sh 内部vitess-up.sh总入口编排上述步骤并执行 vtctl 初始化手动运行guestbook-up.sh创建 Guestbook 应用集群就绪后guestbook-down.sh / vitess-down.sh清理资源结束实验后其中 etcd 的创建etcd-up.sh值得一提Vitess 需要一个 global 集群 每个 cell 各一个集群脚本通过curl https://discovery.etcd.io/new?sizereplicas获取动态成员发现 token再以 sed 替换{{cell}}、{{discovery}}、{{replicas}}生成 Service 与 ReplicationController 并创建。从源码看实现要点与可移植思路模板 变量注入的编排模式整个示例没有手写大量重复 YAML而是用{{placeholder}}模板配合 sed 替换批量生成资源。这种模式在早期 Kubernetes 生态中非常典型可移植到任何支持模板渲染的 IaC 工具如 Helm、Kustomize。双容器 sidecar 协同vttablet-pod-template.yaml 将 MySQL 实例mysqlctld与 Vitess 代理vttablet放进同一个 Pod、共享emptyDir数据卷通过 socket 通信——这是将数据库实例 管理代理打包为原子调度单元的代表性设计。管理接口的端口约定vtctld 的 Web UI15000与 gRPC15001分别以 nodePort30000/30001暴露vtctlclient -server nodeIP:30001即通过 NodePort 访问管理面这解释了 README 中防火墙需放行30000-30001的原因。初始化状态机的完整性从SetKeyspaceShardingInfo定义分片键与算法→RebuildKeyspaceGraph重建拓扑图→InitShardMaster选定主节点→ApplySchema下发 schema这一序列是 Vitess keyspace 从空壳到可用状态的必经之路理解它有助于排查分片初始化类问题。常见问题与排查建议Pod 迟迟不进入 Running脚本内置了超时轮询默认 300 次。请检查集群资源是否满足 README 要求的 6 vCPU / 10 GiB 底线必要时调低各模板中的resources.limits。GCS 备份失败确认集群节点带storage-rwscope且 bucket 名称与项目名正确未创建 bucket 时可先执行gsutil mb gs://bucket。config.sh缺失脚本会直接报错并退出务必先运行./configure.sh。无法连接 vtctld检查防火墙是否放行30000-30001并确认VTCTLD_PORT与 vtctld-service.yaml 中的 nodePort 一致。拓扑中看不到 tablet等待脚本完成ListAllTablets轮询最多 180 次若超时检查 etcd 集群是否全部 Running以及 vttablet 的-etcd_global_addrs是否能连通。赞分享示例工程【免费下载链接】examplesKubernetes application example tutorials项目地址https://gitcode.com/gh_mirrors/examp/examples点击查看免费下载相关推荐使用 Vitess Operator 在 Kubernetes 上部署与运维 Vitess 集群从建群、MoveTables 迁移到 Reshard 分片的完整实战指南使用 Vitess Operator 在 Kubernetes 上部署与运维 Vitess 集群从建群、MoveTables 迁移到 Reshard 分片的完数据库分布式数据库云原生后端数据存储在 Kubernetes 上部署 Spark Standalone 集群基于 kubernetes-handbook 的 Master、Worker 与 Zeppelin 完整实战指南在 Kubernetes 上部署 Spark Standalone 集群基于 kubernetes handbook 的 Master、Worker 与 Ze教程云原生容器编排Apache Spark Kubernetes 集成测试运行指南从 Minikube 本地集群到云上 Kubernetes 的完整实践Apache Spark Kubernetes 集成测试运行指南从 Minikube 本地集群到云上 Kubernetes 的完整实践 导读 本文基于 Apa大数据数据分析批处理流处理机器学习图计算上一篇Apache Druid GCE Extensions 实战指南基于 GCE 托管实例组自动扩缩容 MiddleManager下一篇Python Machine Learning 第 11 章使用 k-means、层次聚类与 DBSCAN 处理无标签数据聚类分析实战创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表