痛并快乐着:浅谈大数据时代的分布式存储架构
从全球知名咨询公司麦肯锡宣称“大数据”时代的到来,时至今日,数据量已经几何倍数的翻增,麦肯锡称:“数据,已经渗透到当今每一个行业和业务职能领域,成为重要的生产因素。
大数据的第一个特征是数据量大,大数据的起始计量单位至少是P、E甚至ZB级别;第二个特征是数据类型繁多,包括网络日志、音频、视频、图片、地理位置信息等等。同时,海量多类型的数据对数据的处理能力提出了更高的要求,不仅要提供海量的数据存储空间,又要满足多种类文件的高效存储。
目前,解决这种需求最常用的方式就是采用分布式存储系统。
分布式存储存放的数据,包含数据和元数据信息,那么什么是数据和元数据呢?
ü用户需要存放到存储设备的文件,就是数据
数据有很多种类,日志、音频、视频、图片等,不同的文件大小是不同的。
ü存储设备为了存放用户文件而生成的数据记录,就是元数据
如果用户数据比喻成一本书,元数据就是这本书的目录。
分布式存储依照存放数据和元数据的方式不同,分为全对称和非对称模式。
全对称:所有的节点都会处理元数据,各个节点间实时同步元数据信息;
非对称:我有元数据节点,元数据节点单独处理元数据信息,所有信息必须通过元数据节点进行管理。
思考一个问题:当不同类型、不同大小的海量数据需要实时存储时,这两种架构会有怎样的情况发生?
û全对称:海量文件带来的海量元数据在各个节点间同步,带来了性能和带宽等瓶颈问题;
û非对称:元数据采用独立的节点,处理能力有限,不能很好的满足海量小文件的性能问题。
如何解决这种问题呢?我做了一个大胆的设想,提出一种新的逆向思维解决方式,我把它叫做集群元数据后处理架构。
通常情况下,海量数据的写入和读取是不需要高度同步的,不妨分开来考虑,首先,要解决混合数据流写入的性能问题,海量小文件的数据处理瓶颈主要集中在元数据上,能否跳过这个瓶颈写入数据呢?
首先,每个存储节点管理一个虚拟磁盘MD,虚拟磁盘MD由多个存储节点的磁盘块按照一定的规律组合而成,几个存储节点形成一个冗余群组,群组内部统一元数据信息,单个节点采用SSD加速缓存,并在自身的存储空间中,保留一份元数据备份。
其次,客户端进行数据写入时,不再经过集群元数据节点,而是直接采用轮询方式写入存储节点,存储节点负责客户端元数据的建立、存储和同步。
ü本地用户文件读取:客户端自身存放的文件,可以通过直接访问数据节点的方式,获取数据,避免元数据节点瓶颈和减轻元数据节点压力;
其他用户文件读取:通过元数据集群,获取目录信息后访问数据节点。
由
图示可以看到,元数据通过这种方式,进行统一模式的集中处理,并可以根据应用需求进行数据索引,提升访问效率。
总结:
我把这种模式称为:分布式存储 – 集群元数据分层处理架构
- 使用Hystrix提高系统可用性
- Spring Security笔记:解决CsrfFilter与Rest服务Post方式的矛盾
- GitHub新开放项目FoolNLTK:一个便捷的中文处理工具包
- hessian学习
- 制作WordPress侧边栏“博客统计”小工具并集成在主题中的方法
- Struts2、Spring MVC4 框架下的ajax统一异常处理
- 前11月网游收入1341亿元同比增超两成 你贡献了多少?
- struts2: config-browser-plugin 与 convention-plugin 学习
- 千万级规模高性能、高并发的网络架构经验分享
- UE4新手之编程指南
- redis 学习笔记(5)-Spring与Jedis的集成
- Linq to SQL 查询Tips
- SQLite 预写式日志
- java调用.net asmx / wcf
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Struts2第四天:Struts2的拦截器和标签库
- kubernete编排技术八:使用operator管理有状态应用
- Spring第一天:Spring的概述、SpringIOC入门(XML)、Spring的Bean管理、Spring属性注入
- Flink的处理背压原理及问题-面试必备
- Spring第二天:Spring的IOC的注解方式、Spring的AOP开发(XML)
- OpenCV还能实现这种效果? | 视频防抖技术
- 迁移到 Go Modules
- 使用docker 搭建redis的哨兵机制
- 使用docker 搭建redis的主从复制
- 使用Python判断文件下是否有空文件夹
- MySQL 设置用户可以远程连接
- MySQL关于character_set 设置为uft8问题
- nohup 退出终端不退出任务
- windows 下Redis开机自启动
- 机器学习基础:决策树的可视化