Mogilefs是一款由perl语言研发的轻量级的分布式存储系统。类似淘宝的TFS可以从应用层解决海量的小数据的存储,比如图片。可以支持由php,java,perl,python写的扩展API接口来提供服务
- 特点:
- 支持多节点冗余
- 自动的文件复制
- 简单的命名空间,比如key,不多在当前domain全局惟一
- 不需要RAID,应用层可以直接实现RAID,不共享任何东西,通过“集群”接口提供服务
- 不能追加写,随机写,写完就不能修改了,因为它有自己的排列顺序,按照一定的编码来的
- 三大主件
- Tracker:跟踪器,调度器,7001/TCP
- TrackerDB:Mysql ,主要用于存储数据的meta元数据,最好做HA
- Storage:存储真正的数据,7500/TCP
# 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:mogile:host=127.0.0.1 ///mogile是指库名
db_user = mogile
db_pass = mogile
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001
初始化mogilefs的数据库,创建完就可以在mysql查看到多出一些新的表了:
~]#mogdbsetup --dbhost=127.0.0.1 --dbname=mogile --dbuser=mogile --dbpass=mogile
启动mogilefsd服务:
/etc/init.d/mogilefsd start
添加Tracker:
mogadm --trackers=172.16.52.61:7001 check
host2和host3上分别安装存储,表示缺包找包这种苦力活略考验耐心。。。此生不想再有第二次。。。
yum install -y MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm perl-IO-stringy-2.110-1.2.el6.rfx.noarch.rpm perl-Sys-Syscall-0.23-1.el6.noarch.rpm perl-Danga-Socket-1.61-5.el6.noarch.rpm perl-BSD-Resource-1.29.03-3.el6.x86_64.rpm perl-IO-AIO-3.71-2.el6.x86_64.rpm perl-common-sense-3.5-1.el6.noarch.rpm MogileFS-Utils-2.19-1.el6.noarch.rpm perl-MogileFS-Client-1.14-1.el6.noarch.rpm
创建存放数据的目录,不然会报错的:
mkdir /var/mogdata
启动mogstored服务:
经验告诉我,需要手动运行在后台,如果再去研究脚本,估计今天就过去了,故先手动起着用咯。。。--daemon是指运行在后台,可以简写为-d
mogstored /etc/mogilefs/mogstored.conf --daemon
Add storage nodes
host1:添加存储节点:
~]# mogadm --trackers=172.16.52.61:7001 host add 172.16.52.62 --status=alive
~]# mogadm --trackers=172.16.52.61:7001 host add 172.16.52.64 --status=alive
host2&&host3:创建磁盘,挂载到/var/mogdata下面,如图
接着w保存,通知内核当前磁盘的分区了,多刷两次。。。
]# partx -a /dev/sda
]# partx -a /dev/sda
格式化磁盘
]#mkfs.ext4 /dev/sda3
挂载:
mount /dev/sda3 /var/mogdata
设置开机自动启动:
添加设备:最后的1是为设备号,随机给的
mogadm --trackers=172.16.52.61:7001 device add 172.16.52.63 1
mogadm --trackers=172.16.52.61:7001 device add 172.16.52.64 2
到host2&&host3上面创建对应的dev#目录
mkdir /var/mogdata/dev#
回到host1,因为我只添加了一个dev设备,因此。。。
[root@localhost ~]# mogadm --trackers=172.16.52.61:7001 check
Checking trackers...
172.16.52.61:7001 ... OK
Checking hosts...
[ 1] 172.16.52.62 ... REQUEST FAILURE FETCHING: http://172.16.52.62:7500/
[ 2] 172.16.52.64 ... REQUEST FAILURE FETCHING: http://172.16.52.64:7500/
[ 3] 172.16.52.63 ... OK
Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 3] dev2 14.374 0.038 14.336 0.26% ? N/A
---- ------------ ---------- ---------- ---------- ------
total: 14.374 0.038 14.336 0.26%
Add domain
添加domain:
~]# mogadm --trackers=172.16.52.61:7001 domain add fruit
查看domain, mindevcount选项是指副本,默认为2个副本,
[root@localhost ~]# mogadm --trackers=172.16.52.61:7001 domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
fruit default 2 MultipleHosts() NONE
Upload files to storage from Tracker
上传文件:将本地的chuju.jpg上传到存储,还记的 mindevcount是默认两个副本吗,如果两台存储主机都添加进去了,就会在两台storage上都存储下来
[root@localhost ~]# ls
anaconda-ks.cfg chuju.jpg Desktop Documents Downloads install.log install.log.syslog Music Pictures Public pxelinux.0 Templates Videos
[root@localhost ~]# mogupload --trackers=172.16.52.61:7001 --domain=fruit --key='/chuju.jpg' --file='./chuju.jpg'
到host2&&host3可以查看:
[root@localhost dev2]# cd /var/mogdata/dev2/
[root@localhost dev2]# ls
0 test-write usage
[root@localhost dev2]# tree 0
0
└── 000
└── 000
└── 0000000004.fid
2 directories, 1 file
[root@localhost mogilefs]# mogfileinfo --tracker=172.16.52.61:7001 --domain=fruit --key='/chuju.jpg' 这些数据都在mysql中存储的源数据
- file: /chuju.jpg
class: default
devcount: 1
domain: fruit
fid: 4
key: /chuju.jpg
length: 68316
- http://172.16.52.63:7500/dev2/0/000/000/0000000004.fid
Test
看到http://172.16.52.63:7500/dev2/0/000/000/0000000004.fid这个地址,我们用浏览器访问一下:如图