手把手部署原生vitess集群(非k8s部署)(代码片段)

境悟初 境悟初     2023-02-20     545

关键词:

最近研究分布式的关系型数据库扩展方案,vitess是youtube开源的中间件,基于mysql实现的分布式分库分表方案。相对于ShardingSphere,ProxySQL,maxscale,vitess的部署是最复杂的。本文经过实践,将vitess的集群部署过程记录下来。
一般vitess是通过k8s来部署,但是想了解细节,还是走一遍原生部署,会加深对整个架构的理解。

首先需要看懂 vitess的架构图,也和部署紧密相关。
关于vitess的这些概念,基本上都是全新的,可以参考官方文档:https://vitess.io/docs/concepts/,本文着重在部署实践,概念的翻译已经有很多博客了。

总共就5个服务:

  • Topo Server
  • vtctld
  • VTGate
  • VTTablet
  • MySQL

其中 VTTablet和MySQL成对出现,需要部署多个实例。

部署参考官方文档:https://vitess.io/docs/user-guides/configuration-basic/,经过浓缩与简化,细节请阅读原文档。

准备

本次部署在一台叫 node02的节点上进行,你可能会问,只有一台机器吗?是的,虽然是集群部署,在组件可以先部署一台机器,然后进行扩展,而扩展集群,请见下一篇博文。

包准备

下载vitess二进制包:https://github.com/vitessio/vitess/releases

在每台机器上都放上这个包,建立vitess的数据目录:

mkdir -p /extra/server/vitess
scp vitess-12.zip root@node01:/extra/server/vitess

cd /extra/server/vitess
unzip /extra/server/vitess/vitess-12.zip

mkdir -p /extra/vt-data/tmp

环境准备

使用非root用户

因为vitess命令不允许root用户运行,所以我们建立vitess用户来跑。

下面所有操作都在非root用户下,这里使用vitess。

chown -R vitess:vitess /extra/vt-data/
chown -R vitess:vitess /extra/server/vitess

一般机器上的mysql目录都是mysql用户权限的,所以将vitess用户加入mysql用户组,才能访问mysql的文件


# 将vitess用户加入mysql组,才能读取mysql目录
usermod -aG mysql vitess

注意:以下操作都是在vitess用户下进行的。

环境变量

  • VTDATAROOT: mysql数据存储目录,默认 /vt,需要改成挂载盘
  • VT_MYSQL_ROOT: mysqld目录

全部机器上执行:

echo "export PATH=/extra/server/vitess/vitess-12/bin:\\$PATH" >> ~/.bashrc
echo "export VTDATAROOT=/extra/vt-data" >> ~/.bashrc
echo "export VT_MYSQL_ROOT=/opt/mysql/mysql-5.7.26-linux-glibc2.12-x86_64" >> ~/.bashrc
# 连接 vtctld 的客户端,不需要起服务,但最好配下别名简化命令。
echo 'alias vtctlclient="command vtctlclient -server node02:15999 -log_dir $VTDATAROOT/tmp -alsologtostderr"' >> ~/.bashrc
# 10.16.9.234:2379是etcd服务的地址,下面会提
echo "export TOPO_SERVER=10.16.9.234:2379" >> ~/.bashrc
source ~/.bashrc

备份参数

备份目录需要是个共享存储(S3,ceph,google云存储等),参考文档:https://vitess.io/docs/user-guides/operating-vitess/backup-and-restore/backup-and-restore/

-backup_storage_implementation file -file_backup_storage_root <mounted_path_dir>

后面简写为 <backup_flags>.
生产环境肯定是需要备份的,我们这里暂时不要备份,如果需要,加上这段参数即可。

日志目录

每个vitess组件都配

-log_dir=$VTDATAROOT/tmp

全局拓扑服务

支持ZK和etcd,我们选etcd,启用V2版本的API。

参数:

-topo_implementation=etcd2 -topo_global_server_address=$TOPO_SERVER -topo_global_root=/vitess/global

后面简写为:<topo_flags>.

vtctld

管理服务后端进程,可以起多个。

