使用docker compose部署MySQL主从复制集群

环境说明

  • 宿主机:Ubuntu 14.04.6 LTS
  • Docker Engine: 18.06.3-ce
  • docker compose: 1.28.5
  • MySQL镜像:mysql:8.0.22

MySQL集群规划

1个master和2个slaver

创建docker需要的mysql挂载目录

做如下约定:
创建mysql_cluster作为工作目录,然后在此目录创建masterslaver1slaver2目录作为MySQL集群各节点的挂载目录。在masterslaver1slaver2目录下,分别创建confdatamysql-files目录,分别用于放置mysql的配置文件my.cnf、mysql的数据文件,在master目录下创建initsql存放初始化sql文件(docker运行时挂载到/docker-entrypoint-initdb.d目录,该目录下的sql文件在mysql容器启动时将自动执行)。

关于mysql-files目录:用于挂载/var/lib/mysql-files目录,当docker挂载了外部配置文件与外部存储路径时,必须指定/var/lib/mysql-files的外部目录,否则mysql启动报错!

$ mkdir -p mysql_cluster/master/conf mysql_cluster/master/data  mysql_cluster/master/initsql mysql_cluster/master/mysql-files
$ cp -r mysql_cluster/master mysql_cluster/slaver1
$ cp -r mysql_cluster/master mysql_cluster/slaver2

目录创建完之后,结构如下:

-mysql_cluster-/master-/conf  #存放my.cnf配置文件,容器启动时挂载到/etc/mysql目录-/data  #存放mysql数据文件、socket和pid文件,容器启动时挂载到/var/lib/mysql目录-/initsql #存放初始化sql文件,容器启动时挂载到/docker-entrypoint-initdb.d目录-/my-files #容器启动时挂载到/var/lib/mysql-files目录-/slaver1-/conf  #同上-/data-/initsql -/my-files             -/slaver2-/conf  #同上-/data-/initsql -/my-files

MySQL各节点的配置文件my.cnf

master my.cnf

[mysqld]
server-id=100
log-bin=master-binlog
# The mysql database not sync
binlog-ignore-db=mysql
binlog_cache_size=1M
binlog_format=mixed
default_authentication_plugin=mysql_native_passwordpid-file=/var/lib/mysql/mysqld.pid
socket=/var/lib/mysql/mysqld.sock
datadir=/var/lib/mysql/data

注意data、pid文件和socket的存放目录!

注意我们使用default_authentication_plugin=mysql_native_password选项指定mysql使用的认证插件为mysql_native_password,否则slaver连接master会出现认证失败的错误!

slaver1 my.cnf

[mysqld]
server-id=101
log-bin=slaver1-binlog
relay_log=slaver1-relaylog
binlog-ignore-db=mysql
log_bin_trust_function_creators=true
binlog_cache_size=1M
binlog_format=mixed
slave_skip_errors=1062
default_authentication_plugin=mysql_native_passwordpid-file=/var/lib/mysql/mysqld.pid
socket=/var/lib/mysql/mysqld.sock
datadir=/var/lib/mysql/data

slaver2 my.cnf

[mysqld]
server-id=102
log-bin=slaver2-binlog
relay_log=slaver2-relaylog
binlog-ignore-db=mysql
log_bin_trust_function_creators=true
binlog_cache_size=1M
binlog_format=mixed
slave_skip_errors=1062
default_authentication_plugin=mysql_native_passwordpid-file=/var/lib/mysql/mysqld.pid
socket=/var/lib/mysql/mysqld.sock
datadir=/var/lib/mysql/data

将配置文件分别放置到各节点约定的目录下。

编写docker-compose.yml

我们使用docker compose来编排mysql集群容器,然后就可以一键启动了。
在mysql_cluster目录下创建文件docker-compose.yml

