首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Netlog中数据库演化过程(转载)

2013-11-25 
Netlog中数据库演变过程(转载)Netlog拥有4000万活跃用户,每个月有超过5000万的独立用户访问网站,每个月有5

Netlog中数据库演变过程(转载)

Netlog拥有4000万活跃用户,每个月有超过5000万的独立用户访问网站,每个月有5亿多的PV。数据量应该算是比较大的。作者是Jurriaan Persyn,他从一个开发者角度而非DBA或者SA角度来谈Netlog是如何通过数据切分来提高网站

性能,横向扩展数据层的

?

第一阶段:读写同在一台数据库服务器

?

Netlog中数据库演化过程(转载)

?

第二阶段:读写分离(可以解决读写比例均衡或者读居多的情况,但是带入了数据复制同步的问题)

Netlog中数据库演化过程(转载)

?

第三阶段:部分数据独立部署结合读写分离。(部分数据根据其业务独立性情况,可以将所有的数据独立存储到数据库服务器,分担数据读写压力,前提是要求数据具有较高的业务独立性)

Netlog中数据库演化过程(转载)

?

?

第四阶段:数据分拆结合读写分离(三阶段的增强)

Netlog中数据库演化过程(转载)

?

?

?

第五阶段:问题出现,分拆也无法解决数据爆炸性增长,同时读写处于同等比例

Netlog中数据库演化过程(转载)

?

?

解决问题两种方式:DB Scale up?,DB Scale out。前者投入以及后期扩展有限,因此需要进行数据切分

Netlog中数据库演化过程(转载)

?

?

?

?

?

?

上图就是将photo的数据切分到了10台数据库服务器上。

?

切分数据的两个关键点:

1.??如何根据存储的数据内容判断数据的存储归属,也就是什么是内容的分区主键。

2.??采用什么算法可以根据不同的主键将内容存储到不同的分区中。

?

分区主键的选择还是要根据自身的业务场景来决定,Netblog选择的是用户ID。

采用什么方式将分区主键映射到对应的分区可以通过以下四种方式:

1.??根据数据表来切分。(前提就是数据独立性较强,和前面提到的三阶段类似)

2.??基于内容区间范围的分区。(就好比前1000个用户的信息存储在A服务器,1000-2000存储在B服务器)

3.??采用Hash算法结合虚拟节点的方式。(这类在memcached等等分布式场景中最常见,其实也是一个难点),缺点就是在于动态增加存储节点会导致数据部分或者全部失效。

4.??目录式的分区。最简单也是最直接的方式,key和分区的对应关系被保存,通过查找目录可以得到分区信息。适合扩展,就是增加查询损耗。

?

如何将数据分布的尽量均匀,如何平衡各个服务器之间的负载,如何在新增存储机器和删除存储机器的时候不影响原有数据,同时能够将数据均摊,都是算法的关键。在分布式系统中DHT(Distribute Hash Table)被很多人研究,并且有很多的论文是关于它的。

?

数据的横向切分给应用带来的问题:

1.??跨区的数据查询变得很困难。(对于复杂的关联性数据查询无法在一个请求中完成)

2.??数据一致性和引用完整性较难保证。(多物理存储的情况下很难保证兼顾效率、可用性、一致性)

3.??数据分区之间的负载均衡问题。(数据本身的不均衡性,访问和读写的不均衡性都会给数据分区的负载均衡带来困难)

4.??网络配置的复杂性。(需要保证服务器之间的大数据量频繁的交互和同步)

5.??数据备份策略将会变得十分复杂。

解决这些问题当前已经有的一些开源项目:

1.??MySql Cluster,解决读写分离问题已经十分成熟。

2.??MySql Partitioning,可以将一个大表拆分为很多小表,提高访问速度,但是限制与这些小表必须在同一台服务器上。

3.??HSCALE和Spock Proxy都是建立与MySql Proxy基础上的开源项目,MySql Proxy采用LUA脚本来进行数据分区。

4.??HiveDB是MySql分区框架的java实现。

5.??另外还有HyperTable,HBase,BigTable\oracle等等。

热点排行