码迷,mamicode.com
首页 > 其他好文 > 详细

分布式文件系统

时间:2014-10-05 05:13:58      阅读:435      评论:0      收藏:0      [点我收藏+]

标签:计算机网络   资源   

分布式文件系统

一、基础原理

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,

而是通过计算机网络与节点相连。简单点说就是把数据分散存储到不同节点上的一种存储机制。

谈到分布式文件存储不得不和传统存储做一下对比

分布式系统的特点

1、很多组件:系统的各组件分布于网络上多个计算机上
2、消息传递:各组件彼此之间通过消息传递来通信并协调行动
3、客户端来看他是一台主机,其实是有多个节点组成
分布式的提出
分布式系统存在的意义
1、向上扩展性能越来越低(当单机性能扩展到一定程度上,用到实际生产环境的不同场景中他的生产率可能是不增反减;
单机的性能也不可能无限制的扩展;成本和产出上也不一定成正比)
2、单机扩展存在性能上升到临界点
3、出于稳定性及可用性考虑,单机会存在多方面问题
分布式存储的优点
适合大数据的存储,尤其是当今已经进入到大数据存储时代,数据海量,单机存储是存储不了的
能实现大数据的备份,更能实现当今网络生产环境的需要
分布式存储的难点
1、各节点cpu时钟频率可能不同,缺乏全局时钟
2、面对故障时的独立性(如何判定故障在哪里)
3、如何处理单点故障(双线机制解决)
4、事物处理(ACID):解决方法 2PC、BASE、CAP、Paxos
解决方法
2PC
TM---(prepare{ok}两次准备)---RM1、RM2
TM---(commit{ok}两次提交成功)---RM1、RM2
CAP
C:consistency一致性
A: availability 可用性
P: partition tolerance分布容错性
任何一种分布式系统最多只能同时满足上述三项中的两项,因此,分布式系统的目标
AP:放弃C:大多数分布式系统都选择此项
CA:#无法分布式,单机mysql
CP:实际生成环境较少使用
分布式系统的目标:加强A和P,在C上进行妥协
BASE模型
BA:Basically Availibale
S:Soft state :接受一段时间内的状态不同步
E:eventual consistency   最终一致性
集群内数据一致性算法实施过程案例:
Quorum, Vector Clock
Quorum:
N: 数据复制的节点量
R:成功读操作所依赖的最少节点数
W:成功写操作所依赖的最少节点数
W+R>N: 强一致性;
假设,W=N,R=1,
W+R<=N: 可以保证最终一致性
mysql主从复制: 弱一致性
拆分
#读一个节点读
#写全部节点写
paxos协议的使用有一个前提:不存在拜占庭将军问题
通信网络不靠谱,无法完成可靠地消息传输

二、几款开源分布式软件的介绍

常见的分布式文件系统

ClusterFS:适用于存储少量大文件
流媒体文件、云环境(用友在使用)
MogileFS(元数据放在数据库中{使用mysql存储元数据}):传统的话放在内存中
适用于海量小文件的
fastDFS:元数据放在内存中
MooseFS:也是适合存储小文件,接受用户较多
Ceph:内核级别,支持PB级别存储的分布式文件系统
HDFS:lucene(人名);MapReduce + HDFS = Hadoop (平台提供接口,需要java程序员来编写程序调用):
大量数据的发现,不支持随机存取;HBase(nosql)
GFS:Google FS(分布式存储论文),MapReduce(并行处理论文),Bigtable
TFS:(淘宝)(nosql)适用于存储海量小文件
{tair:缓存存储}
Lustre: Oracle的开源的分布式文件
TFS 、 MogileFS 、 HDFS
MogileFS
开源的分布式存储,由livejournal旗下的Danga interactive
memcached、MogileFS、Perlbal
MogileFS特性
1、用户空间文件系统:无须特殊的核心组件
2、无单点失败
MogileFS的组件
Mysql节点:用于为tracker存储元数据信息:mogileFS
1、用户空间文件系统:无须特殊的核心组件
2、无单点失败
3、自动文件复制
4、比“RAID”好多了(文件实现了备份)
5、传输中立,无特殊协议(http、nfs)
6、命名空间较简单:每个文件对应一个key,用于domain定义名称空间
7、不依赖于任何共享存储设备

三、分布式文件系统的工作原理

第1个部分:是server端,包括mogilefsd和mogstored两个程序。前者即是mogilefsd的tracker,它将一些全局
信息保存在数据库里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,
默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到
mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。      第2个部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。       第3个部分:是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的
备份管理功能,提供MogileFS.pm。
   当下互联网飞速发展,海量并发所产生的数据量以几何方式增长,随着信息链接方式日益多样化,数据存储的结构
