本章节非必须使用,小项目用以往的MySQL就行。

前言

本文主要讲述 2023 K3s Rancher 如何通过vitess部署生产环境 集群HA MySQL

如果你还没有部署 K3s 和 Rancher ,你可以浏览这篇文章:【K3S】01 - 异地集群初始化

如果你没部署过 单节点 ,你可以浏览这篇文章:【K3S】02 - Rancher 中间件单节点部署


环境声明

hostname 系统 配置 节点 角色 部署
m1 Ubuntu-Server(20.04) 2c4g 192.168.0.67/32 control-plane,etcd,master k3s(v1.24.6+k3n1) server
nginx
rancher(2.7.1)
Helm(3.10.3)
n1 Ubuntu-Server(20.04) 1c2g 192.168.0.102/32 control-plane,etcd,master k3s(v1.24.6+k3n1) server
m2 Ubuntu-Server(20.04) 2c4g 172.25.4.244/32 control-plane,etcd,master k3s(v1.24.6+k3n1) server
harbor Ubuntu-Server(20.04) 2c4g 192.168.0.88 Docker-Hub
Jenkins CI/CD
Harbor(2.7.1)
Jenkins(2.3)
Docker-Compose

节点均用 WireGuard 打通内网,后续所有节点路由均用内网ip访问


概念

Vitess Operator for Kubernetes是一个基于Kubernetes的开源工具,用于在Kubernetes集群中自动化地部署、管理和监控Vitess数据库集群。它是由Vitess社区维护的一款工具,旨在简化Vitess的部署和管理,以提高开发人员和运维人员的效率

Vitess是一个开源的分布式数据库系统,最初由YouTube开发并开源。它旨在解决MySQL数据库的可扩展性问题,可以将MySQL转换为可水平扩展的分布式数据库集群,提供高可用性、高性能和自动化的数据库操作,适用于大规模在线服务的数据库解决方案

Vitess Operator为Kubernetes用户提供了以下几个主要优势:

  1. 简化Vitess的部署和管理:Vitess Operator提供了简单易用的API和自定义资源定义(CRD),可以快速创建、管理和扩展Vitess数据库集群,简化了部署和管理的复杂性

  2. 自动化的水平扩展和负载均衡:Vitess Operator可以自动根据集群负载情况进行水平扩展,以满足应用程序的需求。它还提供了自动负载均衡的功能,将流量均匀分配到集群的不同节点上

  3. 高可用性和故障转移:Vitess Operator支持自动故障转移和恢复,可以自动将主节点切换到备用节点,以确保应用程序的可用性。它还提供了自动备份和恢复的功能,以保护数据的完整性

  4. 可视化监控和诊断:Vitess Operator提供了可视化的监控和诊断工具,可以实时监控集群的健康状况和性能指标,并提供实时诊断和故障排除的功能,帮助用户快速解决问题

YouTube选择使用Go语言实现Vitess,因为Go提供了表现力和性能的结合。它几乎和Python一样富有表现力,而且非常易于维护。它的性能与Java相同,在某些情况下接近C++。此外,该语言非常适合并行编程,并且具有非常高质量的标准库

官方网址:https://vitess.io


特性

  • 性能提升
    • 连接池 - 将前端应用程序以多路复用的方式映射到MySQL连接池以优化性能
    • 查询结果重用 – 对于相同结果集的查询,多个查询并发查询时,vttablet会识别和管理相同查询,等待第一个查询结果完成,并发送给所有的调用者
    • 事务管理 – 限制并发事务数、管理事务超时时间以优化总体吞吐量
  • 保护机制
    • 查询重写和清理 – 避免漫无目的的更新,对大查询添加limits
    • 查询黑名单 – 可通过自定义规则以防止可能存在问题的查询命中数据库
    • 查询超时 – 可自定义查询超时时间值,Vitess将干掉超时的查询
    • 表别访问权限控制定义 – 可以针对不同的接入用户指定表的访问控制权限 (ACLs)
  • 监控
    • 性能分析: Vitess提供工具可让您监控,诊断和分析数据库性能
    • 流式查询 – 使用传入查询列表来提供OLAP工作
    • 更新流 – 服务器流式传输数据库中更改的行列表,可用作将更改传播到其他数据存储的机制
  • 拓扑管理工具
    • Master管理工具(用于reparent处理)
    • 基于Web GUI的管理端
    • 可工作于多个数据中心/区域的设计
  • 拆分
    • 几乎无缝的动态分片拆分
    • 支持垂直和水平分片拆分
    • 多种分片方案,支持自定义分片方案

架构

VitessOverview

Topology

拓扑服务 一个元数据存储,包含有关正在运行的服务器、分片方案和复制图的信息。拓扑由一致的数据存储支持。您可以使用vtctl (命令行) 和 vtctld (web)查看拓扑.

在Kubernetes中,数据存储是etcd。 Vitess源代码还附带Apache ZooKeeper支持。

vtgate