version: "3.9"
services:db_master:image: mysql:8.0.22container_name: db_masterenvironment:- MYSQL_ROOT_PASSWORD=123456ports:- "3306:3306"volumes:- "/home/gengyb/mysql_cluster/master/conf:/etc/mysql"- "/home/gengyb/mysql_cluster/master/data:/var/lib/mysql"- "/home/gengyb/mysql_cluster/master/initsql:/docker-entrypoint-initdb.d"- "/home/gengyb/mysql_cluster/master/mysql-files:/var/lib/mysql-files"db_slaver1:image: mysql:8.0.22container_name: db_slaver1environment:- MYSQL_ROOT_PASSWORD=123456ports:- "3316:3306"volumes:- "/home/gengyb/mysql_cluster/slaver1/conf:/etc/mysql"- "/home/gengyb/mysql_cluster/slaver1/data:/var/lib/mysql"- "/home/gengyb/mysql_cluster/slaver1/initsql:/docker-entrypoint-initdb.d"- "/home/gengyb/mysql_cluster/slaver1/mysql-files:/var/lib/mysql-files"db_slaver2:image: mysql:8.0.22container_name: db_slaver2environment:- MYSQL_ROOT_PASSWORD=123456ports:- "3326:3306"volumes:- "/home/gengyb/mysql_cluster/slaver2/conf:/etc/mysql"- "/home/gengyb/mysql_cluster/slaver2/data:/var/lib/mysql"- "/home/gengyb/mysql_cluster/slaver2/initsql:/docker-entrypoint-initdb.d"- "/home/gengyb/mysql_cluster/slaver2/mysql-files:/var/lib/mysql-files"

注意我们的目录挂载、端口映射和ROOT用户密码的配置!

准备MySQL master节点的初始化sql

为什么需要初始化sql?
当部署MySQL主从复制集群时,slaver需要知道master的信息才能连接master,并且slaver节点需要master节点的授权才能进行binlog的复制,这些都可以通过执行sql命令来完成配置,初始化sql就是用于存放这些sql语句的。

我们统一命名为init.sql,放置到initsql目录下。

master init.sql

CREATE USER 'root'@'db_slaver1' IDENTIFIED BY '123456';
grant replication slave, replication client on *.* to 'root'@'db_slaver1';
CREATE USER 'root'@'db_slaver2' IDENTIFIED BY '123456';
grant replication slave, replication client on *.* to 'root'@'db_slaver2';
flush privileges;

执行完上面的sql在master的mysql.user表中数据如下,包含db_slaver1,db_slaver2 说明授权成功!

user host
root %
root db_slaver1
root db_slaver2
mysql.infoschema localhost
mysql.session localhost
mysql.sys localhost
root localhost

可以在镜像启动完成后验证!

一键启动mysql集群

mysql_cluster目录下执行命令:

$ docker-compose up

注意,启动完之后master和slaver之间还不能进行复制,因为slaver还不知道master在哪儿啊!!!

首先在master节点查看状态,先进入容器:

$ docker exec -it db_master /bin/bash
#进入mysql命令行,这里注意sock文件的路径,我们在my.cnf中配置了:
mysql -uroot -p -S /var/lib/mysql/mysqld.sock

进入master的mysql命令行:


mysql> show master status;
+----------------------+----------+--------------+------------------+-------------------+
| File                 | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------+------------------+-------------------+
| master-binlog.000003 |      156 |              | mysql            |                   |
+----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

注意FilePosition字段,slaver中要用!

所以,需要在各个slaver中执行如下操作:

配置slaver1
进入容器,并进入mysql命令行:

$ docker exec -it db_slaver1 /bin/bash
#进入mysql命令行,这里注意sock文件的路径,我们在my.cnf中配置了:
mysql -uroot -p -S /var/lib/mysql/mysqld.sock

执行sql:

mysql> change master to master_host='db_master', master_user='root',master_password='123456',master_port=3306, master_log_file='master-binlog.000003', master_log_pos=156;
Query OK, 0 rows affected, 2 warnings (0.00 sec)mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

sql语句change master to master_host='db_master', master_user='root',master_password='123456',master_port=3306, master_log_file='master-binlog.000003', master_log_pos=156;,其中master_log_file的值就是master中查看状态File字段的值,master_log_pos值是Position字段的值,不要写错了!

查看slaver1的状态:

mysql> show slave status \G
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: db_masterMaster_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: master-binlog.000003Read_Master_Log_Pos: 156Relay_Log_File: slaver1-relaylog.000003Relay_Log_Pos: 328Relay_Master_Log_File: master-binlog.000003Slave_IO_Running: YesSlave_SQL_Running: Yes

只要Slave_IO_Running: YesSlave_SQL_Running: Yes都为Yes说明一切ok!

配置slaver2
按照上面的步骤对slaver2进行操作!完全按照上面的来,这里不写了。。。

测试一下

在master节点创建一个数据库test

create database test;

在slaver1中查看是否同步成功:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.01 sec)

已经同步成功!
slaver2中同样同步成功!

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
+--------------------+
5 rows in set (0.00 sec)