也发生了变化,在这样的压力下我们不得不重新审视大量数据的存储所带来了巨大的挑战:      1、数据采集:对于社交网站一般都是由用户上传的;       2、数据存储:现在是数据量大爆炸时代,每天都会产生大量的数据,所以数据存储就成了一个大问题;       3、数据搜索:如果说存储是考验数据的存储能力的话,那搜索就是考量计算机能力了,从大量的数据中搜索出来;       4、数据共享:数据存储下来之后还要进行数据的共享问题,大量的数据该怎么共享这些数据呢;       5、数据传输:而海量数据存储下来之后数据怎么用户与用户之间进行安全的传输;       6、数据分析:数据的分析是了解我们过去的一些行为规范;       7、数据可视化:而海量数据存储下来之后怎么样可以直观的展示在人们面前呢;
Tracker:跟踪器:能够知道数据存储在哪里,那些磁盘可以存储,那些磁盘不可以存储要去查询mysql
Storage node:存储节点:真正存储数据的节点
Mysql:元数据存储节点:保存元数据信息

Mogilefs的工作原理图

bubuko.com,布布扣

   首先client需要上传数据时,他要先联系tracker知道哪里可以存储数据,tracker要去mysql查找获取元数据,

并把存储元数据信息取回到tracker再返回给客户端,客户端知道去哪里存储数据了,就直接去storage node上数据啦。

bubuko.com,布布扣

实验

Node1 centos6.5 172.16.11.143下面的包

Node2 centos6.5 172.16.11.144 下面的包

Node3 centos6.5 172.16.11.145 下面的包+mysql

1、安装软件包

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
安装软件包注意可能会有依赖关系所有配置好yum源很重要,这里我是指向外网的yum源头
我指了一个163的源,它没有perl-IO-AIO只好多指几个yum源头
注意指yum源要能上网,上网出了配置好正确的ip地址,还有指定正确的网关和能正确的解析你自己的ip地址
1、route add default gw xxxxxxx
2、Vim /etc/resove.conf #指定局域网的网关

至于怎么指向yum源头就不多说啦

Yum install *.rpm perl-IO-AIO -y

bubuko.com,布布扣

2、node3 上授权mysql用户

mysql> grant all on mogilefs.* to ‘moguser‘@‘172.16.%.%‘ identified by ‘mogpass‘;
Query OK, 0 rows affected (0.01 sec)
mysql> grant all on mogilefs.* to ‘root‘@‘172.16.%.%‘ identified by ‘mogpass‘;
Query OK, 0 rows affected (0.00 sec)
mysql> create database mogilefs;
Query OK, 1 row affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
3、初始化mogilefs
Mogilefs --help可以获取帮助
[root@localhost ~]# mogdbsetup --dbhost=172.16.11.145 --dbname=mogilefs --dbrootpass=
mogpass --dbuser=moguser --dbpass=mogpass --dbrootuser=root
This will attempt to setup or upgrade your MogileFS database.
It won‘t destroy existing data.
Run with --help for more information.  Run with --yes to shut up these prompts.
Continue? [N/y]: y
4、编辑配置文件
[root@localhost ~]# vim /etc/mogilefs/mogilefsd.conf
# Enable daemon mode to work in background and use syslog
daemonize = 1
# 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=172.16.11.145 #指定mysql地址
db_user = moguser #登录用户
db_pass = mogpass #用户密码
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001 #监听地址
# Optional, if you don‘t define the port above.
conf_port = 7001
# Number of query workers to start by default.
query_jobs = 20
# Number of delete workers to start by default.
delete_jobs = 1
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don‘t usually need to increase this)
reaper_jobs = 1
[root@localhost ~]# service mogilefsd restart
[root@localhost ~]# ss -tnl
LISTEN      0      128                              *:7001                            *:*  
Node2
scp /etc/mogilefs/mogilefsd.conf 172.16.11.144://etc/mogilefs/mogilefsd.conf
[root@localhost ~]# service mogilefsd restart
[root@localhost ~]# ss -tnl
LISTEN      0      128                              *:7001                            *:*  
Node3
scp /etc/mogilefs/mogilefsd.conf 172.16.11.145://etc/mogilefs/mogilefsd.conf
[root@localhost ~]# service mogilefsd restart
[root@localhost ~]# ss -tnl
LISTEN      0      128                              *:7001                            *:*  
本地安装了mysql 如果修改了hosts文件可能会解析不成功所有
要登录到服务器授权自己
mysql> grant all on mogilefs.* to ‘moguser‘@‘node3‘ identified by ‘mogpass‘;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
每台主机上都要分配,并修改权限注意目录
划分磁盘分区给mogilefs
Mkdir -pv /mogdata/data/dev1
Chown -R mogilefs.mogilefs /mogdata/data
修改存储目录
vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogdata/data #主要是修改存储目录
Scp /etc/mogilefs/mogstored.conf  172.16.11.144:/etc/mogilefs/mogstored.conf
节点三也是
每个节点启动 mogstored
service mogstored restart
[root@localhost data]# ss -tnl
State      Recv-Q Send-Q                       Local Address:Port                         Peer Address:Port
LISTEN     0      128                                      *:7500                                    *:* 
5、添加存储磁盘
[root@localhost data]# mogadm --trackers=172.16.11.145:7001 host add node1 --ip=172.16.11.143 --status=alive
[root@localhost data]# mogadm --trackers=172.16.11.145:7001 host add node2 --ip=172.16.11.144 --status=alive
[root@localhost data]# mogadm --trackers=172.16.11.145:7001 host add node3 --ip=172.16.11.145 --status=alive
[root@localhost data]# mogadm --trackers=172.16.11.145:7001 host list
node1 [1]: alive
  IP:       172.16.11.143:7500