vtctld -topo_implementation=etcd2 -topo_global_server_address=$TOPO_SERVER -topo_global_root=/vitess/global \\
  -log_dir=$VTDATAROOT/tmp \\
  -port=15000 \\
  -grpc_port=15999 \\
  -service_map='grpc-vtctl' \\
  -pid_file $VTDATAROOT/tmp/vtctld.pid \\
  > $VTDATAROOT/tmp/vtctld.out 2>&1 &

15000端口用于界面访问,15999用于客户端访问。

cell

可以认为是牢房(地区、数据中心等可以建多个),用于隔离作用,我们这里用一个cell足够。

vtctlclient AddCellInfo \\
  -root /vitess/cell1 \\
  -server_address $TOPO_SERVER \\
  cell1

cell的注册中心目录是单独的,如果复用一个拓扑服务器,目录要区分

vttablet和MySQL

这俩配对出现,同一台机器部署。

table-uid 全局唯一的int32整数

mysql

很方便的起一个mysql

mysqlctl \\
  -log_dir=$VTDATAROOT/tmp \\
  -tablet_uid=100 \\
  -mysql_port=17100 \\
  init

要设置额外的参数:

EXTRA_MY_CNF=”/path/to/common.cnf” mysqlctl \\
  -log_dir=$VTDATAROOT/tmp \\
  -tablet_uid=100 \\
  -mysql_port=17100 \\
  init

测试mysql是否启动成功:

$ mysql -S $VTDATAROOT/vt_0000000100/mysql.sock -u vt_dba
[snip]
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| _vt                |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

vttablet

  • table-path: cell名字-table-uid

这里的一堆参数见:https://vitess.io/docs/user-guides/configuration-basic/vttablet-mysql/#starting-vttablet

vttablet -topo_implementation=etcd2 -topo_global_server_address=$TOPO_SERVER -topo_global_root=/vitess/global \\
  -log_dir=$VTDATAROOT/tmp \\
  -tablet-path=cell1-100 \\
  -tablet_hostname=node02 \\
  -init_keyspace=commerce \\
  -init_shard=0 \\
  -init_tablet_type=replica \\
  -port=15100 \\
  -grpc_port=16100 \\
  -service_map 'grpc-queryservice,grpc-tabletmanager' \\
  -enable_semi_sync=false \\
  -enable_replication_reporter=false \\
  -restore_from_backup=false \\
  -queryserver-config-pool-size=16 \\
  -queryserver-config-transaction-cap=300 \\
  -queryserver-config-stream-pool-size=16 \\
 -pid_file $VTDATAROOT/tmp/vttablet.pid \\
 > $VTDATAROOT/tmp/vttablet.out 2>&1 &

查看所有 tablets

$ vtctlclient ListAllTablets
cell1-0000000100 commerce 0 replica node02:15100 node02:17100 [] <null>

删除tablet

vtctlclient DeleteTablet cell1-100

扩展

在多个节点都部署 mysql和vttablet, 方法是一样的, vitess的分布式就体现在这。

选主

vtctlclient \\
  InitShardPrimary \\
  -force \\
  commerce/0 \\
  cell1-100

然后再看现在的情况:

$ vtctlclient ListAllTablets
cell1-0000000100 commerce 0 primary node02:15100 node02:17100 [] 2021-11-22T03:53:59Z

vtgate

接收请求的入口服务,建议起多个,而且是一台机器上起多个(更好利用go的垃圾回收)。

/extra/server/vitess 下建立 mysql_creds.json 文件:


  "test": [
     
      "Password": "VitessDB2021",
      "UserData": "test"
    
  ]

启动vtgate服务

vtgate -topo_implementation=etcd2 -topo_global_server_address=$TOPO_SERVER -topo_global_root=/vitess/global \\
  -log_dir=$VTDATAROOT/tmp \\
  -cell=cell1 \\
  -cells_to_watch=cell1 \\
  -port=15001 \\
  -mysql_server_port=15306 \\
  -tablet_types_to_wait PRIMARY,REPLICA \\
  -mysql_auth_server_impl=static \\
  -mysql_auth_server_static_file=mysql_creds.json \\
  -grpc_port=15991 \\
  -service_map='grpc-vtgateservice' \\
  -vschema_ddl_authorized_users='%' \\
  -pid_file $VTDATAROOT/tmp/vtgate.pid \\
   > $VTDATAROOT/tmp/vtgate.out 2>&1 &

