1. Cell
Cell是一组服务器或者一片基础设置区域,用来做故障隔离的最小单位; Cell可以是一个完整的数据中心也可以是数据中心的一个区域(子集),或者一个逻辑拆分区域; 通常称作为Zone或者Area Zone。Vitess可以优雅的处理单个Cell故障的情况,比如网络故障或者机房掉电
单个机房故障的问题在3.0测试失败,无法自动切换过去,手动处理可以切换过去,6.0待测试
2. Execution Plans
vtgate和vttablet上都会做sql解析目的是获取最佳的执行方式,这个计算过程称作查询计划; 计算完成生成的结果是查询执行计划;
执行计划依赖于查询语句和VSchema路由信息,Vitess执行计划策略一个基本目标是尽可能减少底层MySQL实例的工作负载,对于跨分片的查询,vitess对多个源库的数据进行聚合然后返回正确的查询结果
执行计划的查看
页面查看 http://127.0.0.1:15001/debug/queryz
命令查看
mysql> EXPLAIN FORMAT=vitess select * from corder;
+----------+-----------------+----------+-------------+------------+----------------------+
| operator | variant | keyspace | destination | tabletType | query |
+----------+-----------------+----------+-------------+------------+----------------------+
| Route | SelectUnsharded | commerce | | UNKNOWN | select * from corder |
+----------+-----------------+----------+-------------+------------+----------------------+
mysql> EXPLAIN FORMAT=vitess select * from customer;
+----------+---------------+----------+-------------+------------+------------------------+
| operator | variant | keyspace | destination | tabletType | query |
+----------+---------------+----------+-------------+------------+------------------------+
| Route | SelectScatter | customer | | UNKNOWN | select * from customer |
+----------+---------------+----------+-------------+------------+------------------------+
mysql> EXPLAIN FORMAT=vitess select * from customer where customer_id=1;
+----------+-------------------+----------+-------------+---------------------------------------+
| operator | variant | keyspace | destination | tabletType | query |
+----------+-------------------+----------+-------------+------------+--------------------------+
| Route | SelectEqualUnique | customer | | UNKNOWN | select * from customer where customer_id = 1
| +----------+-------------------+----------+-------------+------------+------------------------+
mysql> EXPLAIN FORMAT=vitess select now();
+----------+-----------------+----------+-------------+------------+------------------------+
| operator | variant | keyspace | destination | tabletType | query |
+----------+-----------------+----------+-------------+------------+------------------------+
| Route | SelectReference | commerce | | UNKNOWN | select now() from dual |
+----------+-----------------+----------+-------------+------------+------------------------+
- Keyspace
Keyspace是逻辑库信息,在非拆分状态下,一个逻辑库对应后端一个mysql物理库;在拆分状态下,一个逻辑库对应多个mysql物理库;从应用程序的角度来看,不管一个keyspace是单分片(1个Mysql集群)还是多分片(多个Mysql集群),在keyspace上的所有操作,和操作普通MYSQL库没有任何区别,应用感知不到分片的概念。
单分片:
多分片:
- Keyspace Graph
Vitess 使用keyspace graph 记录Cell下有多少keyspaces,每个keyspace下有多少shard,每个shard下有多少个tablet,每个tablet的类型是什么。
Partitions
在水平拆分(将表数据通过路由重新打散到各个新分片的)过程中,会出现具有重叠范围的分片。例如,拆分的源分片范围“0”,而其目标分片的范围是“-80”和“80-”;
由于这些分片在迁移期间需要同时存在,因此keyspace graph维护一套分片的列表(也称分区),其范围涵盖所有可能的keyspace ID值,同时不重叠且连续。分片可以移入和移出此列表确定它们是否有效。
partitions: <
served_type: MASTER
shard_references: <
name: "-80"
key_range: <
end: "\200"
>
>
shard_references: <
name: "80-"
key_range: <
start: "\200"
>
>
>
partitions: <
served_type: REPLICA
shard_references: <
name: "-80"
key_range: <
end: "\200"
>
>
shard_references: <
name: "80-"
key_range: <
start: "\200"
>
>
>
partitions: <
served_type: RDONLY
shard_references: <
name: "-80"
key_range: <
end: "\200"
>
>
shard_references: <
name: "80-"
key_range: <
start: "\200"
>
>
>
Served From
在垂直拆分期间(将源keyspace中的某个表移到新的keyspace中),多个keyspace会同时共存同样的表。
对于每个 (cell, tablet type)
元组会有不同的ServedFrom
追踪. 这允许迁移分阶段进行:首先迁移rdonly和replica请求,一次一个单元,最后迁移master请求
5. MoveTables
MoveTables是基于VReplication的新工作流,他可以支持无需停机的情况在在多个逻辑库上迁移表数据
7. VSchema
用于描述如何在keyspace和分片中存储数据。Vschma用于带路由键的SQL查询,也用于拆分分片操作。
拆分路由:
{
"sharded": true,
"vindexes": {
"hash": {
"type": "hash"
}
},
"tables": {
"customer": {
"column_vindexes": [
{
"column": "customer_id",
"name": "hash"
}
],
"auto_increment": {
"column": "customer_id",
"sequence": "customer_seq"
}
},
"corder": {
"column_vindexes": [
{
"column": "customer_id",
"name": "hash"
}
],
"auto_increment": {
"column": "order_id",
"sequence": "order_seq"
}
}
}
}
非拆分表设置:
{
"sharded": true,
"vindexes": {
"hash": {
"type": "hash"
}
},
"tables": {
"customer": {
"column_vindexes": [
{
"column": "customer_id",
"name": "hash"
}
],
"auto_increment": {
"column": "customer_id",
"sequence": "customer_seq"
}
},
"unshard_table": {
"pinned": "00"
}
}
}
- VStream
VStream是可通过VTGate访问的变更通知服务,VStream的目的是从Vitess集群的基础MySQL分片提供与MySQL二进制日志等效的信息;单个VStream还可以合并逻辑库中多个分片中的变更事件,从而使其成为在Vites数据存储下游提供CDC(Change Data Capture)过程的便捷工具。
- VTGate
网关高可用拓扑图如下,正常情况下,各机房的应用优先使用各自机房的网关服务,网关服务可以自动把读写请求路由到跨机房的主库上进行操作; 只读请求会落到本cell的从库上,不会跨cell提供读取服务
同时ORC服务需要是跨多机房高可用,这样如果单个机房故障后ORC可以在其他可用机房提升可用的从库为主库,继续提供服务。这个过程中未故障的机房的应用不用做任何操作; 具备多机房高可用就需要增加集群的副本数
副本数需要变成一主3从, master+replica(同机房)+replica(跨机房)+rdonly(同机房跨机房均可)