当前位置: 首页 > article >正文

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

继续探索未完成的事情。

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


http://www.kler.cn/a/422036.html

相关文章:

  • Postgres 如何使事务原子化?
  • [每周一更]-(第125期):模拟面试|NoSQL面试思路解析
  • 备赛蓝桥杯--算法题目(2)
  • 基于Matlab地形和环境因素的森林火灾蔓延模拟与可视化研究
  • Windows系统搭建Docker
  • 040集——CAD中放烟花(CAD—C#二次开发入门)
  • qt6 oob
  • 微服务即时通讯系统的实现(服务端)----(3)
  • 基于Python 哔哩哔哩网站热门视频数据采集与可视化分析设计与实现,有聚类有网络语义研究
  • 【数据集】细胞数据集:肿瘤-胎儿重编程的内皮细胞驱动肝细胞癌中的免疫抑制性巨噬细胞(Sharma等人)
  • helm部署golang服务
  • numpy 计算两组向量是否相等,以及在一定误差内相等
  • QT - (qrc->binary)
  • 人工智能学习框架:构建AI应用的基石
  • Rust面向对象特性
  • 第三方Express 路由和路由中间件
  • 攻防世界-fileclude-文件包含
  • springboot 项目 层级架构
  • aisuite - 一个接口调用多个大模型
  • 大语言模型在研究领域的应用---下