# mysql8-cluster-docker-compose **Repository Path**: castdlg/mysql8-cluster-docker-compose ## Basic Information - **Project Name**: mysql8-cluster-docker-compose - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-04-14 - **Last Updated**: 2021-04-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 写在前边 ### 主从复制的原理 Master将数据改变记录到二进制日志(binary log)中,也就是配置文件log-bin指定的文件,这些记录叫做二进制日志事件(binary log events); Slave 通过 I/O 线程读取 Master 中的 binary log events 并写入到它的中继日志(relay log); Slave 重做中继日志中的事件, 把中继日志中的事件信息一条一条的在本地执行一次,完成数据在本地的存储, 从而实现将改变反映到它自己的数据(数据重放)。 ### 环境准备 准备两台服务器,系统最好保持一致 服务器都已经安装好docker和docker-compose环境,且网络能够互通 ## 主从目录结构 ```bash . ├── README.md ├── bin │   ├── add-slave-account-to-master.sh │   ├── reset-slave.sh │   ├── show-slave-status.sh │   ├── slave-replias-master-start.sh │   └── stop-replicas.sh ├── config │   ├── master.cnf │   └── slave.cnf ├── logs ├── master-data ├── mysql-files ├── mysql-master-docker.yml ├── mysql-slave-docker.yml ├── slave-data └── sql └── nacos-mysql.sql ``` #### 有些空文件夹无法上传到gitee,运行docker-compose 命令的时候会自动生成 ## 目录/文件说明: - `bin/add-slave-account-to-master.sh` :Master节点添加备份账户的脚本 - `bin/slave-replias-master-start.sh` :从节点添加主节点备份账号信息并开启备份的脚本 - `bin/stop-replicas.sh` :关闭从节点备份的脚本 - `bin/show-slave-status.sh`: 查看主从连接状态的脚本 - `bin/reset-slave.sh` : 重置从节点备份状态,修复由于主从集群重启后无法建立集群的问题 - `config/master.cnf` : MySQL Master节点的配置文件 - `config/slave.cnf` : MySQL Slave节点的配置文件 - `mysql-master-docker.yml` : 构建主节点与挂载数据目录的docker-compose配置文件 - `mysql-slave-docker.yml` : 构建从节点与挂载数据目录的docker-compose配置文件 - `master-data` : 主节点数据位置,当然生产环境要挂到别的位置 - `slave-data` :从节点数据位置,当然生产环境要挂到别的位置 - `sql/nacos-mysql` :nacos服务表结构 - `logs` :宿主机挂载MySQL容器的日志文件目录 - `mysql-files` :宿主机挂载MySQL容器的文件目录 - `.env` : 环境变量文件 ## 搭建过程: 1.修改`.env`文件 ```bash # default environment arguments for docker-compose.yml # set master data dir MASTER_DATA=./master-data # set slave data dir SLAVE_DATA=./slave-data # set master & slave root password MASTER_PASSWD=123456 # set slave root passwor SLAVE_PASSWD=123456 # set replicas mysql account name REPL_NAME=replicas # set replicas mysql password REPL_PASSWD=replicasPasswd #mysql master host ip MYSQL_MASTER_HOST_IP=192.168.6.11 #mysql master log file name MYSQL_MASTER_LOG_FILE=mysql-bin.000008 #mysql master log position MYSQL_MASTER_LOG_POS=9681981 ``` > - `MASTER_DATA`是Master节点的数据目录,需要修改到宿主机对应的位置,SLAVE_DATA亦然。 > - `MASTER_PASSWD`是主节点的root密码,bin目录下的脚本会读取这个变量的值从而进行访问数据库 > - `SLAVE_PASSWD`是从节点的root密码,脚本也会读 > - `REPL_NAME`是主节点要创建的账户名,从节点通过这个账户进行访问 > - `REPL_PASSWD`是主节点要创建的`REPL_NAME`对应的密码 > - `MYSQL_MASTER_HOST_IP` 主节点的IP地址,从节点通过此地址连接主节点 > - `MYSQL_MASTER_LOG_FILE`主节点的二进制文件名,通过show master status 命令查看(File字段) > - `MYSQL_MASTER_LOG_POS`主节点的位置,通过show master status 命令查看(Position字段) 2.将本项目分别克隆到两台服务器上 `git clone https://gitee.com/castdlg/mysql8-cluster-docker-compose.git` 分别启动两个节点 第一次启动失败,切记master-data和slave-data里面的残余文件要删除,否则后面启动会一直读取前面错误的数据导致服务启动失败 主节点执行 `docker-compose -f mysql-master-docker.yml up -d` 从节点执行 `docker-compose -f mysql-slave-docker.yml up -d` 分别检查两个容器是否启动成功,可以用工具连接测试一下 3.进入主节点bin目录,执行脚本 ```bash cd bin ./add-slave-account-to-master.sh #读取mysql密码,为主节点添加备份账户 chmod 777 add-slave-account-to-master.sh #如遇到没有权限执行此命令 ``` 4.进入从节点bin目录,执行脚本 ```bash cd bin ./slave-replias-master-start.sh #从节点使用备份账户连接主节点,开启备份 chmod 777 slave-replias-master-start.sh #如遇到没有权限执行此命令 ``` 5.查看集群状态,在从节点服务器bin目录下执行 ```bash ./show-slave-status.sh #查看集群的状态 chmod 777 show-slave-status.sh #如遇到没有权限执行此命令 ``` ![都为yes即成功](https://images.gitee.com/uploads/images/2021/0414/225408_35adf146_1193507.png "image.png") 到此mysql集群搭建完成。 ## 故障修复 1.重启MySQL集群后从节点无法正常恢复解决。 在从节点执行bin目录下的`reset-slave.sh`, 之后 连接数据库尝试,问题已经解决。 > 另提供了一个关闭备份的脚本 在从节点执行bin目录下的`stop-slave.sh`