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;
查看状态如下显示,表示成功

目录结构

到这里配置就结束了,可以在主库里建表,测试是否同步到从库。

posted @   linyu3036  阅读(63)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示