Docker-Compose实现Mysql主从 - 张铁牛
source link: https://www.cnblogs.com/ludangxin/p/16358928.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
通过使用docker-compose
搭建一个主从数据库,本示例为了解耦 将两个server拆分到了两个compose文件中,当然也可以放到一个compose文件中
演示mysql版本:5.7.16
2. 部署流程
master节点:
- 安装mysql-server
- 创建用于同步的账号并授权
- 检查相关配置
slave节点:
- 安装mysql-server
- 选择主节点
- 检查相关配置并验证同步功能
3. master节点
3.1 安装mysql
-
创建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到宿主机上
-
修改配置文件
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 -
启动mysql服务,通过输出内容得知真实的网络名称为
mysql_mysql-net
,也就是当前所在文件夹的名称拼接了文件中指定的网络名称 -
服务启动完毕后,创建用于同步的用户并授权
创建的用户名称为
slave
密码为123456
CREATE USER 'slave' @'%' IDENTIFIED BY '123456'; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave' @'%'; #刷新权限 FLUSH PRIVILEGES; -
查看master状态信息
SHOW MASTER STATUS; #查看Mater数据有哪些slave select * from information_schema.processlist as p where p.command = 'Binlog Dump';
4. slave节点
安装步骤同master相同,只把需要修改的展示一下,当前的目录结构如下
docker-compose.yaml
主要修改了网络相关的信息和container_name(网络名称上面有解释)
my.cnf
添加的内容如下:
设置完成后启动salve server,连接slave并关联master节点
MASTER_HOST
:直接使用container_nameMASTER_LOG_FILE/MASTER_LOG_POS
:直接使用安装master步骤中的最后一步的值,其实就是指定同步的bin-log文件名称和Offset
管理完成后 启动salve
最后查看slave status
在master上创建test数据库并创建user表,刷新查看salve库,出现了对应的库表
经验证数据同步也没有问题。
6. 可能遇到的问题
SHOW SLAVE STATUS
时发现 slave_io_running=No salve_sql_running=No
,可能的原因有很多,可以查看如下的字段中输出的内容
可能的原因:
- 主从网络不通
- 两台节点的
server-id
重复,直接修改对应的id即可 - 数据库的uuid相同(可能是因为数据库文件是直接copy过来的导致的),在对应的库下生成不同于master的uuid到
auto.cnf
中即可 - sql执行失败,可能是slave刚添加进来,也没有master库的数据库instance,导致操作对应的库时slave这边根本没有对应的instance或者table又或是记录,引发的报错。这个只能具体问题具体解决了
- master和slave的
MASTER_LOG_FILE/MASTER_LOG_POS
值设置的有问题,在slave节点上STOP SLAVE;
然后重新连接下master即可
7. 同步部分数据库实例或表
在master节点上添加配置【可选】(如果只希望从库读取到部分实例)
在my.cnf文件中加入如下配置
salve端:在my.cnf文件中加入如下配置,这样的话salve只会读取配置的db或table,master对其他db的操作也不会影响slave
__EOF__
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK