云卷云舒:云原生数据库系列-Vitness

#云原生数据库# 

#Vitness#

一、Vitess是什么

Vitess是一个用于部署、扩展和管理大型mysql实例集群的数据库解决方案。它的架构是在公共或私有云架构中高效运行,就像在专用硬件上一样。它结合并扩展了许多重要的mysql特性和nosql数据库的可伸缩性。


二、Vitess可以解决以下问题:
1. 实现MYSQL的分片,应用只需很少的更改或无需更改
2. 部署和管理大型数据库集群实例
3. 裸设备到云的迁移


三、Vitess相对MySQL改进

MySQL Vitness
每个MySQL连接的内存开销都在256KB到
3MB之间,具体取决于您使用的是哪个
MySQL版本。随着用户群的增长,您需要添
加RAM来支持更多连接,但RAM无助于加快
查询速度。另外,与获取连接相关的CPU成本
也很高。
Vitess基于gRPC的协议创建了非常轻量级的连接。
Vitess的连接池功能使用Go的并发支持将这些轻量级
连接映射到一小群MySQL连接。因此,Vitess可以轻
松处理数千个连接。
编写不好的查询(如未设置LIMIT的查询)可
能会对所有用户的数据库性能产生负面影响。
Vitess采用SQL解析器,使用一组可配置的规则来重
写可能会损害数据库性能的查询。
分区是对数据进行分区以提高可伸缩性和性能
的过程。MySQL缺乏本地分片支持,要求您
编写分片代码并在应用程序中嵌入分片逻辑。
Vitess支持各种分片方案。它还可以将表迁移到不同
的数据库中,并扩大或缩小碎片的数量。这些功能是
非侵入式执行的,只需几秒钟的只读停机时间即可完
成大部分数据转换。
使用可用性复制的MySQL集群具有主数据库
和一些副本。如果主人失败,副本应该成为新
的主人。这要求您管理数据库生命周期并将当
前系统状态传达给您的应用程序。
Vitess有助于管理数据库场景的生命周期。它支持并
自动处理各种场景,包括主站故障切换和数据备份。
MySQL群集可以为不同的工作负载定制数据
库配置,例如用于写入的主数据库,用于
Web客户端的快速只读副本,批处理作业的
较慢只读副本等等。如果数据库具有水平分
片,则每个分片都会重复该设置,并且该应用
需要插入逻辑以了解如何找到正确的数据库。
Vitess使用由一致数据存储支持的拓扑,如etcd或
ZooKeeper。这意味着群集视图始终是最新的,并且
对于不同的客户端是一致的。Vitess还提供了一个代
理,可以有效地将查询路由到最合适的MySQL实
例。

四、Vitess整体架构

  • Topology

Topology服务是一个包含服务器信息,分片方案和主从信息的元数据信息存储服务。Topology服务是基于一致性存储方案来实现数据一致
性,例如:zookeeper和etcd。用户可以通过使用vtctl(命令行)和vtctld(web)访问Topology。

  • vtgate

vtgate是一个轻量代理服务器,它将查询路由到正确的vttablet并将合并的结果返回给客户端。vtgate接收到请求时会对sql进行解析,根据
Topology服务中的元数据判断路由到哪个vttablet;
vtgate是直接接受应用程序发起的查询的服务。因为客户端只需要能够找到一个vtgate实例即可正常访问,所以客户端的实现可以非常简
单。

  • vttablet

vttablet是一个位于MySQL数据库实例前面的代理服务器,并且要求与对应的MYSQL实例部署在同一个Pod上。在JED中对于每个MySQL
实例对应的都有一个Tablet实现。

  • vtctl

vtctl是用于管理弹性数据库集群的命令行工具。它允许人或应用程序轻松地与弹性数据库实现交互。通过Vtctl可以标识主从数据库, 创建
表, 启动故障转移, 执行分片(重新分片)等操作。

  • vtctld

vtctld是一个HTTP服务器,允许您浏览存储在锁服务器中的信息。

  • vtworker

vtworker负责处理长时间运行的进程。如:
1. 在分片分割和连接过程中重新划分不同的作业检查数据完整性
2. 垂直分割不同作业检查垂直分割和连接期间的数据完整性

  • vtctlclient

通过客户端进行基本功能的校验。
使用方法:vtctlclient ­server 127.0.0.1:15999 command param

五、Vitess的使用方式
Vitess借助Kubernetes能更好的实现逻辑库及节点管理。
Kubernetes 是 Google 开源的 Docker 容器集群管理系统,Vitess 是 Kubernetes 用户的逻辑存储引擎的一个可选项。
Kubernetes 对一个计算集群中的节点进行调度,对这些节点之上的负载进行管理,并对包含有同一应用的容器进行分组以易于管理和发
现。使用 Kubernetes,你可以很容易去创建和管理一个 Vitess 集群,可谓开箱即用。

关键点

特性
keyspace keyspace 是逻辑上的数据库,在非shard场景下,

个keyspace对应一个MYSQL DataBase。从
Keyspace中读取数据和从一个MYSQL DataBase中
读取数据很像。但是根据读取数据时不同的一致性
要求,可以从一个master database或者从一个
replica读取数据。当一个keySpace被sharding成
多个Shard时,一个keyspace会对应多个MYSQL
database。在这种情况下一个查询会被路由到一个
或者多个shard上,这取决于请求的数据所在的位
置。
shard 个shard就是在一个keyspace中的一个
horizontal partition 。每个 shard 都会包含一个
master实例和多个replica实例,目前一个shard包
含一个Master实例,一个Replica实例和一个
ReadOnly实例,但是若支持半同步复制则需要在一
个Shard中包含一个Master实例,两个Replica实例
和一个ReadOnly实例。而且不同的shard之间绝对
不会存在数据重叠的现象。
master 主库提供读写服务
replicate 提供读服务,缓解主库读压力
rdonly 会与主库断开复制,允许异步的服务(备份、分
析)使用

上面可以看出一个KeySpace可以跨越多个Mysql实例,而且每个Shard中的数据都是KeySpace中的一个数据子集,一个KeySpace由分散在各个Shard中的数据子集组成。

每个Shard在物理硬件上由多个MySQL实例和Tablet实例组成,一个shard具体包括:一个Master Mysql实例、一个Replica MySQL实例、一个ReadOnly MySQL实例和三个Tablet实例。


Vindexes分片键(路由)的设置
选择作为分片键的字段值应尽量唯一;在路由计算之前先将Sharding Key转换成字节数组,[0x80]是Sharding key的一个中间值。比如一个KeySpace如果有两个Shard,如果Sharding key对应的字节数组小于0x80的可以落到一个Shard上,大于或等于0x80则落到另一个Shard上。
 

注:云原生数据库的学习笔记,部分内容来自网络,如涉及侵权请您留言,我会立刻处置。

猜你喜欢

转载自blog.csdn.net/bishenghua/article/details/134969389