连接测试:

$ mysql -h 127.0.0.1 -P 15306 -utest -pVitessDB2021
Welcome to the MariaDB monitor.  Commands end with ; or \\g.
Your MySQL connection id is 2
Server version: 5.7.9-vitess-12.0.0 Version: 12.0.0 (Git revision de06fca branch 'HEAD') built on Tue Oct 26 11:54:28 UTC 2021 by runner@fv-az198-353 using go1.17.2 linux/amd64

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| commerce           |
| information_schema |
| mysql              |
| sys                |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)

可以看到,有一个commerce数据库,commerce就是keyspace,在vitess中,相当于一个逻辑数据库,下一篇扩展集群时,会根据 keyspace id来划分数据。

至此,一个集群就搭建完了,目前只有一个mysql数据节点。访问入口是 vtgate服务,就和连接mysql一样连接。

半小时体验云原生:手把手教你在k8s上部署springboot应用——干货分享,建议收藏(代码片段)

你会不会对“云原生”很有兴趣,却不知道从何入手?本文会在window环境下,构建一套基于k8s的istio环境,并且通过skaffold完成镜像的构建和项目部署到集群环境。其实对于实验环境有限的朋友们,完全可以在... 查看详情

云原生之kubernetes实战使用sealos部署k8s集群环境

【云原生之kubernetes实战】使用Sealos部署k8s集群一、Sealos介绍1.Sealos简介2.Sealos特性3.Sealos图示二、本地k8s节点环境1.节点规划2.节点系统版本三、下载Sealos工具包四、初始环境配置1.关闭防火墙和selinux2.配置host文件解析3.配置时间... 查看详情

云原生之kubernetes实战使用sealos部署k8s集群环境

【云原生之kubernetes实战】使用Sealos部署k8s集群一、Sealos介绍1.Sealos简介2.Sealos特性3.Sealos图示二、本地k8s节点环境1.节点规划2.节点系统版本三、下载Sealos工具包四、初始环境配置1.关闭防火墙和selinux2.配置host文件解析3.配置时间... 查看详情

云原生之kubernetes实战在k8s集群环境下部署tomcat应用

【云原生之kubernetes实战】在k8s集群环境下部署Tomcat应用一、检查本k8s集群环境1.检查k8s版本2.检查工作节点系统版本二、检查k8s集群状态1.检查工作节点状态2.检查系统pod状态三、部署mysql服务1.编辑mysql.yaml2.应用mysql.yaml3.查看pod... 查看详情

云原生之kubernetes实战在k8s下部署redis集群

【云原生之kubernetes实战】在k8s下部署Redis集群一、检查本地k8s集群环境1.检查工作节点状态2.检查系统pod状态二、安装helm工具1.下载helm二进制包2.解压压缩包3.复制文件4.查看helm版本5.helm命令补全三、部署NFS服务1.安装nfs2.创建共... 查看详情

云原生|kubernetes-kubeadm部署k8s集群(超详细)(代码片段)

...tes社区为了方便普通用户学习k8s,发起的一个简单上手的部署工具。不用把大量时间花费在搭建集群上面。只需通过两条命令就可以部署一个k8s集群#创建一个Master节点$kubeadminit#将一个Node节点加入到当前集群中$kubeadmjoin安装Kubead... 查看详情

云原生之kubernetes实战使用kubeadm部署k8s集群环境

【【云原生之kubernetes实战】使用kubeadm部署k8s集群环境一、环境规划1.节点系统版本2.集群节点IP规划二、安装docker1.安装docker2.启动docker服务3.开启路由转发4.设置镜像加速5.重启docker服务6.卸载docker方法(补充可选)三、环境配置1... 查看详情

云原生之kubernetes实战部署k8s集群管理平台wayne

