实验:实现Mogilefs分布式存储服务

来源:互联网 发布:2014年流行的网络歌曲 编辑:程序博客网 时间:2024/06/05 11:40

架构(一共三台主机):

一个tracker节点+Mysql服务放在一台主机

两个storage节点

注意:Xshell中有多会话管理工具,为了方便管理,建议打开;

(1)、(Tracker节点、Storage节点)安装方法选择yum安装:

yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO

注意:由于Mogilefs使用perl语言编写的,所以如果perl相关的组件,可能会无法启动Mogilefs的服务;

获取Mogilefs相关的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

(2)、(在Tracker节点安装Mysql数据库)mogilefs服务初始化

注意:生产环境中,数据库一般是主从单独放置,Tracker节点和Storage节点,可以放在一台主机上,在前端的调度器那里做负载均衡即可。

1、数据库授权

GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'127.0.0.1' IDENTIFIED BY 'mogile' WITH GRANT OPTION;

2、设定数据库:

mogdbsetup --help

mogdbsetup --dbhost=127.0.0.1 --dbpass=mogpass

#步骤1可以由mogdbsetup生成,即步骤1可以省略;

注意:用户名默认为:mogile;

注意: --dbpass=mogpass,指定数据库用户mogile的密码是"mogpass",默认为空;

3、添加运行用户

useradd -r mogilefs

mkdir /var/run/mogilefsd/

chown -R mogilefs.mogilefs /data/mogdata/ #storage节点

注意:由于Mogilefsd服务使用mogilefs用户管理,所以,手动安装(per安装)的话,需要创建mogilefs用户。使用yum安装的话,用户已经创建。由于Mogulefs服务的用户身份是mogilefs用户,所以要保证在Storage节点上的"docroot",有管理权限,并且还要和配置文件中的路径对应起来。

4、修改主配置文件:

/etc/mogilefs/mogilefsd.conf

5、启动服务 (tracker服务为mogilefsd) (storage服务为mogstored)

注意:/etc/init.d/mogstored、/etc/init.d/mogilefsd两个脚本有点儿问题,有的时候报错,并不一定是服务启动不了。

(3)、(Tracker节点)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=172.17.252.75:7001 check

#检查这个主机是否加入到 MogileFS 的系统中;

mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive

#可以修改主机IP;

示例:

mogadm --tracker=172.17.252.75:7001 host add node1 --ip=172.17.254.145 --port=7500 --status=alive

mogadm --tracker=172.17.252.75:7001 host add node2 --ip=172.17.253.242 --port=7500 --status=alive

MogileFS中的存储设备管理

在storage节点中"docroot"目录下,建一个目录 ( 并且需要 mount一个硬盘给这个目录 ) 给这个"设备"使用, 我们这的例子是使用dev1在主机中建一个目录,注意建目录使用dev + ID 这种格式,注意所有系统中设备的ID号不能重复。也必须和配置文件中的路径一样.。如下:

mkdir -p /data/mogdata/dev1

chown mogilefs:mogilefs -R /data/mogdata

一定要注意, 给相对应用的块设备 mount 到这个点, 软链也行. 不然写文件都会写到系统硬上, 其它的硬盘都是空的给"设备"加入"存储的节点"当中,相当于为每个设备加入 MogileFS 的存储系统:

mogadm device add <storage_node_name> ID

示例:

Storage节点:

mkdir -p /data/mogdata/dev*

chown mogilefs:mogilefs -R /data/mogdata

如果如果已经启动了/etc/init.d/mogstored的话,会生成一个/data/mogdata/dev*/usage文件。里面记录着dev*下的硬盘的使用情况;

Tracker节点:

mogadm --tracker=172.17.252.75:7001 device add node1 1

mogadm --tracker=172.17.252.75:7001 device add node2 2

mogadm --tracker=172.17.252.75:7001 check

