Web 2.0 时代的到来,使得单个计算机节点远远无法满足用户对海量数据和应用程序运行空间的需求。个人和企业都有安全而持久的存储信息的需求,备份成为最通俗的手段存储需要保持实时读写,提供复杂的查询功能,缺乏容灾和备份能力,大量无结构的数据的存储和处理,对传统的存储方式提出挑战,这个时候,分布式存储,应运而生,就是将数据信息分散存储,在网络发达的现代,这种存储利用多台存储服务器,部署简单化,操作智能化,稳定、可靠、易扩展。数据的存储服务成为一个新兴的服务项目,加上互联网技术的日新月异,迅速发展,风起“云”涌,“云存储”(Cloud Storage)系统提供在线的存储服务,得到众多行业巨鳄的追捧,国外有 Amazon、IBM、Google 等不断推进技术创新,国内有阿里、百度、金山等快速跟进推广应用
分布式存储的挑战
然而分布式存储的出现在一定程度上有效的缓解了这一问题,之所以称之为缓解是因为分布式存储在面对海量数据存储时也并非十全十美毫无压力,依然存在的难点与挑战例如:节点间通信、数据存储、数据空间平衡、容错、文件系统支持等一系列问题仍处在不断摸索和完善中
在理论计算机科学中,CAP定理(CAP theorem),又被称作布鲁尔定理(Brewer’s theorem),
它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
* 一致性(Consistency)—所有节点在同一时间具有相同的数据
* 可用性(Availability)—保证每个请求不管成功或者失败都有响应
* 分隔容忍(Partition tolerance)—系统中任意信息的丢失或失败不会影响系统的继续运作
对于大型站点,可用性(Availability)与分隔容错性(Partition Tolerance)的优先级会高于一致性
(Consistency),这里并不是指完全舍弃一致性,而是通过其他手段实现数据的弱一致性,例如:用户
微博的浏览数和评论可以容忍相对长时间的不一致,几乎不会影响用户体验,例如用户访问美食图片时,不会因为一张图片加载慢,导致整个访问请求出错。
弱一致性(包括最终一致性)
通过提交处理的半同步、半异步或全异步,取得最终一致性效果
最终一致性使得数据的提交具有延时性,而在一定范围时的延时性范围内(比如一秒),应用的可用性是正常的
分布式存储mogileFS和FastdFS,这里将一个个来介绍
企 业 级 分 布 式 存 储 应 用 与 实 站 - mogilefs
Mogilefs是什么?
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片,以大众点评为例,用户全部图片均有mogileFS存储,数据量已经达到500TB级别以上
mogilefs的特性
1,支持多节点冗余
2,可实现名称空间(命名空间),每个文件通过key来确定
3,不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过“集群”接口实现服务
4,可实现自动的文件复制
5,工作于应用层,没有特殊的组件要求
6,不共享任何数据,MogilesFS不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘
mogilefs的架构
mogileFS主要由三部分构成:tracker节点,database节点,storage节点
1、Tracker(MogileFSd 进程):这个是 MogileFS 的核心部分,他是一个调度器, MogileFSd 进程就是trackers进程程序,trackers 做了很多工作:Replication
,Deletion,Query,Reaper,Monitor 等等,这个是基于事件的( event-based ) 父进程/消
息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), ,包括将请求负载平衡到多个“query workers”中,然后让 MogileFSd 的子进程去处
理;
2、MySQL:用来存放 MogileFS 的元数据 (命名空间, 和文件在哪里),是Trackers 来操
作和管理它,可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的
所有元数据,建议做成HA架构;
3、Storage Nodes:这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节
点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些
机器,实际文件存放的地方
mogileFS的架构 client –> trackers host dev 路径 fid
每次文件的上传和读取,都经过前端TrackerServer服务器,trackerServer服务器受到client端的请求,查询数据库,返回一个上传或者是读取的可用的后端StorageServer的地址,然后由client端直接操作后端StorageServer服务器。upload操作返回就是成功或者失败的结果,read操作就是返回对应的查询数据
MogileFS管理的几个概念:
1、Domain:一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型)
,同一个Domain内key必须唯一,不同Domain内,key可以相同;
2、每一个存储节点称为一个主机host,一个主机上可以有多个存储设备dev(单独的硬盘),每个设备都有ID号,Domain+Fid用来定位文件
3、Class:文件属性管理,定位文件存储在不同设备上的份数;
mogilefs安装方式
mogilefs安装常用两种方式,yum安装和perl程序安装
yum 安装:通常是在线安装,好处是安装方式简单,不易出错;常用的安装yum源为
epel
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
本地安装的rpm包:
MogileFS-Server-2.46-2.el6.noarch.rpm #核心服务
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm # tracker节点
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点
MogileFS-Utils-2.19-1.el6.noarch.rpm #主要是MogileFS的一些管理工具,例如mogadm等。
perl程序源码包安装:通过perl的包管理命令cpanm进行安装
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes
cpanm安装
wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x
/usr/bin/cpanm
cpanm DBD::mysql
cpanm MogileFS::Server
cpanm MogileFS::Utils
cpanm MogileFS::Client
cpanm IO::AIO
mogilefs程序路径
主程序:/usr/bin/mogilefsd
命令行管理工具程序:/usr/bin/mogadm
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf
实验:实现基于MogileFS的分布式存储
安装mogilefsd,这里选用3台机器,一个充当tracker,两台充当
在xshell中选择工具,点击发送命令到所有会话,可以一下操作多台机器,再点需选项卡点排列可以选择终端的排列布局
第一步:yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO 分别在三台机器其上安装
lftp 172.17.0.1
cd /pub/Sources/7.x86_64/mogilefs
mget *
下载之后安装 ,yum localinstall ./* 就是安装当前目录下的刚刚下载的rpm包
第二步:安装之后分角色
三台地址分别为172.17.252.130,172.17.252.131,172.17.253.172
这里让130充当了mysql+tracker的主机
131和172都充当了storage的主机
1,在mysql+tracker主机上做如下配置:
cd /etc/mogilefs/
vim mogilefsd.conf 修改下面一行的地址,改为监听本机ip地址
listen = 172.17.252.130:7001
接下来进行数据库的初始化
systemctl start mariadb
mysql -uroot
1、数据库授权 GRANT ALL PRIVILEGES ON . TO ‘mogile’ @’127.0.0.1’ IDENTIFIED BY ‘mogile’ WITH GRANT OPTION;
或者GRANT ALL PRIVILEGES ON mogilefs.* TO ‘mogile’ @’127.0.0.1’ IDENTIFIED BY ‘mogile’ WITH GRANT OPTION;直接给特定的数据库mogilefs授权,虽然还没有创建mogilefs数据库,但是mogdbsetup会自动帮我们创建,我们直接授权是可以的
2,[rootcentos7 ~]# mogdbsetup –dbpass=mogile 设定数据库,只需要设定密码就行了,
vim /etc/mogilefs/mogilefsd.conf
db_user = mogile修改用户名和密码
db_pass = mogile
[rootcentos7 mogilefs]# /etc/init.d/mogilefsd start 启动mogilefsd
ps -ef |grep mogilefsd
mogadm check
mogadm –tracker=172.17.252.130:7001 check 检查tracker是ok但是会提示说找不到设备在tracker上,所以接下来要配置storage了
第三步:,在充当storage的两台主机上:
mkdir /data/mogdata -p
cd /data
ll
[root@centos7 /data]#chown mogilefs.mogilefs mogdata/ -R
vim /etc/mogilefs/mogstored.conf
docroot = /data/mogdata 更改工作目录,该项决定了数据在storage上存储的实际位置,建议使用的是一个单独挂载的磁盘
第四步:
配置好两个storage之后在tracker上配置加入这两个节点,让tracker知道它的两个storage节点是谁
现在加入“存储节点”到 trackers 中.告诉注册自己到 trackers.相当于为每个主机 加入 MogileFS 的存储系统
mogadm –tracker=172.17.252.130:7001 host add node1 –ip=172.17.252.131 –port=7500 – status=alive
mogadm –tracker=172.17.252.130:7001 host add node2 –ip=172.17.253.172 –port=7500 –status=alive
mogadm –tracker=172.17.252.130:7001 host modify node2 –ip=172.17.253.172 – port=7500 –status=alive 可以用modify来修改
第五步:加完节点加设备(他也是mogilefs的一种管理方式)
先在两台storage上创建设备
在一台storage上:
mkdir /data/mogdata/dev1 -p
chown mogilefs.mogilefs /data/mogdata/dev1/ -R
cd /data/mogdata/dev1
ll
在另一台storage上:
mkdir /data/mogdata/dev1 -p
chown mogilefs.mogilefs /data/mogdata/dev2/ -R
cd /data/mogdata/dev1
ll
做好之后需要把设备加入存储的节点当中,相当于为每个设备加入mogilefs的存储系统
在mysql+tracker的主机上:
mogadm –tracker=172.17.252.130:7001 device add node1 1
mogadm –tracker=172.17.252.130:7001 device add node2 2
dev1和的dev2就组成了一个集群
标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数. 恢复上面一样在一次 add 设备就好了
mogadm device mark ID dead
第六步:测试1, 上传文件
在mysql+tracker的主机上
mogupload –domain=magedu –key== –file =
[rootcentos7 mogilefs]# mogupload –domain=img –key=test –file=Jellyfish.jpg ( key用来寻找文件的存放位置时做匹配)
2,查询文件
在mysql+tracker的主机上
mogfileinfo –domain=img –key=test
在两台storage的主机上看看
3,删除指定文件
在mysql+tracker的主机上
mogdelete –domain=img –key=test
删除之后再去storage主机上看一下就没有0000000002.fid这个文件了,不过0目录还是存在的
4,列出所有的文件 key
这个可以列出指定 domain 下面的所有的 key , 也可以指定的一个前缀, 来找特定前缀的所有
文件的 key.
moglistkeys –domain= –key_prefix=
5,列出指定 fid 的文件 这个 fromfid 是指 mogileFS 内部的文件 id , 这个是自增的, 你可以指定一个开始的位置, 指 定显示多少文件, 这个用于查询指定时间段内上传的文件时很有用. 比如我们在 8 点上传了一个 文件, 是 100 的 id, 我们可以查询到从这个之后的所有的 id 的文件.
moglistfids –fromfid= –count=<数量>
在mysql+tracker主机上
mogupload –domain=img –key=swet –file=Jellyfish.jpg
mogfileinfo –domain=img –key=swet 查到文件存放在以下位置
http://172.17.253.172:7500/dev2/0/000/000/0000000003.fid
你去在浏览器中访问可以访问到,此时如果把此storage标记为down了,如下命令所示:
mogadm host mark node2 down (由172可知此主机节点是node2)这个时候你再用命令查还是可以查到文件信息的,同样去浏览器访问还是可以访问到的,这就是mogilefs的一个机制,这个机制是非常不错的,它避免了只能在关机的状态下才能更新内存升级操作系统之类的需要,不会影响用户体验
暂时停止服务器 如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作 之前先设置这些为 “down”. MogileFS 对这种偶然的故障可以很弹性的处理.
mogadm host mark node2 alive 复活
事实上MogileFS本身是有bug的,我们前面在设定文件副本时设定为2个但实际上只有一台storage节点上有文件被存储,想要解决这个问题是需要去降级处理的,首先解决这个问题需要下载一个包,然后把它给编译一下
编译之前需要先实现perl的编译环境,注意stracker和两台storage主机都需要安装
3台机器都需要下载安装
第一步:
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes
第二步:
3台机器都需要下载安装
cd /tmp 进入临时存放目录
wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz(包名)
tar zxvf Sys-Syscall-0.23.tar.gz
cd Sys-Syscall-0.23/
perl Makefile.PL 这是perl的编译
make
make install
接下来开始测试:
在mysql+stracker的机器上
[rootcentos7 ~]# mogupload –domain=img –key=smile –file=Hydrangeas.jpg 上传文件
[rootcentos7 ~]# /etc/init.d/mogilefsd stop
[rootcentos7 ~]# /etc/init.d/mogilefsd start 重启服务
注意:有时候start时会报错说failed,其实它已经启动起来了,这个服务脚本有问题,
用ps -ef |grep mog 看一下就知道起没起来
(tracker 服务为 mogilefsd ) (storage服务为mogstored)
mogadm check 是发现node2状态是down的,所以又把它修改为alive了
mogadm –tracker=172.17.252.130:7001 host modify node2 –ip=172.17.253.172 –port=7500 –status=alive
[rootcentos7 ~]# mogupload –domain=img –key=cry –file=Hydrangeas.jpg
之前是只有一台storage上有数据挂一台数据就没了,现在两台都有,实现了副本
mogilefs在企业中的应用
数据库一定要做主从,不然数据库挂了mogilefs集群就没用了,因为数据库里有图片路径和名称的对应关系,即使你集群上有大量的图片也没用,没人知道图片在哪并且不知道哪个图片是什么名字,另外注意一台机器可以做tracker也可做storage,把tracket放在mysql上速度会更快,mysql主从上都配置一个tracker,然后集群上每一台主机也都配置一个tracker,也可以只在mysql上配置一个tracker,tracker是调度的作用,storage是存储的作用
当然,MogileFS还有其它的机制比如rebalanced,这个机制在企业中也是一个非常重要的作用这里不再介绍,可以自己去了解一下它的用途