docker-compose部署MySQL主从

3 篇文章 0 订阅
2 篇文章 0 订阅

创建目录及配置文件

创建目录结构如下,之后用于挂载数据卷:

├── master
│   ├── conf
│   └── data
├── slaver0
│   ├── conf
│   └── data
└── slaver1
    ├── conf
    └── data

进入./master/conf目录,创建文件vi my.cnf,内容如下:

[mysqld]
# 集群服务器id,不可重复
server-id = 1
# 同步(binlog)文件名称
log-bin = mysql-bin
# 1055异常处理
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"

进入./slaver0/conf目录,创建文件vi my.cnf,内容如下:

[mysqld]
# 集群服务器id,不可重复
server-id = 11
# 1055异常处理
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"

进入./slaver1/conf目录,创建文件vi my.cnf,内容如下:

[mysqld]
# 集群服务器id,不可重复
server-id = 12
# 1055异常处理
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"

docker-compose.yml

创建docker-compose.yml文件,内容如下:

version: '3'
services:
  # 主库
  mysql-master:
    image: "mysql:5.7"
    restart: always
    ports:
      - "3306:3306"
    container_name: mysql-master
    environment:
       MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./master/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf
      - ./master/data:/var/lib/mysql
  # 从库0
  mysql-slaver0:
    image: "mysql:5.7"
    restart: always
    ports:
      - "3307:3306"
    container_name: mysql-slaver0
    environment:
       MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./slaver0/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf
      - ./slaver0/data:/var/lib/mysql
  # 从库1
  mysql-slaver1:
    image: "mysql:5.7"
    restart: always
    ports:
      - "3308:3306"
    container_name: mysql-slaver1
    environment:
       MYSQL_ROOT_PASSWORD: 123456
    volumes:
      - ./slaver1/conf/my.cnf:/etc/mysql/conf.d/mysql.cnf
      - ./slaver1/data:/var/lib/mysql

运行docker-compose up -d启动容器。

配置步骤

主库

docker exec -it mysql-master bash进入主库,mysql -u root -p 123456进入mysql

创建用户 slaver作为从库同步主库数据时的用户:

create user 'slaver'@'%' identified by '123456';

授予权限:

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

刷新权限:

flush privileges;

查看binlog相关配置:

show global variables like 'binlog%';
mysql> show global variables like 'binlog%';
+--------------------------------------------+--------------+
| Variable_name                              | Value        |
+--------------------------------------------+--------------+
| binlog_cache_size                          | 32768        |
| binlog_checksum                            | CRC32        |
| binlog_direct_non_transactional_updates    | OFF          |
| binlog_error_action                        | ABORT_SERVER |
| binlog_format                              | ROW          |
| binlog_group_commit_sync_delay             | 0            |
| binlog_group_commit_sync_no_delay_count    | 0            |
| binlog_gtid_simple_recovery                | ON           |
| binlog_max_flush_queue_time                | 0            |
| binlog_order_commits                       | ON           |
| binlog_row_image                           | FULL         |
| binlog_rows_query_log_events               | OFF          |
| binlog_stmt_cache_size                     | 32768        |
| binlog_transaction_dependency_history_size | 25000        |
| binlog_transaction_dependency_tracking     | COMMIT_ORDER |
+--------------------------------------------+--------------+
15 rows in set (0.01 sec)

查看 server 相关配置:

show global variables like 'server%';
mysql> show global variables like 'server%';
+----------------+--------------------------------------+
| Variable_name  | Value                                |
+----------------+--------------------------------------+
| server_id      | 1                                    |
| server_id_bits | 32                                   |
| server_uuid    | 25410417-5643-11eb-9ef1-0242ac130005 |
+----------------+--------------------------------------+
3 rows in set (0.00 sec)

查看主库状态:

show master status;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

从库

连接从库mysql-slaver0

# 设置 master 连接参数
change master to 
    master_host='mysql-master',  # 主库的IP,由于docker的原因,可以使用容器名来当主机名
	master_user='slaver',    # 主库同步的用户
	master_password='123456', # 密码
	master_port=3306, # 主库的端口
	master_log_file='mysql-bin.000001', # 同步的文件 通过show master status来获取
	master_log_pos=154; # 开始从第几行同步 通过show master status来获取
	
# 启动同步
start slave;

