docker-compose整合mysql主从
创始人
2024-01-29 01:52:45
0

目录

  • 配置配置信息
    • 1.配置配置文件、数据和日志文件路径
    • 2.配置my.cnf
    • 3.配置nginx.conf
    • 4.配置docker-compose.yml
    • 最后的效果图
  • 启动docker-compose
  • 配置mysql主从
    • master中添加slave1、slave2用户
    • slave1中配置主从
    • slave2中配置主从
  • 总结

        本文是通过docker-compose在linux配置mysql一主二从高可用。前提条件是系统中需要安装docker和docker-compose。

配置配置信息

1.配置配置文件、数据和日志文件路径

        配置master目录:

mkdir -p master/conf;
mkdir -p master/data;
mkdir -p master/log;
mkdir -p master/mysql-files;

        配置slave1目录:

mkdir -p slave1/conf;
mkdir -p slave1/data;
mkdir -p slave1/log;
mkdir -p slave1/mysql-files;

        配置slave2目录:

mkdir -p slave2/conf;
mkdir -p slave2/data;
mkdir -p slave2/log;
mkdir -p slave2/mysql-files;
mkdir -p /conf.d/stream

2.配置my.cnf

        在master/conf/配置master的my.cnf:

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-master-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
binlog_expire_logs_seconds=2592000  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=1062  

        在master/conf/配置slave1的my.cnf:

