使用docker compose部署MySQL主从复制集群
使用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
作为工作目录,然后在此目录创建master
、slaver1
和slaver2
目录作为MySQL集群各节点的挂载目录。在master
、slaver1
和slaver2
目录下,分别创建conf
、data
和mysql-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)
注意File
和Position
字段,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: Yes
和Slave_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主从复制集群相关推荐
- Docker学习总结(43)——Docker Compose 搭建Mysql主从复制集群
前言 随着应用业务数据不断的增大,应用的 响应速度不断下降,在检测过程中我们不难发现大多数的请求都是 查询操作.此时,我们可以将数据库扩展成 主从复制模式,将 读操作 和 写操作 分离开来,多台数据库 ...
- docker mysql日志写入本地_Docker Compose搭建MySQL主从复制集群
转载自https://zhuanlan.zhihu.com/p/45193580 前言 随着应用业务数据不断的增大,应用的 响应速度不断下降,在检测过程中我们不难发现大多数的请求都是 查询操作.此时, ...
- 使用docker部署mysql主从复制集群
一.环境搭建 虚拟机环境:centos7 IP:192.168.37.134 用户名:root 密码:123 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和 ...
- 自动化部署mysql主从复制集群_使用docker部署mysql主从复制集群
一.环境搭建 虚拟机环境:centos7 IP:192.168.37.134 用户名:root 密码:123 启动3个容器,一个是master,端口是3307,另外两个是slaver,端口是3308和 ...
- 使用 Docker Stack 部署多服务集群
使用 Docker Stack 部署多服务集群 前言 单机模式下,我们可以使用 Docker Compose 来编排多个服务,而在 上一篇文章 中介绍的 Docker Swarm 只能实现对单个服务的 ...
- k8s(七)—statefullset部署mysql主从集群
1 使用statefullset部署mysql主从集群 mysql-0是master mysql-1和mysql-2是两个备份 当mysql写的时候,找headless service中的mysql- ...
- innodb 集群_部署MySQL InnoDB集群以实现高可用性
innodb 集群 In this article, I am going to explain how we can deploy the MySQL InnoDB cluster. InnoDB ...
- CentOS服务器Mysql主从复制集群的搭建
在配置Mysql数据库主从复制集群的时候要保证: 1.主从服务器操作系统版本和位数一致. 2.Mysql版本一致. 为了保证稳定性,最好服务器操作系统和Mysql数据库环境一致. CentOS服务器上 ...
- 部署mysql MHA集群
MHA 集群 集群:使用多台服务器提供相同的服务 集群类型:LB(负载均衡集群) HA (高可用集群) 拓扑结构 master51|| | | | | | slave52 slave53 slave5 ...
最新文章
- Fabric学习笔记-智能合约
- linux iconv函数失败,Linux 编码转换 (iconv失败的解决方法)
- 【Laravel-海贼王系列】第十三章,路由控制器解析
- 【数学】拉格朗日插值(luogu 4781/金牌导航 拉格朗日插值-1)
- Docker容器网络
- java的基本数据类型有什么特点_【Java】常用数据类型及其特点(万物都是变量)...
- JDK集合源码解析剖析
- 2022考研复习第二十三周
- HTML5网页设计成品_学生DW静态网页设计_web课程设计网页制作 网页制作基础大二dw作业 HTML5期末考核大作业 个人网站设计
- vscode彩色括号
- Excel 2013 查找和替换单元格内换行回车
- qq空间进入游戏显示服务器拒绝,打开QQ空间出现ptlogin2.qq.com的解决方法大全
- ps、firewords在win78中无法直接拖入的问题解决方法
- C++系列(关键字static)
- 我的Redis哨兵为什么不切换?
- excel表计算机实践操作,Excel电子表格计算机实践任务书.ppt
- MCE公司:新突破——癌症治疗耐药性问题有望彻底解决
- 云笔记软件有很多,哪款笔记比较好用?
- 从代理模式再出发!Proxy.newProxyInstance的秘密
- 数据可视化带你了解关于妈妈们的那些事儿
热门文章
- CorelDRAW2023最新工作室Win版矢量图形编辑与排版工具软件
- matlab 马尔可夫过程 实例,一个简单的马尔可夫过程例子
- 比较xdm gdm kdm 三者之间的区别
- 参与国际化项目需遵循的java命名规范
- 数据挖掘工程师发展方向浅谈
- 【黑马程序员】Redis学习笔记001:Redis简介+五种基本数据类型
- matlab对称正定矩阵,对称阵与正定矩阵 · Issue #18 · cyfile/Matlab-base-toolbox · GitHub...
- React-Redux应用示例
- 直播APP开发完成后,如何接入短信验证码服务
- 软件著作权使用许可种类