分布式 | DBLE docker 部署遇到的简单问题修复过程
作者:杨涛涛
资深数据库专家,专研 MySQL 十余年。擅长 MySQL、PostgreSQL、MongoDB 等开源数据库相关的备份恢复、SQL 调优、监控运维、高可用架构设计等。目前任职于爱可生,为各大运营商及银行金融企业提供 MySQL 相关技术支持、MySQL 相关课程培训等工作。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
首先说明如果完全按照官网文档来操作,肯定是没有问题的,DBLE 官网文档已经写的很详细了。
刚好我环境中有最新的 MySQL docker 镜像(MySQL 8.0.29),我偷懒把 DBLE 后台 MySQL 版本换成 8.0.29 ,子网换成172.20.0.0/16(我本机已有其他 docker 容器占用默认子网运行)。
装完 DBLE 后,出现了两个小问题:
由于 IP 地址和 DOCKER 镜像打包的配置不一样,后续的初始化也就没成功。
在修改完 IP 地址后,一个逻辑库提示管理员没有权限创建。
那接下来我们来修复这两个小问题。
先拉下来 DBLE 最新版本。
root@ytt-large:/home/ytt# docker image ls | grep -E '^action|^mysql'
mysql 8.0.29 b2500a44757f 8 days ago 524MB
actiontech/dble latest 9988614a8e4b 6 months ago 755MB
创建 docker 网络环境,打通后台 MySQL 和 DBLE 。
root@ytt-large:/home/ytt# docker network create \
> -o "com.docker.network.bridge.name"="dble-net" \
> --subnet 172.20.0.0/16 dble-net
360a9408c35cd8b8d49ad2e58ca447d5518dbea2d954badc0e618ad5d0c072a1
创建两个后端 MySQL 服务,版本为 MySQL 8.0.29 ,映射端口3306 分别为33061、33062。
root@ytt-large:/home/ytt# docker run --name backend-mysql1 \
> --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=123456 \
> -p 33061:3306 --network=dble-net \
> -d mysql:8.0.29 --server-id=1
54505aeca71ae7c4553a0fa98e705ee302cdfc08c2b472768afc6170dddf6d37
root@ytt-large:/home/ytt# docker run --name backend-mysql2 \
> --ip 172.20.0.3 -e MYSQL_ROOT_PASSWORD=123456 \
> -p 33062:3306 --network=dble-net \
> -d mysql:8.0.29 --server-id=2
5f907b977fc242be35dc01840a5393f2ee754572dd1d59e2fb072032df1ed8d0
等 MySQL 初始化大约30秒完成后,启动 DBLE 。
root@ytt-large:/home/ytt# docker run -d -i -t --name dble-server \
> --ip 172.20.0.5 -p 8066:8066 -p 9066:9066 \
> --network=dble-net actiontech/dble:latest
df80d0e2451c237afb4792f93e29738579f125288daf0dfee4484ddca8350110
DBLE 正常初始化需要根据配置文件加载分片节点,导入样例库表文件/opt/dble/conf/template_table.sql 。查看 DBLE 启动日志,报错内容为:连接服务端口8066失败,应该是配置文件里 IP 地址没同步改过来。
root@ytt-large:/home/ytt# docker logs dble-server
dble init&start in docker
Starting dble-server...
wait-for-it.sh: waiting 15 seconds for 127.0.0.1:8066
wait-for-it.sh: 127.0.0.1:8066 is available after 6 seconds
init shardingNode and execute template_table.sql
ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104
ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)
dble init finish
用docker cp 在宿主环境修改 db.xml 后拷贝到容器或者进入容器环境直接修改 db.xml 里的 url 值为正确的IP地址,之后再退出容器重启 dble-server 。
root@ytt-large:/home/ytt# docker exec -it dble-server /bin/bash
[root@df80d0e2451c /]# cat /opt/dble/conf/db.xml | grep 172
<dbInstance name="instanceM1" url="172.20.0.2:3306" user="root" password="123456" maxCon="300" minCon="10"
<dbInstance name="instanceM2" url="172.20.0.3:3306" user="root" password="123456" maxCon="300" minCon="10"
root@ytt-large:/home/ytt# docker restart dble-server
dble-server
再次检查 DBLE 日志。有新的报错内容: 提示服务账户对数据库 testdb2 没权限访问。
[root@df80d0e2451c /]# dble init&start in docker
Starting dble-server...
wait-for-it.sh: waiting 15 seconds for 127.0.0.1:8066
wait-for-it.sh: 127.0.0.1:8066 is available after 2 seconds
init shardingNode and execute template_table.sql
ERROR 1044 (HY000) at line 200 in file: '/opt/dble/conf/template_table.sql': Access denied for user 'root' to database 'testdb2'
ERROR 1146 (42S02) at line 202 in file: '/opt/dble/conf/template_table.sql': Table 'testdb.tb_test1' doesn't exist in the config of sharding
ERROR 1146 (42S02) at line 207 in file: '/opt/dble/conf/template_table.sql': Table 'testdb.tb_test1' doesn't exist
ERROR 1146 (42S02) at line 210 in file: '/opt/dble/conf/template_table.sql': Table 'testdb.tb_test2' doesn't exist in the config of sharding
ERROR 1146 (42S02) at line 215 in file: '/opt/dble/conf/template_table.sql': Table 'testdb.tb_test2' doesn't exist
dble init finish
连接 DBLE 检查,发现权限是够的。 那应该是用户配置文件里没把这个逻辑库添加进去。
root@ytt-large:/home/ytt# mysql -uroot -p123456 -P8066 -h 127.0.0.1 -e "show grants for root" -s |grep 'CREATE'
mysql: [Warning] Using a password on the command line interface can be insecure.
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE,... ON *.* TO `root`@`%` WITH GRANT OPTION
类似步骤6,添加逻辑库 testdb2 到 DBLE 配置文件 user.xml ,完了退出容器并重启 dble-server 。
[root@df80d0e2451c ~]# cat /opt/dble/conf/user.xml | grep 'testdb2'
<shardingUser name="root" password="123456" schemas="testdb,testdb2" readOnly="false" blacklist="blacklist1" maxCon="20"/>
root@ytt-large:/home/ytt# docker restart dble-server
dble-server
再次查看日志内容,已经无报错。
root@ytt-large:/home/ytt# docker logs dble-server | tail -n 6
Starting dble-server...
Removed stale pid file: /opt/dble/dble.pid
wait-for-it.sh: waiting 15 seconds for 127.0.0.1:8066
wait-for-it.sh: 127.0.0.1:8066 is available after 2 seconds
init shardingNode and execute template_table.sql
dble init finish
连接服务端口,检查下逻辑库: 已经正常创建完毕。
root@ytt-large:/home/ytt# mysql -uroot -p123456 -h127.0.0.1 -P8066 -e "show databases"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------+
| DATABASE |
+----------+
| testdb |
| testdb2 |
+----------+
MySQL分布式中间件DBLE
DBLE是一个基于MySQL的高可扩展性的分布式中间件,适用于高并发及TB级海量数据处理场景。
推荐阅读
故障分析 | 一个因 SSL 配置导致的复制异常报错
在构建 MySQL 复制过程中,IO 线程始终连接不上主库,反复确认复制账号的权限、账号密码都没问题,最终定位为 SSL 配置的问题。作者:木板。某全国性股份制银行 DBA。擅长 DB2,MySQL 和 Oracle 数据库的运行维护...
爱可生云数据库阅读 187
Aliyun-使用Docker方式安装Jenkins
之前自己在阿里云ECS上面安装了Jekins(安装jenkins的文章),最近因为服务器中了挖矿木马于是准备重新安装一下,但是想到每次安装jenkins都要手动安装jdk、maven、docker、kubectl,感觉好麻烦,于是使用官方推荐...
Awbeci赞 2阅读 2.1k
Win10 安装Docker以及Jenkins(超级详细篇)
安装Docker下载地址:[链接] ,按照它的指引教程,无脑下一步即可。安装成功后电脑会重启。打开docker桌面端,会显示进入链接,下载WSL 安装包进行无脑安装即可。安装 Linux 内核更新包 (重启电脑)重启 Docker ...
九旬赞 3阅读 1.1k
Redis集群容器化安装
主从复制在数据库中很常见,一般用来做读写分离,Redis中也是如此。要求只有1个Master(主节点),可以有N个slaver(从节点),而且Slaver也可以有自己的Slaver,由于这种主从的关系决定他们是在配置阶段就要指定...
KerryWu赞 2阅读 2.3k
Java项目是不是分布式,真有那么重要吗?
「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了一把SpringCloud,写了一篇很长的文章,还是很顶的,有不少的大号都给我转载了,在知乎又获得了很多的赞。
Java3y赞 2阅读 618评论 1
HTAP 数据库如何实现?浅析 KaiwuDB 中的列存引擎
TP 与 AP 融合的 HTAP 数据库正成为业内的发展趋势。但由于大规模数据场景下 TP 与 AP 系统本身的复杂性,要在一套数据库系统中融合两种使用场景的功能并不容易。浪潮推出的 HTAP KaiwuDB 采用多模存储引擎的方案...
KaiwuDB阅读 3k
前端切图仔入门Docker,三分钟上线自己的博客平台
依稀记得2022年趁某平台优惠买了台云服务器,周未准备安装MySQL数据库,两天时间卡在MySQL环境配置上,实在是折磨一气之下把服务器给退了。
凌览赞 2阅读 579
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。