编译
运行环境
Architecture:aarch64
OS:ubuntu 18.04
kernel:4.15.0-45-generic
go:1.12.7
安装依赖并配置环境
go版本要求为Go 1.12+。不管是MySQL 5.6 或者MySQL 5.7,环境变量MYSQL_FLAVOR都应设置为MySQL56,设置为MySQL57会出错。
更改bootstrap.sh和dev.env
下载源代码,根据part 1更改文件bootstrap.sh和dev.env。
执行编译
运行local用例
安装MySQL
首先需要安装mysql-server,在上面的步骤中我们已经安装了MySQL5.7。
关闭AppArmor
某些MySQL版本默认的AppArmor配置不能被Vitess识别。如果没有关闭,可能会遇到下面的错误
使用下面命令将AppArmor关闭,并重启机器以确保其生效。
或者将mysqld设置为complain模式
修改ETCD_BINDIR
ETCD_BINDIR默认为"{VTROOT}/dist/etcd/etcd-{ETCD_VERSION}-{etcd_platform}-amd64/"。切换到{HOME}/gopath/src/vitess.io/vitess/examples/local目录下
将env.sh的设置ETCD_BINDIR的行替换为下面命令
运行local cluster
如果运行成功,我们将看到下面的内容
连接mysql,并插入数据
为mysql设置默认配置,mysql命令可以直接连接MySQL服务,
安装和运行firefox浏览器,输入下面的url就可以web访问vtcld了
垂直分割
创建一个新的数据库customer,将数据库commerce中的表customer和product迁移到数据库customer中。删除commerce中的表customer和product。
201_customer_keyspace.sh创建新的数据库customer;
202_customer_tablets.sh为数据库customer启动tablet(replica,replica,rdonly),并选择其中一个replica为master,数据库customer刚创建时没有数据,传给它的请求会重定向到commerce;
203_vertical_split.sh从commerce数据库中将表customer和product拷贝到customer中;
204_vertical_migrate_replicas.sh使传给数据库customer的replica和rdonly tablet的请求直接由customer处理,不再重定向给commerce;
205_vertical_migrate_master.sh使传给数据库customer的master tablet的请求直接由customer处理,不再重定向给commerce;
206_clean_commerce.sh删除commerce数据库中的表customer和product。
水平分割
customer数据库没有分片,当业务量增大到一定程度后,MySQL的性能会达到瓶颈。我们可以对其进行水平分割,即分片,根据列的大小将表分割成多个。本例中将分成-80和-80两个分片。
序列号
表customer和order中有自增列,当分片时,不能很好地运行,Vitess提供了一个替代方案,序列表。序列表时一个未分片的单行表,Vitess可以产生单调增的id。VSchema允许您将表的列与序列表相关联。完成此操作后,该表上的插入将透明地从序列表中获取ID,填写值,然后将行路由到适当的分片。
序列表是未分片的表,因此将被存储在commerce数据库中。序列表的结构如下:
注意创建表语句中的“vitess_sequence” comment,VTTablet将使用该元数据将该表当作是序列号。
id总是0;
next_id设置为1000,该值应大于目前所使用的auto_increment的最大值;
cache指定VTTablet更新next_id前,缓冲值的个数
较大的缓存值性能较好,但会更快用尽这些值,因为在reparent操作期间,新的主服务器将从next_id值开始。更新VSchema告知VTGate服务器这些序列表
Vindexs索引
下一个需要确定的是分片键,即主索引,这是一个复杂的决定,需要考虑下面的问题:
哪些是最高QPS查询,这些查询的where语句是什么
列的基数,基数必须高,即列的可取值多
我们是否希望将同一事务中的某些行放在一起?
我们是否希望某些行在一起以支持分片内联接?
在本例中customer和order表都将选择customer_id作为主索引,数据库customer的VSshema如下:
按照下面步骤进行水平分片:
运行下面的命令,使上面的决定生效
创建新的分片
将已存在的分片分割成更小的分片,Shard 0 已经存在,下面命令将添加两个新的分片-80和80-。CopySchema将直接将schema从shard 0拷贝到新的shard中。
-80和80-有什么含义呢?
代表一个范围,左边-的是包含80,右边-是不包含80
它们的表示法为十六进制
前缀-:小于右值的所有值
后缀-:大于等于左值的所有值
单个-:表示所有值
水平分割
本过程于为split clone,于 VerticalSplitClone 类似
迁移服务
与垂直分割中的migrate类似,将请求从shard 0 迁移到shard -80和shard 80-。
关闭并删除shard 0
原作者:Jiamei