一些有用的知识点
数据库的一主两从
“一主两从”是数据库系统中一种主从复制架构(Master-Slave Replication Architecture),常用于提升系统的可用性(availability)与读取性能(read scalability)。
🔧 什么是“一主两从”?
-
一主(Master):负责所有的写操作(插入、更新、删除),也可以承担读取。
-
两从(Slave):负责复制主库的数据更新,一般只做读操作,不能写入。
💡 简单说就是:
主库写、从库读,一主库写的内容会同步到两个从库上。
🧱 架构图示意(口头版)
写操作(写入) |
✅ 主要好处
优势 | 说明 |
---|---|
读写分离 | 主库处理写,从库处理读,减轻压力 |
高可用性 | 主库挂了可以手动或自动切换为从库(主从切换) |
数据冗余 | 从库就是备份,避免数据丢失 |
⚠️ 潜在问题
问题 | 说明 |
---|---|
数据延迟 | 主库更新后,从库同步可能会有延迟(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(而不是直接连数据库)
-
MyCat 根据 SQL 类型自动路由:
-
INSERT / UPDATE / DELETE
→ 主库 -
SELECT
→ 从库(轮询/负载均衡)
-
-
从库数据通过 MySQL 自带的主从复制机制保持同步
✅ 好处
优点 | 说明 |
---|---|
⚡ 提高性能 | 写操作主库集中处理,读操作多个从库分担,性能提升明显 |
🧠 中间件智能路由 | 应用代码不需要修改 SQL 路由逻辑 |
🧩 支持多种数据库 | 支持 MySQL、MariaDB、Oracle 等 |
🧮 配置灵活 | 支持权重分配、读写比例控制 |
⚠️ 注意事项
问题 | 说明 |
---|---|
🕓 数据延迟 | 主从同步可能有延迟,导致读到旧数据 |
❌ 事务不一致 | 一些跨主从的事务或读写顺序要求高的业务要小心处理 |
🔒 强一致性需求场景不适合 | 例如刚插入再查询的数据可能查不到(除非设置强制走主库) |
🛠 SQL识别误差 | 某些写入 SQL 被错误识别为读操作(比如 SELECT ... FOR UPDATE ) |
📦 配置方式(简化示意)
# server.xml 中定义读写分离策略 |
🔍 balance=“1” 表示使用简单的轮询负载均衡策略。
好的!下面我来用通俗又专业的方式,讲清楚 Nginx 和 LVS(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 { |
🧱 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 |
🧠 所以:
-
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 并行处理请求 |