MySQL中间件 Kingshard 安装与分表配置实战
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分片代理的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