vtgate 是一个轻型代理服务器,它将流量路由到正确的vttablet,并将合并的结果返回给客户端。应用程序向vtgate发起查询。客户端使用起来非常简单,它只需要能够找到vtgate实例就能使vitess。

为了路由查询,vtgate综合考虑了分片方案、数据延迟以及vttablet及其对应底层MySQL实例的可用性。

vttablet

vttablet 是一个位于MySQL数据库前面的代理服务器。vitess实现中每个MySQL实例都有一个vttablet。

执行的任务试图最大化吞吐量,同时保护mysql不受有害查询的影响。它的特性包括连接池、查询重写和重用重复数据。此外,vtTablet执行vtcl启动的管理任务,并提供用于过滤复制和数据导出的流式服务。

通过在MySQL数据库前运行vttablet并更改您的应用程序以使用Vitess客户端而不是MySQL驱动程序,您的应用程序将受益于vttablet的连接池,查询重写和重用数据集等功能。

vtctl

vtctl vtctl是一个用于管理Vitess集群的命令行工具。它允许用户或应用程序轻松地与Vitess实现交互。使用vtctl,您可以识别主数据库和副本数据库,创建表,启动故障转移,执行分片(和重新分片)操作等。

当vtctl执行操作时,它会根据需要更lockserver。其他Vitess服务器会观察这些变化并做出相应的反应。例如,如果使用vtctl故障转移到新的主数据库,则vtgate会查看更改并将将写入流量切到新主服务器。

vtctld

vtctld vtctld是一个HTTP服务器,允许您浏览存储在lockserver中的信息。它对于故障排除或获取服务器及其当前状态的高层概观非常有用。

vtworker

vtworker 托管长时间运行的进程。它支持插件架构并提供代码库,以便您可以轻松选择要使用的vttablet。插件可用于以下类型的作业:

  • 水平拆分或合并过程中检查数据的完整性
  • 垂直拆分或合并过程中检查数据的完整性

vtworker还可以让您轻松添加其他验证程序。例如,如果一个keyspace中的索引表引用到另一keyspace中的数据,则可以执行片内完整性检查以验证类似外键的关系或跨分片完整性检查。

安装

etcd-operator

GitHub: coreos/etcd-operator

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
git clone https://github.com/coreos/etcd-operator

# 由于资源版本的定义太旧了,我们需要将列表中所有的yaml里
# rbac.authorization.k8s.io/v1beta1 改为 rbac.authorization.k8s.io/v1

# ctrl + \
# rbac.authorization.k8s.io/v1beta1 回车
# rbac.authorization.k8s.io/v1 回车
# ctrl + Y
# ctrl + O 回车
# ctl + X
nano etcd-operator/example/cluster-role-binding-template.yaml
nano etcd-operator/example/cluster-role-template.yaml
nano etcd-operator/example/role-binding-template.yaml
nano etcd-operator/example/role-template.yaml

# 生成角色
bash etcd-operator/example/rbac/create_role.sh

# 输出结果如下
# Creating role with ROLE_NAME=etcd-operator, NAMESPACE=default
# clusterrole.rbac.authorization.k8s.io/etcd-operator created
# Creating role binding with ROLE_NAME=etcd-operator, ROLE_BINDING_NAME=etcd-operator, NAMESPACE=default
# clusterrolebinding.rbac.authorization.k8s.io/etcd-operator created

# 修改 deployment.yaml
# 1. extensions/v1beta1 改为 app/v1
# 2. DaemonSet 由 extensions/v1beta1 变成了 apps/v1
# 3. 新增了 selector
nano etcd-operator/example/deployment.yaml

# 替换为如下内容
apiVersion: apps/v1
kind: Deployment
metadata:
name: etcd-operator
spec:
replicas: 1
selector:
matchLabels:
app: etcd-operator
template:
metadata:
labels:
app: etcd-operator
spec:
containers:
- name: etcd-operator
image: quay.io/coreos/etcd-operator:v0.9.4
command:
- etcd-operator
# Uncomment to act for resources in all namespaces. More information in doc/user/clusterwide.md
#- -cluster-wide
env:
- name: MY_POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: MY_POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name

# 执行创建deployment
kubectl create -f etcd-operator/example/deployment.yaml

GitHub: vitessio/vitess

克隆该项目

1
git clone https://github.com/vitessio/vitess

为了能连接vitess 内部仪表盘,我们需要修改vitess的默认监听api

1
nano vitess/examples/operator/101_initial_cluster.yaml

将localhost改为任意master节点,将端口改为Nodeport范围内的端口(30000-32767)

1
2
3
4
5
6
7
8
vtadmin:
rbac:
name: example-cluster-config
key: rbac.yaml
cells:
- zone1
apiAddresses:
- http://192.168.0.67:30667

开始安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 安装 vitess operator
kubectl apply -f vitess/examples/operator/operator.yaml

# 初始化集群 创建 commerce keyspace
kubectl apply -f vitess/examples/operator/101_initial_cluster.yaml

