分散式 | DBLE docker 部署遇到的簡單問題修復過程

愛可生雲資料庫 發表於 2022-06-15
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 後,出現了兩個小問題:
  1. 由於 IP 地址和 DOCKER 映象打包的配置不一樣,後續的初始化也就沒成功。
  2. 在修改完 IP 地址後,一個邏輯庫提示管理員沒有許可權建立。
那接下來我們來修復這兩個小問題。
  1. 先拉下來 DBLE 最新版本。
   [email protected]:/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
  1. 建立 docker 網路環境,打通後臺 MySQL 和 DBLE 。
   [email protected]:/home/ytt# docker network create \
   >  -o "com.docker.network.bridge.name"="dble-net" \
   >   --subnet 172.20.0.0/16 dble-net
   360a9408c35cd8b8d49ad2e58ca447d5518dbea2d954badc0e618ad5d0c072a1
  1. 建立兩個後端 MySQL 服務,版本為 MySQL 8.0.29 ,對映埠3306 分別為33061、33062。
[email protected]:/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

[email protected]:/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
  1. 等 MySQL 初始化大約30秒完成後,啟動 DBLE 。
[email protected]:/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
  1. DBLE 正常初始化需要根據配置檔案載入分片節點,匯入樣例庫表檔案/opt/dble/conf/template_table.sql 。檢視 DBLE 啟動日誌,報錯內容為:連線服務埠8066失敗,應該是配置檔案裡 IP 地址沒同步改過來。
   [email protected]:/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
  1. 用docker cp 在宿主環境修改 db.xml 後拷貝到容器或者進入容器環境直接修改 db.xml 裡的 url 值為正確的IP地址,之後再退出容器重啟 dble-server 。
   [email protected]:/home/ytt# docker exec -it dble-server /bin/bash
   
   [[email protected] /]# 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"
           
   [email protected]:/home/ytt# docker restart dble-server
   dble-server
   
  1. 再次檢查 DBLE 日誌。有新的報錯內容: 提示服務賬戶對資料庫 testdb2 沒許可權訪問。
   [[email protected] /]# 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
  1. 連線 DBLE 檢查,發現許可權是夠的。 那應該是使用者配置檔案裡沒把這個邏輯庫新增進去。
[email protected]:/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
  1. 類似步驟6,新增邏輯庫 testdb2 到 DBLE 配置檔案 user.xml ,完了退出容器並重啟 dble-server 。
[[email protected] ~]# cat /opt/dble/conf/user.xml | grep 'testdb2'
   <shardingUser name="root" password="123456" schemas="testdb,testdb2" readOnly="false" blacklist="blacklist1" maxCon="20"/>
       
[email protected]:/home/ytt# docker restart dble-server
dble-server   
   
  1. 再次檢視日誌內容,已經無報錯。
    [email protected]:/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
  1. 連線服務埠,檢查下邏輯庫: 已經正常建立完畢。
[email protected]:/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  |
    +----------+