分布式存储之MogileFS分布式文件系统简单应用
一、分布式存储原理:
分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
1.分布式文件系统的特点:
• 节点间能相互通信
• 同一数据存储在多个节点上
• 数据空间平衡
• 具有容错能力
• 文件系统的支持
2.分布式文件系统设计目标:
• 访问透明
• 位置透明
• 并发透明
• 失效透明
• 硬件透明
• 可扩展性
• 复制透明
• 迁移透明
3.分布式系统的难点:
• 缺乏全局时钟
• 面对故障的独立性
• 处理单点故障
冗余
降低单点故障的影响
• 事务类的挑战
ACID
2pc(两段式提交)、最终一致、BASE、CAP、Paxos
事务要具有ACID. 但是这在分布式系统中很难实现:
A: Atomicity 原子性
C: Consistency 一致性
I: Isolation 隔离性
D: Durability 持久性
很多数据库都能实现单机事务, 但是一旦构建为分布式系统, 单机的ACID就不能实现了, 有两种选择, 1、放弃事务 2、引入分布式事务;
两段式提交:
事务管理器提交不止一个数据,第一阶段准备,第二阶段提交,如果出现错误,第二阶段回滚
CAP理论:
C:Consistency(一致性) 所有主机的数据都是同步的。
A:Availability(可用性) 能够保证系统的可用性(有主机宕机不影响用户)。
P: Partition Tolerance ( 分区容错性 ) 即使网络出现故障从而分区, 不影响系统运行。
有科学家都在致力于 CAP 三元素并存的时候,Eric.Brewer教授指出 CAP 永远无法兼顾,只能根据具体应用来权衡和取舍,并且至多两个元素可以共存,后来由两位麻省理工学院的科学家证明此观点是具有前瞻性的,由此形成Brewer的 CAP定理 。
正所 谓鱼和熊掌不可兼得 ,关注一致性就需要处理因系统不可用而带来写操作失败的情况,反之关注可用性就无法保证每次都能读取到最新的写入操作。传统 关系型数据库 侧重于 CA ,而 非关系型键值数据库 则侧重于 AP 。
强一致性(ACID) : 在单机环境中,强一致性可以由数据库的事务来保证;在分布式环境中,强一致性很难做到,即便是做到也会因为分布式事物所带来的性能低下,不适合在互联网的环境中应用。
弱一致性(包括最终一致性) : 系统不能保证后续访问返回最新的值,在访问到最新值之前这段时间称之为 不一致窗口 。
最终一致性 :是弱一致性的一种特例,存储系统保证如果对象有多次更新,在渡过 不一致窗口 之后必将放回最后更新的值。
服务器的一致性 : N 代表节点的个数; W 代表更新的时候需要确认已经被更新的节点个数; R 代表读取数据需要的节点数量。
W + R > N —-> 强一致性(通常N=3,W=R=2)
W=N,R=1 —-> 最佳读
W=1,R=N —-> 最佳写
W + R <= N —-> 弱一致性
BASE: 可替代ACID;
BA: Basically Availibale 基本可用性
S: Soft state 接受一段时间的状态不能同步
E: Eventually Consistent 最终一致性
相比于ACID而言, BASE并没有那么苛刻, BASE允许部分的失败但是不会引起系统的故障
DNS就是最著名的Eventually Consistent的实现
分布式存储或分布式文件系统
集中式:
共享存储:
NAS
SAN
分布式存储:
专用的元数据节点:集中元数据存储,数据节点至负责存储数据
无专用元数据几点:所有数据均完整存储元数据,存储了部分数据
分布式:
文件系统:有文件系统接口:一般挂载使用
存储:无文件系统接口,通过API访问
常见的分布式文件系统:
GFS:Google File System GFS擅长处理单个大文件 。
HDFS:Hadoop Distributed File System 根据GFS思想开发的,擅长处理单个大文件 ,使用场景,数据不太多的大文件。
将元数据存储于关系型数据库或其他高性能存储中,从而能维护海量文件元数据。
GlusterFS:去中心化设计:擅长处理单个大文件
ceph:整合到linux内核实现的文件系统,已经被收录在内核,是一个 Linux PB级别的分布式文件系统。
MogilesFS:MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群
TFS:Taobao File System 淘宝开源的文件系统,擅长处理海量小文件,适用于大规模场景。
fastdfs:国产的分布式文件系统,基于mogliefs的实现理论而使用c/c++语言开发的。
MogileFS实现原理:
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的DangaInteractive公司开发。Danga团队开发了包括Memcached、MogileFS、Perlbal等多个知名的开源项目。目前使用MogileFS的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。
MogileFS的特性:
1.应用层提供服务,不需要使用核心组件
2.无单点(tracker(跟踪点)mogstore(存储节点)database(MySQL))
3.自动文件复制:复制的最小单位不是文件,而是class
4.传输中立:无特殊协议,可以通过NFS或HTTP实现通信
5.简单的命名空间:没有目录,直接存在存储空间上,通过域来实现,每个文件对应一个key
6.不共享任何数据:
Tracker:
MogileFS的核心,是一个调度器,服务进程为mogilefsd,职责:删除数据、复制数据、监控、查询等。可以使用简单的负载均衡,可以使用Haproxy,lvs,nginx等,监听端口7001
Dtabase:
用于为tracker存储元数据信息。
mogstore:
数据存储的位置,通常是一个HTTP(webDAV)服务器,用来做数据的创建(put)、删除(delete)、获取(get),监听端口7500, storage节点使用http进行数据传输, 依赖于perbal, 进程为mogstored。
MogileFS工作流程图:
存储主机(节点)
这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器.
设备(device)
一个存储节点,以就是上面的主机,可以有多个 device, 就是用来存放文件的目录(比较挂载的目录),每个设备都有一个设备 id,需要在 mogstored 的配置文件中的 docroot 配置的项目 指定的目录下面创建相应的设备的目录,目录名为 $docroot/dev$id,设备是不能删除的.只能将其设备的状态的值置为dead,当一个设备 dead 之后,就真的 dead了,里面的数据也无法恢复了,且这个dead了的设备的 id 也不能再用.
域(domain)
在一个 MogileFS 中,可以有多个域,用来存放不同的文件,比如,不同大小的文件,不同类型的文件.在上图中所有 alive 的"设备"是一个大的整体,形成一个统一的存储空间,里面的数据可以根据 "域" domain 和类 class 来分类管理,属于同一个 domain,即使是属于不同的class,文件的key也必须是唯一的.不同域的 key 才能重复
类(class)
复制文件的最小单位 (最大为64M,如果一个单文件超出此大小将拆分为多个class存储)。在一个域中,可以有多个类,主要是用来控制复制单元的,类是用来做属性管理的,类是比域 domain 低一个级别,可以定义一个文件存储在不同 device 中的份数.一个文件必须通过 domain,class 和 key 才能找出来.我们可以给不同的重要程度的文件,不同热度的文件,来分别用类来控制份数.
mindevcount:最小复制文件的份数
MogileFS安装及基础配置:
实验环境:
host1.daixiang.com 192.168.80.129 tracker,database
mogstore1.daixiang.com 192.168.80.132 mogstored
mogstore2.daixiang.com 192.168.80.133 mogstored
mogstore3.daixiang.com 192.168.80.134 mogstored
rpm包下载地址:http://pan.baidu.com/s/1c1S0dJM
在tracker+database节点上进行如下操作:
[root@host1 ~]# yum install MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm -y
[root@host1 ~]# yum install -y perl-IO-AIO
[root@host1 ~]# yum install -y mysql-server mysql
[root@host1 ~]# scp *.rpm 192.168.80.132:/root/
[root@host1 ~]# scp *.rpm 192.168.80.133:/root/
配置数据库,给用户授权:
[root@host1 ~]# service mysqld start mysql> grant all on *.* to 'root'@'192.168.80.%' identified by 'passwd';
mysql> grant all on mogilefs.* to 'mogilefs'@'192.168.80.%' identified by 'passwd';
mysql> flush privileges;
注意:在centos6.7上,yum安装的mysql-server需要在my.cnf配置文件中需要添加“skip-name-resolve”,不实用dns解析反解,即只能使用ip地址授权。否则生成mogilefs库时会出现错误。
生成mogilefs库:
[root@host1 ~]# mogdbsetup --dbhost=192.168.80.129 --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbrootpass=passwd --dbuser=mogilefs --dbpass=passwd --yes mysql> use mogilefs
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A Database changed
mysql> show tables;
+----------------------+
| Tables_in_mogilefs |
+----------------------+
| checksum |
| class |
| device |
| domain |
| file |
| file_on |
| file_on_corrupt |
| file_to_delete |
| file_to_delete2 |
| file_to_delete_later |
| file_to_queue |
| file_to_replicate |
| fsck_log |
| host |
| server_settings |
| tempfile |
| unreachable_fids |
+----------------------+
17 rows in set (0.00 sec)
修改mogilefsd的配置文件:
[root@host1 ~]# vim /etc/mogilefs/mogilefsd.conf
daemonize =
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.80.129
db_user = mogilefs
db_pass = passwd
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:
# Optional, if you don't define the port above.
conf_port =
[root@host1 ~]# service mogilefsd start
在tracker上添加被管理的mogstore节点:
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 host add mogstore1 --ip=192.168.80.132 --status=alive
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 host add mogstore2 --ip=192.168.80.133 --status=alive
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 host add mogstore3 --ip=192.168.80.134 --status=alive
配置mogstore节点:
在每个mogstore节点上安装所需rpm包:
[root@mogstore1 ~]# yum install MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm -y
[root@mogstore1 ~]# yum install perl-IO-AIO -y [root@mogstore2 ~]# yum install MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm -y
[root@mogstore2 ~]# yum install perl-IO-AIO -y [root@mogstore3 ~]# yum install MogileFS-Server-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm -y
[root@mogstore3 ~]# yum install perl-IO-AIO -y
对每个mogstore节点进行如下配置:
[root@mogstore1 ~]# vim /etc/mogilefs/mogstored.conf maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogdata [root@mogstore1 ~]# mkdir -pv /dfs/mogdata/dev1
[root@mogstore1 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/
[root@mogstore1 ~]# service mogstored start
[root@mogstore2 ~]# vim /etc/mogilefs/mogstored.conf maxconns =
httplisten = 0.0.0.0:
mgmtlisten = 0.0.0.0:
docroot = /dfs/mogdata [root@mogstore2 ~]# mkdir -pv /dfs/mogdata/dev2
[root@mogstore2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/
[root@mogstore2 ~]# service mogstored start
[root@mogstore3 ~]# vim /etc/mogilefs/mogstored.conf maxconns =
httplisten = 0.0.0.0:
mgmtlisten = 0.0.0.0:
docroot = /dfs/mogdata [root@mogstore3 ~]# mkdir -pv /dfs/mogdata/dev3
[root@mogstore3 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/
[root@mogstore3 ~]# service mogstored start
在tracker节点上添加设备:
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 device add mogstore1 001
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 device add mogstore2 002
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 device add mogstore3 003
对添加的设备进行验证:
[root@host1 ~]# mogadm check
Checking trackers...
127.0.0.1: ... OK Checking hosts...
[ ] mogstore1 ... OK
[ ] mogstore2 ... OK
[ ] mogstore3 ... OK Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ ] dev1 16.509 3.898 12.611 23.61% writeable 0.0
[ ] dev2 16.509 3.897 12.612 23.61% writeable 0.0
[ ] dev3 16.509 3.897 12.612 23.61% writeable 0.0
---- ------------ ---------- ---------- ---------- ------
total: 49.527 11.692 37.835 23.61%
在tracker节点上创建两个域:
[root@host1 ~]# mogadm domain add images
[root@host1 ~]# mogadm domain add files
[root@host1 ~]# mogadm domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files default MultipleHosts() NONE images default MultipleHosts() NON
在域中创建类:
[root@host1 ~]# mogadm class add files class1 --mindevcount=3
[root@host1 ~]# mogadm class add files class2 --mindevcount=2
[root@host1 ~]# mogadm class add images class3 --mindevcount=2
[root@host1 ~]# mogadm class list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
files class1 MultipleHosts() NONE
files class2 MultipleHosts() NONE
files default MultipleHosts() NONE images class3 MultipleHosts() NONE
images default MultipleHosts() NONE
上传文件:
[root@host1 ~]# mogupload --trackers=192.168.80.129:7001 --domain=files --key='/fstab.html' --file='/etc/fstab'
[root@host1 ~]# mogupload --trackers=192.168.80.129:7001 --domain=images --key='/1.jpg' --file='/root/mogilefs2.jpg'
查看域中的 某个域中的key对应的文件:
[root@host1 ~]# moglistkeys --trackers=192.168.80.129:7001 --domain=images
[root@host1 ~]# mogfileinfo --trackers=192.168.80.129:7001 --domain=images --key='/1.jpg'
- file: /1.jpg
class: default
devcount: 2
domain: images
fid: 8
key: /1.jpg
length: 39704
- http://192.168.80.133:7500/dev2/0/000/000/0000000008.fid
- http://192.168.80.132:7500/dev1/0/000/000/0000000008.fid
访问效果图:
扩展管理工具命令:
[root@host1 ~]# mogdelete --trackers=192.168.80.129:7001 --domain=files --key='/1.jpg' #删除files域中key值为'/1.jpg'对应的文件
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 host mark mogstore1 down #让mogstore2主机离线
[root@host1 ~]# mogadm --trackers=192.168.80.129:7001 host mark mogstore1 alive #让mogstore2主机上线
作者是菜鸟一只,请大家多多指点,如有错误请指出,我会在第一时间更正,谢谢!!
分布式存储之MogileFS分布式文件系统简单应用的更多相关文章
- 构建Mogilefs分布式文件系统(配置篇)
构建Mogilefs分布式文件系统: 当下互联网飞速发展,海量并发所产生的数据量以几何方式增长,随着信息链接方式日益多样化,数据存储的结构也发生了变化,在这样的压力下我们不得不重新审视大量数据的存储 ...
- 简单搭建FastDFS分布式文件系统(简单易懂)
一.什么是FastDFS FastDFS一个开源的轻量级分布式文件系统,它对文件进行管理,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,功能包括:文件存储.文件同步.文件访 ...
- 分布式存储之MogileFS基于Nginx实现负载均衡(Nginx+MogileFS)
MogileFS分布式文件系统特点: 1.具有raid的性能 2.不存在单点故障 3.简单的命名空间: 每个文件对应一个key:用于domain定义名称空间 4.不共享任何数据 5.传输中立,无特殊协 ...
- 分布式文件系统之MogileFS工作原理及实现过程
MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上.MogileFS由3个部分组成: 第1个部分:是server端,包 ...
- centos 6.5环境下分布式文件系统MogileFS工作原理及分布式部署实现过程
MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上 MogileFS由3个部分组成: 第1个部分:是server端, ...
- 分布式文件系统 ~MogileFS~
一.分布式文件系统 分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连,也就是集群文件系统,可以支持 ...
- MogileFS 的介绍(MogileFS 系列1)[分布式文件系统]
MogileFS 是一个开源的分布式文件系统,用于组建分布式文件集群,由 LiveJournal 旗下 Danga Interactive 公司开发,Danga 团队开发了包括 Memcached.M ...
- 分布式文件系统 - FastDFS 简单了解一下
别问我在哪里 也许我早已不是我自己,别问我在哪里,我一直在这里. 突然不知道说些什么了... 初识 FastDFS 记得那是我刚毕业后进入的第一家公司,一个技术小白进入到当时的项目组后,在开发中上传用 ...
- Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!
转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop ...
随机推荐
- 超全面的JavaWeb笔记day21<过滤器>
1.过滤器的原理 2.实现过滤器 写一个类实现javax.servlet.Filter接口 在web.xml中对Filter进行配置 3.Filter接口 void init(FilterConfig ...
- Java精选笔记_Java编程基础
Java的基本语法 Java代码的基本格式 修饰符 class 类名 { 程序代码 } 一个Java源文件只定义一个类,不同的类使用不同的源文件定义:将每个源文件中单独定义的类都定义成public ...
- MVC源码
http://aspnetwebstack.codeplex.com/ MVC源码
- Android的读写文件及权限设置
drwx read write excute openFileOutput(name,drwx); 用系统api读取文件 设置文件生成的权限: public static boolean sav ...
- Chosen
前言: 想要达到下拉框有多选的情况. 过程: 1.因为本次工作项目使用的是surperUI,而它则是基于bootstrap框架搭建而成的.于是自然而然的就想到了使用bootstrap中的select插 ...
- PyQt4网格布局
最通用的布局类别是网格布局(QGridLayout).该布局方式将窗口空间划分为许多行和列.要创建该布局方式,我们需要使用QGridLayout类. #!/usr/bin/python # -*- c ...
- zookeeper-端口说明
一.zookeeper有三个端口(可以修改) 1.2181 2.3888 3.2888 二.3个端口的作用 1.2181:对cline端提供服务 2.3888:选举leader使用 3.2888:集群 ...
- GROW
经理今天介绍了一下,GROW,就给他放上来了: 有一个辅导的方法 叫做 GROW (G:goal:R:reality:O:option:W:will)这个辅导方法是这样的,客观地给自己或者别人提问 ...
- 在fedora 18中将普通用户设置为sudo权限
将一般的用户加入sudo组is not in the sudoers file. This incident will be reported 解决方法 在一般用户下执行sudo命令提示xxx is ...
- 设计模式之装饰模式(Java实现)
“怎么了,鱼哥?” “唉,别提了,网购了一件衣服,结果发现和商家描述的差太多了,有色差就算了,质量还不好,质量不好就算了,竟然大小也不行,说好的3个X,邮的却是一个X的,不说了,退货去.你先开讲吧,你 ...