read|mysql双主热备简单部署

前提
由于没有多台服务器, 所以这里改用docker-compose启动多个mysql服务, docker安装指引可见: debian安装docker

我的linux服务器是debian的, 所以这里以debian为例
另外, 需要在宿主机连接docker的mysql服务, 需要在宿主机安装mysql服务, mysql安装指引可见: linux安装mysql
这里我的虚拟机的ip为: 192.168.226.140
之前已经介绍过mysql主从简单部署, 该文章会在上述基础上, 实现双主热备.
前期准备
这里由于不像 mysql主从简单部署 中所言, 通过docker启动容器, 改为使用docker-compose启动, 故需要提前准备好相关的docker-compose配置和mysql的相关配置
目录
read_replication ├── mysql │├── master ││└── my.cnf (数据库配置文件) │└── slave │└── my.cnf (数据库配置文件) └── docker-compose.yml

【read|mysql双主热备简单部署】虽然这里是互为主从, 但是为了方便去分, 还是用master(主服)和slave(从服)来命名
docker-compose配置 其中, docker-compose配置如下:
version: '3'services: mysql_master: container_name: read_replication_demo3_mysql_master image: mysql command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci ports: - 3307:3306 environment: - MYSQL_DATABASE=test - MYSQL_ROOT_PASSWORD=123456 - TZ=Asia/Shanghai # 设置时区 volumes: - ./mysql/master/my.cnf:/etc/mysql/my.cnf - ./db/mysql/master/:/var/lib/mysql # 低版本的mysql数据存于此 - ./db/mysql/master/:/var/lib/mysql-files # 高版本的mysql数据存于此 restart: always networks: - read_replication_demo3mysql_slave: container_name: read_replication_demo3_mysql_slave image: mysql command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci ports: - 3308:3306 environment: - MYSQL_DATABASE=test - MYSQL_ROOT_PASSWORD=123456 - TZ=Asia/Shanghai # 设置时区 volumes: - ./mysql/slave/my.cnf:/etc/mysql/my.cnf - ./db/mysql/slave/:/var/lib/mysql # 低版本的mysql数据存于此 - ./db/mysql/slave/:/var/lib/mysql-files # 高版本的mysql数据存于此 restart: always networks: - read_replication_demo3networks: read_replication_demo3: driver: bridge ipam: config: - subnet: 172.177.0.0/16

数据库配置 ./mysql/master/my.cnf 内容如下:
[mysqld] log-bin=mysql-bin server-id=1001#忽略写入binlog日志的库 binlog-ignore-db = mysql,information_schema# auto_increment_increment=n有多少台服务器,n就设置为多少 auto-increment-increment = 2# auto_increment_offset设置步长,这里设置为1,这样Master的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数id auto-increment-offset = 1#忽略所有复制产生的错误 slave-skip-errors = all

./mysql/slave/my.cnf 内容如下:
[mysqld] log-bin=mysql-bin server-id=1002#忽略写入binlog日志的库 binlog-ignore-db = mysql,information_schema# auto_increment_increment=n有多少台服务器,n就设置为多少 auto-increment-increment = 2# auto_increment_offset设置步长,这里设置为2,这样Master的auto_increment字段产生的数值是:2,4,6,8 …等偶数id auto-increment-offset = 1#忽略所有复制产生的错误 slave-skip-errors = all

至此, 前期准备已全部完成
启动并配置互为主从
  1. 启动服务
    在docker-compose目录执行docker-compose up -d, 启动mysql服务
  2. 查看服务状态
    docker ps -a, 查看服务是否正常启动, 如果启动异常, 可通过docker logs [容器名/容器id]查看容器日志, 已排查异常所在
  3. 连接master(主服), 查看master(主服)的主服状态show master status; , 记住fileposition
    read|mysql双主热备简单部署
    文章图片

  4. 连接slave(从服), 配置slave(从服)的主从配置的主服
    # 配置从服的主从配置的主服 change master to master_host='192.168.226.140',master_port=3307,master_user='root',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=340; # 启动该mysql的从服配置 start slave;

    master_host: docker的地址, 不能写127.0.0.1
    master_user: 在主库创建的用户
    master_port: 主库的端口, 默认3306
    master_log_pos: 主库show master status; 查询出的Position
  5. 连接slave(从服), 查看slave(从服)的主服状态show master status; , 记住fileposition
    read|mysql双主热备简单部署
    文章图片

  6. 连接master(主服), 配置master(主服)的主从配置的主服
    # 配置从服的主从配置的主服 change master to master_host='192.168.226.140',master_port=3308,master_user='root',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=340; # 启动该mysql的从服配置 start slave;

    master_host: docker的地址, 不能写127.0.0.1
    master_user: 在主库创建的用户
    master_port: 主库的端口, 默认3306
    master_log_pos: 主库show master status; 查询出的Position
验证
  1. 连接master(主服), 创建student表
    CREATE TABLE IF NOT EXISTS `student`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, PRIMARY KEY ( `id` ) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;

    查看slave(从服), 是否已经同步该表
    在master(主服)中插入数据, 查看slave(从服)是否已同步该插入的数据
    在slave(从服)中插入数据, 查看master(主服)是否已同步该插入的数据
  2. 连接slave(从服), 创建teacher表
    CREATE TABLE IF NOT EXISTS `teacher`( `id` INT UNSIGNED AUTO_INCREMENT, `name` VARCHAR(100) NOT NULL, PRIMARY KEY ( `id` ) ) ENGINE = InnoDB DEFAULT CHARSET = utf8;

    查看slave(从服), 是否已经同步该表
    在master(主服)中插入数据, 查看slave(从服)是否已同步该插入的数据
    在slave(从服)中插入数据, 查看master(主服)是否已同步该插入的数据
上述步骤验证无误后, 证明双主备份已经完成

    推荐阅读