跳到主要内容

ApeCloud MySQL 代理

开始之前

  1. 安装 kbcli

  2. 安装 Helm

  3. 安装 KubeBlocks。

    可以执行 kbcli playground init 安装 k3d 集群和 KubeBlocks。详情请参考在本地使用 KubeBlocks在云上使用 KubeBlocks

    kbcli playground init

    # 使用--version 指定版本
    kbcli playground init --version='x.y.z'

    如果已经有 Kubernetes 集群,可以直接安装 KubeBlocks

  4. 准备一个名为 mycluster 的 ApeCloud MySQL 集群版集群,用于演示如何为现有集群启用代理功能。详情请参考创建并连接到 MySQL 集群

创建代理集群

建议使用 kbcli 创建 ApeCloud MySQL 代理集群。

  1. 添加 KubeBlocks 仓库。

    helm repo add kubeblocks https://apecloud.github.io/helm-charts
  2. 查看仓库列表,确认 KubeBlocks 仓库是否已添加。

    helm repo list
  3. 执行更新命令,确保您已安装最新版本。

    helm repo update
  4. 安装 etcd,用于创建外部服务引用。

    1. 查看 etcd 的所有版本。

      helm search repo kubeblocks/etcd --devel --versions
    2. 安装 etcd 引擎。

      helm install etcd kubeblocks/etcd --version=v0.6.5
    3. 安装 etcd 集群。

      helm install etcd-cluster kubeblocks/etcd-cluster 
    4. 查看 etcd 集群状态,确保其处于 Running 状态。

      kubectl get cluster
      >
      NAME CLUSTER-DEFINITION VERSION TERMINATION-POLICY STATUS AGE
      etcd-cluster etcd etcd-v3.5.6 Halt Running 10s
    5. 查看 etcd 集群的服务地址。

      kubectl get service
      >
      NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
      etcd-cluster-etcd ClusterIP 10.110.23.89 <none> 2379/TCP 55s
      etcd-cluster-etcd-headless ClusterIP None <none> 2379/TCP,2380/TCP,3501/TCP,50001/TCP 55s
      kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m

      您可以将服务地址组合起来,获取 endpoint。或者您可使用服务地址的 IP 作为连接地址。

      以下为服务地址组合的示例。

      etcd-cluster-etcd.default.svc.cluster.local:2379
  5. 创建 ApeCloud MySQL 代理集群。

    1. 查看 ApeCloud MySQL 代理集群可用版本。

      helm search repo kubeblocks/apecloud-mysql --devel --versions
    2. (可选)如果您在安装 KubeBlocks 时停用了 apecloud-mysql 引擎,可执行以下命令并指定版本,安装 ApeCloud MySQL 的集群定义(cluster definition)。如果您安装 KubeBlocks 时选用了默认设置,可跳过本步骤。

      helm install myproxy kubeblocks/apecloud-mysql --version=v0.9.0
    3. 创建 ApeCloud MySQL 代理集群。

      helm install myproxy kubeblocks/apecloud-mysql-cluster --version=v0.9.0 --set mode=raftGroup,proxyEnabled=true,etcd.serviceReference.endpoint="etcd-cluster-etcd.default.svc.cluster.local:2379"
备注

如果您只有一个节点可用于部署集群版,可在创建集群时将 extra.availabilityPolicy 设置为 none

helm install myproxy kubeblocks/apecloud-mysql-cluster --version=v0.9.0 --set mode=raftGroup,proxyEnabled=true,etcd.serviceReference.endpoint="etcd-cluster-etcd.default.svc.cluster.local:2379" --set extra.availabilityPolicy=none
  1. 查看集群状态。

    kubectl get cluster

    kubectl get pods

    您也可以进入 etcd 容器或 wesql-scale 容器内部,查看 wesql-scale 的配置或检查 etcd 服务的可用性。

    etcdctl --endpoints=http://etcd-cluster-etcd.default.svc.cluster.local:2379 get /vitess --prefix --keys-only

动态启用代理

ApeCloud MySQL 代理本质是一个数据库代理。通过设置 proxyEnabled=true,可以将 ApeCloud MySQL 集群版切换为 ApeCloud MySQL 代理集群。

helm upgrade mycluster kubeblocks/apecloud-mysql-cluster --set mode=raftGroup,proxyEnabled=true,etcd.serviceReference.endpoint="etcd-cluster-etcd.default.svc.cluster.local:2379"

如需关闭代理,可执行以下命令。

helm upgrade mycluster kubeblocks/apecloud-mysql-cluster --set mode=raftGroup

连接代理集群

ApeCloud MySQL 代理通过 vtgate 组件进行路由,MySQL 服务器访问 vtgate 的方式和访问 mysqld 很像。代理提供的外部 SQL 访问地址是 vtgate 的地址和端口,而 KubeBlocks 默认创建的 vtgate 地址是 myproxy-cluster-vtgate-headless,端口号为 15306。你可以通过与代理处于相同命名空间的任意 Pod 中的 MySQL 服务器访问 ApeCloud MySQL 代理。

