Docker部署MySql主从详细教程

👩🏽‍💻个人主页:阿木木AEcru

🔥 系列专栏:Docker容器化部署系列

💹每一次技术突破,都是对自我能力的挑战和超越。

一、前言

1.1 什么是Mysql主从?

MySQL主从复制是一种数据库复制技术,用于在多个MySQL数据库之间同步数据。在主从复制中,一个MySQL服务器(称为主服务器或主节点)作为数据源,将其数据库的更改传播到一个或多个MySQL服务器(称为从服务器或从节点)。从服务器接收主服务器的更改并将其应用到本地数据库,从而实现数据的复制和同步。

1.2 Mysql主从的好处是什么?

  1. 提高性能和可伸缩性: 主从复制可以分担主服务器的负载,从而提高系统的整体性能。从服务器可以处理读取请求,减轻主服务器的负担,并允许系统更轻松地扩展以处理更多的读取操作。
  2. 实现数据备份和灾难恢复: 通过在从服务器上复制主服务器的数据,可以实现数据备份和灾难恢复。如果主服务器发生故障或数据损坏,可以快速切换到一个从服务器来继续提供服务,同时保留数据的完整性。
  3. 提高可用性和容错能力: 通过在多个从服务器上复制主服务器的数据,可以提高系统的可用性和容错能力。如果主服务器出现故障,可以自动将一个从服务器提升为新的主服务器,从而确保系统的连续性和可用性。
  4. 实现读写分离: 主从复制允许在从服务器上执行只读操作,从而实现读写分离。这可以进一步提高系统的性能和吞吐量,同时减少主服务器的负载。

1.3 Mysql主从的实现原理是什么?

MySQL主从复制的实现原理基于一种称为二进制日志(binary log)的机制。

MySQL主从复制的基本实现原理:

  1. 主服务器记录二进制日志: 当在主服务器上执行写入操作时,MySQL会将这些更改记录到二进制日志中。二进制日志包含了主服务器上执行的所有更改操作的详细信息,包括对数据库表的插入、更新和删除操作。
  2. 从服务器连接到主服务器并请求日志: 从服务器连接到主服务器,并请求获取主服务器上的二进制日志。从服务器通过与主服务器建立连接,并发送请求来获取主服务器上的二进制日志。
  3. 从服务器将日志应用到本地数据库: 从服务器获取到主服务器的二进制日志后,将其应用到本地数据库。从服务器会按照主服务器上操作的顺序,逐条执行二进制日志中的操作,从而在本地数据库中复制主服务器的更改操作。
  4. 从服务器定期轮询获取新日志: 从服务器会定期轮询主服务器,检查是否有新的二进制日志可用。如果有新的二进制日志生成,从服务器会下载并应用这些新的日志,从而保持与主服务器的同步。
  5. 处理主从服务器之间的复制延迟: 由于网络延迟和服务器负载等因素的影响,从服务器复制主服务器的数据可能存在一定的延迟。为了确保从服务器与主服务器之间的数据同步,通常需要采取一些措施来处理复制延迟,例如调整复制线程的参数或增加从服务器的性能。

这里需要注意的是,如果是在生产中使用,建议使用二进制文件进行安装部署,性能会更加好一些,也会更稳定。使用二进制部署的话 配置文件什么的都一样的,只是安装mysql的步骤不一样。

好了,话不多说,开始部署!

二、 Mysql-Master 部署

2.1 拉取镜像

docker pull mysql:5.7.35

2.2 创建持久化文件目录

bash 复制代码
mkdir -p /usr/local/mysql-master/log \
mkdir -p /usr/local/mysql-master/data \
mkdir -p /usr/local/mysql-master/conf \
touch /usr/local/mysql-master/conf/my.cnf

log 目录主要用于存放日志信息

data 目录主要用于存放数据库中的大部分数据,包括表结构、表数据、索引等信息。

conf 目录主要用于存放mysql的配置文件

my.cnf 文件主要用于编写mysql相关配置

2.3 编写mysql配置文件

bash 复制代码
vim /usr/local/mysql-master/conf/my.cnf

内容如下:

