vitess基本概念介绍


1. Cell

Cell是一组服务器或者一片基础设置区域,用来做故障隔离的最小单位; Cell可以是一个完整的数据中心也可以是数据中心的一个区域(子集),或者一个逻辑拆分区域; 通常称作为Zone或者Area Zone。Vitess可以优雅的处理单个Cell故障的情况,比如网络故障或者机房掉电

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 |
+----------+-----------------+----------+-------------+------------+------------------------+
  1. Keyspace

Keyspace是逻辑库信息,在非拆分状态下,一个逻辑库对应后端一个mysql物理库;在拆分状态下,一个逻辑库对应多个mysql物理库;从应用程序的角度来看,不管一个keyspace是单分片(1个Mysql集群)还是多分片(多个Mysql集群),在keyspace上的所有操作,和操作普通MYSQL库没有任何区别,应用感知不到分片的概念。

单分片:

单分片

多分片:

多分片

  1. 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追踪. 这允许迁移分阶段进行:首先迁移rdonlyreplica请求,一次一个单元,最后迁移master请求

5. MoveTables

MoveTables是基于VReplication的新工作流,他可以支持无需停机的情况在在多个逻辑库上迁移表数据

MoveTables

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"
    }
  }
}
  1. VStream

VStream是可通过VTGate访问的变更通知服务,VStream的目的是从Vitess集群的基础MySQL分片提供与MySQL二进制日志等效的信息;单个VStream还可以合并逻辑库中多个分片中的变更事件,从而使其成为在Vites数据存储下游提供CDC(Change Data Capture)过程的便捷工具。

vstream

  1. VTGate

网关高可用拓扑图如下,正常情况下,各机房的应用优先使用各自机房的网关服务,网关服务可以自动把读写请求路由到跨机房的主库上进行操作; 只读请求会落到本cell的从库上,不会跨cell提供读取服务

同时ORC服务需要是跨多机房高可用,这样如果单个机房故障后ORC可以在其他可用机房提升可用的从库为主库,继续提供服务。这个过程中未故障的机房的应用不用做任何操作; 具备多机房高可用就需要增加集群的副本数

副本数需要变成一主3从, master+replica(同机房)+replica(跨机房)+rdonly(同机房跨机房均可)

网关拓扑


文章作者: perfect-geek
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 perfect-geek !
评论
  目录