数据库的一主两从

“一主两从”是数据库系统中一种主从复制架构(Master-Slave Replication Architecture),常用于提升系统的可用性(availability)与读取性能(read scalability)


🔧 什么是“一主两从”?

  • 一主(Master):负责所有的写操作(插入、更新、删除),也可以承担读取。

  • 两从(Slave):负责复制主库的数据更新,一般只做读操作,不能写入。

💡 简单说就是:
主库写、从库读,一主库写的内容会同步到两个从库上。


🧱 架构图示意(口头版)

       写操作(写入)

主数据库
/ \
复制同步 复制同步
/ \
从库1(只读) 从库2(只读)

↑ ↑
读操作 读操作

✅ 主要好处

优势 说明
读写分离 主库处理写,从库处理读,减轻压力
高可用性 主库挂了可以手动或自动切换为从库(主从切换)
数据冗余 从库就是备份,避免数据丢失

⚠️ 潜在问题

问题 说明
数据延迟 主库更新后,从库同步可能会有延迟(Replication Lag)
切换复杂 主库宕机时手动或自动切换需要较复杂配置
一致性风险 某些时候从库还没同步完数据,读到的就是旧数据(Eventually Consistent)

📚 案例参考

  • MySQL 支持 一主多从 的异步复制,通过 binlog(二进制日志)机制。

  • PostgreSQL 支持 Streaming Replication,可以实现一主两从。

  • 阿里云 RDS 就可以一键搭建一主两从结构,自动故障转移。


💡 英文关键词(DevOps相关)

中文 英文
主从复制 Master-Slave Replication
主库 Primary / Master
从库 Replica / Slave
延迟 Replication Lag
高可用 High Availability
自动故障转移 Automatic Failover

如果你是做 DevOps 或分布式系统设计的,这种架构是常见的高可用部署手段之一。未来 3 年里,很多企业数据库架构都会往“一主多从 + 自动容灾 + 云上备份”演进。

需要我帮你画个一主两从的流程图或者配置方式也可以继续说哈 🙂

MyCat 的读写分离,说白了就是:让写操作走主库,读操作走从库,从而减轻主库压力、提高性能。这是它作为**数据库中间件(Database Middleware)**的核心功能之一。


🧱 什么是 MyCat读写分离?

MyCat 是一个基于 Java 的开源数据库中间件,支持分库分表、读写分离、负载均衡、分布式事务等功能。

👉 它位于应用程序和数据库之间,相当于数据库的“代理服务器”。


📥 一般架构如下:

  应用层(Java、Python等)

MyCat中间件
/ \
写操作 读操作
↓ ↓
主库 从库1、从库2……

🛠 实现方式:

  1. 应用只连接 MyCat(而不是直接连数据库)

  2. MyCat 根据 SQL 类型自动路由:

    • INSERT / UPDATE / DELETE → 主库

    • SELECT → 从库(轮询/负载均衡)

  3. 从库数据通过 MySQL 自带的主从复制机制保持同步


✅ 好处

优点 说明
⚡ 提高性能 写操作主库集中处理,读操作多个从库分担,性能提升明显
🧠 中间件智能路由 应用代码不需要修改 SQL 路由逻辑
🧩 支持多种数据库 支持 MySQL、MariaDB、Oracle 等
🧮 配置灵活 支持权重分配、读写比例控制

⚠️ 注意事项

