大型网站系统架构演化
- 大型网站系统架构演化
- 需要关注的维度
- 涉及的技术
- 演进过程
- 单体架构
- 垂直架构
- 使用缓存改善网站性能
- 缓存与数据库的数据一致性问题
- 缓存技术对比
- Redis分布式存储方案
- Redis集群切片的常见方式
- Redis数据类型
- Redis 淘汰算法
大型网站系统架构演化
需要关注的维度
高性能、高可用、可维护、应变、安全
涉及的技术
维度 | 涉及技术内容 |
---|
架构 | MVC,MVP,MVVM,REST,Webservice,微服务 |
并发分流 | 集群(负载均衡)、CDN |
缓存 | MemCache,redis,Squid |
数据 | 主从库(主从复制),内存数据库,反规范化技术,NoSQL,分区分表技术,视图与物理化视图 |
持久化 | HIbernate,Mybatis |
分布存储 | Hadoop,FastDFS,区块链 |
数据编码 | XML,JSON |
Web应用服务器 | Apache,WebSphere,WebLogic,Tomcat,JBOSS,IIS |
安全性 | SQL注入攻击 |
其他 | 静态化,有状态与无状态,响应式Web设计,中台 |
演进过程
单体架构
垂直架构
使用缓存改善网站性能
缓存与数据库的数据一致性问题
数据库与缓存数据是否有可能不一致?如何解决?
有可能不一致。
大体思想如下:先写入数据库、再更新缓存
缓存技术对比
工作 | MemCache | Redis |
---|
数据类型 | 简单key/value结构 | 丰富的数据结构 |
持久性 | 不支持 | 支持 |
分布式存储 | 客户端哈希分片/一致性哈希 | 多种方式,主从、Sentinel、Cluster等 |
多线程支持 | 支持 | 支持 (Redis5.0之前不支持) |
内存管理 | 私有内存池/内存池 | 无 |
事务支持 | 不支持 | 有限支持 |
数据容灾 | 不支持,不能做数据恢复 | 支持,可以在灾难发生时,恢复数据 |
Redis分布式存储方案
分布式存储方案 | 核心特点 |
---|
主从模式 | 一主多从,故障时手动切换 |
哨兵模式 | 有哨兵的一主多从,主节点故障自动选择新的主节点 |
集群模式 | 分节点对等集群,分slots,不同slots的信息存储到不同节点 |
Redis集群切片的常见方式
集群切片方式 | 核心特点 |
---|
客户端分片 | 在客户端通过key的hash值对应到不同的服务器 |
中间件实现分片 | 在应用软件和Redis中间,例如:Twemproxy、Codis等,由中间件实现服务到后台Redis节点的路由分派 |
客户端服务端协作分片 | Redis Cluster模式,客户端可采用一致性哈希,服务端提供错误节点的重定向服务solt上。不同的solt对应到不同服务 |
Redis数据类型
类型 | 特点 | 示例 |
---|
String(字符串) | 存储二进制,,最大512M | 缓存,计数,共享Session |
Hash(字典) | 无序字典,数组+链表,适合存对象。Key对应一个HashMap。针对一组数据 | 存储、读取、修改用户属性 |
List(列表) | Linked List:双向链表,有序,增删快,查询慢;Array List:数组方式,有序,增删慢,查询快 | |
消息队列,文章列表,记录前N个最新登录的用户ID列表 | | |
Set(集合) | 键值对无序,唯一。增删查复杂度均为O(1),支持交/并/差集操作 | 独立IP,共同爱好,标签 |
Sorted Set【ZSet】(有序集合) | 键值对有序,唯一,自带按权重排序效果 | 排行榜 |
Redis 淘汰算法