通过 VTGate 连接代理集群

  1. 将 VTGate 的端口映射到本地主机,使本地主机可以访问代理。

    kubectl port-forward svc/vt-vtgate-headless 15306:15306
  2. 连接到集群。

    mysql -h 127.0.0.1 -P 15306

通过 MySQL 服务器连接代理集群

  1. 将 MySQL 服务器的端口暴露到本地主机,使本地主机可以访问 MySQL 服务器。

    kubectl port-forward svc/vt-mysql 3306:3306
  2. 连接到集群。

    mysql -h 127.0.0.1 -P 3306
备注

如果要测试 MySQL 的故障切换功能,请先删除 Pod,然后进行端口转发。或者你可以编写一个 shell 脚本进行测试。比如,

如果使用 VTGate:

while true; do date; kubectl port-forward svc/vt-vtgate-headless 15306:15306; sleep 0.5; done

如果使用 MySQL:

while true; do date; kubectl port-forward svc/vt-mysql 3306:3306; sleep 0.5; done

配置代理集群参数

  1. 查看当前配置文件的详细信息。

    kubectl edit configurations.apps.kubeblocks.io myproxy-vtgate
  2. 按需配置参数。如下示例添加 spec.configFileParams 部分,用以配置 max_connections

    spec:
    clusterRef: myproxy
    componentName: vtgate
    configItemDetails:
    - configFileParams:
    vtgate.cnf:
    parameters:
    healthcheck_timeout: "5s"
    configSpec:
    constraintRef: mysql-scale-vtgate-config-constraints
    name: vtgate-config
    namespace: kb-system
    templateRef: vtgate-config-template
    volumeName: mysql-scale-config
    name: vtgate-config
    payload: {}
  3. 连接至该集群,确认配置是否生效。

    1. 将 MySQL 服务器的端口暴露到本地主机,使本地主机可以访问 MySQL 服务器。

      kubectl port-forward svc/vt-vtgate-headless 15306:15306
    2. 连接集群,确认参数是否已修改。

      mysql -h 127.0.0.1 -P 3306

      >
      mysql> show variables like 'healthcheck_timeout';
      +---------------------+-------+
      | Variable_name | Value |
      +---------------------+-------+
      | healthcheck_timeout | 5s |
      +---------------------+-------+
      1 row in set (0.00 sec)

日志

您可以使用 kbcli 和 kubectl 来查看组件、Pod 和容器的日志文件。

查看 VTGate 日志。

kubectl logs myproxy-cluster-vtgate-8659d5db95-4dzt5

查看 VTTablet 日志,-c 为必选项。

kubectl logs myproxy-cluster-mysql-0 -c vttablet

进入容器,查看更多 VTGate 日志。

kubectl exec -it myproxy-cluster-vtgate-8659d5db95-4dzt5 -- bash
ls /vtdataroot

进入容器,查看更多 VTTablet 日志。

kubectl exec -it myproxy-cluster-mysql-0  -c vttablet -- bash
ls /vtdataroot

读写分离

你可以启用读写分离功能。

  1. 获取当前集群的配置文件。

    kubectl edit configurations.apps.kubeblocks.io myproxy-vtgate
  2. read_write_splitting_policy 配置为 random

    spec:
    clusterRef: myproxy
    componentName: vtgate
    configItemDetails:
    - configFileParams:
    vtgate.cnf:
    parameters:
    read_write_splitting_policy: "random"
    configSpec:
    constraintRef: mysql-scale-vtgate-config-constraints
    name: vtgate-config
    namespace: kb-system
    templateRef: vtgate-config-template
    volumeName: mysql-scale-config
    name: vtgate-config
    payload: {}

您也可以设置读写分离的比例,以下示例将 70% 的流量导向只读节点。

spec:
clusterRef: myproxy
componentName: vtgate
configItemDetails:
- configFileParams:
vtgate.cnf:
parameters:
read_write_splitting_rati: "70"
configSpec:
constraintRef: mysql-scale-vtgate-config-constraints
name: vtgate-config
namespace: kb-system
templateRef: vtgate-config-template
volumeName: mysql-scale-config
name: vtgate-config
payload: {}

透明故障切换

执行以下命令,实现透明故障切换。

  1. 获取集群的配置文件。

    kubectl edit configurations.apps.kubeblocks.io myproxy-vtgate
  2. enable_buffer 设置为 true

    spec:
    clusterRef: myproxy
    componentName: vtgate
    configItemDetails:
    - configFileParams:
    vtgate.cnf:
    parameters:
    enable_buffer: "true"
    configSpec:
    constraintRef: mysql-scale-vtgate-config-constraints
    name: vtgate-config
    namespace: kb-system
    templateRef: vtgate-config-template
    volumeName: mysql-scale-config
    name: vtgate-config
    payload: {}