Realize MySQL read-write separation based on middleware

1. Scene

When the database reads more and writes less

2. Read and write separation

Only write on the master server, only read on the slave server.
Use amoeba middleware

3. Deployment

3.1 Docker compose one-click deployment

Compose file:

       version: '3.8'

        services:

          mysql_master:

            image: mysql:8.0.33-oracle

            restart: always

            privileged: true

            ports:

              - "3306:3306"

            environment:

              - MYSQL_ROOT_PASSWORD=admin123

              - MYSQL_DATABASE=db01

            volumes:

              - ./3306_log:/var/log/mysql

              - ./3306_data:/var/lib/mysql  

              - ./3306_conf/my.cnf:/etc/mysql/my.cnf

            networks:

              - mysql_network



          mysql_slave1:

            image: mysql:8.0.33-oracle

            restart: always

            privileged: true

            ports:

              - "3307:3306"

            environment:

              - MYSQL_ROOT_PASSWORD=admin123

              - MYSQL_DATABASE=db01

            volumes:

              - ./3307_log:/var/log/mysql

              - ./3307_data:/var/lib/mysql  

              - ./3307_conf/my.cnf:/etc/mysql/my.cnf

            networks:

              - mysql_network



          mysql_slave2:

            image: mysql:8.0.33-oracle

            restart: always

            privileged: true

            ports:

              - "3308:3306"

            environment:

              - MYSQL_ROOT_PASSWORD=admin123

              - MYSQL_DATABASE=db01

            volumes:

              - ./3308_log:/var/log/mysql

              - ./3308_data:/var/lib/mysql  

              - ./3308_conf/my.cnf:/etc/mysql/my.cnf

            networks:

              - mysql_network



        networks:

          mysql_network:

3.2 Configuration file

conf file:

     3306 端口

[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=101 

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能

log-bin=mall-mysql-bin

## 允许服务器更新二进制文件

log-slave-updates=true

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。

expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062

character-set-server=utf8

bind-address=0.0.0.0



3307 端口



[mysqld]

## 设置server_id,同一局域网中需要唯一

server_id=102

## 指定不需要同步的数据库名称

binlog-ignore-db=mysql  

## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用

log-bin=mall-mysql-slave1-bin  

## 设置二进制日志使用内存大小(事务)

binlog_cache_size=1M  

## 设置使用的二进制日志格式(mixed,statement,row)

binlog_format=mixed  

## 二进制日志过期清理时间。默认值为0,表示不自动清理。

expire_logs_days=7  

## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。

## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致

slave_skip_errors=1062  

## relay_log配置中继日志

relay_log=mall-mysql-relay-bin  

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

log_slave_updates=1  

## slave设置为只读(具有super权限的用户除外)

read_only=1

3.3 Intermediate operations

      # 主机

    CREATE USER slave@'%' IDENTIFIED WITH mysql_native_password BY '12345678';

    GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; 

    """

    参数说明

    % 表示该用户可以从任何主机连接到MySQL服务器

    *.* 表示数据库名,支持正则

    REPLICATION SLAVE 允许用户作为MySQL复制的从服务器,接受来自主服务器的二进制日志并应用到本地数据库

    REPLICATION CLIENT 权限允许用户连接到主服务器并检索复制相关的信息。

    若想让用户拥有只读权限:GRANT SELECT ON *.* TO 'readonly'@'%';

    """

    flush privileges;



    show master status;



    # 从机

    change master to master_host='192.168.128.2', master_user='slave', 
    master_password='12345678', master_port=3306, 
    master_log_file='mall-mysql-bin.000004',master_log_pos=848,master_connect_retry=10;



    CHANGE MASTER TO MASTER_HOST='mysql_master', MASTER_PORT=3306, 
    MASTER_USER='slave', MASTER_PASSWORD='12345678';



    START SLAVE;



    SHOW SLAVE STATUS\G





    ---- 暂且不看

    CHANGE MASTER TO

      MASTER_HOST='${MYSQL_MASTER_HOST}',

      MASTER_USER='${MYSQL_MASTER_USER}',

      MASTER_PASSWORD='${MYSQL_MASTER_PASSWORD}',

      MASTER_PORT=${MYSQL_MASTER_PORT},

      MASTER_LOG_FILE='${MYSQL_MASTER_LOG_FILE}',

      MASTER_LOG_POS=${MYSQL_MASTER_LOG_POS},

      MASTER_CONNECT_RETRY=${MYSQL_MASTER_CONNECT_RETRY};



    master_log_file='mall-mysql-bin.000001',  # 指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数

    master_log_pos=769,  # 指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;

    master_connect_retry=30; 连接失败重试的时间间隔,单位为秒。

Author: Diao Leyuan

Guess you like

Origin blog.csdn.net/ekcchina/article/details/131208206