# 查看 slave 状态
show slave status; # 看到 Slave_IO_Running 和 Slave_SQL_Running 都为 Yes 即为配置成功

对从库mysql-slaver1做相同操作。

还可以使用stop slave;停止同步。

binlog 模式

前面通过show global variables like 'binlog%';命令可以看到binlog_formatROW

binlog有以下三种模式:

  • ROW:每条记录的修改都会被记录。

    优点:不存在数据不一致的情况。

    缺点:一旦修改表结构( alter table) 会出现 binlog 暴涨现象。

  • STATEMENT:每执行一条导致值变化的 sql 就会记录到 binlog 中。

    优点: 仅仅记录了SQL,不会记录执行结果,减少了 binlog 日志量,节约了 IO,提高了性能

    缺点:会出现数据不一致的情况。

  • MIXED:以上两种模式混合使用。

我们可以通过编辑./master/conf/my.cnf文件,添加一行binlog_format = MIXED来修改binlog模式。

MySQL 主从同步原理

主从同步原理图:

mysql主从同步原理图

MySQL 默认的复制方式是异步的,主库把日志发送给从库后不关心从库是否已经处理,这样会产生一个问题就是假设主库挂了,从库处理失败了,这时候从库升为主库后,日志就丢失了。可以根据情况调整同步策略:

  • 全同步复制:主库写入 binlog 后强制同步日志到从库,所有的从库都执行完成后才返回给客户端。性能会受到严重影响。
  • 半同步复制:从库写入日志成功后返回 ACK 确认给主库,主库收到至少一个从库的确认就认为写操作完成。

主从延迟:主库与从库之间数据同步肯定是有延时的(网络)。解决方案是:部分查询强制走主库,主库肯定是最新的数据。

我的更多文章尽在:我的个人博客

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过Docker Compose部署MySQL主从复制,您可以按照以下步骤进行操作: 1. 首先,创建一个名为`docker-compose.yml`的文件,用于定义您的Docker服务配置。在该文件中,定义两个MySQL容器,一个作为主服务器,另一个作为从服务器。示例配置如下: ```yaml version: '3.8' services: master: image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: your_root_password volumes: - master-data:/var/lib/mysql slave: image: mysql:latest restart: always environment: MYSQL_ROOT_PASSWORD: your_root_password MYSQL_REPLICATION_MODE: slave MYSQL_MASTER_HOST: master MYSQL_MASTER_PORT: 3306 MYSQL_MASTER_USER: root MYSQL_MASTER_PASSWORD: your_root_password depends_on: - master volumes: - slave-data:/var/lib/mysql volumes: master-data: slave-data: ``` 在上面的示例中,我们定义了两个服务,`master`和`slave`。`master`服务使用了最新版本的MySQL镜像,并设置了`MYSQL_ROOT_PASSWORD`环境变量来设置root密码。`slave`服务也使用了最新版本的MySQL镜像,并设置了`MYSQL_ROOT_PASSWORD`和`MYSQL_REPLICATION_MODE`环境变量,用于配置从服务器的复制模式。`MYSQL_MASTER_HOST`指定了主服务器的名称,`MYSQL_MASTER_PORT`指定了主服务器的端口,`MYSQL_MASTER_USER`和`MYSQL_MASTER_PASSWORD`指定了连接主服务器所需的凭据。 2. 保存`docker-compose.yml`文件,并在终端中导航到该文件所在的目录。 3. 运行以下命令启动Docker服务: ```bash docker-compose up -d ``` 这将根据您在`docker-compose.yml`文件中定义的配置创建和启动两个MySQL容器。 4. 等待一段时间,以确保两个MySQL容器成功启动和连接。可以使用以下命令检查容器状态: ```bash docker-compose ps ``` 您应该看到`master`和`slave`容器都处于运行状态。 5. 最后,您可以登录到`master`容器中的MySQL,并执行一些额外的配置来设置主从复制。例如,您可以执行以下命令: ```bash docker-compose exec master mysql -uroot -pyour_root_password -e "GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%' IDENTIFIED BY 'replication_password'; FLUSH PRIVILEGES;" ``` 上述命令将为复制配置添加一个名为`replication_user`的用户,并设置其密码为`replication_password`。 至此,您已成功通过Docker Compose部署MySQL主从复制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值