Docker搭建MySQL集羣環境

安裝Docker

由於我用的是Windows10,所以我打開了Hyper-V,然後在Dcoker官網下載並安裝了Docker。

CentOS 之間使用 yum install docker 安裝docker然後使用systemctl start docker啓動服務,systemctl enable docker開機啓動docker服務。

使Docker容器和Windows10建立局域網連接

Docker創建一個局域網

docker network create --subnet=[IP]/[掩碼位數] 子網名稱

指令示例:

docker network create --subnet=192.168.100.0/24 homenet

在Windows10中將這個子網添加到路由表中 ,Linux重啓即可

route add -p [局域網ip] mask [子網掩碼] [經過網關(使用Docker默認網關)]

指令示例(管理員模式下運行指令):

route add -p 192.168.100.0 mask 255.255.255.0 10.0.75.2

簡單Mysql持久化

預先準備

先啓動一個mysql,查看需要持久化的文件有哪些。

docker run -itd --net homenet --ip 192.168.100.10 --name mysql000 -e MYSQL_ROOT_PASSWORD=00000000 mysql
docker exec -it mysql000 /bin/bash
# find / -name "mysql"

然後發現了以下需要映射的文件
/etc/mysql/my.cnf
/var/lib/mysql
保存一份my.cnf文件到宿主機,掛載文件時需要用到

然後刪除剛纔創建的Mysql,刪除前順便測試下局域網有沒有用

 mysql -h 192.168.100.10 -u root -p
 [mysql]exit
 docker stop mysql000
 docker rm mysql000

啓動mysql

然後創建mysql容器,命令示例(在掛載過程中需要輸入Windows10密碼授權本地文件操作):

docker run -itd --privileged=true --net homenet --ip 192.168.100.10 --name mysql000 -e MYSQL_ROOT_PASSWORD=00000000 -e MYSQL_USER="ovea" -e MYSQL_PASSWORD="00300100" -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL000/etc/my.cnf:/etc/mysql/my.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL000/varlib:/var/lib/mysql mysql

搭建MySQL集羣

預習準備

docker pull mysql/mysql-cluster
docker run -itd --net homenet --ip 192.168.100.10 --name mysql000 -e MYSQL_ROOT_PASSWORD=00000000 mysql/mysql-cluster ndbd

然後查找需要映射的文件
/var/lib/mysql
/var/lib/mysql-files/
/var/lib/mysql-keyring/
/etc/my.cnf
/etc/mysql-cluster.cnf
最後兩個文件保存一份到宿主機

docker stop mysql000
docker rm mysql000

修改配置文件

修改my.cnf [Linux下該文件權限應爲644或744]

主要是manager以外的節點使用的,ip指向manager節點的IP

[mysqld]
ndbcluster
ndb-connectstring=192.168.100.10
user=mysql

[mysql_cluster]
ndb-connectstring=192.168.100.10

修改mysql-cluster.cnf [Linux下該文件權限應爲644或744]

主要配置節點之間的關係和職責

# Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; version 2 of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301 USA

[ndbd default]
NoOfReplicas=4
DataMemory=128M
IndexMemory=16M


[ndb_mgmd]
NodeId=1
hostname=192.168.100.10
datadir=/var/lib/mysql

[ndbd]
NodeId=2
hostname=192.168.100.11
datadir=/var/lib/mysql

[ndbd]
NodeId=3
hostname=192.168.100.12
datadir=/var/lib/mysql

[ndbd]
NodeId=4
hostname=192.168.100.13
datadir=/var/lib/mysql

[mysqld]
NodeId=5
hostname=192.168.100.14

啓動5個節點

Windows 指令示例

