ARM技术论坛
直播中

风来吴山

8年用户 1386经验值
擅长:电源/新能源
私信 关注
[经验]

在arm机器上如何编译vitess并运行local用例呢

编译

运行环境

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

更多回帖

发帖
×
20
完善资料,
赚取积分