Skip to content

Elastic Scaling Compaction With K8s

luantian-terark edited this page Jun 7, 2023 · 5 revisions

本文档演示了如何使用k8s实现远程Compact集群的弹性伸缩。

1. 前置条件

1.已经部署好的 k8s

2.预定义的私有dns或写入hosts

<私有镜像源的ip> registry.mytopling.in
<node01的ip> node01.mytopling.in
<node02的ip> node02.mytopling.in
<instance-1的ip> mytopling-instance-1.mytopling.in
<instance-2的ip> mytopling-instance-2.mytopling.in

实际的 k8s 节点数量可以超过 2。这里使用了两个节点接受请求,这是保证集群的 compact 请求消息接受器多活的最少数量。 只要node1 和 node2 之一在线,dcompact的请求就会轮流发送到每个节点上活跃的 dcompact 容器。

2. 导入私有镜像

社区版用户可以使用如下命令在 registry.mytopling.in 上导入镜像:

docker pull registry.cn-guangzhou.aliyuncs.com/topling/dcompact-community:v0.0.1
docker tag registry.cn-guangzhou.aliyuncs.com/topling/dcompact-community:v0.0.1 registry.mytopling.in:5000/topling/dcompact-community:v0.0.1
docker pull registry.cn-guangzhou.aliyuncs.com/topling/nginx-labour:v0.0.1
docker tag registry.cn-guangzhou.aliyuncs.com/topling/nginx-labour:v0.0.1 registry.mytopling.in:5000/topling/nginx-labour:v0.0.1

企业版用户可以按照如下方式在 registry.mytopling.in 上导入镜像:

# 下载
docker load < dcompact-enterprise.tar.gz # dcompact-enterprise.tar.gz 联系客服获取
docker tag dcompact-enterprise:v0.0.1 registry.mytopling.in:5000/topling/dcompact-enterprise:v0.0.1
docker pull registry.cn-guangzhou.aliyuncs.com/topling/nginx-labour:v0.0.1
docker tag registry.cn-guangzhou.aliyuncs.com/topling/nginx-labour:v0.0.1 registry.mytopling.in:5000/topling/nginx-labour:v0.0.1

3. 启动dcompact服务

3.1 测试本地 k8s 节点的 registry 服务

在每个 node 上执行

curl registry.mytopling.in:5000/v2/_catalog

测试本地 registry 是否已配置成功

如果得到形如

{"repositories":["topling/dcompact-community","topling/forward-nginx"]}

说明配置成功

如果得到

Error response from daemon: Get "https://10.6.0.13:5000/v2/": http: server gave HTTP response to HTTPS client

说明本地 registry 没有配置。 此时应当修改 /etc/docker/daemon.json

// 内容应当形如
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "insecure-registries": ["registry.mytopling.in:5000"],
  "registry-mirrors": ["https://ud6340vz.mirror.aliyuncs.com"]
}

按照上文的格式将 "insecure-registries": ["registry.mytopling.in:5000"], 加入第一级

3.2 启动 dcompact服务

在k8s控制节点上执行

kubectl -f mytopling-depoly/Elastic-Dcompact/k8s/dcompact-community.yaml
# 企业版用户使用
# kubectl -f mytopling-depoly/Elastic-Dcompact/k8s/dcompact-enterprise.yaml

启动服务

4. 查看性能监控

服务启动后几分钟,可以查看效果

kubectl get hpa

应当打印形如:

NAME           REFERENCE                        TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
dcompact-hpa   Deployment/dcompact-deployment  3%/80%   2         10        2          38m

表示服务正常启动

如果 TARGETS 出现<unknown>字样可能是监控相关未安装

可以使用kubectl -f mytopling-depoly/Elastic-Dcompact/k8s/metrics-server-components.yaml安装HA相关服务

我们可以看到,dcompact 容器的最大值为10,可以调整 mytopling-depoly/Elastic-Dcompact/k8s/dcompact-community.yaml 中弹性伸缩部分配置:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: dcompact-hpa
  labels:
    app: dcompact
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: dcompact-deployment
  minReplicas: 2 # 最小 Node 数量
  maxReplicas: 10 # 最大 Node 数量
  targetCPUUtilizationPercentage: 80 # 目标 CPU 使用率

5.调整单个 POD 资源使用量:

