Docker中怎么搭建MySQL主从集群,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
我们提供的服务有:网站设计制作、网站制作、微信公众号开发、网站优化、网站认证、河东ssl等。为数千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的河东网站制作公司
在搭建主从集群之前,我们需要在本机上安装一个docker服务器,具体的安装步骤读者可参见docker的官网https://www.docker.com/
下载服务安装。安装完成之后,执行如下命令能正常显示则说明安装成功了:
$ docker --version Docker version 18.09.0, build 4d60db4
在安装完docker之后,我们首先执行如下命令运行一个master容器:
docker run --name mysql-master --privileged=true -v /home/mysql/master-data:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-master
在执行上述命令之后,docker首先会检测本地有没有目标镜像,即xiaochunping/mysql-master
,如果没有,则会下载该镜像,然后根据配置的参数运行该镜像。上述命令中各个参数的含义如下:
--name
指定运行之后的容器的名称为mysql-master
;
--privileged
指定了当前容器是否真正的具有root权限,所谓的root权限是指具有宿主机的root权限,而不仅仅只是在容器内部有root权限;
-v
指定了容器中指定目录挂载到宿主机上的某个目录,这样做的目的在于防止容器中配置的数据丢失,因为docker容器在重启之后是不会保留前一次在其内部运行的相关数据的;
-p
表示宿主机上的某个端口映射到docker容器内的某个端口,这里也就是将宿主机的3306端口映射到容器内部的3306端口;
-e
表示指定当前容器运行的环境变量,该变量一般在容器内部程序的配置文件中使用,而在外部运行容器指定该参数。这里的MYSQL_ROOT_PASSWORD
表示容器内部的MySQL的启动密码;
-d
参数指定了当前容器是在后台运行。
在master容器启动完成之后,我们通过docker ps
命令即可看到这个运行的容器:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES fa4afaeb24c4 xiaochunping/mysql-master "docker-entrypoint.s…" 12 days ago Up About an hour 0.0.0.0:3306->3306/tcp mysql-master
可以看到,master容器已经正常启动了,然后我们需要进入到该容器内部,对master节点进行一定的配置。可以通过如下命令进入该容器:
# 通过容器id方式,这里的id就是上面docker ps中展示的id docker exec -it fa4afaeb24c4 /bin/bash # 通过容器名称方式,这里的名称就是创建容器时指定的名称,也就是mysql-master docker exec -it mysql-master /bin/bash
进入容器后,我们需要连接其MySQL服务:
# 这里的密码就是最开始创建容器时指定的密码 mysql -uroot -proot
然后我们需要为从服务器创建一个可以用来master服务器的账户,也就是创建一个专门用来复制binlog的账号,并且赋予该账号复制权限,其命令如下:
grant replication slave on *.* to 'test'@'%' identified by '123456'; flush privileges;
这里的grant replication slave
是一个命令格式,表示赋予后面的账户以复制的权限,这样slave节点就能够获取到master节点对数据的更新。上述命令中创建的账户的用户名为test
,密码为123456
。接着我们需要查看master节点的binlog状态:
mysql> show master status; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000014 | 154 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
这里需要记住这个File和Position属性的值,因为下面在配置slave的时候需要用到。
对于从容器的使用,其启动命令与master容器非常相似,但也有一些小小的区别:
docker run --name mysql-slave --privileged=true -v /home/mysql/slave-data:/var/lib/mysql -p 3307:3306 --link mysql-master:master -e MYSQL_ROOT_PASSWORD=root -d xiaochunping/mysql-slave
从容器启动与主容器启动参数主要有一下两点:
所映射的宿主机的端口号不能与master容器相同,因为其已经被master容器占用;
必须加上--link
参数,其后指定了当前容器所要连接的容器,mysql-master
表示所要连接的容器的名称,master
表示为该容器起的一个别名,通俗来讲,就是slave容器通过这两个名称都可以访问到master容器。这么做的原因在于,如果master与slave不在同一个docker network中,那么这两个容器相互之间是没法访问的。注意这一点非常重要,之前本人按照网上的搭建方式搭建主从服务器一直无法成功,主要就是因为他们一直没有提到要设置这个参数。
在启动从容器之后,我们还是需要进入到从容器,并且连接上MySQL服务:
docker exec -it mysql-slave /bin/bash
mysql -uroot -proot
连接上MySQL服务器之后,我们就需要切换当前服务的状态,使其能够连接上master服务器,并且复制其数据:
change master to master_host='master', master_user='test', master_password='123456', master_port=3306, master_log_file='mysql-bin.000014', master_log_pos=154, master_connect_retry=30;
上述命令中,各个参数的含义其实比较好理解,主要就是指定master服务的域名(也就是我们前面link时使用的别名)、用户名、密码、端口,以及master节点的binlog文件和log的position。这里的binlog文件和log的position就是前面我们show master status;
命令的执行结果,读者朋友需要与本机的实际结果一致。最后我们需要开启主从复制:
start slave;
开启完成之后,我们可以通过如下命令查看从服务器的连接状态:
mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: master Master_User: test Master_Port: 3306 Connect_Retry: 30 Master_Log_File: mysql-bin.000014 Read_Master_Log_Pos: 154 Relay_Log_File: 6774ae81bc25-relay-bin.000034 Relay_Log_Pos: 367 Relay_Master_Log_File: mysql-bin.000014 Slave_IO_Running: Yes Slave_SQL_Running: Yes .... Master_Server_Id: 1 Master_UUID: 8976b929-bc8b-11e9-bab3-0242ac110005 Master_Info_File: /var/lib/mysql/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: .... 1 row in set (0.00 sec)
这里只要看到两个参数Slave_IO_Running
和Slave_SQL_Running
都为true,则表示复制是正常进行的,到这里我们的主从结构也就搭建完成了。
测试主从服务比较简单,只需要在master服务器上执行相关的命令,然后检查slave服务器上是否存在相应的更新即可。我们可以在master节点上执行如下命令,创建一个数据库和表,然后插入一条数据:
mysql> create database test; Query OK, 1 row affected (0.01 sec) mysql> use test; Database changed mysql> create table t_user(id bigint, name varchar(255)); Query OK, 0 rows affected (0.02 sec) mysql> insert into t_user(id, name) value (1, 'Mary'); Query OK, 1 row affected (0.01 sec)
然后我们连接上从数据库,查看其上是否有相关的更新:
mysql> select * from test.t_user; +------+------+ | id | name | +------+------+ | 1 | Mary | +------+------+ 1 row in set (0.00 sec)
可以看到,从服务器上确实同步了相关的数据,这也进一步验证了我们搭建的主从服务器是OK的。
关于Docker中怎么搭建MySQL主从集群问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注创新互联行业资讯频道了解更多相关知识。