MySQL中间件 Kingshard 安装与分表配置实战

Theo
Theo
发布时间:2026-10-13| 6人浏览过
原创

Kingshard是一个基于Go语言开发的MySQL代理层,支持读写分离和SQL路由功能。本文将指导用户在最小化实验环境中,通过`mysqld_multi`工具启动多个MySQL实例,并利用Kingshard实现数据的自动分片(Hash与Range策略)及路由访问,解决单体数据库容量瓶颈问题。

准备条件:MySQL多实例环境搭建

为了模拟真实生产环境的节点分布,首先需要在单机上初始化两个独立的MySQL数据目录,并通过配置文件管理它们。

第1步:初始化MySQL数据目录

目的:创建隔离的数据库存储路径。
动作:使用mysql_install_db命令分别初始化 /var/lib/mysql2 和 /var/lib/mysql3 目录。

# mysql_install_db --datadir=/var/lib/mysql2/ --user=mysql
# mysql_install_db --datadir=/var/lib/mysql3/ --user=mysql

第2步:生成并修改Multi配置文件

目的:定义每个实例的端口、Socket文件和账号权限。
动作:执行mysqld_multi --example生成模板,随后编辑文件以指定不同实例的配置项。

[mysqld_multi]
mysqld   = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user    = multi_admin
password  = my_password
 
[mysqld2]
socket   = /var/lib/mysql2/mysql.sock2
port    = 3307
pid-file  = /var/lib/mysql2/hostname.pid2
datadir  = /var/lib/mysql2
user    = unix_user1
 
[mysqld3]
socket   = /var/lib/mysql3/mysql.sock3
port    = 3308
pid-file  = /var/lib/mysql3/hostname.pid3
datadir  = /var/lib/mysql3
user    = unix_user2

第3步:启动并验证多实例状态

目的:确保所有节点正常响应。
动作:调用mysqld_multi启动服务,并使用 report 命令检查运行状态。

# mysqld_multi --defaults-extra-file=./mysqld_multi.conf start

验证输出应显示对应的分组正在运行:

Reporting MySQL servers
MySQL server from group: mysqld2 is running
MySQL server from group: mysqld3 is running

安装Kingshard中间件

Kingshard由Go语言编写,需先确保系统已安装Go环境。

第4步:获取源码并编译

入口:终端命令行
动作:克隆官方仓库并执行构建脚本。

git clone https://github.com/flike/kingshard.git src/github.com/flike/kingshard
cd src/github.com/flike/kingshard
source ./dev.sh
make

编译成功后,将在 bin 目录下生成可执行程序。

核心配置:路由与连接设置

本阶段重点在于配置 kingshard.yaml(或 multi.yaml),使其能够发现后端的MySQL节点并定义分片规则。同时需在操作系统层级解析节点名称。

第5步:配置Hosts映射

目的:简化配置中的主机名引用。
动作:在 /etc/hosts 文件中添加节点别名。

127.0.0.1 node1
127.0.0.1 node2

第6步:编写YAML配置文件

注意:YAML格式严禁使用Tab键缩进,且冒号 : 后必须有一个空格。

以下为关键配置示例,定义了监听地址、后端节点(Node)、以及针对 kingshard 库的分表规则:

# server listen addr
addr : 127.0.0.1:9696
 
# server user and password
user : kingshard
password : kingshard
 
# log level
log_level : debug
 
nodes :
- 
  name : node1 
  idle_conns : 16
  rw_split: true # 读写分离开关
  user : root
  password : root
  master : 127.0.0.1:3307 # 对应之前的mysqld2
  slave : 
- 
  name : node2 
  idle_conns : 16
  rw_split: true
  user : root
  password : root
  master : 127.0.0.1:3308 # 对应之前的mysqld3
  slave : 
  down_after_noalive: 100

schemas :
-
  db : kingshard
  nodes: [node1,node2]
  rules:
    default: node1 # 默认路由到node1
    shard:
    -  
      table: test_shard_hash
      key: id       # 分片键
      nodes: [node1, node2]
      type: hash    # 分片算法
      locations: [4,4]
    -  
      table: test_shard_range
      key: id
      type: range
      nodes: [node1, node2]
      locations: [4,4]
      table_row_limit: 10000

第7步:初始化后端数据库用户与库

目的:授予中间件连接权限并创建逻辑库。
动作:分别对端口 3307 和 3308 执行以下命令,创建 root 用户密码及 kingshard 库。

/usr/bin/mysqladmin -h 127.0.0.1 -P 3307 -u root password 'root'
/usr/bin/mysqladmin -h 127.0.0.1 -P 3308 -u root password 'root'
/usr/bin/mysql -h 127.0.0.1 -P 3307 -u root -proot -e "create database kingshard;"
/usr/bin/mysql -h 127.0.0.1 -P 3308 -u root -proot -e "create database kingshard;"

功能测试:分片路由验证

第8步:手动创建物理分表

Kingshard会自动拆分SQL,但首次使用时需在真实的MySQL节点上建好子表。例如 Hash 分表的命名通常为 表名_编号。

动作:在 node1 (3307) 上创建 _0000 至 _0003,在 node2 (3308) 上创建 _0004 至 _0007。

for i in `seq 0 3`;do /usr/bin/mysql -h 127.0.0.1 -P 3307 -u root -proot kingshard -e "CREATE TABLE IF NOT EXISTS test_shard_hash_000"${i}" ( id BIGINT(64) UNSIGNED NOT NULL, str VARCHAR(256), f DOUBLE, e enum('test1', 'test2'), u tinyint unsigned, i tinyint, ni tinyint, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;";done

for i in `seq 4 7`;do /usr/bin/mysql -h 127.0.0.1 -P 3308 -u root -proot kingshard -e "CREATE TABLE IF NOT EXISTS test_shard_hash_000"${i}" ( id BIGINT(64) UNSIGNED NOT NULL, str VARCHAR(256), f DOUBLE, e enum('test1', 'test2'), u tinyint unsigned, i tinyint, ni tinyint, PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8;";done

第9步:启动Kingshard服务

动作:加载刚生成的配置文件启动中间件。

./bin/kingshard -config=etc/multi.yaml

第10步:插入数据并查看日志

目的:验证 SQL 是否被正确转发至不同的后端节点。
动作:通过 Kingshard 的监听端口 (9696) 连接插入测试数据。

for i in `seq 1 10`;do mysql -h 127.0.0.1 -P 9696 -u kingshard -pkingshard -e "insert into test_shard_hash (id, str, f, e, u, i) values(${i}, 'abc$i', 3.14, 'test$i', 255, -127)";done

观察 Kingshard 输出的日志,可以看到 INSERT 语句根据 ID 的哈希值,被分流到了 3307 和 3308 端口对应的子表中(如 test_shard_hash_0001 和 test_shard_hash_0004)。

第11步:查询与排错

动作:尝试通过代理查询数据,同时测试非法语句。

mysql -h 127.0.0.1 -P 9696 -u kingshard -pkingshard -e "select * from test_shard_hash where id in (2, 3, 4, 5)"

注意:Kingshard 当前版本可能不支持全表扫描类的无主键查询(如 SELECT * FROM ... 不带 WHERE)。若遇到错误,请检查索引和 WHERE 条件是否符合分片规范。

简要总结

通过上述步骤,我们成功构建了一个包含 Kingshard 中间件的双节点 MySQL 测试环境。该架构展示了如何利用 Go 语言编写的代理层,将应用程序的逻辑库映射到底层多个物理分表,从而实现了基础的读写分离和数据水平分片。以上就是为MySQL安装配置代理工具Kingshard的详细内容,更多关于MySQL分片代理的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。