vitess使用记录:vtctldclient,设置分表规则
继续探索未完成的事情。
vitess使用记录系列已经写了好几篇了,记录了在测试过程中遇到的各种问题。《vitess使用:从部署到go客户端连接查询》、《vitess使用记录:vtctldclient》、《vitess使用:基于源码运行vtctldclient工具》整个系列不具备很强的逻辑性,待我熟悉了这个开源组件之后,再做详细且完备的梳理。
这篇文章,先说明一下如何设置分表规则,再记录遇到的问题。
规则设置
使用 ApplyVSchema
的步骤
-
配置 VSchema 文件:将你的 JSON VSchema 配置保存到一个文件中,例如
vschema.json
。
我是配置在examples/local目录下,vschema_customer_sharded1.json。{ "sharded": true, "vindexes": { "hash": { "type": "hash" } }, "tables": { "customer": { "column_vindexes": [{ "column": "customer_id", "name": "hash" }] } } }
设置的规则查看
有两种方法可以查看规则设置是否成功。
第一种方法
一种是通过vitess的可视化web页面查看,比如,在我的测试用例中,在浏览器中输入这个地址:
http://localhost:33574/debug/status
然后,我们可以看到如下一个页面
点击“In JSON”就可以查看设置的规则。
第二种方法
go run main.go --server 127.0.0.1:33575 GetVSchema test
go测试案例
package main
import (
"fmt"
"log"
"vitess.io/vitess/go/vt/vitessdriver"
)
func main() {
// 连接 vtgate
/*
// Open is a Vitess helper function for sql.Open().
//
// It opens a database connection to vtgate running at "address".
func Open(address, target string) (*sql.DB, error) {
c := Configuration{
Address: address,
Target: target,
}
return OpenWithConfiguration(c)
}
关于target参数的说明:
- target参数是一个逗号分隔的字符串,用于指定查询的目标,格式为:keyspace@primary
- keyspace:指定要查询的数据库实例
- primary:指定要查询的数据库实例的主分片
*/
db, err := vitessdriver.Open("localhost:33575", "test@primary")
if err != nil {
panic(err)
}
defer db.Close()
// SHOW VSCHEMA TABLES; 查询所有表
tables, err := db.Exec("SHOW TABLES")
if err != nil {
panic(err)
}
fmt.Printf("tables:%+v\n", tables)
// 建表
// create table if not exists customer(
// customer_id bigint not null auto_increment,
// email varbinary(128),
// primary key(customer_id)
// ) ENGINE=InnoDB;
_, err = db.Exec("CREATE TABLE if not exists customer(customer_id bigint not null auto_increment, email varbinary(128), primary key(customer_id)) ENGINE=InnoDB;")
// 插入数据
_, err = db.Exec("INSERT INTO customer (customer_id, email) VALUES (3, '3@mai.com')")
if err != nil {
fmt.Println("插入错误", err)
}
_, err = db.Exec("INSERT INTO customer (customer_id, email) VALUES (4, '4@mai.com')")
if err != nil {
fmt.Println("插入错误", err)
}
// 执行查询
rows, err := db.Query("SELECT * FROM customer ")
if err != nil {
panic(err)
}
defer rows.Close()
// 处理查询结果
// 输出查询结果
for rows.Next() {
var column1 int64
var column2 string
if err := rows.Scan(&column1, &column2); err != nil {
log.Fatal(err)
}
fmt.Println(column1, column2)
}
}
但是,通过MySql的工具查看,是只有一张表,是不是实际上是分区的方式?并不是物理分表的逻辑?这个问题还需进一步探索。
文章的最后,说说我遇到的问题。
开始我是通过这个命令设置规则:
go run main.go --server 127.0.0.1:33575 ApplySchema --sql-file ../../../examples/local/vschema_ddls.sql test
vschema_ddls.sql文件的内容如下:
alter vschema add table test.customer;
-- Sharded Keyspace
alter vschema on test.customer add vindex hash(customer_id) using hash;
最终报了这个错误:
vtctldclient: rpc error: code = Unknown desc = non-ddl statements can only be executed for single shard keyspaces: alter vschema add table test.customer