ini 复制代码
[mysqld]
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
binlog_cache_size = 32K
thread_stack = 256K
join_buffer_size = 256K
query_cache_type = 0
max_heap_table_size = 128M
lower_case_table_names = 1
port = 3306
default_storage_engine = InnoDB
performance_schema_max_table_instances = 400
table_definition_cache = 400
skip-external-locking
key_buffer_size = 256M
table_open_cache = 1024
sort_buffer_size = 4096K
net_buffer_length = 4K
read_buffer_size = 4096K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 64M
thread_cache_size = 128
query_cache_size = 0M
tmp_table_size = 128M

explicit_defaults_for_timestamp = true
#skip-name-resolve
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

skip-ssl

log_bin = ON
server_id = 2
sync_binlog = 1
binlog_format = ROW
expire-logs-days=10
binlog-ignore-db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performation_schema

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

内容解读:

sql_mode:设置MySQL的SQL模式,这里指定了一系列严格模式和错误处理模式,例如禁止日期字段中的零值、禁止自动创建用户等。

binlog_cache_size:指定了二进制日志缓存的大小,这是MySQL服务器用于存储二进制日志事件的缓冲区大小。

thread_stack:设置线程栈的大小,即每个MySQL线程的栈空间大小。

join_buffer_size:设置连接缓冲区的大小,用于执行连接操作时的中间结果缓存。

query_cache_type:设置查询缓存的类型,这里将其设置为0,表示禁用查询缓存。

max_heap_table_size:设置最大的堆表(内存表)大小限制。

lower_case_table_names:设置表名的大小写规则,这里设置为1表示表名不区分大小写。

port:指定MySQL服务器监听的端口号。

default_storage_engine:设置默认的存储引擎,这里设置为InnoDB。

performance_schema_max_table_instances:设置性能模式中表实例的最大数量。

table_definition_cache:设置表定义缓存的大小。

skip-external-locking:禁用外部锁定,不再支持旧式的外部锁定。

key_buffer_size:设置MyISAM索引缓冲区的大小。

table_open_cache:设置表打开缓存的大小,用于存储表的打开实例。

sort_buffer_size:设置排序缓冲区的大小,用于执行排序操作时的中间结果缓存。

net_buffer_length、read_buffer_size、read_rnd_buffer_size:分别设置网络缓冲区、读取缓冲区和随机读取缓冲区的大小。

myisam_sort_buffer_size:设置MyISAM排序缓冲区的大小。

thread_cache_size:设置线程缓存的大小,用于存储已经分配但未被使用的线程。

query_cache_size:设置查询缓存的大小,这里将其设置为0,表示禁用查询缓存。

tmp_table_size:设置临时表的最大大小。

explicit_defaults_for_timestamp:设置是否启用了显式的时间戳默认值。

max_connections:设置最大连接数。

max_connect_errors:设置最大连接错误数。

open_files_limit:设置打开文件的限制数。

skip-ssl:禁用SSL连接。

log_bin:启用二进制日志功能。

server_id:设置服务器的ID。

sync_binlog:设置二进制日志的同步方式。

binlog_format:设置二进制日志的格式,这里设置为ROW格式。

expire-logs-days:设置二进制日志文件的过期时间。

binlog-ignore-db:设置要忽略的数据库,这里分别忽略了mysql、information_schema和performance_schema数据库。

symbolic-links:设置是否允许符号链接,这里设置为0,禁用符号链接以防止安全风险。

2.4 运行mysql主节点镜像

perl 复制代码
docker run -p 3306:3306 --name mysql-master \
-v /usr/local/mysql-master/log:/var/log/mysql \
-v /usr/local/mysql-master/data:/var/lib/mysql \
-v /usr/local/mysql-master/conf:/etc/mysql/  \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7.35  

内容解读:

-p 3306:3306:将容器的3306端口映射到主机的3306端口,允许通过主机的3306端口访问MySQL服务。

--name mysql-master:给容器指定一个名称,这里命名为mysql-master。

-v /usr/local/mysql-master/log:/var/log/mysql:将主机上的/usr/local/mysql-master/log目录挂载到容器内的/var/log/mysql目录,用于存放MySQL日志文件。

-v /usr/local/mysql-master/data:/var/lib/mysql:将主机上的/usr/local/mysql-master/data目录挂载到容器内的/var/lib/mysql目录,用于存放MySQL数据文件。