【云原生之kubernetes实战】部署k8s集群管理平台Wayne一、Wayne平台介绍1.Wayne简介2.Wayne特点3.Wayne架构二、检查本地docker状态1.检查docker版本2.检查docker状态三、安装docker-compose1.安装docker-compose2.给docker-compose文件添加执行权限3.查看doc... 查看详情

云原生之kubernetes实战在k8s集群下部署wordpress(代码片段)

【云原生之kubernetes实战】在k8s集群下部署wordpress一、wordpress介绍1.wordpress简介2.wordpress的优点3.wordpress使用场景二、检查本地kubernetes集群状态三、配置nfs共享存储1.安装nfs2.创建共享目录3.配置共享目录4.使配置生效5.重启nfs相关服... 查看详情

云原生之kubernetes实战使用helm在k8s集群下部署dataease可视化分析平台

【云原生之kubernetes实战】使用helm在k8s集群下部署DataEase可视化分析平台一、DataEase介绍1.DataEase简介2.DataEase特点3.DataEase的技术栈4.DataEase的优势5.DataEase的基本架构二、检查本地k8s状态1.检查kubernetes节点状态2.检查系统pod状态三、... 查看详情

云原生之kubernetes实战部署octant开源可视化k8s管理平台

【云原生之kubernetes实战】部署Octant开源可视化k8s管理平台一、Octant介绍1.Octant简介2.Octant特点二、检查k8s状态1.检查工作节点状态2.检查pod状态三、下载软件包四、安装Octant--vmware五、octant命令帮助六、配置访问路径1.配置访问路... 查看详情

云原生kubernetesk8s集群部署springboot项目(代码片段)

...;模拟一个比较接近实际业务的使用场景,使用k8s集群部署一个springboot的项目,我们的需求是:部署SpringBoot项目到阿里云服务器 ;基于容器打包,推送私有镜像仓库;采用K8S集群部署,对外暴露服务&#... 查看详情

云原生kubernetes部署k8s集群架构(admin部署)(代码片段)

kubeadmv1.20部署K8S集群架构前言主机规划一、环境初始化1.1检查操作系统版本1.2主机名解析1.3时间同步1.4禁用iptables和firewalld1.5禁用selinux1.6禁用swap分区1.7修改linux内核参数1.8配置ipvs功能1.9重启服务器二、安装docker三、安装kubenetes... 查看详情

云原生之kubernetes实战使用yum方式部署kubernetes集群

【云原生之kubernetes实战】使用yum方式部署kubernetes集群一、环境规划1.节点IP规划2.本次k8s部署介绍二、环境检查1.检查docker状态2.检查节点系统版本3.检查防火墙状态三、安装前环境配置工作1.关闭swap2.开启内核对流量转发3.关闭sel... 查看详情

k8s

原生Kubernetes云平台部署1.部署架构Kubernetes(简称K8S)是开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。它既是一款容器编排工具,也是全新的基于容器技术的分布式架构领先方案。在Docke... 查看详情

云原生之kubernetes实战kubernetes集群的证书管理

...、检查k8s集群状态三、检查相关证书过期时间1.查看sealos部署的k8s集群证书过期时间2.查看kubeadm部署的k8s集群过期时间3.证书有效期分析四、备份相关证书和配置文件1.生成集群备份文件2.备份原证书3.备份etcd数据目录五、控制面... 查看详情

云原生之kubernetes实战使用docker作为运行时部署kubernetes集群

【云原生之kubernetes实战】使用docker作为运行时部署Kubernetes集群一、cri-dockerd介绍1.cri-dockerd简介2.cri-dockerd代码托管地址二、k8s集群环境规划三、k8s集群环境准备工作1.设置主机名及hosts文件解析2.关闭防护墙和selinux3.关闭swap4.配置... 查看详情

云原生之kubernetes实战使用docker作为运行时部署kubernetes集群

【云原生之kubernetes实战】使用docker作为运行时部署Kubernetes集群一、cri-dockerd介绍1.cri-dockerd简介2.cri-dockerd代码托管地址二、k8s集群环境规划三、k8s集群环境准备工作1.设置主机名及hosts文件解析2.关闭防火墙和selinux3.关闭swap4.配置... 查看详情