关于MySQL主从模式,如果我们直接在本机上搭建的话,是没法搭建的,只能借助于虚拟机,但有的时候我们又需要搭建一个主从集群,以便于进行一些功能性的测试。这个时候我们就可以尝试使用docker,借助于docker的容器化技术,我们只需要创建两个MySQL容器,并且占用主机的两个端口即可,对主机没有其他额外的影响。这种方式非常的轻量,而且也容易复制。本文则主要讲解如何通过docker来搭建MySQL集群。

1. 环境准备

在搭建主从集群之前,我们需要在本机上安装一个docker服务器,具体的安装步骤读者可参见docker的官网https://www.docker.com/下载服务安装。安装完成之后,执行如下命令能正常显示则说明安装成功了:

$ docker --version
Docker version 18.09.0, build 4d60db4

2. 主从集群搭建

2.1 master服务器准备

在安装完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的时候需要用到。

2.2 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 statusG;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: masterMaster_User: testMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000014Read_Master_Log_Pos: 154Relay_Log_File: 6774ae81bc25-relay-bin.000034Relay_Log_Pos: 367Relay_Master_Log_File: mysql-bin.000014Slave_IO_Running: YesSlave_SQL_Running: Yes....Master_Server_Id: 1Master_UUID: 8976b929-bc8b-11e9-bab3-0242ac110005Master_Info_File: /var/lib/mysql/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:....
1 row in set (0.00 sec)

这里只要看到两个参数Slave_IO_RunningSlave_SQL_Running都为true,则表示复制是正常进行的,到这里我们的主从结构也就搭建完成了。

3. 测试主从服务

测试主从服务比较简单,只需要在master服务器上执行相关的命令,然后检查slave服务器上是否存在相应的更新即可。我们可以在master节点上执行如下命令,创建一个数据库和表,然后插入一条数据:

mysql> create database test;
Query OK, 1 row affected (0.01 sec)mysql> use test;
Database changedmysql> 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的。

4. 小结

本文主要讲解了如何通过docker运行两个MySQL容器,并且详细介绍了如何将两个容器连接起来,以及如何配置主从数据库架构模式。

docker 搭建mysql 连接不上_docker搭建MySQL主从集群相关推荐

  1. mysql gtid 集群_Docker搭建MySQL主从集群,基于GTID

    写在前边 搭建MySQL读写分离主从集群,这里未使用binlog方式,使用的是GTID方式 源码见我的Github https://github.com/hellxz/mysql-cluster-do ...

  2. 基于Docker搭建Redis集群(主从集群)

    最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...

  3. mysql 数据库集群搭建:(四)pacemaker管理三台maxscale集群,搭建mariadb读写分离中间层集群...

    为什么80%的码农都做不了架构师?>>>    <mysql 数据库集群搭建:(一)VirtualBox中多台CentOS虚拟机间和windows主机间互通以及访问互联网设置& ...

  4. 一、史上最强hadoop分布式集群的搭建

    史上最强hadoop分布式集群的搭建 @Author:by Runsen @data:2020-02-23 原创文章,禁止转载 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自 ...

  5. 连接不上虚拟机的mysql

    连接不上虚拟机的mysql 1.登录虚拟机的mysql mysql -u root -p[密码] 2.设置远程主机登录 mysql> use mysql;mysql> update use ...

  6. MySQL 数据库主从集群搭建

    文章目录 1 准备工作 2 配置主数据库 3 配置从库 4 从库设置只读用户 5 推荐参考资料 1 准备工作 1 选择一个服务器当做主服务器,将服务器上需要的数据进行备份 2 安装从库的 MySQL, ...

  7. Redis 主从集群搭建及哨兵模式配置

    Redis 主从集群搭建及哨兵模式配置 最近搭建了redis集群及哨兵模式,为方便以后查看特此记录下来: 1.Redis安装 2.主从架构 2.1 Redis主从架构图 2.2Redis主从结构搭建 ...

  8. Redis主从集群搭建及其原理

    Redis主从集群搭建及其原理 1.Redis主从 1.1.搭建主从架构 1.2.准备实例和配置 1.3.启动 1.4.开启主从关系 1.5.测试 2.主从数据同步原理 2.1.全量同步 2.2.增量 ...

  9. MySQL连接问题【如何解决MySQL连接超时关闭】

    --MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...

最新文章

  1. 为什么“15。。。”会导致微信ANR?
  2. 如何更改mysql的授权信息_Mysql 的用户权限等操作管理与设置(创建、授权、修改、查看)...
  3. php 分页参数丢失,THINKPHP3.2搜索分页丢失参数,实现保留搜索条件解决办法
  4. android xe 调用 java,Delphi XE6 for Android 让手机震动(调用Java的函数)
  5. 公开课视频与课件(完全免费)-《大企业云桌面部署实战》
  6. 玻璃体浑浊的分子原理
  7. C语言程序设计及上机指导,《C语言程序设计上机指导》全套教案
  8. Linux的分区类型
  9. POJ3067 Japan(归并排序)
  10. 下一代iPhone将变成“越南制造”?富士康已在越南买地
  11. 应对大数据分析的几个方法
  12. Linux 分区简介
  13. 对python程序设计的学习心得_程序设计心得体会-精选模板
  14. 普林斯顿陈丹琦团队最新论文:受GPT-3启发,用小样本学习给语言模型做微调,性能最高提升30% | AI 日报...
  15. 第八次作业-项目进度计划
  16. HTML的表格边框的合并
  17. 坦然面对,大步向前!
  18. 作业3 跟踪分析Linux内核的启动过程
  19. STM32 阿里云MQTT esp8266 AT命令
  20. 视频教程-C语言核心编程-C/C++

热门文章

  1. 场强和电阻_电阻定律及其相关问题
  2. java中复制图片_如何在Java中实现复制图片
  3. java对焦_相机的对焦与合焦
  4. python echo off_生活中的python-随机分配单词输出至word
  5. python计算存款_python入门教程NO.8 用python写个存款利息计算器
  6. list多选 android,Android ExpandableListView单选以及多选实现代码
  7. java tomcat 日志_java – 访问Tomcat中的详细日志
  8. Redis主从读写分离配置
  9. nginx 配置后网站图片加载出来一半或者不出来
  10. 构建之法----软件工程简介