查看使用的 dcompact-*.yaml 修改容器中的配置:

        resources:
          limits:
            cpu: 16
            memory: 32G

上述配置中限制每个POD使用16个核心和32G内存,如果您的node实例低于16核心,dcompact 服务无法启动。此时应当按照物理机核心数修改配置数量。

6. 启动服务器

本章(6.x)在两台 MyTopling 主机上(主库和从库所在主机)分别运行一遍

6.1 检测内核,保证内核为 5.14 以上,以使用 io uring

uname -a

如果低于5.14,可以使用如下指令升级:

sudo yum install elrepo-release -y
# 注意安装完内核后修改默认内核并重启
sudo yum -y --disablerepo="*" --enablerepo="elrepo-kernel" install kernel-ml

修改默认启动内核的指令:

# 查看已安装内核列表
grubby --info=ALL | grep -E "^kernel|^index" 
# 按照上一条打印的列表修改默认内核,最新安装的内核一般为0
grubby --set-default-index=<新的内核index>
reboot

6.2 确认 SSD/NVMe 磁盘(disk1)已经开启 Trim(mount 的 discard 选项)

grep discard /etc/fstab

如果 mount 未开启 discard,SSD/NVMe 盘的写操作会大幅降速

为两台主机关闭防火墙和 selinux

sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
sudo systemctl disable --now firewalld

6.4 安装依赖 NFS

# 对应 powertools, RHEL8 需要自行安装相应仓库以安装 gflags
sudo yum install yum-utils -y
sudo yum config-manager --set-enabled powertools
sudo yum install libaio gflags libcurl nfs-utils liburing -y
sudo yum install -y snappy zlib bzip2 lz4

6.5 开启 NFS 共享

假设 /disk1 为格式化并挂载后的磁盘 在 mytopling-instance-1 上执行

mkdir -p /mnt/mynfs/datadir/mytopling-instance-1

mytopling-instance-2 上执行

mkdir -p /mnt/mynfs/datadir/mytopling-instance-2

两台主机分别执行:

echo "/mnt/mynfs *(rw,async,no_root_squash,fsid=1)" >> /etc/exports
# 增加服务器线程数
sudo sed -i  's|#\[nfsd\]|\[nfsd\]|g' /etc/nfs.conf
sudo sed -i  's/# threads=8/threads=64/g' /etc/nfs.conf
sudo systemctl enable --now nfs-server

6.6 部署 MyTopling 程序

映射共享磁盘到对应位置,和程序安装位置相同,或者自行挂载磁盘到 /mnt/mynfs

sudo mkdir /mnt/mynfs
# 如果你的磁盘不是 /disk1,将 disk1 换成你的nvme磁盘实际挂载位置
# 或者直接将磁盘挂载到 /mnt/mynfs 也可以, 这时不需要追加内容到 fstab
sudo bash -c "echo '/disk1 /mnt/mynfs none defaults,bind 0 0'" >> /etc/fstab
mount -a

mytopling-rhel8-haswell.tar.gz 文件,社区版可自行编译

企业版请联系客服获取。 安装 mytopling:

# 运行完之后 /mnt/mynfs/opt/ 下应该是 MyTopling 的程序文件
tar xf mytopling-rhel8-haswell.tar.gz -C /mnt/mynfs/opt

6.2 启动数据库

这里提供使用弹性伸缩时的 MyTopling 主从配置。 调用下面指令启动两个数据库:

sudo bash /mnt/mynfs/opt/mytopling-depoly/Elastic-Dcompact/community/start-mytopling-instance-1.sh
sudo bash /mnt/mynfs/opt/mytopling-depoly/Elastic-Dcompact/community/start-mytopling-instance-2.sh
# 企业版用户使用
# sudo bash mytopling-depoly/Elastic-Dcompact/enterprise/start-mytopling-instance-1.sh
# sudo bash mytopling-depoly/Elastic-Dcompact/enterprise/start-mytopling-instance-2.sh

注意 mytopling-instance-1和mytopling-instance-2 两台服务器都使用了 dcompact服务,所以他们

上述配置中的 dcompact 服务器可以给更多的 MyTopling 实例提供服务,注意保证每个 MyTopling 实例的 json 配置文件中的 insatnce-name 在使用同一 dcompact 的集群中全局唯一