检查我们加入的"设备"信息,这样就能见到上面这个设备了。还能显示加入的大小。mogadm device list标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数。恢复上面一样在一次 add 设备就好了:

mogadm device mark <storage_node_name> <storage_node_name> ID dead

注意:由于每次使用mogadm命令,都要指明tracker的IP和端口;所以,方便使用,可以创建一个"/etc/mogilefs/mogilefs.conf",在文件中指明" --tracker=172.17.252.75:7001",以后使用mogadm命令,就可以不用再输入密码了。

MogileFS 中域、类的管理

当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文件到存储当中。我们使用 mogadm 的工具来能创建一个"域"和"类",也可以使用这个来增加文件到"类"中。

mogadm domain add <domain_name> #创建"域"

mogadm domain list #检查"域",显示存在的域

mogadm class add <domain_name> <class_name> --mindevcount=3

#在"域"中建"类",并加入最小保存份数

示例:

mogadm domain add img

mogadm domain list

mogadm class add img m26 --mindevcount=3

mogupload --domain=doc --class=m --key=12 --file=./47243-106.jpg

 

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=<数量>

示例:

mogupload --domain=img --key=1 --file=./281783-106.jpg

mogfileinfo --domain=img --key=1

moglistfids --fromfid=2 --count=10

注意:可以通过浏览器来访问"http://172.17.253.242:7500/dev2/0/000/000/0000000006.fid"

暂时停止服务器

如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作之前先设置这些为 "down"。MogileFS 对这种偶然的故障可以很弹性的处理。

$ mogadm host mark mystorage down

... 做一些操作 ...

$ mogadm host mark mystorage alive

只读模式和耗尽(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系统中有两个副本,而dev1设备损坏了,产生了一个安全隐患,怎样解决?

Storage节点(node3):

yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO

lftp 172.17.0.1 #获取必要的rpm包

MogileFS-Server-2.46-2.el6.noarch.rpm

perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm

MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm

perl-MogileFS-Client-1.14-1.el6.noarch.rpm

MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm

MogileFS-Utils-2.19-1.el6.noarch.rpm

yum localinstall *.rpm -y

mkdir /data/mogdata -p

vim /etc/mogilefs/mogstored.conf

docroot = /data/mogdata

/etc/init.d/mogstored start

ss -ntl

cd /data/

mkdir dmogdata/ev3

chown mogilefs:mogilefs -R .

yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes

wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz

tar xf Sys-Syscall-0.23.tar.gz

cd Sys-Syscall-0.23

perl Makefile.PL

make && make install

/etc/init.d/mogstored restart

ss -ntl

Tracker节点:

mogadm host mark node1 dead

mogadm --tracker=172.17.252.75:7001 host add node3 --ip=172.17.253.138 --port=7500 --status=alive

mogadm check

mogadm --tracker=172.17.252.75:7001 device add node3 3

mogadm rebalance policy --options="from_hosts=2 to_percent_free=50"

mogadm rebalance test

mogadm rebalance start

注意:生产环境中一般不会立即reblance,因为一个空的dev设备,突然挂到系统中,所有的数据都会往dev3设备上写,容易对dev3设备造成损坏。实际生产中,一般是先将dev3设备挂载起来,标记为可写,其他的dev设备标记为读,等到dev硬盘中写的差不多了,改变所有dev为写,然后再将其reblance;

扩展实验:

上面实验可以看到,上传的文件仅在一个主机上存放,实际上应该是两个节点都存放才对。原因可能是由于Sys::Syscall这个模块造成的。我们看到现在此模块的版本为0.25。需要将此软件降为0.23版本可能会修复此问题:

yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes

wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz

tar xf Sys-Syscall-0.23.tar.gz

cd Sys-Syscall-0.23

perl Makefile.PL

make && make install

然后重启Tracker节点、Storage节点中的服务后生效。

注意:lftp中,mget *可以用来下载多个文件;

注意:在企业中,一般会有一个图片处理的工具,例如用于裁剪图片

原创粉丝点击