MySQL主从集群
主从模式、集群模式,都是在一个项目中使用多个mysql节点进行存储和读取数据。
当单机模式部署,不满足安全性、高可用、高并发等需求的时候,就需要考虑主从模式或者集群模式部署。
什么是主从模式?
- 主从模式,或者是叫主从架构、主从复制,有以下几种常见方案:一主一从、一主多从、多主一从、互为主 备、级联复制等。
- 主数据库必须开启binary log(二进制)功能,因为主从同步所有的操作都是基于二进制文件来完成的。
- 数据同步模式有:
- 异步模式:主库将事务binlog事件写入到binlog文件中,此时主库只会 通知一下dump线程发送这些新的binlog,然后主库就会继续处理提交 操作,而此时不会保证这些binlog传到任何一个从库节点上。
- 半同步模式:主库只需要等待至少一个从库节点收到并且Flush binlog 到relay-log文件即可,主库不需要等待所有从库给主库反馈。同时,这里只是一个收到的反馈,而不是已经完全执行并且提交的反馈。
- 全同步模式:当主库提交事务之后,所有的从库节点必须全部收到,APPLY并且提交这些事务,然后主库线程才能继续做后续操作。
1、主从复制指的是当主数据库中进行了update、insert、delete操作导致数据发生改变时,变化会实时同步到一个或者多个从数据库(slave)中。
2、默认情况下异步复制、无需维持长连接。
3、通过配置可以选择想要同步的库和表
什么是集群模式
集群最大的优点就是数据实时同步,高可用,每个节点的数据都是同步一致的,不像主从,有时会出现数据不一致,而高可用,任何一个节点宕机都不会影响业务。
集群模式有以下集中常见部署方式:
- 读写分离的集群模式:集群中有的节点只进行写入操作,有的节点只进行读取操作,每个节点的数据都是完全一致的。
- 分片(分库分表)集群模式:集群中所有的节点表结构一致,每个节点存储的数据不一样。分片算法主要有两种,一种是范围法(1-100条数据在节点A,101-200条数据在节点B),另一种是HASH法(对每条数据按照一定的算法分配到不同的存储节点)。
- 读写分离和分片模式组合应用,先进行分片模式部署,然后对每个分片进行读写分离模式部署。
主从模式部署注意事项
- 常用命令(执行命令之前stop服务,执行完再start):
- 查看主节点状态:show master status\G;
- 查看从节点状态:show slave status\G;
- 停止同步:stop slave;
- 开启同步:start slave;
- 修改Master_Log_File:CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;
- 修改master节点信息:CHANGE MASTER TO MASTER_HOST='192.168.203.141', MASTER_PORT=33060,MASTER_USER='root', MASTER_PASSWORD='123456';
- 删除当前节点的 binlog 文件:PURGE BINARY LOGS TO 'binlog.000001';
- 数据的操作日志位置:SHOW BINARY LOGS;
- 数据的真实具体位置:SHOW GLOBAL VARIABLES LIKE "%datadir%";
- 每个节点的slave_sql_running、Slave_IO_Running两个字段都是YES,集群状态才正常
- 主服务器查看主节点状态,显示的 File 字段,和从服务器查看从节点状态,显示的 Master_Log_File 字段,必须保持一致。
- slave_sql_running为No的话,可能是主从库数据不同步,可以同步一下数据。
- 数据导出命令(在mysql服务器执行,不需要登录数据库):
- mysqldump -u[用户名] -h[ip] -p[密码] -P[端口号] --databases 数据库名 --tables 表名 >导出的文件名.sql
- 数据库导入命令(导入的时候需要指定数据库,保证指定的数据库存在):
- mysqldump -u[用户名] -h[ip] -p[密码] -P[端口号] < 导入的文件名.sql
操作
docker pull mysql/mysql-server:5.7
mkdir -p /home/data/mysql/slave/{conf,data}
mkdir -p /home/data/mysql/slave/{conf,data}
上传数据库容器的配置文件my.cnf
- 主数据库需要开启二进制日志 log-bin=mysql-bin
- 主从服务器都需要指定服务器标识ID server-id=1
创建Master主服务器
设置主服务器 master
docker run -p 3999:3306 \
--name mysql-master \
-v /home/data/mysql/master/conf/my.cnf:/etc/my.cnf \
-v /home/data/mysql/master/data:/var/lib/mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql/mysql-server:5.7
设置从服务器 slave
docker run -p 3998:3306 \
--name mysql-slave \
-v /home/data/mysql/slave/conf/my.cnf:/etc/my.cnf \
-v /home/data/mysql/slave/data:/var/lib/mysql \
--privileged=true \
-e MYSQL_ROOT_PASSWORD=123456 \
-d mysql/mysql-server:5.7
接着查看结果
输入 dockers ps
配置主从
先进入主服务器,查看主服务器的binlog 日志文件
show master status;
主服务器界面
从服务器界面
CHANGE MASTER TO MASTER_HOST='192.168.198.128', MASTER_PORT=3999, MASTER_USER='root',MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=586;
master_host=xx 这里填master主机IP,除了填写住宿主机IP,还可以填写bridge网络中的IP
master_log_file=xx 这里填写 File 的值就是前面我们show master status;命令的执行结果
master_log_pos=xx 这里填写 Position 的值就是前面我们show master status;命令的执行结果
start slave;
show slave status\G;
这里只要看到两个参数Slave_IO_Running和Slave_SQL_Running都为true|yes,则表示复制是正常进行的, 到这里我们的主从结构也就搭建完成了
集群成功后,在mysql-master容器重启后虽然File的值和Position的值会变化,但在mysql-slave可以进行跟踪,所以不需要重新进行配置
stop slave;
reset slave all;