node2 [2]: alive
  IP:       172.16.11.144:7500
node3 [3]: alive
  IP:       172.16.11.145:7500
[root@localhost data]# mogadm --trackers=172.16.11.143:7001,172.16.11.144:7001,172.16.11.145:7001 check
[root@localhost data]# mogadm --trackers=172.16.11.143:7001,172.16.11.144:7001,172.16.11.145:7001 device list
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 device add node1 1
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 device add node2 2
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 device add node3 3
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 device list
node1 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      1.031     17.654     18.686        100
   node2 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   Dev2:   alive     0.643     18.043     18.686        100
node3 [3]: alive
                    used(G)    free(G)   total(G)  weight(%)
   Dev3:   alive      0.643     18.043     18.686        100
6、添加domain
Domain定义名称空间
不同的domain内,其key可以相同
同一个domain内,其key不能相同
Class:复制单元
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 domain add html
Files  images 等
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 domain list
添加class
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 class add files cls3
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 class list
删除class
[root@localhost data]# mogadm --trackers=172.16.11.145:7001,172.16.11.144:7001,172.16.11.143:7001 class delete files cls23
上传文件
[root@localhost data]# mogupload --trackers=172.16.11.143:7001 --domain=files --key=‘/fstab.html‘ --file=‘/etc/fstab‘
查看文件
[root@localhost data]# mogfileinfo --trackers=172.16.11.145:7001 --domain=files --key=‘/fstab.html‘
- file: /fstab.html
     class:              default
  devcount:                    2
    domain:                files
       fid:                   15
       key:          /fstab.html
    length:                  963
- http://172.16.11.143:7500/dev1/0/000/000/0000000015.fid
- http://172.16.11.145:7500/dev6/0/000/000/0000000015.fid


也可以下载

用fetch

7、扩展

在node1上
yum install httpd php php-devel
vim /var/www/html/index.php
<?php
phpinfo();
?>
安装软件
mogilefs-0.9.2.tgz
注意要安装开发环境
Tar xf mogilefs-0.9.2.tgz
Cd mogilefs-0.9.2.tgz
Phpize
./configure --with-php-config=/usr/bin/php-config #注意编译安装的php要指定具体的路径
configure: error: Cannot find libneon  #解决依赖关系
yum install neon-devel -y
为php添加模块
ls /usr/lib64/php/modules/
Vim /etc/php.ini
; extension_dir = "./"
extension = mogilefs.so #加入模块
测试页面查看是否具有mogilefs

http://172.16.11.143 #查看是否载入模块

bubuko.com,布布扣

Vim /var/www/html/test.php
<?php
$mg = new MogileFs();
$mg->connect(‘172.16.11.145‘, 7001, ‘files‘);
$mg->put(‘/etc/issue‘, ‘/issue.html‘, ‘cls1‘);
$paths = $mg->getPaths(‘/issue.html‘);
var_dump($paths);
$mg->close();
?>
测试
http://172.16.11.145
[root@localhost html]# moglistkeys --trackers=172.16.11.145:7001 --domain=files
/fstab.html
/issue.htm #上传
<?php
$mg = new MogileFs();
$mg->connect(‘172.16.11.145‘, 7001, ‘files‘);
$mg->put(‘/etc/inittab‘, ‘/inittab.html‘, ‘cls3‘);
$myfile = $mg->getPaths(‘/inittab.html‘);
var_dump($myfile);
$mg->close();
?>
mogfileinfo --trackers=172.16.11.144:7001 --domain=files --key=‘/inittab.html‘
http://172.16.11.145:7500/dev6/0/000/000/0000000019.fid #网页测试

8、ngnix反代tracker

分布式文件系统

标签:计算机网络   资源   

原文地址:http://1983939925.blog.51cto.com/8400375/1560626

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!