vitess使用记录:vtctldclient,设置分表规则

发布于:2024-12-08 ⋅ 阅读:(134) ⋅ 点赞:(0)

继续探索未完成的事情。

vitess使用记录系列已经写了好几篇了,记录了在测试过程中遇到的各种问题。《vitess使用:从部署到go客户端连接查询》、《vitess使用记录:vtctldclient》、《vitess使用:基于源码运行vtctldclient工具》整个系列不具备很强的逻辑性,待我熟悉了这个开源组件之后,再做详细且完备的梳理。

这篇文章,先说明一下如何设置分表规则,再记录遇到的问题。

规则设置

使用 ApplyVSchema 的步骤

  1. 配置 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


网站公告

今日签到

点亮在社区的每一天
去签到