MySQL主从集群

发布时间:2024年01月21日

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;

文章来源:https://blog.csdn.net/T278lk/article/details/135721890
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。