mogilefs实现分布式存储
mogilefs是一个开源的分布式文件存储系统。
mogilefs的工作原理:每次文件的上传和读取,都经过前端trackerserver服务器,trackerserver服务器收到客户端的请求,查询数据库,返回一个上传或者是读取可用的后端storageserver的地址,然后由客户端直接操作后端storageserver服务器,下载操作返回就是成功或者失败的果,read操作就是返回对应的查询数据。
它支持多节点冗余。
可实现自动的文件复制。
使用名称空间,每个文件通过key来确定
工作于应用层,没有特殊的组件要求。
不共享任何数据,mogilefs不需要依靠昂贵的SAN来共享磁盘,每个机器只用维护好自己的磁盘。
mogilefs主要有三部分构成:tracker节点,database节点,storage节点。
tracker节点:这个是mogilefs的核心部分,它是一个调度器。借助数据库保存各节点文件的元数据信息,保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本。除此之外,它还负责数据的删除,复制,监控,查询等,可以作为负载均衡。
mysql节点:用来存放mogilefs的元数据,是trackers来操作和管理它,可以用mogdbsetup程序来初始化数据库。
storage节点:这个是mogilefs存储文件存放在这些机器上,每一台存储都要启动一个mogstored服务,扩容就是增加这些机器。
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等。
分别在tracker节点和storage节点上安装以上软件包,为了节省资源,我的tracker节点和mysql
数据库放在一台机器上。
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程序功能的配置文件介绍
daemonize = 1
设置为1表示启动为守护进程
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = username
db_pass = password
#配置数据库连接相关信息
listen = 127.0.0.1:7001
mogilefs监听地址,监听在127.0.0.1表示只允许从本机登录进行管理
query_jobs = 10
启动多少个查询工作线程
delete_jobs = 1
启动多少个删除工作线程
replicate_jobs = 5
启动多少个复制工作线程
reaper_jobs = 1
启动多少个用于回收资源的线程
mogilefs服务初始化
授权给用户,使授权的用户可以登录到数据库 MariaDB [(none)]> grant all privileges on mogilefs.* to 'mogile'@'127.0.0.1' identified by '123456'with grant option; Query OK, 0 rows affected (0.08 sec) 刷新授权表 MariaDB [(none)]> flush privileges; Query OK, 0 rows affected (0.00 sec) 使用mogdbsetup命令安装mogilefs数据库 [[email protected] ~]# mogdbsetup --dbpass=123456 This will attempt to setup or upgrade your MogileFS database. It won't destroy existing data. Run with --help for more information. Run with --yes to shut up these prompts. Continue? [N/y]: y Create/Upgrade database name 'mogilefs'? [Y/n]: y Grant all privileges to user 'mogile', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y 验证初始化数据库的结果 [[email protected] ~]# mysql -umogile -p123456 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 9 Server version: 5.5.52-MariaDB MariaDB Server Copyright (c) 2000, 2016, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mogilefs | | test | +--------------------+ 3 rows in set (0.00 sec) MariaDB [(none)]> use mogilefs; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed MariaDB [mogilefs]> show tables; +----------------------+ | Tables_in_mogilefs | +----------------------+ | checksum | | class | | device | | domain | | file | | file_on | | file_on_corrupt | | file_to_delete | | file_to_delete2 | | file_to_delete_later | | file_to_queue | | file_to_replicate | | fsck_log | | host | | server_settings | | tempfile | | unreachable_fids | | zzz | +----------------------+ 18 rows in set (0.00 sec)
配置tracker文件
修改以下四项即可,其他的根据具体的工作环境而定
db_dsn=DBI:mysql:mogilefs:host=127.0.0.1 db_user=mogile db_pass=123456 listen=172.17.252.15:7001
安装好tracker后会在/var/run/生成该目录,改变目录的属主和属组
[[email protected] ~]# chown -R mogilefs.mogilefs /var/run/mogilefsd
启动mogilefsd服务
[[email protected] ~]# cd /etc/mogilefs/ [[email protected] mogilefs]# /etc/init.d/mogilefsd start Starting mogilefsd (via systemctl): [ OK ] [[email protected] mogilefs]# ss -ntl|grep 7001 LISTEN 0 128 172.17.252.15:7001 *:*
配置storage节点的文件
maxconns = 10000(存储系统最大连接数) httplisten = 0.0.0.0:7500(可通过http访问服务端口) mgmtlisten = 0.0.0.0:7501(mogilefs的管理端口) docroot = /data/mogdata(数据存储的实际位置,建议使用的是一个单独挂载使用的磁盘) ~
因为进程都是以mogilefs的身份运行的,所以我们要把文件存储的路径的属主和属组改为mogilefs
[email protected] data]# ll total 0 drwxr-xr-x. 3 mogilefs mogilefs 18 Nov 28 21:24 mogdata [[email protected] mogilefs]# /etc/init.d/mogstored start Starting mogstored (via systemctl): [ OK ] [[email protected] mogilefs]# ss -ntl|grep 75* LISTEN 0 128 *:7500 *:* LISTEN 0 128 *:7501 *:*
现在加入"存储节点"到trackers中,相当于为每个主机加入mogilefs的存储系统
[[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 host add node1 --ip=172.17.252.16 --port=7500 --status=alive [[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 host add node2 --ip=172.17.252.17 --port=7500 --status=alive 查看已经添加的主机 [[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 check Checking trackers... 172.17.252.15:7001 ... OK Checking hosts... [ 1] node1 ... REQUEST FAILURE FETCHING: http://172.17.252.16:7500/ [ 2] node2 ... REQUEST FAILURE FETCHING: http://172.17.252.17:7500/ No devices found on tracker(s). [[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 check Checking trackers... 172.17.252.15:7001 ... OK Checking hosts... [ 1] node1 ... OK(节点已经检测成功) [ 2] node2 ... OK Checking devices...(devices设备尚未加入) host device size(G) used(G) free(G) use% ob state I/O% ---- ------------ ---------- ---------- ---------- ------ ---------- ----- ---- ------------ ---------- ---------- ---------- ------ total: 0.000 0.000 0.000 0.00%
mogilefs中的存储设备管理
建目录使用dev+ID这种格式,注意所有系统中的ID不能重复,也必须和配置文件中的路径一样
分别在两个storage节点的主机上建目录dev1 和dev2
mkdir -p /data/mogdata/dev1 mkdir -p /data/mogdata/dev2
给设备加入存储的节点当中,相当于为每个设备加入mogilefs的存储系统
[[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 device add node1 1 [[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 device add node2 2 [[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 check Checking trackers... 172.17.252.15:7001 ... OK Checking hosts... [ 1] node1 ... OK [ 2] node2 ... OK Checking devices...(已经成功加入设备) host device size(G) used(G) free(G) use% ob state I/O% ---- ------------ ---------- ---------- ---------- ------ ---------- ----- [ 1] dev1 97.609 6.321 91.287 6.48% writeable 0.0 [ 2] dev2 97.609 6.429 91.179 6.59% writeable 0.0 ---- ------------ ---------- ---------- ---------- ------ total: 195.217 12.750 182.467 6.53% 也可以使用另一种方式查看device [[email protected] mogilefs]# mogadm --tracker=172.17.252.15:7001 device list node1 [1]: alive used(G) free(G) total(G) weight(%) dev1: alive 6.321 91.287 97.608 100 node2 [2]: alive used(G) free(G) total(G) weight(%) dev2: alive 6.429 91.180 97.608 100
添加域:域用来存储不同应用类型数据的容器
创建图片存放的域 [[email protected] ~]# mogadm --tracker=172.17.252.15:7001 domain add imgs 创建html等文件存放的域 [[email protected] ~]# mogadm --tracker=172.17.252.15:7001 domain add files [email protected] ~]# mogadm --tracker=172.17.252.15:7001 domain list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 MultipleHosts() NONE imgs default 2 MultipleHosts() NONE
添加类:
[[email protected] ~]# mogadm --tracker=172.17.252.15:7001 class add imgs img1 --mindevcount=3 [[email protected] ~]# mogadm --tracker=172.17.252.15:7001 class add imgs img2 --mindevcount=3 [[email protected] ~]# mogadm --tracker=172.17.252.15:7001 class add files file1 --mindevcount=4 [[email protected] ~]# mogadm --tracker=172.17.252.15:7001 class add files file2 --mindevcount=4 [[email protected] ~]# mogadm --tracker=172.17.252.15:7001 class list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 MultipleHosts() NONE files file1 4 MultipleHosts() NONE files file2 4 MultipleHosts() NONE imgs default 2 MultipleHosts() NONE imgs img1 3 MultipleHosts() NONE imgs img2 3 MultipleHosts() NONE
上传文件
[email protected] ~]# mogupload --domain=imgs --key=jpg1 --file=timg.jpg --key指定上传后的键 --file指定要上传的文件
查询文件
[[email protected] ~]# mogfileinfo --domain=imgs --key=jpg1 - file: jpg1 class: defa devcount: 2 domain: imgs fid: 12 key: jpg1 length: 60918 - http://172.17.252.17:7500/dev2/0/000/000/0000000012.fid - http://172.17.252.16:7500/dev1/0/000/000/0000000012.fid
通过它给出的路径,我们进行访问
删除指定的文件
[[email protected] ~]# mogdelete --domain=imgs --key=jpg1 再次查看 [[email protected] ~]# mogfileinfo --domain=imgs --key=jpg1 Error fetching file info: unknown_key unknown_key at /usr/bin/mogfileinfo line 60, <Sock_172.17.252.15:7001> line 1.
列出所有文件的key
[[email protected] ~]# moglistkeys --domain=imgs
暂时停止服务器
如果需要维护一个服务器,比如更新内存,升级操作之类的需要关机的操作,可以在操作之前将主机设置为"down".
[[email protected] ~] mogadm host mark node1 down 恢复 [[email protected] ~] mogadm host mark node1 alive
mogilefs有一个小bug,就是默认的情况下它是不会复制的,为了实现自动复制,我们需要安装Syscall模块、
可以到http://search.cpan.org/网站下载如下包,并在tarcker节点和storage节点进行编译
转载于:https://blog.51cto.com/13017865/2049160