网站架构2

【笔记】常用网站架构

作者 Trekerz 日期 2017-03-01
网站架构2

四、 键值对数据库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) 动静页面分离(把静态资源应用部署在专门的服务器集群中)