前言
MySQL的部署模式常见的包括以下几种:
- 独立服务器部署
- 主从复制部署
- 高可用性集群(HA)
- 分片
- 容器化部署
部署方式 | 优点 | 缺点 |
---|---|---|
独立服务器部署 | 简单直接,适用于小规模应用。 管理和维护相对容易。 性能相对稳定,不受其他服务器影响。 |
单点故障风险,如果服务器崩溃,将导致应用不可用。 难以实现高可用性和故障切换。 |
主从复制部署 | 数据冗余和备份,从服务器可以作为主服务器的备份。 支持读写分离,提高读操作的性能。 故障切换机制,当主服务器故障时,可以快速切换到从服务器 |
写操作只能在主服务器上执行,可能会造成主服务器的负载压力。 数据同步延迟,从服务器与主服务器之间存在一定的复制延迟。 |
高可用性集群 | 高可用性,集群中的节点可以承担故障并实现自动故障切换。 数据冗余和备份,每个节点都包含完整的数据副本。 支持水平扩展和负载均衡。 |
配置和管理相对复杂。 集群节点之间的同步可能会引入一定的网络延迟。 需要额外的硬件和资源。 |
分片 | 数据分布在多个节点上,可以扩展存储容量和吞吐量。 水平扩展,减轻单个节点的负载压力。 负载均衡,每个节点只处理部分数据和查询。 |
需要应用层支持,必须将数据分片逻辑嵌入应用程序中。 数据访问变得更加复杂,需要在多个节点上进行查询和事务操作。 数据一致性管理较为复杂 |
容器化部署 | 快速部署和可移植性,通过容器技术实现快速启动和停止。 灵活性,可以在不同的环境中部署和迁移。 资源利用率高,容器可以共享主机的资源并提供隔离性。 |
对容器化技术和容器编排的要求较高。 配置和管理容器化的 MySQL 实例可能会更复杂。 维护多个容器的状态和版本控制。 |
本文主要介绍MySQL集群模式的主从复制部署模式,觉得写得不错的可以点赞支持一下。
一、基本介绍
1.1、概念
主从复制(Master-Slave Replication):主从复制是最简单的 MySQL 集群架构,将读写操作分离到不同的服务器上。主服务器接收所有的写操作,并将更改记录到二进制日志中,而从服务器则定期地检查主服务器的二进制日志并应用这些更改。主从复制适用于高读写比例,对数据一致性要求不高的场景。简而言之,在主从复制中,数据变更主要通过binlog来实现同步。
1.2、执行流程
执行流程(标红画线):
1、从库不断试探主库的二进制日志文件,如果这个文件有更新则发送请求到主库获取主库中更新的内容;
2、当向主库中写数据时:包括增加、删除、修改、建库建表等等;
3、主库将写命令记录到二进制日志文件中,并更新二进制日志文件的偏移量;
4、如果从库试探主库的二进制日志文件发现偏移量与从库记录的偏移量值不同,则标识主库有更新,那么就启动IO线程向主库请求从某个偏移量开始到二进制日志文件结束位置之间的所有数据;
5、主库根据从库请求偏移量位置来推送数据到从库中,然后从接收到数据以后,会更新从库所记录的偏移量位置;
6、从库获取到主库的数据后,将这些命令数据写入到中继文件中,然后唤醒SQL线程同时让当前IO线程挂起(休眠等待);
7、SQL线程根据记录在中继日志文件的偏移量,读取中继日志文件中的命令;
8、SQL线程拿到命令以后在本地数据库进行回放(从库中执行主库更新的SQL语句),回放完成后当前SQL线程挂起(等待下一次操作);
二、部署
本文主要根据三台服务器来部署一主二从的MySQL集群,服务器布置如下所示:
- 192.168.100.101:3306(主)
- 192.168.100.102:3306(从)
- 192.168.100.103:3306(从)
mysql数据库版本:8.0.34
准备好安装包 mysql-8.0.34-linux-glibc2.17-x86_64.tar
2.1、通用配置
通用配置即为在101、102、103三台服务器上都安装MySQL,并进行基本配置。
# 1、创建目录/opt/mysql,并将安装包上传至当前目录
cd /opt/mysql
# 2、解压安装包
tar -zxvf mysql-8.0.34-linux-glibc2.17-x86_64.tar.gz
# 3、将安解压后的安装包移动到/usr/local/目录下,并改个名字
mv mysql-8.0.34-linux-glibc2.17-x86_64 /usr/local/mysql-8
# 4、创建配置文件 my.cnf,并输入以下内容
vim my.cnf
# *****************************************************************
#-------------------------文本内容分割线----------------------------
[mysqld]
basedir=/usr/local/mysql-8
datadir=/usr/local/mysql-8/data
port=3306
socket=/tmp/mysql.sock