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

性能,横向扩展数据层的

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

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

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

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

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

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

上图就是将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等等。

Netlog中数据库演变过程(转载)相关推荐

  1. Netlog 的数据库及 LAMP 架构

    Database Sharding@Netlog 详细的描述了 Netlog 数据库架构的演变过程,文章浅显易懂,非常值得学习.本文数据.图片均来自:Database Sharding at Netl ...

  2. weevely-------linux中的菜刀(转载)

    weevely 是BT5中一个常用的webshell后门连接工具,它发挥的作用类似于中国菜刀(chopper). root@bt:/pentest/backdoors/web/weevely# ./w ...

  3. Access 中数据库操作时提示from子句语法错误

    问题:如果在Access 中数据库操作时提示from子句语法错误 原因:语句中某一单词为Access中的关键字.如:select * from user.其中user就是一关键字. 解决:用中括号[] ...

  4. Sybase数据库简介 (转载)

    一.Sybase数据库简介 (转载) 1.版本 1984年,Mark B. Hiffman和Robert Epstern创建了Sybase公司,并在1987年推出了Sybase数据库产品.SYBASE ...

  5. python数据库模糊查询_python中数据库like模糊查询方式

    python中数据库like模糊查询方式 在Python中%是一个格式化字符,所以如果需要使用%则需要写成%%. 将在Python中执行的sql语句改为: sql = "SELECT * F ...

  6. MySQL中数据库的操作

    文章目录 1 MySQL中数据库的操作 1.1 创建数据库 1.2 查看数据库 1.3 选择数据库 1.4 删除数据库 1.5 数据库的命名规范 1 MySQL中数据库的操作 像文件一样,我们可以随时 ...

  7. Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)

    flask-script扩展命令行 1. 安装  : pip install  Flask-Script 2. 在程序中   from flask_script import Manager   '' ...

  8. django 开发中数据库可以怎样优化

    django 开发中数据库可以怎样优化 (1)设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能: (2)使用缓存,减少对数据库的访问: (3)在 orm 框架下设置表时,能用 varchar ...

  9. mysql表设计讲解_MySQL中数据库的设计归纳讲解

    谈到MySQL中数据库的设计,相信大家都知道这是实现实际业务的重要一步,因此对于Java学习者来说,深入了解和学习数据库的设计是十分有必要的.本文为大家准备了一份MySQL中数据库的设计归纳讲解,内容 ...

  10. git在eclipse中的配置 转载

    git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...

最新文章

  1. 高颜值的神经网络可视化工具:3D、彩色、可定制,还能可视化参数重要性
  2. Go 语言编程 — go-swagger OpenAPI 工具
  3. 单臂路由的配置及应用:
  4. DOCTYPE html PUBLIC 指定了 HTML 文档遵循的文档类型定义
  5. 素数与线性筛选法初级版
  6. sharedpreferences使用方法_细数 SharedPreferences 的那些槽点 !
  7. 失落城堡获取服务器信息,《失落城堡》精英服资格获取方法 失落城堡精英服招募...
  8. mysql5.5 replication_mysql5.5 master-slave(Replication)配置
  9. ubuntu 普通用户下设置tab键自动补全
  10. java2wsdl_Axis2用法:JAVA2WSDL和WSDL2JAVA
  11. WINDOWS游戏编程学习笔记(一):Hello Game!
  12. Full RangeLimited Range
  13. Mapgis67软件实用操作
  14. java滚动字幕实训报告_Java实习报告 (7000字).doc
  15. ricequant量化交易文件如何保存和读取
  16. vue 阻止输入框冒泡
  17. 什么是工程思维和产品思维
  18. PMP考试 工作绩效数据 工作绩效信息 工作绩效报告 区别与联系
  19. html在浏览器中的渲染原理,浏览器渲染原理
  20. 【零基础深度学习教程第一课:深度学习基础】

热门文章

  1. 数学分析教程(科大)——1.11笔记+习题
  2. 汽车行业营销案例(共13份)
  3. 计算机的acpi高级电源选项配置,ACPI电源管理模式详解
  4. 网络虚拟化之虚拟交换机技术Linux Bridge
  5. 深入理解Java虚拟机——可视化监控工具(Jconsole)
  6. 密码学专题 对称加密算法
  7. 虚拟主机和云服务器有什么区别,我们应该如何选择?
  8. ajax一般格式,ajax格式是什么样的?ajax教程
  9. 瑞星企业防毒2010网络版(二)管理及应用
  10. 计算机专业术语pe什么意思,pe是什么意思