Netlog中数据库演变过程(转载)
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中数据库演变过程(转载)相关推荐
- Netlog 的数据库及 LAMP 架构
Database Sharding@Netlog 详细的描述了 Netlog 数据库架构的演变过程,文章浅显易懂,非常值得学习.本文数据.图片均来自:Database Sharding at Netl ...
- weevely-------linux中的菜刀(转载)
weevely 是BT5中一个常用的webshell后门连接工具,它发挥的作用类似于中国菜刀(chopper). root@bt:/pentest/backdoors/web/weevely# ./w ...
- Access 中数据库操作时提示from子句语法错误
问题:如果在Access 中数据库操作时提示from子句语法错误 原因:语句中某一单词为Access中的关键字.如:select * from user.其中user就是一关键字. 解决:用中括号[] ...
- Sybase数据库简介 (转载)
一.Sybase数据库简介 (转载) 1.版本 1984年,Mark B. Hiffman和Robert Epstern创建了Sybase公司,并在1987年推出了Sybase数据库产品.SYBASE ...
- python数据库模糊查询_python中数据库like模糊查询方式
python中数据库like模糊查询方式 在Python中%是一个格式化字符,所以如果需要使用%则需要写成%%. 将在Python中执行的sql语句改为: sql = "SELECT * F ...
- MySQL中数据库的操作
文章目录 1 MySQL中数据库的操作 1.1 创建数据库 1.2 查看数据库 1.3 选择数据库 1.4 删除数据库 1.5 数据库的命名规范 1 MySQL中数据库的操作 像文件一样,我们可以随时 ...
- Flask框架(flask-script扩展命令行和flask中数据库migrate扩展的使用)
flask-script扩展命令行 1. 安装 : pip install Flask-Script 2. 在程序中 from flask_script import Manager '' ...
- django 开发中数据库可以怎样优化
django 开发中数据库可以怎样优化 (1)设计表时,尽量少使用外键,因为外键约束会影响插入和删除性能: (2)使用缓存,减少对数据库的访问: (3)在 orm 框架下设置表时,能用 varchar ...
- mysql表设计讲解_MySQL中数据库的设计归纳讲解
谈到MySQL中数据库的设计,相信大家都知道这是实现实际业务的重要一步,因此对于Java学习者来说,深入了解和学习数据库的设计是十分有必要的.本文为大家准备了一份MySQL中数据库的设计归纳讲解,内容 ...
- git在eclipse中的配置 转载
git在eclipse中的配置 转载 一_安装EGIT插件 http://download.eclipse.org/egit/updates/ 或者使用Eclipse Marketplace,搜索EG ...
最新文章
- 高颜值的神经网络可视化工具:3D、彩色、可定制,还能可视化参数重要性
- Go 语言编程 — go-swagger OpenAPI 工具
- 单臂路由的配置及应用:
- DOCTYPE html PUBLIC 指定了 HTML 文档遵循的文档类型定义
- 素数与线性筛选法初级版
- sharedpreferences使用方法_细数 SharedPreferences 的那些槽点 !
- 失落城堡获取服务器信息,《失落城堡》精英服资格获取方法 失落城堡精英服招募...
- mysql5.5 replication_mysql5.5 master-slave(Replication)配置
- ubuntu 普通用户下设置tab键自动补全
- java2wsdl_Axis2用法:JAVA2WSDL和WSDL2JAVA
- WINDOWS游戏编程学习笔记(一):Hello Game!
- Full RangeLimited Range
- Mapgis67软件实用操作
- java滚动字幕实训报告_Java实习报告 (7000字).doc
- ricequant量化交易文件如何保存和读取
- vue 阻止输入框冒泡
- 什么是工程思维和产品思维
- PMP考试 工作绩效数据 工作绩效信息 工作绩效报告 区别与联系
- html在浏览器中的渲染原理,浏览器渲染原理
- 【零基础深度学习教程第一课:深度学习基础】