目录1. 简介2. 部署流程3. master节点3.1 安装Mysql4. slave节点5. 验证6. 可能遇到的问题7. 同步部分数据库实例或表1. 简介 通过使用Docker
通过使用Docker-compose
搭建一个主从数据库,本示例为了解耦 将两个server拆分到了两个compose文件中,当然也可以放到一个compose文件中
演示mysql版本:5.7.16
master节点:
slave节点:
创建mysql文件夹并进入文件夹(文件夹名称mysql)
创建docker-compose文件内容如下
# docker-compose.yml
version: '3'
services:
mysql:
restart: "no"
image: mysql:5.7.16
container_name: mysql-master
volumes:
- ./datadir:/var/lib/mysql
- ./conf/mysql:/etc/mysql
environment:
- "MYSQL_ROOT_PASSWord=123456"
- "TZ=Asia/Shanghai"
ports:
- 3306:3306
networks:
- mysql-net
networks:
mysql-net:
driver: bridge
注意:因为要把配置文件挂在到服务中去,所以要先把容器中的配置文件copy到宿主机上
1.先启动一个用于copy文件的容器
$ docker run --name mysql-temp -e MYSQL_ROOT_PASSWORD=root --rm -d mysql:5.7.16
2.将mysql-temp
容器中的配置文件copy出来,现在conf文件夹中就是mysql自带的所有配置文件
$ docker cp mysql-temp:/etc/mysql conf
因为当前conf目录中的my.cnf
还是个link,所以直接使用当前目录中的备份文件作为主要的配置文件
$ mv my.cnf.fallback my.cnf
3.修改配置文件my.cnf
在文件的最下方加入配置信息
[mysqld]
log-bin=mysql-bin # 开启 binlog
server-id=1 # 当前server在cluster中的id,必须保证在cluster中唯一
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不备份的数据库 (可选)
binlog-ignore-db=infORMation_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys
4.启动mysql服务,通过输出内容得知真实的网络名称为mysql_mysql-net
,也就是当前所在文件夹的名称拼接了文件中指定的网络名称
5.服务启动完毕后,创建用于同步的用户并授权
创建的用户名称为slave
密码为123456
CREATE USER 'slave' @'%' IDENTIFIED BY '123456';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%';
#刷新权限
FLUSH PRIVILEGES;
6.查看master状态信息
SHOW MASTER STATUS;
#查看Mater数据有哪些slave
select * from information_schema.processlist as p where p.command = 'Binlog Dump';
安装步骤同master相同,只把需要修改的展示一下,当前的目录结构如下
docker-compose.yaml
主要修改了网络相关的信息和container_name(网络名称上面有解释)
version: '3'
services:
mysql:
restart: "no"
image: mysql:5.7.16
container_name: mysql-slave
volumes:
- ./datadir:/var/lib/mysql
- ./conf:/etc/mysql
environment:
- "MYSQL_ROOT_PASSWORD=123456"
- "TZ=Asia/Shanghai"
ports:
- 3307:3306
networks:
- mysql_mysql-net
networks:
mysql_mysql-net:
external: true # 来自外部
my.cnf
添加的内容如下:
[mysqld]
server-id=2
relay_log=relay-log
#开启只读 意味着当前的数据库用作读,当然这也只会影响到非root的用户,如果使用root用户操作本库是不会有影响的
read_only=ON
设置完成后启动salve server,连接slave并关联master节点
MASTER_HOST
:直接使用container_nameMASTER_LOG_FILE/MASTER_LOG_POS
:直接使用安装master步骤中的最后一步的值,其实就是指定同步的bin-log文件名称和OffsetCHANGE MASTER TO
MASTER_HOST='mysql-master',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
管理完成后 启动salve
START SLAVE;
最后查看slave status
SHOW SLAVE STATUS;
在master上创建test数据库并创建user表,刷新查看salve库,出现了对应的库表
经验证数据同步也没有问题。
SHOW SLAVE STATUS
时发现 slave_io_running=No salve_sql_running=No
,可能的原因有很多,可以查看如下的字段中输出的内容
可能的原因:
server-id
重复,直接修改对应的id即可auto.cnf
中即可MASTER_LOG_FILE/MASTER_LOG_POS
值设置的有问题,在slave节点上STOP SLAVE;
然后重新连接下master即可在master节点上添加配置【可选】(如果只希望从库读取到部分实例)
在my.cnf文件中加入如下配置
#需要同步的数据库名 有多个库添加多行即可
binlog-do-db=test
binlog-do-db=test1
#排除的数据库
binlog-ignore-db=sys
salve端:在my.cnf文件中加入如下配置,这样的话salve只会读取配置的db或table,master对其他db的操作也不会影响slave
#如果salve库名称与master库名相同,使用本配置
replicate-do-db=test
#如果master库名[test]与salve库名[test001]不同,使用以下配置[需要做映射]
#replicate-rewrite-db = test -> test001
#如果不是要全部同步[默认全部同步],则指定需要同步的表
#replicate-wild-do-table=test.user
#replicate-wild-do-table=test.role
到此这篇关于Docker-Compose实现Mysql主从的示例代码的文章就介绍到这了,更多相关Docker-Compose Mysql主从内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: Docker-Compose实现Mysql主从的示例代码
本文链接: https://lsjlt.com/news/151052.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0