Instagram 的分片与 ID 设计

Instagram上有大量的数据,每分钟就有超过25张的图片和90个点赞。为了确保所有重要的数据都能被合理存储并且及时得被提取应用,我们对数据进行了分片(sharding)——也就是说,我们把数据放到多个桶(bucket)中,每个桶里都有一部分数据。

我们的应用服务器上运行的是Django, 后端数据库是PostgreSQL。对数据分片首先要决定是否要保留PostgreSQL作为主要的数据存储库,是否要采用其他的数据库。经过评估一些不同的数据库解决方案,我们最终确定最适合的方案是在PostgreSQL数据库集群上实现数据分片。

然而在把数据写到数据库之前,我们还要解决如何给数据(例如Instagram上发布的没一张图片)加上唯一标识符的问题。在单一数据库上的典型解法——使用数据库自带的自增主键功能——在当数据需要被同时插入到多个数据库时就不适用了。文章的下面就来讲讲我们是如何解决这个问题的