一:分布式存储产生背景

①时代背景

Web 2.0 时代的到来,使得单个计算机节点远远无法满足用户对海量数据和应用程序运行空间的需求。个人和企业都有安全而持久的存储信息的需求,备份成为最通俗的手段。个人用户通过保存多个拷贝的形式实现信息存储的安全,小概率事件不易发生,但如中奖发生了,多个拷贝都失去后,崩溃恐怕不是简单的心理表达,而将成为不可改变的事实,无法复原。存储需要保持实时读写,提供复杂的查询功能,缺乏容灾和备份能力,大量无结构的数据的存储和处理,对传统的存储方式提出挑战。

②技术背景

互联网技术的日新月异,迅速发展,风起“云” 涌,“云存储”(Cloud Storage)系统提供在线的存储服务。而分布式存储正是通过利用这些存储服务,将数据分散存储在多台服务器上,从而使得数据存储实现部署简单化,操作智能化,稳定、可靠、易扩展。

二:MogileFS软件介绍

1、MogileFS软件特点

①支持多节点冗余

② 可实现自动的文件复制

③ 使用名称空间(命名空间),每个文件通过key来确定

如:文件123.jpg的key为 :/000/000/00/01/md5hash.fid

④ 不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过“集群”接口提供服务 

⑤工作于应用层,没有特殊的组件要求; 

⑥不共享任何数据,MogileFS不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护 好自己的磁盘。


2、MogileFS架构详解

新手必读:Linux分布式存储之——Mogilefs_第1张图片

基于MogileFS分布式存储系统三大组件:

①Tracker(Mogilefsd 进程):调度器,为MogileFS 的核心部分,主要用来帮助客户端定位真实数据存储位置。MogileFSd 进程就是trackers进程程序,trackers做了很多工作:Replication ,Deletion,Query,Reaper,Monitor 等等,这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到多个"query workers"中,然后让 MogileFSd 的子进程去处理;

②MySQL用来存放MogileFS 的元数据 (命名空间&&文件存储位置),由Trackers来操作和管理。可以用mogdbsetup程序来初始化数据库,因为数据库保存了MogileFS的所有元数据,建议将其做成HA(主从)架构;

③Storage Nodes存储节点服务器,也叫 Storage Server,用来存储真实数据。每台存储节点要启动一个 mogstored服务。通过增加存储节点服务器来实现扩容。

3、MogileFS系统管理相关概念

①Domain:域。一个MogileFS可以有多个Domain,用来存放不同文件(大小,类型) ,同一个Domain内key必须唯一,不同Domain内,key可以相同;

②每一个存储节点称为一个主机host,一个主机上可以有多个存储设备dev(单独的硬盘 ),每个设备都有ID号,Domain+Fid用来定位文件;

③Class:文件属性管理,定位文件存储在不同设备上的份数;

三:MogileFS软件详解

1、MogileFS软件安装流程