-v /usr/local/mysql-master/conf:/etc/mysql/:将主机上的/usr/local/mysql-master/conf目录挂载到容器内的/etc/mysql/目录,用于存放MySQL的配置文件。

-e MYSQL_ROOT_PASSWORD=root:设置MySQL的root用户密码为root。-e选项用于设置环境变量。

-d mysql:5.7.35:指定要运行的Docker镜像为MySQL 5.7.35版本。-d选项表示以后台模式运行容器。

2.5 开启端口权限

css 复制代码
开启防火墙访问端口权限
firewall-cmd --zone=public --add-port=3306/tcp --permanent 
重启防火墙生效
systemctl restart firewalld.service
注:如果是云服务器还需要开放对应的安全组

测试能够正常连接即可

三、Mysql-slave 部署

由于我这里是用的同一台服务器做的演示,所以我这里就不再去拉取镜像了

3.1 创建持久化文件目录

bash 复制代码
mkdir -p /usr/local/mysql-slave/log \
mkdir -p /usr/local/mysql-slave/data \
mkdir -p /usr/local/mysql-slave/conf 


touch /usr/local/mysql-slave/conf/my.cnf

3.2 编写mysql配置文件

ini 复制代码
[mysqld]
binlog_cache_size = 32K
thread_stack = 256K
join_buffer_size = 256K
query_cache_type = 0
max_heap_table_size = 128M
lower_case_table_names = 1
port = 3306
default_storage_engine = InnoDB
performance_schema_max_table_instances = 400
table_definition_cache = 400
skip-external-locking
key_buffer_size = 256M
table_open_cache = 1024
sort_buffer_size = 4096K
net_buffer_length = 4K
read_buffer_size = 4096K
read_rnd_buffer_size = 256K
myisam_sort_buffer_size = 64M
thread_cache_size = 128
query_cache_size = 0M
tmp_table_size = 128M

explicit_defaults_for_timestamp = true
#skip-name-resolve
max_connections = 500
max_connect_errors = 100
open_files_limit = 65535

skip-ssl

log_bin = ON
server_id = 1
sync_binlog = 1
binlog_format = ROW
binlog-ignore-db = mysql
binlog_ignore_db = information_schema
binlog_ignore_db = performation_schema

# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

内容解释:

binlog_cache_size = 32K:设置二进制日志缓存的大小为32KB。
thread_stack = 256K:设置线程栈的大小为256KB,即每个MySQL线程的栈空间大小。
join_buffer_size = 256K:设置连接缓冲区的大小为256KB,用于执行连接操作时的中间结果缓存。
query_cache_type = 0:设置查询缓存的类型为0,表示禁用查询缓存。
max_heap_table_size = 128M:设置最大的堆表(内存表)大小限制为128MB。
lower_case_table_names = 1:设置表名的大小写规则,这里设置为1表示表名不区分大小写。
port = 3306:指定MySQL服务器监听的端口号为3306。
default_storage_engine = InnoDB:设置默认的存储引擎为InnoDB。
performance_schema_max_table_instances = 400:设置性能模式中表实例的最大数量为400。
table_definition_cache = 400:设置表定义缓存的大小为400。
skip-external-locking:禁用外部锁定,不再支持旧式的外部锁定。
key_buffer_size = 256M:设置MyISAM索引缓冲区的大小为256MB。
table_open_cache = 1024:设置表打开缓存的大小为1024,用于存储表的打开实例。
sort_buffer_size = 4096K:设置排序缓冲区的大小为4096KB,用于执行排序操作时的中间结果缓存。
net_buffer_length = 4K、read_buffer_size = 4096K、read_rnd_buffer_size = 256K:分别设置网络缓冲区、读取缓冲区和随机读取缓冲区的大小。
myisam_sort_buffer_size = 64M:设置MyISAM排序缓冲区的大小为64MB。
thread_cache_size = 128:设置线程缓存的大小为128,用于存储已经分配但未被使用的线程。
query_cache_size = 0M:设置查询缓存的大小为0MB,表示禁用查询缓存。
tmp_table_size = 128M:设置临时表的最大大小为128MB。
explicit_defaults_for_timestamp = true:设置是否启用了显式的时间戳默认值为true。
max_connections = 500:设置最大连接数为500。
max_connect_errors = 100:设置最大连接错误数为100。
open_files_limit = 65535:设置打开文件的限制数为65535。
skip-ssl:禁用SSL连接。
log_bin = ON:启用二进制日志功能。
server_id = 1:设置服务器的ID为1。
sync_binlog = 1:设置二进制日志的同步方式为每次提交事务。
binlog_format = ROW:设置二进制日志的格式为ROW格式。
binlog-ignore-db = mysql、binlog_ignore_db = information_schema、binlog_ignore_db = performance_schema:分别设置要忽略的数据库为mysql、information_schema和performance_schema。
symbolic-links=0:设置是否允许符号链接为0,禁用符号链接以防止安全风险。

