‍个人主页:阿木木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. 处理主从服务器之间的仿制推迟: 因为网络推迟和服务器负载等因素的影响,从服务器仿制主服务器的数据或许存在必定的推迟。为了保证从服务器与主服务器之间的数据同步,通常需要采纳一些措施来处理仿制推迟,例如调整仿制线程的参数或添加从服务器的功用。

Docker布置MySql主从具体教程

这儿需要留意的是,假如是在生产中运用,主张运用二进制文件进行装置布置,功用会更加好一些,也会更稳定。运用二进制布置的话 装备文件什么的都相同的,只是装置mysql的过程不相同。

好了,话不多说,开端布置!

二、 Mysql-Master 布置

2.1 拉取镜像

docker pull mysql:5.7.35

2.2 创建耐久化文件目录

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装备文件

vim /usr/local/mysql-master/conf/my.cnf

内容如下:

[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主节点镜像

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选项表明以后台形式运转容器。

Docker布置MySql主从具体教程

2.5 敞开端口权限

敞开防火墙拜访端口权限
firewall-cmd --zone=public --add-port=3306/tcp --permanent 
重启防火墙收效
systemctl restart firewalld.service
注:假如是云服务器还需要敞开对应的安全组

Docker布置MySql主从具体教程

测验可以正常衔接即可

三、Mysql-slave 布置

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

3.1 创建耐久化文件目录

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装备文件

[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从节点镜像

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 敞开端口权限

敞开防火墙拜访端口权限
firewall-cmd --zone=public --add-port=3307/tcp --permanent 
重启防火墙收效
systemctl restart firewalld.service
注:假如是云服务器还需要敞开对应的安全组

Docker布置MySql主从具体教程

四、装备主从同步

4.1 装备主节点拜访账号

# 检查正在运转的docker容器 
docker ps 
# 进入到指定id的容器中 
docker exec -it <容器id> /bin/bash

Docker布置MySql主从具体教程

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

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

## 创建从节点的拜访账号
CREATE USER 'slave'@'%' IDENTIFIED BY 'slave';
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
## 检查master状况
show master status; 

Docker布置MySql主从具体教程

退出mysql 履行 exit即可;

退出容器履行 exit即可;

4.2 装备从节点同步

如上相同,进入到从节点容器的mysql中。履行以下指令

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。

Docker布置MySql主从具体教程

最终测验一下,创建数据库,表,增修改查可以同步到从节点表明成功,多个从节点也是相同的布置办法,只需server_id不同即可。

Docker布置MySql主从具体教程

五、结束

感谢您的观看! 假如本文对您有协助,费事用您发财的小手点个三连吧!您的支撑就是作者行进的最大动力!再次感谢!