Docker快速搭建Mysql8一主两从复制架构

Docker快速搭建Mysql8一主两从复制架构


一、快速创建mysql实例

角色server_id

二、配置mysql主从复制

1.主节点

1.1.创建挂载目录

mkdir -p /mysql/replication/source/data /mysql/replication/source/conf
/mysql/replication/source/log

1.2.准备配置文件

vim /mysql/replication/source/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8

[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql

secure-file-priv= NULL

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

# 服务器唯一ID,默认是1
server-id=10

# 启用二进制日志
log-bin=mysql-bin

# 最大连接数
max_connections=1000

# 设置默认时区
default-time_zone='+8:00'

# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1

!includedir /etc/mysql/conf.d/

pid-file: 这是MySQL服务器的进程ID文件的位置。通过这个文件,您可以在系统上找到正在运行的
MySQL服务器的进程。
socket: 这是MySQL服务器用于本地通信的Unix套接字文件的位置。
datadir: 这是MySQL服务器存储其数据文件的位置。
secure-file-priv: 这是一个用于限制LOAD_FILE()和SELECT … INTO OUTFILE命令的文件路径。
如果此选项被设置,那么这两个命令只能用于读取在这个路径下的文件。设置为NULL表示禁用这
个功能。
symbolic-links: 如果设置为0,MySQL服务器将不允许在数据目录中使用符号链接。这有助于防止
安全风险。
server-id: 每个MySQL服务器实例在复制时需要有一个唯一的ID。这有助于区分不同的服务器,特
别是在复制环境中。
log-bin: 启用二进制日志记录所有对数据库的更改,这对于复制和恢复操作是必要的。
max_connections: 这是MySQL服务器可以接受的最大并发连接数。
default-time_zone: 这设置了MySQL服务器的默认时区。
lower_case_table_names: 这决定了MySQL如何存储和比较表名。设置为1意味着表名不区分大小
写(但在文件系统中它们仍然会区分大小写)。
!includedir /etc/mysql/conf.d/: 这告诉MySQL服务器从/etc/mysql/conf.d/目录中包含其他配置文
件。这意味着该目录下的任何.cnf或.ini文件都会被合并到这个主配置文件中。
replicate_do_db : 待同步的数据库日志
replicate_ignore_db:不同步的数据库日志

1.3.运行mysql容器

# 创建主从复制的网络
docker network create --driver bridge mysql-source-replica
#运行mysql容器
docker run -d \
--name mysql-source \
--privileged=true \
--restart=always \
--network mysql-source-replica \
-p 3307:3306 \
-v /mysql/replication/source/data:/var/lib/mysql \
-v /mysql/replication/source/conf:/etc/mysql/conf.d \
-v /mysql/replication/source/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1

1.4.配置远程访问

docker exec -it mysql-source /bin/bash
mysql -u root -p

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

在这里插入图片描述

2.从节点1

2.1.配置挂载目录

# 创建挂载目录
mkdir -p /mysql/replication/replica1/data /mysql/replication/replica1/conf
/mysql/replication/replica1/log

#准备配置文件
vim /mysql/replication/replica1/conf/custom.cnf

2.2.准备配置文件

vim /mysql/replication/replica1/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8

[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql

secure-file-priv= NULL

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

# 服务器唯一ID,默认是1
server-id=10

# 启用二进制日志
log-bin=mysql-bin

# 最大连接数
max_connections=1000

# 设置默认时区
default-time_zone='+8:00'

# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1

!includedir /etc/mysql/conf.d/

2.3.运行mysql容器


#运行mysql容器
docker run -d \
--name mysql-replica1\
--privileged=true \
--restart=always \
--network mysql-source-replica \
-p 3307:3306 \
-v /mysql/replication/source/data:/var/lib/mysql \
-v /mysql/replication/source/conf:/etc/mysql/conf.d \
-v /mysql/replication/source/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1

2.4.配置远程访问

docker exec -it mysql-replica1 /bin/bash
mysql -u root -p

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

在这里插入图片描述

3.从节点2

3.1.创建挂载目录

mkdir -p /mysql/replication/replica2/data /mysql/replication/replica2/conf
/mysql/replication/replica2/log

3.2.准备配置文件

vim /mysql/replication/replica2/conf/custom.cnf
[mysql]
# 设置mysql客户端默认编码
default-character-set=utf8

[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql

secure-file-priv= NULL

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

# 服务器唯一ID,默认是1
server-id=10

# 启用二进制日志
log-bin=mysql-bin

# 最大连接数
max_connections=1000

# 设置默认时区
default-time_zone='+8:00'

# 0:区分大小写
# 1:不区分大小写
lower_case_table_names=1

!includedir /etc/mysql/conf.d/

3.3.运行mysql容器

#运行mysql容器
docker run -d \
--name mysql-replica2\
--privileged=true \
--restart=always \
--network mysql-source-replica \
-p 3307:3306 \
-v /mysql/replication/source/data:/var/lib/mysql \
-v /mysql/replication/source/conf:/etc/mysql/conf.d \
-v /mysql/replication/source/log:/logs \
-e MYSQL_ROOT_PASSWORD=123456 \
-e TZ=Asia/Shanghai mysql:8.0.27 \
--lower_case_table_names=1

3.4.配置远程访问

docker exec -it mysql-replica2 /bin/bash
mysql -u root -p

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
flush privileges;

在这里插入图片描述

4.主库配置复制用户

  • List item

每个副本使用一个 MySQL 用户名和密码连接到源,因此在源上必须有一个用户帐户,副本可以使用
该帐户进行连接。

 # 连接主库mysql-source
CREATE USER 'xiaodeng'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'xiaodeng'@'%';
flush privileges;

5.查看 master 机器的状态

使用 SHOW MASTER STATUS 语句确定当前二进制日志文件的名称和位置

 # 主库上执行
SHOW MASTER STATUS;

在这里插入图片描述

“文件”列显示日志文件的名称,“位置”列显示文件内的位置。

6.从节点设置主库信息

文档:https://dev.mysql.com/doc/refman/8.0/en/replication-howto-slaveinit.html

在从库上执行 CHANGE REPLICATION SOURCE TO 语句(来自 MySQL 8.0.23)或 CHANGE MASTER
TO语句(在 MySQL 8.0.23之前)

mysql> CHANGE MASTER TO
 -> MASTER_HOST='source_host_name',
 -> MASTER_USER='replication_user_name',
 -> MASTER_PASSWORD='replication_password',
 -> MASTER_LOG_FILE='recorded_log_file_name',
 -> MASTER_LOG_POS=recorded_log_position;

 Or from MySQL 8.0.23:
mysql> CHANGE REPLICATION SOURCE TO
 -> SOURCE_HOST='source_host_name',
 -> SOURCE_USER='replication_user_name',
 -> SOURCE_PASSWORD='replication_password',
 -> SOURCE_LOG_FILE='recorded_log_file_name',
 -> SOURCE_LOG_POS=recorded_log_position;

6.1.从库1和从库2上执行

# from MySQL 8.0.23 执行下面的命令。 
change replication source to source_host='192.168.65.185', source_user='fox',
source_password='123456', source_port=3307, source_log_file='mysql-bin.000003',
source_log_pos=1273, source_connect_retry=30;

source_host:主数据库的IP地址;
source_port:主数据库的运行端口;
source_user:在主数据库创建的用于同步数据的用户账号;
source_password:在主数据库创建的用于同步数据的用户密码;
source_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
source_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position
参数;
source_connect_retry:连接失败重试的时间间隔,单位为秒。

在这里插入图片描述

7.开启从库

#开启从库
start slave; 或者 start replica;
#查看从库状态
show slave status \G; 或者 show replica status \G;

在这里插入图片描述

看到Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates基本说明
配置成功了,已经开始了主从复制。

8.测试主从复制功能

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

CREATE DATABASE IF NOT EXISTS test;
USE test; 
 -- ----------------------------
 -- Table structure for user
 -- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
	`id` int(0) NOT NULL AUTO_INCREMENT,
	`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT
NULL,
	`address` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT
NULL,
	`last_updated` bigint(0) NULL DEFAULT NULL,
	`is_deleted` int(0) NULL DEFAULT NULL,
	PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE =
utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

 -- ----------------------------
 -- Records of user
 -- ----------------------------
 INSERT INTO `user` VALUES (2, '张三', '广州白云山', 1691563465, 0);

 SET FOREIGN_KEY_CHECKS = 1;
  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值