MySQL配置主从复制读写分离

环境准备

docker-compose.yml

version: "3"
services:
  mysql-master:
    image: mysql:5.7.22
    restart: always
    hostname: mysql-master
    container_name: mysql_master
    ports:
      - 3316:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Shanghai
    volumes:
      - ./master/mysql/data:/var/lib/mysql
      - ./master/mysql/log:/var/log/mysql
    command:
      --server_id=100
      --log-bin=mysql-master-bin
      --sync_binlog=1
      --binlog-ignore-db=mysql
      --binlog_format=mixed
      --expire_logs_days=7
      --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
    links:
      -  mysql-slave-read
  mysql-slave-read:
    image: mysql:5.7.22
    restart: always
    hostname: mysql-slave-read
    container_name: mysql-slave-read
    ports:
      - 3317:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Shanghai
    volumes:
      - ./slave/mysql/data:/var/lib/mysql
      - ./slave/mysql/log:/var/log/mysql
    command:
      --server_id=200
      --read_only=1
      --binlog-ignore-db=mysql
      --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
  mysql-slave-back:
    image: mysql:5.7.22
    restart: always
    hostname: mysql-slave-back
    container_name: mysql-slave-back
    ports:
      - 3318:3306
    environment:
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Shanghai
    volumes:
      - ./slave-back/mysql/data:/var/lib/mysql
      - ./slave-back/mysql/log:/var/log/mysql
    command:
      --server_id=300
      --log-bin=slave-back-bin
      --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

主服务器其它相关

# 设置server_id,一般设置为IP,注意在一个局域网唯一
server_id=101  
# 
# =============== 非必要配置 ===============
#复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql  
# 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=mysql-slave-bin  
# 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M  
# 从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed  
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7 
# 只读模式
read_only=1
# relay_log配置中继日志
当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启
relay_log=mysql-relay-bin  
relay_log_recovery=1
# og_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  

配置从数据库

主服务器相关操作

  1. 在主库创建一个用于同步的用户,赋予REPLICATION SLAVE的权限(直接用已有的)

    grant replication slave on *.* to 'slave'@'%' identified by '123456';
    

    也可以设置从局域网 192.168.1.%

  2. 执行以下命令锁定数据库以防止写入数据

    FLUSH TABLES WITH READ LOCK;
    
  3. 主库执行:show master status; 记下 **Position 和 File **的值,等下进行从库配置要用到

    | File                    | Position |
    | mysql-master-bin.000003 | 154      |
    
  4. 解锁数据表(从服务器配置完成之后别忘记解锁主数据库)。

    UNLOCK TABLES;
    
    flush tables with read lock
    show master status;
    grant replication slave on *.* to 'slave'@'%' identified by '123456';
    UNLOCK TABLE
    

从服务器操作

  1. 执行如下命令(先停止同步,然后设置同步信息,master_log_file 和 master_log_pos就是我们主库上面的)

    change master to master_host='127.0.0.1',master_user='slave',master_password='123456',master_port=3316,master_log_file='mysql-master-bin.000006', master_log_pos=438;
    

    MASTER_HOST:主服务器的IP。

    MASTER_USER:配置主服务器时建立的用户名

    MASTER_PASSWORD:用户密码

    MASTER_PORT:主服务器mysql端口

  2. 从库执行:show slave status 查看是否正常

    CHANGE MASTER TO
     MASTER_HOST='mysql-master',
     MASTER_USER='root',
     MASTER_PASSWORD='root',
     MASTER_LOG_FILE='mysql-master-bin.000007',
     MASTER_LOG_POS=154;
    show slave status
    start slave
    STOP SLAVE
    set global sql_slave_skip_counter =1 
    reset slave
    
    

如果:Slave_IO_Running: Yes //此状态必须YESSlave_SQL_Running: Yes //此状态必须YES

为两个yes,配置成功。

mysql> change master to
-> master_host="ip地址",
-> master_user="授权时指定的用户名",
-> master_password="用户密码",
-> master_log_file="binlog日志",
-> master_log_pos=偏移量;

你可能感兴趣的:(MySQL配置主从复制读写分离)