关键词:
最近研究分布式的关系型数据库扩展方案,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.配置... 查看详情