配置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
在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
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目录下面的所有配置文件
}
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 up -d
运行如下代码,然后之前设置的密码: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)
运行如下代码,然后之前设置的密码: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
运行如下代码,然后之前设置的密码: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一主二从完成。