四、 键值对数据库Redis
a. 一个基于内存的键值对存储系统,常用作数据库、缓存、消息代理。
b. 支持的数据类型:字符串、字典、列表、集合、有序集合、位图、地理位置、HyperLogLog等等。
c. 支持事务、分片、主从复制,支持RDB(将内存中的数据保存在文件中)、AOF(类似于MySQL的binlog)两种持久化方式。
d. 还支持订阅、分发、集群等特性。
e. 用作缓存时和Memcached相似,但Redis还能实现主从同步,并且Redis有丰富的命令和数据结构,像列表、集合这样的数据结构是Memcached所没有的。
1. Redis的应用场景
当不需要数据库的高级功能(回滚、关联查询、UPDATE操作等等),且Redis能满足此应用场景时就可以使用Redis。
注意:Redis本身并没有序列化/反序列化,本书使用MessagePack来完成这项工作。(序列化/反序列化使得Redis能够把对象存起来,这也是消息对列能实现的原因)
(1) 实例:取topN操作(排行榜应用)
(相比于MySQL+Memcached的方式,redis能够更有效地提高计算和排名的效率)
(2) 实例:计数器
(3) 实例:实时统计
Redis的位图提供了二进制操作,非常适合存储布尔值。常见场景是用来记录用户登录状态,可以用来统计一段时间内活跃的用户量。
2. 分片和集群管理
当单机的Redis不能满足需要时,可以通过一致性哈希算法将Redis数据的键进行散列,通过哈希函数,让特定的键映射到特性的Redis节点上。(但Redis的Python客户端redis-py目前还不支持分片)
(1) 常见的分片和集群管理方式
a. Twemproxy:Redis3.0之前通用的方式。一般一个Redis应用由多个Twemproxy来管,少数负责写,多数负责读。它能自动替换出现异常的节点,但它无法平滑地扩容/缩容,不便于维护,而且没有友好的控制面板。
b. Redis Cluster:Redis3.0添加的集群方式。它使用数据分片而非一致性哈希。
c. Codis:豌豆荚的Redis分布式集群解决方案。Codis对前端来说是透明的,它会处理请求的转发、不停机的数据迁移等工作。
五、 NoSQL数据库MongoDB
1. 为什么使用NoSQL
a. 对数据库可以进行高并发读写
b. 对海量数据的高效率存储和访问
c. 高可扩展性和高可用性
NoSQL是不能完全替代关系型数据库的,他们没有绝对的孰优孰劣。
2. MongoDB
(1) 优点
a. 文档型存储(键值对)
b. 使用高效的二进制BSON作为数据存储(拥有更快的遍历速度)
c. 自带高可用及分区的解决方案(副本集和分片)
d. 基于文档的富查询语言(多种查询方式)
e. 内置聚合工具(可通过MapReduce等方式进行复杂的统计和并行计算)
f. 3.0版本后增加了高性能、可伸缩、支持压缩和文档级锁的数据存储引擎WiredTiger。
(2) 安装MongoDB(注意添加源)
3. 使用pymongo的例子
MongoDB的一大核心是聚合功能,主要用于返回计算好的结果。
常用的执行聚合的方式有如下三种:
a. 使用管道
b. MapReduce
c. 单一目的的聚合操纵方法
4. 使用Mongoengine的例子
Mongoengine是MongoDB的ODM(对象文档映射)框架,相当于MySQL的ORM框架SQLAlchemy。
5. MongoDB实践经验(需详看)
(1) 善用组合式的大文档
可以尽量把数据组合起来节省空间。
(2) 正确使用索引(需详看)
添加索引就是为了提高查询速度。(但还是要经常查看MongoDB的日志,发现和找出速度问题)
(3) 高复用方案
MongoDB提供两种复制:主从复制和副本集。
副本集是推荐的复制策略,它提供自动的故障转移:主服务器因为某些原因下线后,如果可能的话,可以把一个节点提升为主节点。
Primary:主节点
Secondary:从节点
Arbiter:仲裁节点
Hidden:隐藏节点
Secondary-Only:只能作为从节点,防止这种性能不高的节点成为主节点。
注意:复制不是备份。
(4) 分片方案
情景:单台服务器无法应对越来越高的读写吞吐量的时候。
MongoDB支持自动分片,就是把一个集合根据片键分成多个块,然后将各个块分别分发到各个分片副本集上。
六、 大型网站架构经验
1. 缓存
通常来说,用户访问的热点数据只集中在一小部分数据上,这部分数据应该放在缓存中,这样就减轻了后端应用和数据存储的负担。
(1) 本地缓存(应用服务器内)
(2) 分布式缓存(分布式缓存集群,适合于大型网站)
(3) 反向代理(通常决定是从后端获取内容还是从缓存获取的就是代理服务器了)
(4) CDN缓存(在CDN上缓存一些变化少的内容可以有效提升页面加载速度)
2. 负载均衡
较好的服务器负担更大的访问量,较差的服务器负担较小的访问量。这样就均衡了服务器的负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间的目的。
常用的负载均衡工具:LVS、HAProxy、Nginx。
3. 高可用
Keepalived、Heartbeat。(这些工具通常都跟负载均衡一起使用)
4. 业务拆分
每个应用独立开发、部署、维护,应用之间通过网络进行通信,或者使用消息队列进行分发。业务拆分还包括对数据库的分库,其实现的成本低,但效果相对较好。
5. 集群
解决高并发、海量数据问题的常用手段。
6. 前端性能优化
(1) 减少页面请求和请求内容量(合并、压缩等)
(2) 动静页面分离(把静态资源应用部署在专门的服务器集群中)