使用docker进行跨主机mysql-cluster集群实践
构建集群环境
搭建docker swarm集群
在进行mysql-cluster集群前,我们需要设置好docker的集群环境,使用docker swarm模式来进行docker容器间的跨主机通信。
docker swarm集群的基本要求:
- 3台可以网络通信的Linux主机
- 安装了1.12.0以上版本的docker
- 开放TCP port 2377为集群管理通信端口,TCP and UDP port 7946 为节点间通信端口,UDP port 4789 为网络间流量端口
然后使用 docker swarm init 来初始化一个新的swarm集群(本机作为一个管理节点),也可以用
docker swarm init --advertise-addr ip-adress
来指定作为管理节点的ip,根据给出的命令添加相应的工作/管理节点:
docker@manager:~$ docker swarm init --advertise-addr 192.168.0.100
Swarm initialized: current node (dxn1zf6l61qsb1josjja83ngz) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join \
--token SWMTKN-1-49nj1cmql0jkz5s954yi3oex3nedyz0fb0xx14ie39trti4wxv-8vxv8rssmk743ojnwacrr2e7c \
192.168.0.100:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
集群初始化完成后,用docker node ls查看当前节点信息。
如果没有记住添加节点的命令,可以用docker swarm join-token worker/manager可以重新获取添加工作/管理节点的命令。
创建docker跨主机overlay网络
现在我们已经创建了docker swarm集群,下一步是创建一个overlay网络,使得不同主机上的docker容器可以直接通过这个新建网络直接进行通信。
docker network create --driver overlay --attachable --subnet 192.168.0.0/24 dadao
swarm在设计之初是为了service(一组容器)而服务的,因此通过swarm创建的overlay网络在一开始并不支持单独的容器加入其中。但是在docker1.13, 我们可以通过“–attachable ” 参数声明当前创建的overlay网络可以被容器直接加入。
用docker启动mysql-cluster
mysql-cluster的配置安装
在docker安装mysql-cluster,先拉取最新的mysql-cluster镜像。
docker pull mysql/mysql-cluster
这里为了数据持久性,使用指定数据卷保存每个节点的数据。
docker volume create management1
docker volume create ndb1
docker volume create mysql1
mysql-cluster的配置文件:
my.cnf
[mysqld]
skip-grant-tables
ndbcluster
ndb-connectstring=192.168.12.5,192.168.12.10
user=mysql
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
character-set-server = utf8mb4
default-time-zone = '+08:00'
max_allowed_packet = 100M
[mysql_cluster]
ndb-connectstring=192.168.12.5,192.168.12.10
mysql-cluster.cnf
[ndbd default]
NoOfReplicas=2
DataMemory=256M
IndexMemory=64M
MaxNoOfTables=1024
MaxNoOfAttributes=50000
MaxNoOfConcurrentTransactions=100000
MaxNoOfConcurrentOperations=100000
MaxNoOfOrderedIndexes=1024
[ndb_mgmd]
NodeId=1
hostname=192.168.12.5
datadir=/var/lib/mysql
[ndb_mgmd]
NodeId=2
hostname=192.168.12.10
datadir=/var/lib/mysql
[ndbd]
NodeId=3
hostname=192.168.12.30
datadir=/var/lib/mysql
[ndbd]
NodeId=4
hostname=192.168.12.40
datadir=/var/lib/mysql
[mysqld]
NodeId=5
hostname=192.168.12.100
[mysqld]
NodeId=6
hostname=192.168.12.200
部分配置不是必要,仅仅是项目需求
接下来分别运行mysql-cluster管理节点、数据节点和sql节点,为他们指定配置文件和数据卷,同时指定前面构建好的overlay网络,设置好相应ip
# 在指定自定义的network时,最好使用-it参数
# 运行管理节点:
docker run -d --net=dadao -v /home/dadao/mysql-conf/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/dadao/mysql-conf/my.cnf:/etc/my.cnf --mount source=management1,target=/var/lib/mysql --name=management1 --ip=192.168.12.5 mysql/mysql-cluster ndb_mgmd
docker run -dit --net=dadao -v /home/dadao/mysql-conf/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/dadao/mysql-conf/my.cnf:/etc/my.cnf --mount source=management1,target=/var/lib/mysql --name=management2 --ip=192.168.12.10 mysql/mysql-cluster ndb_mgmd
# 挂载目录:/var/lib/mysql
# 运行数据节点:
docker run -d --net=dadao -v /home/dadao/mysql-conf/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/dadao/mysql-conf/my.cnf:/etc/my.cnf --mount source=ndb1,target=/var/lib/mysql --name=ndb1 --ip=192.168.12.30 -p 13306:3306 mysql/mysql-cluster ndbd
docker run -dit --net=dadao -v /home/dadao/mysql-conf/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/dadao/mysql-conf/my.cnf:/etc/my.cnf --mount source=ndb2,target=/var/lib/mysql --name=ndb2 --ip=192.168.12.40 -p 13306:3306 mysql/mysql-cluster ndbd
# 挂载目录:/var/lib/mysql
# 运行mysql节点;
docker run -d --net=dadao -v /home/dadao/mysql-data:/opt/mysql-data -v /home/dadao/mysql-conf/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/dadao/mysql-conf/my.cnf:/etc/my.cnf --mount source=mysql1,target=/var/lib/mysql --name=mysql1 --ip=192.168.12.100 -p 13308:3306 mysql/mysql-cluster mysqld
docker run -dit --net=dadao -v /home/dadao/mysql-conf/mysql-cluster.cnf:/etc/mysql-cluster.cnf -v /home/dadao/mysql-conf/my.cnf:/etc/my.cnf --mount source=mysql2,target=/var/lib/mysql --name=mysql2 --ip=192.168.12.200 -p 13308:3306 mysql/mysql-cluster mysqld
# 挂载目录:/var/lib/mysql
最后使用docker exec -it management1 bash进入管理节点,输入ndb_mgm命令,查看集群运行情况