程序地带

docker-compose部署MySQL主从


创建目录及配置文件

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


├── 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-slaver 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_format为ROW。


binlog有以下三种模式:


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

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

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

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

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

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

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


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


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


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39340792/article/details/112689521

随机推荐

比较大的点云你们用什么软件打开

 用meshlab太卡 Geomagic “亿级的数据需要建lod,一般的显卡基本hold不住”“千万级的,没必要,最多是拖动的时候卡一点”  ...

It-is-me! 阅读(803)

humblebundle靠谱吗_加盟物流公司靠谱吗

加盟物流公司真的靠谱吗,经过一段时间的摸索后,小编发现,在选择加盟项目的时候,大部分人还是会优先考虑餐饮和奶茶,以及干洗店...

光慢光慢 阅读(524)

【SSL】2291分组背包

【SSL】2291分组背包TimeLimit:1000MSMemoryLimit:65536KDescription有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[...

SSL_MYD 阅读(997)

【强化学习-2】grid_mdp创建自己的gym环境

一、参考资料强化学习实战第一讲gym学习及二次开发【深入浅出强化学习原理入门】grid_mdp.py运行几个问题的解决方法】reinforcement-learning-code源代码参考书籍...

花花少年 阅读(910)

Day19-Switch多选择结构与反编译初步了解

switch多选择结构多选择结构还有一个实现方法就是switchcase语句switchcase语句判断一个变量与一系列值中某个值是否相等,每个值成为一个分支switch语句中的变量类型...

shijiehim 阅读(650)