docker run -itd --privileged=true --net homenet --ip 192.168.100.10 --name mysql-mgmd-000  -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL000/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL000/varlib:/var/lib/mysql mysql/mysql-cluster ndb_mgmd
docker run -itd --privileged=true --net homenet --ip 192.168.100.11 --name mysql-node-000  -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL001/etc/my.cnf:/etc/my.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL001/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL001/varlib:/var/lib/mysql mysql/mysql-cluster ndbd
docker run -itd --privileged=true --net homenet --ip 192.168.100.12 --name mysql-node-001  -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL002/etc/my.cnf:/etc/my.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL002/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL002/varlib:/var/lib/mysql mysql/mysql-cluster ndbd
docker run -itd --privileged=true --net homenet --ip 192.168.100.13 --name mysql-node-002  -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL003/etc/my.cnf:/etc/my.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL003/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL003/varlib:/var/lib/mysql mysql/mysql-cluster ndbd
docker run -itd --privileged=true --net homenet --ip 192.168.100.14 --name mysql000  -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL004/etc/my.cnf:/etc/my.cnf  -v /c/Users/OVEA/Documents/Docker/MySQL/MySQL004/varlib:/var/lib/mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql/mysql-cluster mysqld

Linux命令示例:

docker run -itd --privileged=true --net homenet --ip 192.168.100.10 --name mysql-mgmd-000  -v /home/ovea/Documents/Docker/MySQL/MySQL000/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/ovea/Documents/Docker/MySQL/MySQL000/varlib:/var/lib/mysql mysql/mysql-cluster ndb_mgmd
docker run -itd --privileged=true --net homenet --ip 192.168.100.11 --name mysql-node-000  -v /home/ovea/Documents/Docker/MySQL/MySQL001/etc/my.cnf:/etc/my.cnf -v /home/ovea/Documents/Docker/MySQL/MySQL001/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/ovea/Documents/Docker/MySQL/MySQL001/varlib:/var/lib/mysql mysql/mysql-cluster ndbd
docker run -itd --privileged=true --net homenet --ip 192.168.100.12 --name mysql-node-001  -v /home/ovea/Documents/Docker/MySQL/MySQL002/etc/my.cnf:/etc/my.cnf -v /home/ovea/Documents/Docker/MySQL/MySQL002/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/ovea/Documents/Docker/MySQL/MySQL002/varlib:/var/lib/mysql mysql/mysql-cluster ndbd
docker run -itd --privileged=true --net homenet --ip 192.168.100.13 --name mysql-node-002  -v /home/ovea/Documents/Docker/MySQL/MySQL003/etc/my.cnf:/etc/my.cnf -v /home/ovea/Documents/Docker/MySQL/MySQL003/etc/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/ovea/Documents/Docker/MySQL/MySQL003/varlib:/var/lib/mysql mysql/mysql-cluster ndbd
docker run -itd --privileged=true --net homenet --ip 192.168.100.14 --name mysql000  -v /home/ovea/Documents/Docker/MySQL/MySQL004/etc/my.cnf:/etc/my.cnf  -v /home/ovea/Documents/Docker/MySQL/MySQL004/varlib:/var/lib/mysql -e MYSQL_RANDOM_ROOT_PASSWORD=true mysql/mysql-cluster mysqld

必須一次啓動成功,否則將會導致無法正確運行!啓動完前一個節點再啓動下一個節點。
結果:
啓動集羣
啓動完成後
在日誌中找到密碼然後登錄

docker logs mysql000
docker exec mysql000 /bin/bash
# mysql -u root -p

需要把-v掛載除配置文件外的其他選項(持久化集羣)都取消掉才能正常打開mysqld服務,原因不明……而且錯誤也沒有寫入日誌中!

解決方案,先停止所有容器,然後全部啓動。(雖然這樣是啓動了,但是密碼就不知道了)
Windows10

docker stop $(docker ps -q)
docker start $(docker ps -a -q)

Linux

sudo docker stop $(sudo docker ps -q)
sudo docker start $(sudo docker ps -a -q)

啓動所有集羣

參考資料

https://www.jianshu.com/p/cc837360c9e7

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章