数据类型:
结构化数据:结构化数据即行数据,存储在数据库里,可以用二维表结构来逻辑表达实现的数据
非结构化数据:包括所有的办公文档、文本、图片、xml、html、各类报表、图像和音频视频信息等等,相对于结构化数据而言,不方便用逻辑表来表现的数据;非结构化数据库是指其字段长度可变,并且每个字段的记录又可以由可重复或不可重复的子字段构成的数据库,用它不仅可以处理结构化数据而且更适合处理非结构化数据;
半结构化数据:所谓半结构化数据,就是介于完全结构化数据(如关系型数据库、面向对象数据库中的数据)和完全无结构的数据之间的数据,HTML文档就属于半结构化数据。它一般是自描述的,数据的结构和内容混在一起,没有明显的区分。
数据模型:
结构化数据:二维表(关系型)
半结构化数据:树、图
非结构化数据:无
RMDBS的数据模型有:网状数据模型、层次数据模型、关系型
Nosql非关系数据库(memcached,redis,mangodb)
CAP理论:
C(一致性):所有的节点上的数据时刻保持同步;
A(可用性):每个请求都能接受到一个响应,无论响应成功或失败;
P(分区容忍):系统应该能持续提供服务,即使系统内部有消息丢失(分区);
高可用、数据一致是很多系统设计的目标,但是分区又是不可避免的事情;一般情况下,只能实现其中的两种;
大数据存储:
传统存储问题:
纵向扩展受阵列空间限制;
横向扩展受交换设备限制;
节点受文件系统限制;
分布式存储的概念:
与目前常见的集中式存储技术不同,分布式存储技术并不是将数据存储在某个或多个特定的节点上,而是通过网络使用企业中每台机器上的磁盘空间,并将这些分散的存储资源构成一个虚拟的存储设备,数据分散的存储在企业的各个角落。
分布式存储的特性:
可扩展;
可靠性;
低成本;
易用;
分布式存储的机制分类:
通用分布式存储:
分布式存储(不支持挂载,不支持复杂的文件系统机制,不支持权限模型),mofilefs,fastdfs;
专用分布式存储:
分布式文件系统(支持挂载),moosefs,…
分布式存储的挑战
节点间通信;
数据存储;
数据空间平衡;
容错;
文件系统支持;
分布式存储的核心点:
元数据存储(高效)
数据存储(冗余)
Mofilefs:
Mofilefs是一个开源的分布式文件存储系统,由liveJournal旗下的Danfa Inreractive公司开发。Danfa团队开发了包括Memcached、Mofilefs、perlbal等多个知名的开源项目。
Mofilefs由3个部分组成:
1) Server:主要包括mofilefsd和mogstored两个应用程序。Mofilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;mogstored是存储节点(store node),它其实是个webDAV服务,默认监听在7500端口,接收客户端的文件存储请求。在mofileFS安装完后,要运行mofadm工具将所有的store node注册到mofilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
2) Utils(工具集):主要是mofileFS的一些管理工具,例如mogadm等。
3) 客户端API:MofileFS的客户端API很多,例如Perl、php、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。
Mogilefs的特性:
应用层:运行于用户空间,无须特殊的核心组件;
无单点:
Mogstored:存储多个数据副本;
Tracker:多节点;
Database:mysql(存放元数据);
自动文件复制;
传输中立,无特殊协议,可通过NFS或HTTP进行通信;
简单的名称空间;
不用共享任何数据
不需要RAID
Mogilefs的实现机制和工作原理:
实现机制:
在该文件系统集群中,每个数据块都会有多个副本,存放于多个storage node上,不同的文件系统副本的数量各不相同(一般建议为3份),在tracker node上会分别单独记录每一个数据块的存储位置(位于哪一个storage及路径)。若某个storage节点不在线了,客户端向tracker节点请求获取数据时,tracker节点会返回用于冗余的副本的存储位置给客户端。这样就保证了整个文件系统中数据的高可用性。当有数据存储至某一storage节点后,各storage节点会根据tracker的指示通过节点间通信将副本发送至其它节点上。若某一storage下线了。该节点上的副本会由其他节点重新提供,保证副本的个数不少于指定的值。
工作原理:
客户端存取数据时,首先与tracker进行交互,tracker通过查询数据库来获取客户端存取数据时所需要访问的元数据,然后返回给客户端,客户端利用tracker返回的结果,与storage nodes节点进行交互完成数据存取。
Mogilefs中的术语:
Tracker:借助于数据库保存各个节点文件的元数据信息,便于检索定位数据位置并监控各个节点,告知客户端存储区的位置并指挥storage节点复制数据副本,进程为mogilefsd;
Databases:为tracker节点存储节点文件的元数据信息;
Storage:将指定域中的键转换为特有的文件名存储于在特定的设备文件中,转换后文件名为值,storage自动维护键值之间的对应关系,storage节点使用http进行数据传输,依赖于perbal,进程mogstored,perbal;
Domain:一个域中的键值是唯一的,一个mogilefs可以有多个域来存储不同类型的文件,同一个domain内key必须唯一,不同的domain内的key可以相同;
Class:一个域中的键值是唯一的,一个mogilefs可以有多个域来存储不同类型的文件,同一个domain内key必须唯一,不同的domain内key可以相同,
Device:一个存储节点,可以有多个device,就是用来存放文件的目录,每个设备都有一个设备id,需要在mogstored配置文件中docroot配置,设备不能删除,只能将设备的状态设置为dead,置为dead之后数据就无法恢复了,并且设备id也无法再使用;
Mogilefs安装和配置:
实验环境:
Node1:192.168.19.134,tracker,mogstore,mysql;
Node2:192.168.19.143,tracker,mogstore;
1. 在node1节点下载安装相关rpm包并安装;
2. 在node1节点上安装mysql,创建数据库,并授权用户;
3. 初始化数据库;
查看数据库;
4. 配置tracker节点;
1) 编辑/etc/mogilefs/mogilefsd.conf配置文件;
2) 查看程序程序生成的文件;
3) 确保pid文件属主属组;
4) 启动服务;
5) 查看端口;
5. 配置mogstore;
1) 编辑配置文件;
2) 创建相关文件;
3) 查看端口,发现服务没有起来;
4) 需要安装perl-IO-AIO;
5) 再次启动服务,查看端口,发现可以启动了。
以上内容都在node1节点上进行;
6. 在node2节点上安装mogstore;
1) 在node2节点上同样安装如上的包;
注意:不能忘记装perl-IO-AIO;
2) 编辑配置文件;
3) 创建相关目录;
4) 启动服务,并查看端口;
7. 在ndoe1节点上测试;
1) 查看mogadm用法;
2) 添加主机;
查看添加的主机;
3) 添加存储节点device;
查看添加的节点;
4) 添加domain或者类class;
Note:
Mindevcount:默认最小设备数为2,即默认创建两个副本;
Replpolicy:复制策略为多主机复制;
Hashtype:哈希类型,None表示不自定义,使用默认值;
查看类;
5) 查看检测状态;
6) 用mogupload上传文件;
列出文件:
7) 使用mogfileinfo查看文件信息,并通过url访问其资源;
通过url访问:
8) 使用mogstats指明连接的数据库,查看状态:
8. 我们再次配置node2节点为tracker;
1) 编辑配置文件:
2) 在node1节点上授权node2节点登录mysql;
3) 确认pid文件权限,启动服务查看端口;
演示2:基于以上实验环境,实现nginx反代mogilefs及负载均衡;
实验环境:nginx服务器:192.168.19.141,其它和上面演示一样;
要想实现nginx代理trackers,需要在编译ngixn的时候加入第三方模块nginx_mogilefs_module
1. 准备程序源码包;
2. 准备开发环境,并解决依赖关系;
#yum groupinstall "Development Tools" "Server Platfrom Development" –y
#yum install pcre-devel openssl-devel zlib-devel –y
3. 编辑安装nginx,将nginx_mogilefs_module模块编译到nginx中;
1) 创建用户和组;
2) 编译安装;
# make && make install
出现了如下错误:
找到nginx目录中/objs/Makefile文件,找到-Werror字段,去掉-Werror,重新编译,即可解决;
3) 提供环境变量,并测试nginx启动;
4) 分别在两个trackers节点上传文件;
Node1:
Node2:
5) 编辑nginx配置文件,使nginx可以支持mogilefs,在server中添加location向后端代理;
启动服务:
6) 测试;
7) 配置upstream,开启负载均衡;
8) 重新测试(模拟mogilefsd故障,killall mogilefsd)