因为EC2机器的最大内存为68G,随着照片存储量的增加,进行垂直分区(vertical partitioning);
使用django db routers,做垂直分区变得很容易;如下:照片则映射到photodb
def db_for_read(self, model):
if app_label == 'photos':
return 'photodb'
当照片存储量大于60G的时候,采用水平分区(也就是所谓的“分片”sharding)
sharding带来的问题:
1、数据的检索,hard to know what your primary access patterns will be w/out any usage in most cases, user ID
2、当有分片变得太大的时候怎么办?
基于范围的分片策略(就像MongoDB那样)
用户上传图片时:
1、用户上传带有标题信息和地理位置信息(可选)的照片;
2、同步写到这个用户对应的数据库(分片)中;
3、进行队列化处理
a、如果带有地理位置信息,通过异步的POST请求,将这个图片的信息送到Solr(Instagram 用于geo-search API的全文检索服务器)。
b、跟随者的信息分发(follower delivery),即告诉我的follower ,我发布了新的照片。如何来实现的呢?每个用户都有一个follower 列表,新照片上传时会把照片ID发送给列表中的每一个用户,用Redis 来处理这一业务简直太棒了,快速插入,快速子集化(rapid subsets,什么意思?是指获取部分数据吗)
c、when time to render a feed,we take small # of IDs, go look up info in memcached(当需要生成feed的时候,我们通过ID+#的格式,直接在memcached中查找信息)
Redis适合什么样的场景:
1、数据结构相对有限;
2、对频繁GET的地方,对复杂对象进行缓存;
不要将自己绑定在非得以内存数据库为主要存储策略的方案上(don’t tie yourself to a solution where your in-memory DB is your main data store
give back; e.g. node2dm(我理解的意思是:回报开源世界,例如:node2dm,一个出自instagram的node.js服务器,用来向安卓C2DM服务提交推送请求)
关注优化,如何是我们的系统速度快上一倍?
staying nimble = remind yourself of what’s important(保持敏捷 = 时刻提醒自己,什么才是你最重要的)
前所未有的时代,两个后端工程师能够支撑3000万用户规模的系统,关键字是: simplicity(简单)
cleanest solution with the fewest moving parts as possible(使用最少部件,最干净的解决方案)
don’t over-optimize or expect to know ahead of time how site will scale(不要过度的优化,除非你提前知道自己的系统将如何扩展)
don’t think “someone else will join & take care of this”