# 创建软连接
sudo ln -sf vitess/bin/* /usr/bin/

# 执行创建 sechema
vtctlclient ApplySchema --server=$(kubectl get svc | grep example-vtctld | awk '{print $3}'):15999 -- --sql "$(cat create_commerce_schema.sql)" commerce
vtctlclient ApplyVSchema --server=$(kubectl get svc | grep example-vtctld | awk '{print $3}'):15999 -- --vschema "$(cat vschema_commerce_initial.json)" commerce

# 安装mysql工具
apt install mysql-client-8.0 -y

# 查看sechema
mysql -h $(kubectl get svc | grep zone1-vtgate | awk '{print $3}') -P 3306 -u user -e "show databases"

# 或者
kubectl run mysql-client --image=mysql:5.7 -i -t --rm --restart=Never -- \
mysql -h $(kubectl get svc | grep zone1-vtgate | awk '{print $1}') -P 3306 -u user -e "show databases"

# 插入并校验数据
mysql -h $(kubectl get svc | grep zone1-vtgate | awk '{print $3}') -P 3306 -u user --table < ../common/insert_commerce_data.sql
mysql -h $(kubectl get svc | grep zone1-vtgate | awk '{print $3}') -P 3306 -u user --table < ../common/select_commerce_data.sql

由于内存不够无法进行后续的测试,你可以按照 vitess/examples/operator/README.md 里继续后面的分片操作测试

查看安装

1
2
3
4
5
6
7
8
9
10
11
12
13
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
example-commerce-x-x-zone1-vtorc-c13ef6ff-6c7bd687ff-whb2l 1/1 Running 0 23h 10.42.3.82 m2 <none> <none>
example-etcd-faf13de3-1 1/1 Running 0 23h 10.42.3.84 m2 <none> <none>
example-etcd-faf13de3-2 1/1 Running 0 22h 10.42.6.81 n1 <none> <none>
example-etcd-faf13de3-3 1/1 Running 0 23h 10.42.0.147 m1 <none> <none>
example-vttablet-zone1-2469782763-bfadd780 3/3 Running 1 (22h ago) 22h 10.42.6.80 n1 <none> <none>
example-vttablet-zone1-2548885007-46a852d0 3/3 Running 1 (22h ago) 23h 10.42.3.85 m2 <none> <none>
example-zone1-vtadmin-c03d7eae-85797d5d7c-dcbbt 2/2 Running 0 23h 10.42.3.81 m2 <none> <none>
example-zone1-vtctld-1d4dcad0-76948f674c-965qx 1/1 Running 0 23h 10.42.3.79 m2 <none> <none>
example-zone1-vtgate-bc6cde92-5c749668f5-l4bs6 1/1 Running 0 22h 10.42.3.86 m2 <none> <none>
vitess-operator-565985f76f-rkbsl 1/1 Running 0 22h 10.42.3.87 m2 <none> <none>

在每一个master节点中都部署了etcd example-etcd,这个etcd跟k3s中的etcd是独立的

vtgate 作为查询的入口,负责将查询路由到正确的 vttablet 实例,并将结果返回给客户端。vtgate 支持多种查询协议,如 MySQL、PostgreSQL、gRPC 等,也就是 example-zone1-vtgate

vtctld 是一个单独的二进制文件,可以在 Vitess 集群中的任何节点上运行。然而,为了方便使用和管理,可以将 vtctld 部署为 Kubernetes 中的一个容器,也就是example-zone1-vtctld

vttablet 负责管理和监控 MySQL 实例,并与 Vitess 集群的其他组件进行通信。vttablet 在 Vitess 集群中的每个 shard 中运行,并维护了该 shard 的 MySQL 实例以及 Vitess 相关的元数据信息,也就是 example-vttablet-zone1,目前默认了一个PRIMARY,一个REPLICA,所以一共两个

vtorc 负责监控并管理每个 vttablet 的健康状况,并在需要时执行自动垂直分片和升级操作,也就是example-commerce-x-x-zone1-vtorc

Operator 是 Kubernetes 中一种特殊的控制器,可以通过监控 Kubernetes API 中的自定义资源来实现特定的管理和自动化操作。Vitess Operator 利用 Kubernetes Operator 的特性,将 Vitess 的复杂性和灵活性与 Kubernetes 的自动化和弹性相结合,实现了 Vitess 在 Kubernetes 上的自动化运维。它监控 Kubernetes 中定义的 VitessCluster 自定义资源,并根据规则自动部署和管理 Vitess 集群的各个组件(如 vtctld、vttablet、vtgate 等)。通过使用 Vitess Operator,可以大大简化 Vitess 集群的部署和管理,并提高 Vitess 集群的可靠性和弹性,也就是vitess-operator


内部仪表板

在访问之前,我们需要映射nodeport

image-20230412104525625

配置选择器 planetscale.com/component : vtadmin

image-20230412104540870

接下来只需要请求任意节点ip:30666即可

image-20230412104751902


在下一篇文章中,我们将尝试部署Redis HA


参考文章

[1] The Vitess Docs | Vitess Operator for Kubernetes

[2] Vitess Operator on Kubernetes (storidge.com)