[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,表示不自动清理。
binlog_expire_logs_seconds=2592000  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=1062  
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin 
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  
## slave设置为只读(具有super权限的用户除外)
read_only=1

        在master/data/配置slave2的my.cnf:

[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=103
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave2-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
binlog_expire_logs_seconds=2592000  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_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.配置nginx.conf

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}# 添加stream模块,实现tcp反向代理
stream {include /opt/nginx/stream/conf.d/*.conf; #加载 /opt/nginx/stream/conf.d目录下面的所有配置文件
}

4.配置docker-compose.yml

        MASTER_HOST修改为当前主机对应的ip。

version: '3'
services:mysql-slave-lb:restart: alwaysimage: nginx:alpinecontainer_name: mysql-slave-lbports:- 3307:3307volumes:- ./conf.d/stream:/opt/nginx/stream/conf.d- ./nginx.conf:/etc/nginx/nginx.confnetworks: - mysql-netdepends_on:- mysql-master- mysql-slave1- mysql-slave2mysql-master:restart: alwaysimage: mysql:latestcontainer_name: mysql-masterenvironment:MYSQL_ROOT_PASSWORD: "123456"MASTER_SYNC_USER: "sync_admin" #设置脚本中定义的用于同步的账号MASTER_SYNC_PASSWORD: "123456" #设置脚本中定义的用于同步的密码ADMIN_USER: "root" #当前容器用于拥有创建账号功能的数据库账号ADMIN_PASSWORD: "123456"ALLOW_HOST: "123.249.%.%" #允许同步账号的host地址TZ: "Asia/Shanghai" #解决时区问题ports:- 3306:3306networks: - mysql-netvolumes:- ./master/data:/var/lib/mysql:rw- ./master/conf/my.cnf:/etc/mysql/my.cnf:rw- ./master/log:/var/log/mysql:rw- ./master/mysql-files:/var/lib/mysql-files:rwmysql-slave1:restart: alwaysimage: mysql:latestcontainer_name: mysql-slave1environment:MYSQL_ROOT_PASSWORD: "123456"SLAVE_SYNC_USER: "sync_admin" #用于同步的账号,由master创建SLAVE_SYNC_PASSWORD: "123456"ADMIN_USER: "root"ADMIN_PASSWORD: "123456"MASTER_HOST: "$host" #master地址,开启主从同步需要连接masterTZ: "Asia/Shanghai" #设置时区ports:- 3316:3306networks: - mysql-netvolumes:- ./slave1/data:/var/lib/mysql:rw- ./slave1/conf/my.cnf:/etc/mysql/my.cnf:rw- ./slave1/log:/var/log/mysql:rw- ./slave1/mysql-files:/var/lib/mysql-files:rwmysql-slave2:restart: alwaysimage: mysql:latestcontainer_name: mysql-slave2environment:MYSQL_ROOT_PASSWORD: "123456"SLAVE_SYNC_USER: "sync_admin"SLAVE_SYNC_PASSWORD: "123456"ADMIN_USER: "root"ADMIN_PASSWORD: "123456"MASTER_HOST: "$host"TZ: "Asia/Shanghai"ports:- 3326:3306networks: - mysql-netvolumes:- ./slave2/data:/var/lib/mysql:rw- ./slave2/conf/my.cnf:/etc/mysql/my.cnf:rw- ./slave2/log:/var/log/mysql:rw- ./slave2/mysql-files:/var/lib/mysql-files:rwnetworks:mysql-net:external: false

最后的效果图

tree

        最后配置的目录如下。

.
├── conf.d
│   └── stream
├── docker-compose.yml
├── master
│   ├── conf
│   │   └── my.cnf
│   ├── data
│   ├── log
│   └── mysql-files
├── nginx.conf
├── slave1
│   ├── conf
│   │   └── my.cnf
│   ├── data
│   ├── log
│   └── mysql-files
└── slave2├── conf│   └── my.cnf├── data├── log└── mysql-files

启动docker-compose

docker-compose up -d

配置mysql主从

master中添加slave1、slave2用户

        运行如下代码,然后之前设置的密码:123456,进入mysql master。

docker exec -it mysql-master mysql -u root -p

        执行如下代码添加slave1、slave2用户。

#在主机MySQL里执行授权命令 
CREATE USER 'slave1'@'%' IDENTIFIED BY '123456'; 
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%'; #此语句必须执行。否则见下面。 
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 
#在主机MySQL里执行授权命令 
CREATE USER 'slave2'@'%' IDENTIFIED BY '123456'; 
GRANT REPLICATION SLAVE ON *.* TO 'slave2'@'%'; #此语句必须执行。否则见下面。 
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; 
flush privileges;
#查询master的状态,记住file和position对应的信息,为后来添加从到主做准备。
show master status;
+------------------------------+----------+--------------+------------------+-------------------+
| File                         | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------------------+----------+--------------+------------------+-------------------+
| mall-mysql-master-bin.000003 |    40130 |              | mysql            |                   |
+------------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

slave1中配置主从

        运行如下代码,然后之前设置的密码:123456,进入mysql master。

docker exec -it mysql-slave1 mysql -u root -p

        $host替换为配置master的ip,master_log_file就是之前master对应的file信息,master_log_pos就是之前position对应的信息。

change master to master_host='$host', master_user='slave1', master_password='123456', master_port=3306, master_log_file='mall-mysql-master-bin.000003', master_log_pos=1965, master_connect_retry=30;

        启动slave。

start slave;

        查看slave信息,如果Slave_IO_Running、Slave_SQL_Running两个信息是yes代表搭建从库成功。

show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: $hostMaster_User: slave1Master_Port: 3306Connect_Retry: 30Master_Log_File: mall-mysql-master-bin.000003Read_Master_Log_Pos: 40130Relay_Log_File: bc55a10d23de-relay-bin.000002Relay_Log_Pos: 38503Relay_Master_Log_File: mall-mysql-master-bin.000003Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 40130Relay_Log_Space: 38720Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 101Master_UUID: 0d212aaf-665e-11ed-968d-0242ac120003Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set, 1 warning (0.00 sec)ERROR: 
No query specified

slave2中配置主从

        运行如下代码,然后之前设置的密码:123456,进入mysql master。

docker exec -it mysql-slave2 mysql -u root -p

        $host替换为配置master的ip,master_log_file就是之前master对应的file信息,master_log_pos就是之前position对应的信息。

change master to master_host='$host', master_user='slave2', master_password='123456', master_port=3306, master_log_file='mall-mysql-master-bin.000003', master_log_pos=1965, master_connect_retry=30;

        启动slave。

start slave;

        查看slave信息,如果Slave_IO_Running、Slave_SQL_Running两个信息是yes代表搭建从库成功。

show slave status \G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: $hostMaster_User: slave2Master_Port: 3306Connect_Retry: 30Master_Log_File: mall-mysql-master-bin.000003Read_Master_Log_Pos: 40130Relay_Log_File: bc55a10d23de-relay-bin.000002Relay_Log_Pos: 38503Relay_Master_Log_File: mall-mysql-master-bin.000003Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 40130Relay_Log_Space: 38720Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 101Master_UUID: 0d212aaf-665e-11ed-968d-0242ac120003Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set, 1 warning (0.00 sec)ERROR: 
No query specified

总结

        至此,通过docker-compose搭建mysql一主二从完成。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...