①安装perl相关程序包

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节点(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等。

2、程序文件&&配置文件

主程序:/usr/bin/mogilefsd
命令行管理工具程序:/usr/bin/mogadm
主配置文件(Tracker):/etc/mogilefs/mogilefsd.conf
主配置文件(Storage Nodes):/etc/mogilefs/mogstored.conf

四:MogileFS基础操作详解

1、Tracker初始化

1.数据库授权
GRANT ALL PRIVILEGES ON mogilefs.* TO 'mogile' @'127.0.0.1' IDENTIFIED BY 'mogile' WITH GRANT OPTION;

2.设定数据库
mogdbsetup --dbhost=127.0.0.1 --dbpass=mogile

3.添加运行用户mogilefs(yum安装无需此步骤)
useradd -r mogilefs 
mkdir /var/run/mogilefsd/ 
chown -R mogilefs.mogilefs /var/run/mogilefsd

4.修改tracker配置文件
vim /etc/mogilefs/mogilefsd.conf
    # Database connection information     设置数据库用户和密码
    db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
    db_user = mogile  
    db_pass = mogile
    # IP:PORT to listen on for mogilefs client requests  mogilefs客户端IP
    listen = 172.17.250.121:7001
5.启动mogilefsd
/etc/init.d/mogilefsd start

6.创建tracker子配置文件,指定tracker_IP,创建完成后tracker主机使用mogilefs相关命令无需再指定tracker
vim /etc/mogilefs/mogilefs.conf   #注意,不是主配置文件!!
    trackers=172.17.250.121:7001

2、Storage Nodes初始化

1.修改配置文件,自定义数据存储目录
vim /etc/mogilefs/mogstored.conf
    docroot = /data/mogdata/    #指定数据存储位置,一般挂载在单独磁盘上

2.创建此文件夹,并修改存储目录的属主和属组为mogilefs
chown -R  mogilefs.mogilefs /data/mogdata/

3.启动mogstored服务
/etc/init.d/mogstored start

注意:mogstored启动完成后后,将会让本机成为一个存储节点,接下来要配合mogadm来让当前的这个主机加入到 MogileFS 的系统中

3、添加节点到MogileFS

1.添加storage到指定tracker
mogadm --tracker=172.17.250.121:7001 host add node1 --ip=172.17.214.74 --port=7500 --status=alive
mogadm --tracker=172.17.250.121:7001 host add node2 --ip=172.17.214.75 --port=7500 --status=alive
注意:此命令在tracker和storage上都能执行,因为已经指定特定tracker。

2.检查主机是否添加成功
mogadm --tracker=172.17.214.73:7001 check
mogadm --tracker=172.17.214.73:7001 host list  

3.修改节点信息
mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive

4、添加存储设备到MogileFS

注意:生产环境中,会将devID/目录挂载到指定硬盘上,然后在将其添加为节点设备,不会使用系统盘。

1.创建目录/dev/mogdata/devID
目录名:dev+ID,且ID唯一,不可重复
mkdir /data/mogdata/dev1
mkdir /data/mogdata/dev2

2.修改目录权限为mogilefs
chown -R  mogilefs.mogilefs dev1/
chown -R  mogilefs.mogilefs dev2/

3.添加设备
格式:mogadm device add --tracker=    ID
mogadm --tracker=172.17.214.73:7001 device add node1 1
mogadm --tracker=172.17.214.73:7001 device add node2 2

4.查看设备列表
mogadm --tracker=172.17.214.73:7001 device list

题外话:
标记设备为:dead (谨慎操作!!!)
当硬盘损坏,设备出现问题时,可将设备标记为dead,这时,MogileFS 将开始删除设备上的文件,并试图在集群间重新复制它们到其它的设备上.
mogadm --tracker=172.17.214.73:7001 device mark node1 1 dead

5、Domain&&Class 管理

1.添加域名
mogadm --tracker=172.17.250.121:7001 domain add zdd

2.检查”域“,显示存在的域
[root@centos7 ~]# mogadm --tracker=172.17.250.121:7001 domain list
domain                   class                 mindevcount       replpolicy       hashtype
-------------------- -------------------- -------------     ------------         -------
zdd                       default                       2                    MultipleHosts()         NONE
注:  mindevcount  副本数

3.在域zdd中建"类"zd,并加入最小保存份数(副本数)为3
mogadm --tracker=172.17.250.121:7001 class add zdd zd --mindevcount=3

6、MogileFS文件管理

1.上传文件:mogupload
mogupload --domain=zdd --key=test1 --file=Chrysanthemum.jpg

2.查询文件:mogfileinfo
mogfileinfo --domain=zdd --key=test1

3.删除文件:mogdelete
mogdelete --domain=zdd  --key=test1      

4.列出所有文件key:moglistkeys
这个可以列出指定 domain 下面的所有的key , 也可以指定的一个前缀, 来找特定前缀的所有文件的key.
moglistkeys --domain=zdd
moglistkeys --domain=  --key_prefix=

5.列出指定 fid 的文件:moglistfids

fid:MogileFS文件系统中文件的编号,是自增的,mysql数据表mogilefs.file存放了相关信息

用途:查询指定fid后 所有/指定数量 的文件
moglistfids     --fromfid=    显示指定fid后的所有文件
moglistfids     --fromfid=     --count=  显示指定fid后的num个文件

7、Storage服务器状态管理&&硬盘管理

1.暂时停止服务器
使用场景:如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作 之前先设置这些为 "down". MogileFS 对这种偶
然的故障可以很弹性的处理.
mogadm host mark node_name down   ##标记存储节点下线   注意:此节点可读,不可写
...............做相关操作.................................
...............操作完成,启动服务器...............
mogadm host  mark  node_name  alive     ##存储节点机器重新上线

2.添加硬盘设备
使用场景:有时候需要用旧硬盘来替换新硬盘,就需要一个新的deviceID。这样做的原因是可以将旧设备中所有文件列表中的文件复制到新硬盘上,从而保
持数据的完整性。
mogadm device add node_name  node_ID --status=alive
mogadm device add node_name  node_ID --status=down

8、Storage模式管理

1、只读模式:radonly,只能读,禁止写和删除
mogadm device mark node_name node_id readonly

2、耗尽模式:drain,只能读和删除,禁止写
mogadm device mark node_name node_id drain      

注:耗尽(Drain) 模式在 MogileFS 的早期版本,将会从设备删除FIDS。现在它已经被重新均衡的功能取代。

3、重新复制文件
如果有一个硬盘坏了,MogileFS 可以自动的让请求不在访问这个设备,但是不会自动的重新复制这个硬盘的文件,你必须通过 mogadm 来
手工来标志成 'dead'. 只要你这样做, MogileFS将开始删除设备上的文件,并试图在集群间重新复制它们到其它的设备上.
mogadm  device mark  node_name  node_id  dead

9、MogileFS软件bug修复:无法创建副本

细心的朋友发现,设置完MogileFS的mindevcount后无法生效,因此,可通过下列步骤解决

一:tracker和storage进行如下操作
1.安装perl语言编译环境
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes

2.下载相关模块
包地址:http://www.cpan.org/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz

3.解包并编译
tar zxvf Sys-Syscall-0.23.tar.gz
cd Sys-Syscall-0.23/  
perl Makefile.PL
make&&make install

二:重启服务
1.重启tracker的mogilefsd服务
2.重启storage的mogstored服务

10、rebalance 重平衡策略

Rebalance策略官方文档:https://github.com/hrchu/mogilefs/blob/wiki/Rebalance.md

①策略描述

将剩余空间较小盘上的数据写入另一个剩余空间较大的盘上,从而平衡空间使用率 

②策略工作图解

新手必读:Linux分布式存储之——Mogilefs_第2张图片

策略图示解读:如上图,当新增硬盘和集群已有硬盘磁盘大小及使用率不一致时,继续进行写操作将会使其他四块硬盘先用光,从而引起副本创建失败,从而造成安全隐患。

③策略相关执行命令

命令选项:
mogadm rebalance settings:
rebal_policy = from_percent_used=95 to_percent_free=50 limit_type=device limit_by=size limit=5g fid_age=old

1、将使用率为50%的dev2的数据搬到使用率为40%的磁盘上,以平衡存储
mogadm rebalance policy --options="from_hosts=2 to_percent_free=40"

2、查看已存在的平衡策略
mogadm rebalance test

3、策略的 开始|暂停|重设|队列
$ mogadm rebalance start
$ mogadm rebalance stop
$ mogadm rebalance reset
$ mogadm --stats="general-queues"     ##stop后仍在运行的rebalance策略,为这些策略将会以队列(queues)的方式继续执行
注意:stop不会影响正在进行的rebalance策略

4、查看rebalance状态
$ mogadm rebalance status