分布式文件系统
一、基础原理
分布式文件系统(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的工作原理图
首先client需要上传数据时,他要先联系tracker知道哪里可以存储数据,tracker要去mysql查找获取元数据,
并把存储元数据信息取回到tracker再返回给客户端,客户端知道去哪里存储数据了,就直接去storage node上数据啦。
实验
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
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 #查看是否载入模块
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