问题 说明
🕓 数据延迟 主从同步可能有延迟,导致读到旧数据
❌ 事务不一致 一些跨主从的事务或读写顺序要求高的业务要小心处理
🔒 强一致性需求场景不适合 例如刚插入再查询的数据可能查不到(除非设置强制走主库)
🛠 SQL识别误差 某些写入 SQL 被错误识别为读操作(比如 SELECT ... FOR UPDATE

📦 配置方式(简化示意)

# server.xml 中定义读写分离策略
<dataHost name="mysqlCluster" maxCon="1000" minCon="10" balance="1">
<writeHost host="hostM" url="主库IP:3306" user="root" password="123456">
<readHost host="hostS1" url="从库1IP:3306" />
<readHost host="hostS2" url="从库2IP:3306" />
</writeHost>
</dataHost>

🔍 balance=“1” 表示使用简单的轮询负载均衡策略。

好的!下面我来用通俗又专业的方式,讲清楚 NginxLVS(Linux Virtual Server) 两种负载均衡技术的原理、对比和使用场景。


🍃 什么是负载均衡(Load Balancing)?

负载均衡的核心目标是:
把用户请求合理地分发到多个后端服务器上,提高系统的并发能力和可用性。

就像饭店排队时有多个窗口,前台决定你去哪一窗口点餐,这个前台就是“负载均衡器”。


🧰 Nginx 的负载均衡

✅ Nginx 是什么?

Nginx 是一个轻量级的 Web 服务器 / 反向代理服务器,也可以作为 应用层负载均衡器

👉 它运行在第 7 层(HTTP),对请求内容可以“看得懂”,可以根据 URL、头部、Cookie 等做分发。

🛠 工作原理

  • 用户请求到达 Nginx

  • Nginx 根据配置(如轮询、IP hash、权重)把请求转发到后端服务器

  • 后端返回响应,Nginx再转发给用户

⚙️ 常用策略

名称 说明
round-robin(轮询) 默认,按顺序分发
ip_hash 按客户端 IP 保证请求打到同一台服务器
least_conn 谁连接少分发给谁
weight 给每台服务器设定权重

📦 配置示例

upstream backend {
server 10.0.0.2;
server 10.0.0.3;
}

server {
location / {
proxy_pass http://backend;
}
}

🧱 LVS 的负载均衡

✅ LVS 是什么?

LVS(Linux Virtual Server)是基于 Linux 内核层的负载均衡解决方案。

👉 它工作在第 4 层(传输层,TCP/UDP),是一个 IP级别的调度器,效率非常高。

🛠 工作原理

  • 用户请求先到达 LVS 所在的虚拟 IP(VIP)

  • LVS 根据配置选择一台真实服务器(Real Server)

  • 将数据包转发到该服务器

  • 有三种模式(后面说)

🔁 三种 LVS 模式

模式 特点 简介
NAT模式 改 IP 和端口,性能较低 LVS 改包再发出,服务器回包经 LVS
TUN模式 高性能,对后端要求高 使用 IP 隧道,服务器自己回包
DR模式(最常用) 高性能,不改包 LVS 把包直接转给服务器,服务器直接回复客户端

🔍 Nginx vs LVS 对比

对比项 Nginx LVS
工作层 第7层(应用层) 第4层(传输层)
性能 中等偏高 非常高
功能 支持内容分发、缓存、静态资源 仅基于 IP/端口做分发
配置复杂度 简单,适合中小公司 稍复杂,适合大型网站
宕机检测 内建支持 需配合 Keepalived
适用场景 Web 应用、接口服务 高性能网络服务(如 TCP游戏服务器)

📚 英文术语中英对照(带解释)

英文术语 中文解释
Load Balancing 负载均衡
Reverse Proxy 反向代理(常用于 Nginx)
Real Server 实际处理请求的后端服务器
NAT (Network Address Translation) 网络地址转换
DR (Direct Routing) 直接路由转发模式
VIP (Virtual IP) 虚拟 IP 地址,用于外部访问

🚀 小结与建议

如果你是… 推荐方案
中小型公司,做 Web 开发 Nginx,配置简单,功能强大
要支持数百万连接,高性能要求 LVS(配合 Keepalived 做高可用)
想要二者结合 前端 LVS,后端 Nginx,经典双层结构

Redis 集群

Redis 集群的作用简单一句话就是:

让 Redis 能“分布式运行”,存得下更多数据,扛得住更多请求,还能在节点故障时自动容错。

下面我从用途、原理、架构、优缺点四方面,给你讲清楚 Redis 集群到底干嘛的👇


🌟 Redis 集群是干嘛的?

默认情况下,单个 Redis 实例的数据是单机存的、单线程处理的,它有以下限制:

  • 内存容量受限(32GB 以上就危险了)

  • QPS(每秒请求数)受限

  • 容错性差,一挂全挂

➡️ 所以 Redis 官方推出了 Redis Cluster 模式,将数据和请求分布到多个节点上,实现高可用(HA)+ 高性能(Scalability)


🧱 Redis 集群架构原理

Redis Cluster 是一种 分布式架构,有以下关键特点:

🔑 关键词:分片 + 主从 + 自动故障转移

组成 说明
分片(Sharding) 将整个数据库划分成 16384 个槽(slot),不同键根据 CRC16 算法分配到不同 slot,再由不同节点处理
主节点(Master) 存储数据、响应请求
从节点(Slave) 备份主节点数据,当主节点挂掉可自动切换
自动发现 / 故障转移 节点之间互相通信(gossip 协议),发现异常后自动重新选主

📦 架构示意图(口头版)

假设有一个 3 主 3 从 的 Redis 集群:

      Client
|
---------------------
| | |
Master1 Master2 Master3 (负责写/读)
| | |
Slave1 Slave2 Slave3 (负责备份)

↓数据槽分配
slot 0~5460 → Master1
slot 5461~10922 → Master2
slot 10923~16383 → Master3

🧠 所以:

  • Client 发起请求前,会根据 key 的哈希 slot 定位到某个 master

  • 如果该 master 挂了,它的 slave 会升级为新的 master

  • 集群之间用 gossip 协议定期“互相问候”检查健康状况


✅ Redis 集群的好处

优势 说明
🌍 水平扩展 增加节点即可扩容(读写、内存、吞吐量)
📦 数据分片 大数据集可以拆分到多个节点上,避免内存爆炸
🔁 自动故障恢复 节点挂了,从节点自动补位,系统不中断
🚀 高并发处理 多主节点并行处理请求,QPS 成倍提升

⚠️ Redis 集群的坑点(要注意)

问题 说明
❌ 不支持多 key 跨 slot 的事务 比如 MGET k1 k2 如果 k1、k2 属于不同 slot,会失败
🚦 客户端必须支持 Cluster 协议 否则收到 MOVED 响应后自己不会跳转
🔒 数据一致性弱 主从复制是异步的,有短暂数据丢失风险(可以搭配 wait 命令缓解)
⚙️ 运维稍复杂 部署、监控、扩容需要一定 DevOps 能力(但有脚本和工具支持)

🔧 使用案例

场景 Redis 集群能解决的问题
电商秒杀 高并发请求,库存缓存写入压力大
分布式 session 存储 用户量大,session 数据分散到不同节点
热点排行榜 每天上亿次访问,单节点 Redis 无法承载
游戏排行榜 用户多,实时性要求高,Redis Cluster 并行处理请求