3.3 启动运行mysql从节点镜像

perl 复制代码
docker run -p 3307:3306 --name mysql-slave  \
-v /usr/local/mysql-slave/log:/var/log/mysql \
-v /usr/local/mysql-slave/data:/var/lib/mysql \
-v /usr/local/mysql-slave/conf:/etc/mysql/  \
-e MYSQL_ROOT_PASSWORD=root  \
-d mysql:5.7.35  

由于在同一台服务器部署,主节点已经占用了3306端口,这里的子节点就使用了3307端口,避免端口冲突。

3.5 开启端口权限

css 复制代码
开启防火墙访问端口权限
firewall-cmd --zone=public --add-port=3307/tcp --permanent 
重启防火墙生效
systemctl restart firewalld.service
注:如果是云服务器还需要开放对应的安全组

四、配置主从同步

4.1 配置主节点访问账号

bash 复制代码
# 查看正在运行的docker容器 
docker ps 
# 进入到指定id的容器中 
docker exec -it <容器id> /bin/bash

进到容器之后,访问数据库 mysql -uroot -p 回车 ,然后输入密码。

进入到mysql后执行以下语句:

sql 复制代码
## 创建从节点的访问账号
CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';


## 查看master状态
show master status; 

退出mysql 执行 exit即可;

退出容器执行 exit即可;

4.2 配置从节点同步

如上一样,进入到从节点容器的mysql中。执行以下指令

ini 复制代码
CHANGE MASTER TO
MASTER_HOST='126.32.92.61',
MASTER_USER='slave',
MASTER_PASSWORD='slave',
MASTER_LOG_FILE='ON.000004',
MASTER_LOG_POS=617;

执行完成后,开启同步
start slave;
  1. MASTER_HOST='126.32.92.61':指定主节点的IP地址或主机名,这里设置为126.32.92.61。
  2. MASTER_USER='slave':指定用于连接主节点的用户名,这里设置为slave。
  3. MASTER_PASSWORD='slave':指定用于连接主节点的密码,这里设置为slave。
  4. MASTER_LOG_FILE='ON.000004':指定从哪个二进制日志文件开始复制数据。这里设置为ON.000004。
  5. MASTER_LOG_POS=617:指定从二进制日志文件的哪个位置开始复制数据。这里设置为617。

最后测试一下,创建数据库,表,增删改查能够同步到从节点表示成功,多个从节点也是一样的部署方法,只要server_id不同即可。

五、结尾

感谢您的观看! 如果本文对您有帮助,麻烦用您发财的小手点个三连吧!您的支持就是作者前进的最大动力!再次感谢!

相关推荐
奥顺互联V5 分钟前
一次性部署:使用Docker部署PHP应用
大数据·mysql·开源·php
小黄人软件12 分钟前
20241220流水的日报 mysql的between可以用于字符串 sql 所有老日期的,保留最新日期
数据库·sql·mysql
dessler18 分钟前
Docker-如何启动docker
运维·docker·云原生·容器·eureka
zhy2956318 分钟前
【DOCKER】基于DOCKER的服务之DUFS
运维·docker·容器·dufs
无为之士23 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
XiaoH2331 小时前
培训机构Day15
sql·mysql
ThisIsClark1 小时前
【后端面试总结】MySQL主从复制逻辑的技术介绍
mysql·面试·职场和发展
蜜獾云2 小时前
docker 安装雷池WAF防火墙 守护Web服务器
linux·运维·服务器·网络·网络安全·docker·容器
Python之栈2 小时前
【无标题】
数据库·python·mysql
年薪丰厚3 小时前
如何在K8S集群中查看和操作Pod内的文件?
docker·云原生·容器·kubernetes·k8s·container