docker搭建简单mysql主从
关于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 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,则表示复制是正常进行的,到这里我们的主从结构也就搭建完成了。
3. 测试主从服务
测试主从服务比较简单,只需要在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的。
4. 小结
本文主要讲解了如何通过docker运行两个MySQL容器,并且详细介绍了如何将两个容器连接起来,以及如何配置主从数据库架构模式。
docker搭建简单mysql主从的更多相关文章
- Docker 搭建 Tomcat + Mysql
Docker 搭建 Tomcat + Mysql 准备 虚拟机 虚拟机安装Docker 在纯净的Centos镜像上搭建 Centos镜像准备 虚拟机上拉取 Centos 镜像: docker pull ...
- Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案
原文:Docker搭建的MySQL容器出现 "Too many connections 1040" 最大连接数修改完未生效的解决方案 版权声明:本文为博主原创文章,未经博主允许不得 ...
- 使用Innobackupex快速搭建(修复)MySQL主从架构
MySQL的主从搭建大家有很多种方式,传统的mysqldump方式是很多人的选择之一.但对于较大的数据库则该方式并非理想的选择.使用Xtrabackup可以快速轻松的构建或修复mysql主从架构.本文 ...
- Docker 搭建简单 LVS
LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux内核中实现了基 ...
- centos7上用docker搭建简单的前后端分离项目
1. 安装docker Docker 要求 CentOS 系统的内核版本高于 3.10 ,首先验证你的CentOS 版本是否支持 Docker . 通过 uname -r 命令查看你当前的内核版本 使 ...
- django 本地项目部署uwsgi 以及云服务器部署 uwsgi+Nginx+Docker+MySQL主从
一 .django 本地项目部署uwsgi 1 本地部署项目 uwsgi安装测试 通过uwsgi 进行简单部署 安装uwsgi命令:pip install uwsgi -i http://pypi.d ...
- 聊聊Mysql主从同步读写分离配置实现
Hi,各位热爱技术的小伙伴您们好,好久没有写点东西了,今天写点关于mysql主从同步配置的操作日志同大家一起分享.最近自己在全新搭建一个mysql主从同步读写分离数据库简单集群,我讲实际操作步骤整理分 ...
- 这次一定要教会你搭建Redis集群和MySQL主从同步(非Docker)
前言 一直都想自己动手搭建一个Redis集群和MySQL的主从同步,当然不是依靠Docker的一键部署(虽然现在企业开发用的最多的是这种方式),所以本文就算是一个教程类文章吧,但在动手搭建之前,会先聊 ...
- 【架构】docker环境搭建mysql主从
序 本文主要研究怎么在docker上搭建mysql的主从.因为在单机搭建mysql多实例然后再配主从,感觉太痛苦了,环境各有不同,配置各不大相 同,从网上找搭建方法,试了半天也没成功,最后也没耐心调试 ...
随机推荐
- JDBC 用PreparedStatement语句动态操作SQL语句
https://blog.csdn.net/u014453898/article/details/79038187 1.Statement 和 PreparedStatement: Statement ...
- Django自学计划之集装箱货物运输物流仓储一站式ERP系统
业余开始学习时间:2018年1月 业余学习时间段:每天下班晚饭后时间+无事的星期六和星期天+上班时的空闲时间 自学目标: 1.我们要用管理的思维来写我们的系统! 2.我们要用我们的ERP系统帮助中小集 ...
- Vue学习笔记-Vue.js-2.X 学习(一)===>基本知识学习
一 使用环境: windows 7 64位操作系统 二 IDE:VSCode/PyCharm 三 Vue.js官网: https://cn.vuejs.org/ 四 下载安装引用 方式1:直接 ...
- 微信支付/支付宝支付/银联支付,对比加总结(Java服务端)
今天来讲讲支付. 工作到现在,接入过好几个项目的支付,其中涉及到了微信支付.支付宝支付.银联支付. 三种支付的对接感受其实整体上大同小异.都遵循同一个流程: 1).商户APP向商户服务器请求生成订单 ...
- CSS的定位布局(position)
定位 static(默认值) 没有开启定位 relative 相对定位的性质 包含块(containing block)概念 没有开启定位时包含块就是当前元素最近的祖先块元素 开启绝对定位后的元素包含 ...
- 永恒之蓝(MS17-010)检测与利用
目录 利用Nmap检测 MSF反弹SHELL 注意 乱码 参考 利用Nmap检测 命令: nmap -p445 --script smb-vuln-ms17-010 [IP] # 如果运行报错,可以加 ...
- 通过golang小案例,了解golang程序常见机制
目录 代码理解及纠错 1.defer和panic执行先后顺序 2.for循环元素副本问题 3.slice追加元素问题 4.返回值命名问题 5.用new初始化内置类型问题 6.切片append另外一个切 ...
- 在windows上安装MySQL数据库注意点及Navicat Premium 15的破解
在windows上安装MySQL数据库 跟随慕课网教程(http://www.imooc.com/wiki/mysqllesson/mysqlwindows.html)下载安装MySQL: 其中注意 ...
- 扫盲贴|如何评价一款App的稳定性和质量?
作者:友盟+移动开发专家 张文 「崩溃」与「卡顿」.「异常退出」等一样,是影响App稳定性常见的三种情况.相关数据显示,当iOS的崩溃率超过0.8%,Android的崩溃率超过0.4%的时候,活跃用户 ...
- httpd解析PHP
1.vim /usr/local/apache2.4/conf/httpd.conf 编辑httpd的主配置文件 搜索ServerName,把ServerName www.example.com:80 ...