MySql主从以及用Docker部署
type
status
date
slug
summary
tags
category
icon
password
order
介绍
MySql主从一般1主多从,当然MySql5.7开始多主一从,还有双主复制、级联复制,这里暂时不说,现在之说1主多从,利用的是MySql的replication来保证数据一致,但是必然会有延迟、不一致性,使用PCX集群可以保证一致.
其实就是把主库的binlog文件传给从库的relaylog,然后sql读取同步。
从节点I/O线程
当从节点上执行`start slave`命令之后,从节点会创建一个I/O线程用来连接主节点,请求主库中更新的bin-log。I/O线程接收到主节点binlog dump 进程发来的更新之后,保存在本地relay-log中。
从节点SQL线程
SQL线程负责读取relay log中的内容,解析成具体的操作并执行,最终保证主从数据的一致性。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F8a78ef16-ae72-44ed-90d9-f751aabd6ce1%2FUntitled.png?table=block&id=f1197d9a-c842-49f6-82bc-3fc141d00a5b&t=f1197d9a-c842-49f6-82bc-3fc141d00a5b&width=621&cache=v2)
开始搭建
mysql的配置
在多台服务器上安装好MySql后,修改my.cnf,不知道位置可以whereis my.cnf 或者 whereis mysql查看,修改完记得service mysql restart或者systemctl mysql restart重启服务,还有show global variables;可以查看mysql的所有配置信息。
首先修改主库的my.cnf,加入以下两行
然后是从库的my.cnf,注意:service-id每台服务器都不可一样,一般主库为1,从库往后排
还有以下配置,看各人需要,配置同步哪些表
然后进入主库的mysql,mysql -uroot -p 进入后执行命令,修改可以被任何客户端连接mysql_native_password是身份验证插件,记得一定要用这个,MySql8.0开始默认为caching_sha2_password ,从库会连不上提示错误的,在mysql库的user表里可以看到用户所使用的身份验证插件。
注意:上面我是直接用的root用户作为从库连接凭证,最好还是新建个从库专门用的账户,如下
账户创建完之后,然后在主库中再执行 show master status; 查看数据库状态 ,记住这个File和Position,后面从库要用到
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fa9a2b20d-9156-4d06-b41c-90954f794001%2FUntitled.png?table=block&id=95e8892e-3af9-4036-a0bf-a320612a0310&t=95e8892e-3af9-4036-a0bf-a320612a0310&width=960&cache=v2)
然后进入从库的MySql,执行以下命令,修改x.x.x.x为主库IP,user,password为主库用户名和密码,log_file和log_pos就是上图的这个File和Position
执行完之后,执行 start slave; 启动从服务器复制功能,如果配置错了,执行 stop slave; 再如上配置下,再 start slave; 即可
执行完之后,在从库中执行 show slave status\G; 可以查看主从连接状态,只要Slave IO Running和Slave SQL Running都为Yes就正常,还有前面的Slave_IO_State,对应的信息显示的是Waiting for master to send event...
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F2c5f948a-2851-4fbe-9b03-b4aaf2ff261b%2FUntitled.png?table=block&id=dd123f96-6ae6-4b9c-9c1a-255783396746&t=dd123f96-6ae6-4b9c-9c1a-255783396746&width=733&cache=v2)
这个时候就已经完成了,可以去连接主库的mysql去创建表和字段,这个时候再去从库看就可以发现,已经同步过来了(可能有一点延时)
Docker下安装MySQL
简单粗暴,直接上docker-compose.yml配置,如下,主要注意的是volumes配置,这个是使用主机的目录来存放数据和日志,还有使用主机的my.cnf配置文件,格式如下
应该注意到我下面yml配置中用的是./ ,意思是docker-compose.yml所在的当前位置下的文件夹和文件,如图
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F9ddaddba-1401-4958-8bad-3fd2a383d0b3%2FUntitled.png?table=block&id=f7e6f9e8-3961-442d-bead-e813ef503691&t=f7e6f9e8-3961-442d-bead-e813ef503691&width=1020&cache=v2)
这些用到的目录和配置文件要提前新建好,然后将一下代码保存为docker-compose.yml,放在如上图位置
然后在docker-compose.yml所在目录执行以下命令,创建并运行容器
下面我放一下master的my.cnf配置,slave的my.cnf也只是改下server-id参数就行
docker run命令版
踩坑跳坑
1.容器是跑起来了,但是发现mysql没使用主机的my.cnf文件,而是使用的自己默认的my.cnf,于是查看日志发现有个warning: can't allow writable /config/slave2.cnf 什么的,意思就是容器如果使用主机的这个mysql配置文件,不能为可写,于是权限修改为444,都只能读,然后重启容器,mysql配置生效。
2.从库执行过change master...和start slave;命令后,执行show slave status;发现有问题,Slave_IO_State显示:Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection,关键字就是这个
caching_sha2_password ,mysql8.0默认的就是这个,网上搜寻一下,也就是说把它换成mysql_native_password,代码如下
3.还有一个网上看到的,防火墙问题,Slave_IO_Running: Connecting # 出现错误,IO线程处于正在连接状态,关掉主从的防火墙即可
4.注意检查账号权限,在主库新建过账号,记得主库中mysql -uroot -p 连接执行select什么的检查下,本文使用的直接是root偷懒了,安全起见使用特定用户授予REPLICATION 权限,用于从库的连接。