接下来,你可以创建个表试试,插入几条数据!

使用docker compose部署MySQL主从复制集群相关推荐

  1. Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群

    前言 随着应用业务数据不断的增大,应用的 响应速度不断下降,在检测过程中我们不难发现大多数的请求都是 查询操作.此时,我们可以将数据库扩展成 主从复制模式,将 读操作 和 写操作 分离开来,多台数据库 ...

  2. docker mysql日志写入本地_Docker Compose搭建MySQL主从复制集群

    转载自https://zhuanlan.zhihu.com/p/45193580 前言 随着应用业务数据不断的增大,应用的 响应速度不断下降,在检测过程中我们不难发现大多数的请求都是 查询操作.此时, ...

  3. 使用docker部署mysql主从复制集群

    一.环境搭建 虚拟机环境:centos7 IP:192.168.37.134 用户名:root 密码:123 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和 ...

  4. 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群

    一.环境搭建 虚拟机环境:centos7 IP:192.168.37.134 用户名:root 密码:123 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和 ...

  5. 使用 Docker Stack 部署多服务集群

    使用 Docker Stack 部署多服务集群 前言 单机模式下,我们可以使用 Docker Compose 来编排多个服务,而在 上一篇文章 中介绍的 Docker Swarm 只能实现对单个服务的 ...

  6. k8s(七)—statefullset部署mysql主从集群

    1 使用statefullset部署mysql主从集群 mysql-0是master mysql-1和mysql-2是两个备份 当mysql写的时候,找headless service中的mysql- ...

  7. innodb 集群_部署MySQL InnoDB集群以实现高可用性

    innodb 集群 In this article, I am going to explain how we can deploy the MySQL InnoDB cluster. InnoDB ...

  8. CentOS服务器Mysql主从复制集群的搭建

    在配置Mysql数据库主从复制集群的时候要保证: 1.主从服务器操作系统版本和位数一致. 2.Mysql版本一致. 为了保证稳定性,最好服务器操作系统和Mysql数据库环境一致. CentOS服务器上 ...

  9. 部署mysql MHA集群

    MHA 集群 集群:使用多台服务器提供相同的服务 集群类型:LB(负载均衡集群) HA (高可用集群) 拓扑结构 master51|| | | | | | slave52 slave53 slave5 ...

最新文章

  1. Fabric学习笔记-智能合约
  2. linux iconv函数失败,Linux 编码转换 (iconv失败的解决方法)
  3. 【Laravel-海贼王系列】第十三章,路由控制器解析
  4. 【数学】拉格朗日插值(luogu 4781/金牌导航 拉格朗日插值-1)
  5. Docker容器网络
  6. java的基本数据类型有什么特点_【Java】常用数据类型及其特点(万物都是变量)...
  7. JDK集合源码解析剖析
  8. 2022考研复习第二十三周
  9. HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作 网页制作基础大二dw作业 HTML5期末考核大作业 个人网站设计
  10. vscode彩色括号
  11. Excel 2013 查找和替换单元格内换行回车
  12. qq空间进入游戏显示服务器拒绝,打开QQ空间出现ptlogin2.qq.com的解决方法大全
  13. ps、firewords在win78中无法直接拖入的问题解决方法
  14. C++系列(关键字static)
  15. 我的Redis哨兵为什么不切换?
  16. excel表计算机实践操作,Excel电子表格计算机实践任务书.ppt
  17. MCE公司:新突破——癌症治疗耐药性问题有望彻底解决
  18. 云笔记软件有很多,哪款笔记比较好用?
  19. 从代理模式再出发!Proxy.newProxyInstance的秘密
  20. 数据可视化带你了解关于妈妈们的那些事儿

热门文章

  1. CorelDRAW2023最新工作室Win版矢量图形编辑与排版工具软件
  2. matlab 马尔可夫过程 实例,一个简单的马尔可夫过程例子
  3. 比较xdm gdm kdm 三者之间的区别
  4. 参与国际化项目需遵循的java命名规范
  5. 数据挖掘工程师发展方向浅谈
  6. 【黑马程序员】Redis学习笔记001:Redis简介+五种基本数据类型
  7. matlab对称正定矩阵,对称阵与正定矩阵 · Issue #18 · cyfile/Matlab-base-toolbox · GitHub...
  8. React-Redux应用示例
  9. 直播APP开发完成后,如何接入短信验证码服务
  10. 软件著作权使用许可种类