docker mariadb 主从复制

1. 创建配置文件

主节点: master.cnf

[client]
# 默认字符集
default-character-set=utf8mb4

[mysqld]
# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
# 允许最大链接数
max_connections=4096

# 服务器引擎
default-storage-engine=InnoDB

# 表名小写
# lower_case_table_names=1

# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M

# binlog 格式 row statement mixed
binlog_format=mixed

# 忽略的数据库binlog
binlog-ignore-db=mysql,information_schema

# 到期自动删除
expire_logs_day=7

# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

# 设置server_id,一般设置为IP,注意要唯一
server-id=1

# bin-log
log_bin=mariadb-bin

从节点 slave.cnf

[client]
# 默认字符集
default-character-set=utf8mb4

[mysqld]
# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci

# 服务器引擎
default-storage-engine=InnoDB

# 表名小写
# lower_case_table_names=1

# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M

# binlog 格式 row statement mixed
binlog_format=mixed

# 忽略的数据库binlog
binlog-ignore-db=mysql,information_schema

# 到期自动删除
expire_logs_day=7

# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

# 设置server_id,一般设置为IP,注意要唯一
server-id=10

# bin-log
log_bin=slave-mariadb-bin

# 表示slave将复制事件写进自己的二进制日志
log_slave_updates=1

# 记录同步信息
relay-log=slave-relay-bin

# 防止改变数据(除了特殊的线程)
read_only=1

# 同步刷新binlog,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,
# 而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
# sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘
# 1 最安全,但是最慢。 0 最快,但是风险最大
sync_binlog=0

docker-compose 配置文件 docker-compose.yml

version: "3"
services: 
  mariadb-master:
    image: mariadb:10.7.1
    container_name: mariadb-master
    restart: always
    ports:
      - "3307:3306"
    environment:
#密码
      - MARIADB_ROOT_PASSWORD=abcd!234
    volumes:
      - ../master/data:/var/lib/mysql:cached
      - ./master.cnf:/etc/mysql/my.cnf:cached
    security_opt:
      - seccomp:unconfined
    logging: 
      driver: "json-file"
      options: 
        max-size: "500m"
    networks:
      - dev_network

  mariadb-slave:
    image: mariadb:10.7.1
    container_name: mariadb-slave
    restart: always
    ports:
      - "3308:3306"
    environment:
#密码
      - MARIADB_ROOT_PASSWORD=abcd!234
    volumes:
      - ../slave/data:/var/lib/mysql:cached
      - ./slave.cnf:/etc/mysql/my.cnf:cached
    security_opt:
      - seccomp:unconfined
    logging: 
      driver: "json-file"
      options: 
        max-size: "500m"
    networks:
      - dev_network

networks:
  dev_network:
    external:
      name: dev_network

2. 创建网络

docker network create dev_network

3. 启动服务

docker-compose up -d

4. master 节点配置

docker exec -it mariadb-master bash
mysql -uroot -p'abcd!234'

创建同步账号

create user 'slave'@'%' identified by 'abcd!234';

授权

grant replication slave on *.* to 'slave'@'%';

刷新权限

flush privileges;
查看节点信息
show master status;
image.png

5. slave节点配置

docker exec -it mariadb-slave bash
mysql -uroot -p'abcd!234'

配置连接的节点:

change master to master_host='mariadb-master',master_port=3306,master_user='slave',master_password='abcd!234',master_log_file='mariadb-bin.000003',
master_log_pos=1099;

执行 start slave 开始同步
查看是否成功:show slave status \G;

image.png

MySQL数据同步,出现Slave_SQL_Running:no和slave_io_running:no问题的解决方法

来源@雨田君的记事本

你可能感兴趣的:(docker mariadb 主从复制)