Mysql主从集群搭建
项目地址
https://github.com/SanguineWang/mysql-master-slave
创建 MySQL 容器
项目结构
mysql
├── docker-compose.yml
├── master
│ ├── data
│ └── my.cnf
└── slave
├── data
└── my.cnf
准备配置文件
master
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
## 设置server_id,一般设置为IP,注意要唯一
server_id=100
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=replicas-mysql-bin
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
slave
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
secure-file-priv= NULL
## 设置server_id,一般设置为IP,注意要唯一
server_id=101
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=replicas-mysql-slave1-bin
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=replicas-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## 防止改变数据(除了特殊的线程)
read_only=1
docker-compose.yml
version: '3.7'
services:
mysql-master:
image: mysql
# 容器命名
container_name: mysql-master
# 环境变量,mysql要求提供,根据此密码可以进入容器mysql中
environment:
TZ: Asia/Shanghai
MYSQL_DATABASE: new_ink_db
MYSQL_ROOT_PASSWORD: root
volumes:
- ./master/data/:/var/lib/mysql/
- ./master/my.cnf:/etc/mysql/my.cnf
ports:
- "3306:3306"
networks:
- db-net
mysql-slave:
image: mysql
# 容器命名为从数据库
container_name: mysql-slave
environment:
TZ: Asia/Shanghai
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: new_ink_db
volumes:
- ./master/data/:/var/lib/mysql/
- ./master/my.cnf:/etc/mysql/my.cnf
# 将容器端口映射到宿主机端口,可以声明也可以不声明,一般情况下不会将后端端口直接暴露出去
ports:
- "3307:3306"
networks:
- db-net
networks:
db-net:
driver: bridge
上传到服务器
$ scp -r mysql root@{serverip}:/home/service/
构建容器
$ docker-compose up -d
进入容器
$ docker exec -it 容器名 bash
连接数据库
mysql -uroot -proot <uroot是用户名,proot是密码>
查看主数据库状态(注意分号回车才算一条命令)
mysql> show master status
-> ;
+---------------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------------------+----------+--------------+------------------+-------------------+
| replicas-mysql-bin.000004 | 704 | | mysql | |
+---------------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
创建用于主从同步的账号:
create user 'slave'@'%' indentified by '123456';
grant file,select,replication slave on *.* to 'slave'@'%';
从数据库通过账号连接主库
CHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='replicas-mysql-bin.000004',
MASTER_LOG_POS=704;
重启slave
stop slave;
start slave;
从库状态
show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: *.*.*.*(主库地址)
Master_User: ****(创建的账号)
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: replicas-mysql-bin.000004
Read_Master_Log_Pos: 704
Relay_Log_File: replicas-mysql-relay-bin.000002
Relay_Log_Pos: 881
Relay_Master_Log_File: replicas-mysql-bin.000004
Slave_IO_Running: Yes (这两行)
Slave_SQL_Running: Yes (都是yes才算启动主从)
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 704
Relay_Log_Space: 1099