企业级分布式存储应用与实战-mogilefs实现
Mogilefs是什么
MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片,以大众点评为例,用户全部图片均有mogileFS存储,数据量已经达到500TB级别以上。
mogilefs的特性
123.jpg /000/000/00/01/md5hash.fid
4、不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过"集群"接口提供服务
6、不共享任何数据,MogileFS不需要依靠昂贵的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 服务.扩容就是增加这些机器,实际文件存放的地方。
每次文件的上传和读取,都经过前端TrackerServer服务器,trackerServer服务器受到client端的请求,查询数据库,返回一个上传或者是读取的可用的后端StorageServer的地址,然后由client端直接操作后端StorageServer服务器。upload操作返回就是成功或者失败的结果,read操作就是返回对应的查询数据。
mogileFS的术语
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
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
wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x
mogilefs程序路径
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf
tracker配置文件
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
mogilefs监听地址,监听在127.0.0.1表示只允许从本机登录进行管理
storage配置文件
该项决定了数据的在storage上存储的实际位置,建议使用的是一个单独挂载使用的磁盘
mogilefs服务初始化
GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'127.0.0.1' IDENTIFIED BY 'mogile' WITH GRANT OPTION;
mogdbsetup --dbhost=127.0.0.1 --dbpass=mogpass
chown -R mogilefs.mogilefs /var/run/mogilefsd #yum安装的话已经完成
5、启动服务 (tracker 服务为 mogilefsd ) (storage服务为mogstored)
MogileFS 的管理
mogstored 程序的启动将使主机本身成为一个存储的节点,mogstored 的启动后,还需要使用 mogadm 来让当前的这个主机加入到 MogileFS 的系统中.这就是一个存储节点.注意存储节点中还需要添加设备,每个设备有一个 uniq 的 ID 号.同样也要使用 mogadm 来加入到 MogileFS 的系统中.
MogileFS 中的存储主机(节点)管理
现在加入"存储节点"到 trackers 中.告诉注册自己到 trackers.相当于为每个主机加入 MogileFS 的存储系统
mogadm host add <storage_node_name> --ip=127.0.0.1 --port=7500 --status=alive
mogadm host list相当于mogadm --tracker=192.168.10.190:7001 check
mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive
#如果你不小心写错了,可以修改主机IP,端口,alive或者down,只要指定好节点就行
MogileFS 中的存储设备管理
建一个目录 ( 并且需要 mount 一个硬盘给这个目录 ) 给这个"设备" 使用, 我们这的例子是使用dev1在主机中建一个目录,建目录使用 dev + ID 这种格式,记的所有系统中 ID 不能重复.也必须和配置文件中的路径一样.
一定要注意, 给相对应用的块设备 mount 到这个点, 软链也行. 不然写文件都会写到系统硬上,其它的硬盘都是空的
给"设备"加入"存储的节点"当中,相当于为每个设备加入 MogileFS 的存储系统
mogadm device add <storage_node_name> ID
检查我们加入的"设备"信息,这样就能见到上面这个设备了.还能显示加入的大小.
标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数.恢复上面一样在一次 add 设备就好了
mogadm device mark <storage_node_name> <storage_node_name> ID dead
MogileFS 中域,类的管理
当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文件到存储当中.
我们使用 mogadm 的工具来能创建一个"域"和"类".也可以使用这个来增加文件到"类"中.
mogadm domain add <domain_name>
mogadm class add <domain_name> <class_name> --mindevcount=3
MogileFS 中文件管理
我们可以简单的使用 mog 开头的系列 Linux 命令, 来进行管理, 当然也可以用 Client 的 API来管理. 新的 MogileFS 的工具, 拆分成多个了. 下面这些命令, 都需要在/etc/mogilefs/mogilefs.conf 中指定 trackers , 不然就需要在下面的命令都加上 –trackers来指定.
1. 上传文件
mogupload --domain=magedu --key=<key_name> --file=<file_path>
2. 查询文件
mogfileinfo --trackers=host --domain=<domain_name> --key=<key_name>
例如查询一个叫 crossdomain 的 key .在指定的 domain 中.
mogfileinfo --domain=magedu --key=magedu
4. 删除指定文件
mogdelete --domain=<domain_name> --key=<key_name>
5. 列出所有的文件 key
这个可以列出指定 domain 下面的所有的 key , 也可以指定的一个前缀, 来找特定前缀的所有文件的 key.
moglistkeys --domain=<domain_name> --key_prefix=<key_name>
6. 列出指定 fid 的文件
这个 fromfid 是指 mogileFS 内部的文件 id , 这个是自增的, 你可以指定一个开始的位置, 指定显示多少文件, 这个用于查询指定时间段内上传的文件时很有用. 比如我们在 8 点上传了一个文件, 是 100 的 id, 我们可以查询到从这个之后的所有的 id 的文件.
moglistfids --fromfid=<file_id> --count=<数量>
暂时停止服务器
如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作之前先设置这些为 "down". MogileFS 对这种偶然的故障可以很弹性的处理.
mogadm host mark mystorage down
mogadm host mark mystorage alive
硬盘设备编号
添加新的硬盘设备需要给一个唯一的,增量的设备 ID(devid).
如果你用一个新的硬盘来更换坏掉的硬盘,总是需要给一个新的 devid.不能重用老的 devid. 之所以这样做的原因是可以让你从旧设备中给所有文件列表中的文件,重新复制到其它的Mogilefs 的硬盘中.不然容易引起文件不会复制到这个中和错误的更新,也不会重新复制的旧文件
mogadm device add mystorage 5 --status=alive
mogadm device add mystorage 5 --status=down
只读模式和耗尽(Drain) 模式
如果你想要冻结设备上所有的文件,你要使用只读模式就行了。这将停掉 MogileFS 存放新文件到这个设备上,但它也将阻止删除文件.代替的删除的操作是会给这些内容放到队列中等待为您标记为'alive'或'drain'。
mogadm device mark mystorage 5 readonly
mogadm device mark mystorage 5 drain
耗尽(Drain) 模式, 在 2.40 和更高以上,告诉 MogileFS 不会有新的文件应写入设备. 但是在耗尽(Drain) 模式,文件可能被删除.所以如果你不希望写文件到这个设备上,可以设置为drain 的模式
注:耗尽(Drain) 模式在 MogileFS 的早期版本,,将会从设备删除 FIDS.现在它已经被重新均衡的功能取代。
重新复制文件
如果有一个硬盘坏了,MogileFS 可以自动的让请求不在访问这个设备,但是不会自动的重新复制这个硬盘的文件,你必须通过 mogadm 来手工来标志成 'dead'. 只要你这样做, MogileFS 将开始删除设备上的文件,并试图在集群间重新复制它们到其它的设备上.
实验:企业级分布式存储应用与实战-mogilefs实现
(1)安装mogilefs
1.创建一个存放安装mogilefs所需的软件包的目录
2.用lftp下载安装mogilefs所需的软件包
lftp 172.17.0.1:/pub/Sources/7.x86_64/mogilefs> mget *
3.安装mogilefs
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y
(2)初始化数据库,授权即可,其他默认
1.授权
grant all privileges on mogilefs.* to 'mogile'@'172.17.0.1' identified by 'mogile' with grant option;
2.初始化数据库,只需指定密码,其他默认
(3)配置tracker
1.修改配置文件
vim /etc/mogilefs/mogilefsd.conf
2.启动tracker
3.查看配置的tracker
mogadm --tracker=ip:port check
mogadm --tracker=192.168.10.190:7001 check
(4)配置storage节点
1.修改配置文件
vim /etc/mogilefs/mogstored.conf
2.创建配置的工作路径路径
chown mogilefs.mogilefs /data/mogdata -R
3.启动strage
(5)关联tracker调度器和storage节点服务器
在tracker上去配置(也可在storage节点上去配置,只不过要制定tracker是谁)
1.添加节点1
mogadm --tracker=192.168.10.190:7001 host --add node3 --ip=192.168.10.187 --port=7500 --status=alive
2.查看tracker
mogadm --tracker=192.168.10.190:7001 check
3.添加节点2
mogadm --tracker=192.168.10.190:7001 host --add node5 --ip=192.168.10.160 --port=7500 --status=alive
4.查看tracker
mogadm --tracker=192.168.10.190:7001 check
(6)添加设备
1.在storage节点上node1
chown mogilefs.mogilefs dev1 -R
2.在storage节点上node2
chown mogilefs.mogilefs dev2 -R
(7)将设备加载到mogilefs的集群中
mogadm --tracker=192.168.10.190:7001 device add node3 1
mogadm --tracker=192.168.10.190:7001 device add node5 2
在客户端配置文件加一个tracker,指定tracker在哪
mogadm domain add img 添加一个img域,只存放图片
mogadm class add img m26 --mindevcount=3 在img域中添加一个m26class,数据保存3份
1.上传文件(在tracker上)
mogupload --domain=img --key=test --file=magedu.png
2.在storage节点查看上传文件
(11)查询上传文件
mogfileinfo --domain=img --key=test
(12)在浏览器上访问该文件
(13)修复bug,实现后端storage node 同步存储
1.下载包
wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
也可以http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz 去网站直接下载
2.上传,解压缩
rz,tar xvf Sys-Syscall-0.23.tar.gz -C /tmp
3.编译安装
① 因为是perl 语言编写的,所以需要安装perl 编译安装的环境
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
① 在tracker 服务器是,有时候开启服务显示失败,其实已经成功
② 在storage node 服务器上,有时候开启服务显示失败,其实已经成功