继续探索未完成的事情。
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 mainimport ("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 int64var column2 stringif 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