docker-compost安装mysql主从教程
MySQL主从同步原理
基本原理
slave会从master读取binlog来进行数据同步
具体步骤
- step1:master将数据改变记录到二进制日志(binary log)中。
- step2:当slave上执行 start slave 命令之后,slave会创建一个 IO 线程用来连接master,请求master中的binlog。
- step3:当slave连接master时,master会创建一个 log dump 线程,用于发送 binlog 的内容。在读取 binlog 的内容的操作中,会对主节点上的 binlog 加锁,当读取完成并发送给从服务器后解锁。
- step4:IO 线程接收主节点 binlog dump 进程发来的更新之后,保存到 中继日志(relay log) 中。
- step5:slave的SQL线程,读取relay log日志,并解析成具体操作,从而实现主从操作一致,最终数据一致。
docker-compost.yaml配置文件
version: '3.8'
services:
ly-mysql:
container_name: ly-mysql
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
hostname: ly-mysql
image: mysql:8.0.16
networks:
ly-network:
ipv4_address: 192.168.17.17
ports:
- "3306:3306"
restart: always
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/initdb:/docker-entrypoint-initdb.d
- ./mysql/conf.d/docker.cnf:/etc/mysql/conf.d/docker.cnf
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ly-mysqlslave:
container_name: ly-mysqlslave
environment:
- TZ=Asia/Shanghai
- MYSQL_ROOT_PASSWORD=123456
hostname: ly-mysqlslave
image: mysql:8.0.16
networks:
ly-network:
ipv4_address: 192.168.17.18
ports:
- "3307:3306"
restart: always
volumes:
- ./mysqlslave/data:/var/lib/mysql
- ./mysqlslave/initdb:/docker-entrypoint-initdb.d
- ./mysqlslave/conf.d/docker.cnf:/etc/mysql/conf.d/docker.cnf
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
networks:
ly-network:
driver: bridge
ipam:
config:
- subnet: 192.168.17.0/24
name: ly-network
mysql主从设置
创建文件 mysql\conf.d\docker.cnf主配置
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
skip-host-cache
skip-name-resolve
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
table_open_cache=512
wait_timeout=31536000
interactive_timeout=31536000
# 允許最大連接數
max_connections=500
# 允許連接失敗的次數。這是為了防止有人從該主機試圖攻擊數據庫系統
max_connect_errors=10
#log
log-bin=mysql-bin
binlog_format=ROW
#binlog每个日志文件大小
max_binlog_size=100m
#binlog缓存大小
binlog_cache_size=4m
#最大binlog缓存大小
max_binlog_cache_size=512m
server-id=1
binlog-do-db= test_dome #需要同步的数据库
innodb_buffer_pool_size=1024m
gtid-mode= on
enforce-gtid-consistency= on
创建文件 mysqlslave\conf.d\docker.cnf从配置
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
skip-host-cache
skip-name-resolve
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
table_open_cache=512
wait_timeout=31536000
interactive_timeout=31536000
# 允許最大連接數
max_connections=500
# 允許連接失敗的次數。這是為了防止有人從該主機試圖攻擊數據庫系統
max_connect_errors=10
#log
log-bin=mysql-bin
binlog_format=ROW
#binlog每个日志文件大小
max_binlog_size=100m
#binlog缓存大小
binlog_cache_size=4m
#最大binlog缓存大小
max_binlog_cache_size=512m
server-id=2
binlog-do-db= test_dome #需要同步的数据库
innodb_buffer_pool_size=1024m
skip-slave-start= 1
log-slave-updates= 1
gtid-mode= on
enforce-gtid-consistency= on
从库创建查询用户,用于从库查询使用
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT SELECT, INSERT ON *.* TO 'slave'@'%';
执行主从失败或开始建立主从时需执行以下语句:
主库执行:获取日志名称,及position
show master status;
从库执行:
停止同步
stop slave;
重置同步
reset slave;
建立同步设置
change master to master_host='192.168.17.17',MASTER_PORT=3306, master_user='root',master_password='123456',master_log_file='mysql-bin.000027',master_log_pos=26791910;
启动同步
start slave;
查看同步状态
show slave status;
查看状态如下显示,表示成功
目录结构
到这里配置就结束了,可以在主库里建表,测试是否同步到从库。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)