分布式文件存储之MogileFS

1.分布式存储

大数据带来的挑战

数据采集,数据存储,数据搜索,数据共享,数据传输,数据分析,数据可视化

分布式存储

节点间通信,数据存储,数据空间平衡,容错,文件系统支持

多线程与进程的执行模式

互不通信的多线模式,基于共享容器协同的多线程模式,通过事件协同的多线程模型

输入设备的变化
控制器的变化:

透明代理,旁路模式,名称服务,规则服务器,运算器的变化

存储器的变化

代理模型,旁挂模型,规则服务器
Master(主控机):元数据在控制节点,数据在后端存储节点上

分布式系统的难点
       缺乏全局时钟
       面对故障的独立性
       处理单点故障
           冗余
           降低单点故障的影响
       事务类的挑战
           ACID
           2pc(两段式提交)、最终一致、BASE、CAP、Paxos
分布式文件系统设计目标

访问透明,位置透明,并发透明,失效透明,硬件透明,可扩展性,复制透明,迁移透明

满足以下特性
伸缩能力
可靠性
性价比

1.1分布式事务的模型及规范

X/Open(开源组织):XA
DTP:Distributed Transcationn Processing Reference Model(分布式事务处理参考模型X/Open定义)
定义了三个组件
AP:Application Program 应用程序
RM:Resourse Manager 资源管理器
TM:Transaction Manager 事务管理器

AP通过资源管理器管理资源,通过事务管理器管理事务,事务管理器通过资源管理器管理的资源进行控制,TM通过RM的XA管理RM

两段式提交:
事务管理器提交不止一个数据,第一阶段准备,第二阶段提交,如果出现错误,第二阶段回滚

CAP理论-分布式系统无法同时满足三种情况
C:一致性,任何一个读操作总是能够读取之前完成的写操作
A:可用性,(指的是快速获取数据)每一次操作总是能够在确定的时间返回
P:容错性,在网络出现分区的情况下(脑裂)仍然能够满足一致性和可用性

BASE:
BA:Basically Available,基本可用
S:soft state 软状态,接受一段时间内的状态不同步
E:Evetually consistent:最终一致性

一致性:
强一致性,满足ACID,在单机环境中强一致性有数据库的事务来保证,在多机环境下强一致性很难做到,分布式事务,在互联网应用中不合适,性能差 软一致性,(包括最终一致)

Paxos
2PC更轻量级的分布式事务的协调方式
集群内数据一致性算法实施过程案例:
Quorum(合法票数),Vector clock(向量时钟)

Quorum:
N:数据复制的节点数
R:成功完成读操作所依赖的最少节点数
W:成功完成写操作所依赖的最少节点数

W+R>N:强一致性   W+R<N: 弱一致性,可以保证最终一致性

2.分布式应用

分布式计算
        MapReduce:分布式运算框架
             MapReduce
    分布式存储
        GFS,Google File System
             HDFS
        只能存储k-v数据
    bigtable:列式数据库
        HBase

NoSQL:列式数据库是其中的一种,大多数存储都是key-value的形式
hadoop:MapReduce+HDFS(两者结合起来)

3.分布式存储

不能mount,基于API进行存储
分布式文件系统(把存储空间抽象成文件的格式存储的格式)
mount基于VFS接口直接往里面写数据

解决方案:
适合存储少量大文件
GFS:存储少量大数据,2T
HDFS:hadoop的分布式文件系统,适合存储少量大文件
TFS:淘宝FS,在名称节点上将元数据存储于关系型数据中,文件数量不在受限于名称节点的内存空间,可以存储海量小文件
TFS:腾讯FS
Lustre:Oracle,企业级应用,重量级
GlusterFS:分布式的文件系统,适合存储p/b级的企业级数据,允许数千个节点同时访问,在海量文件存储尤其是在I/O需求量非常大的情况下,GlusterFS较好的解决方案
MooseFS:基于FUSE的格式,可以挂载
Mogilefs:存储海量小数据,使用perl开发
FastDFS,mogileefs的山寨版

3.1分布式文件系统MogileFS

MogileFS是一个开源的分布式文件存储系统,由LiveJournal旗下的Danga Interactive公司开发。Danga团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。目前使用MogileFS 的公司非常多,如日本排名先前的几个互联公司及国内的yupoo(又拍)、digg、豆瓣、1号店、大众点评、搜狗和安居客等,分别为所在的组织或公司管理着海量的图片。

3.2MogileFS的特性

1.应用层提供服务,不需要使用核心组件
2.无单点(tracker(跟踪点)mogstore(存储节点)database(MySQL))
3.自动文件复制:复制的最小单位不是文件,而是class(类),将多个文件组织成一个单位进行复制
4.传输中立:无特殊协议,可以通过NFS或HTTP实现通信
5.简单的命名空间:没有目录,直接存在存储空间上,通过域来实现
6.不共享任何数据:

3.3MogileFS的工作模型

说明:用户通过自主编程的API访问数据,通过Tracker后Tracker访问database获取源数据,把源数据返回给用户告诉在那个存储节点上,然后API就调一个去访问,因为它是通过NFS和http协议的,所有每一个数据都能通过uri获取;橙色表示源数据,绿色表示API访问关系,灰色表示复制关系

MogileFS由3个部分组成:
(1) server:主要包括mogilefsd和mogstored两个应用程序。mogilefsd实现的是tracker,它通过数据库来保存元数据信息,包括站点domain、class、host等;mogstored是存储节点(store node),它其实是个WebDAV服务,默认监听在7500端口,接受客户端的文件存储请求。在MogileFS安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。
(2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等。
(3) 客户端API:MogileFS的客户端API很多,例如Perl、PHP、Java、Python等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。

存储主机(节点)
这个是 MogileFS 存储文件存放在这些机器上,也是 mogstored 节点,也叫 Storage Server,一台存储主要都要启动一个 mogstored 服务.扩容就是增加这些机器.

设备(device)
一个存储节点,以就是上面的主机,可以有多个 device, 就是用来存放文件的目录(例如挂载的目录),每个设备都有一个设备id,需要在 mogstored 的配置文件中的 docroot 配置的项目 指定的目录下面创建相应的设备的目录,目录名为 $docroot/dev$id,设备是不能删除的.只能将其设备的状态的值置为dead,当一个设备 dead 之后,就真的 dead了,里面的数据也无法恢复了,且这个dead了的设备的 id 也不能再用.

3.4Tracker安装配置

##MogileFS是使用perl语言开发的,所以它们的各功能都是perl模块,要安装这些功能只需连接到cpan上;
rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/libdb-5.3.21-24.el7.x86_64.rpm
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
cpan> instll mould::name

1.安装MySQL数据库

wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm
rpm -ivh mysql-community-release-el7-5.noarch.rpm
yum install -y mysql-server
systemctl start mysql

2.安装cpanm

##依赖模块
yum -y install make gcc unzip perl-IO-AIO perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
##安装方式一
wget https://raw.githubusercontent.com/miyagawa/cpanminus/master/cpanm -O /usr/bin/cpanm
chmod +x /usr/bin/cpanm
##安装方式二
yum安装
yum install perl-App-cpanminus.noarch
注意:安装完成后,root及非root用户都可以使用cpanm安装模块,root用户直接用cpanm modulename安装即可,非root用户安装命令也
是一样的,但是会由于权限问题(permission denied)导致错误,因为使用yum安装的cpanm会默认安装到/root/perl5目录下,所以对于普
通用户来说,要想把模块安装到自己目录,需要在环境变量中加入如下参数:
vim ~/.bashrc
编辑环境变量
#cpanm lib
export PERL_CPANM_OPT="--prompt --reinstall -l ~/perl5 --mirror http://cpan.cpantesters.org" #指定cpanm模块安装路径为~/perl5,及mirror网址
export PERL5LIB=/home/usrname/perl5/lib/perl5:$PERL5LIB #添加lib环境变量
使环境变量生效
source ~/.bashrc

3.安装各个模块

~]# cpanm DBD::mysql
~]# cpanm MogileFS::Server
~]# cpanm MogileFS::Utils
~]# cpanm MogileFS::Client
~]# cpanm Danga::Socket
~]# cpanm App::cpanminus

若出现如下问题解决办法

Configuring ExtUtils-MakeMaker-7.36 ... OK
Can't locate ExtUtils/Manifest.pm in @INC (@INC contains: FatPacked::9927560=HASH(0x977b88) 
/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl 
/usr/lib64/perl5 /usr/share/perl5 .) at /usr/bin/cpanm line 132.
##解决办法
~]# yum install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker
##补充安装DBD::mysql
yum install "perl(DBD::mysql)"

4.推荐安装方式

下载各个rpm包进行上传yum安装
[root@linux-node3 ~]# ll
总用量 624
-rw-r--r-- 1 root root 1984 7月 16 2017 MogileFS-Server-2.46-2.el7.centos.noarch.rpm
-rw-r--r-- 1 root root 177468 7月 16 2017 MogileFS-Server-mogilefsd-2.46-2.el7.centos.noarch.rpm
-rw-r--r-- 1 root root 26980 7月 16 2017 MogileFS-Server-mogstored-2.46-2.el7.centos.noarch.rpm
-rw-r--r-- 1 root root 77000 7月 16 2017 MogileFS-Utils-2.19-1.el7.centos.noarch.rpm
-rw-r--r-- 1 root root 11208 7月 18 2017 nginx_mogilefs_module-1.0.4.tar.gz
-rw-r--r-- 1 root root 28111 11月 9 2015 perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
-rw-r--r-- 1 root root 30348 7月 16 2017 perl-MogileFS-Client-1.14-1.el7.centos.noarch.rpm
-rw-r--r-- 1 root root 268620 7月 16 2017 perl-Perlbal-1.78-1.el6.noarch.rpm
#安装依赖环境
yum install perl-Net-Netmask perl-IO-stringy perl-Sys-Syslog perl-IO-AIO -y 
#安装rpm包
yum install *.rpm -y
链接:https://pan.baidu.com/s/1mIWJaReMiHPF4jCaitxPlg 
提取码:qkwy

5.数据库初始化

[root@linux-node1 ~]# mogdbsetup --dbhost=localhost --dbport=3306 --dbname=mogilefs --dbrootuser=root --dbuser=moguser --dbpass=mogpass
[root@linux-node1 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 5.6.44 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mogilefs           |
| mysql              |
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)

mysql> 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
mysql> 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     |
+----------------------+
17 rows in set (0.00 sec)

##若执行不成功,进行授权
mysql> grant all on mogilefs.* to 'moguser'@'118.190.%.%' identified by 'mogpass';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

6.配置数据库及其他配置文件

进入目录 cd /usr/local 
创建文件夹 mkdir mogilefs
进入目录 cd mogilefs
创建mogilefsd.conf文件 vim mogilefsd.conf
mogilefsd.conf内容 
[root@linux-node1 local]# grep -v "^$" mogilefsd.conf
[root@linux-node1 mogilefs]# cat mogilefsd.conf
#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:mogilefs:host=localhost
db_user = moguser
db_pass = mogpass
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001
# Optional, if you don't define the port above.
conf_port = 7001
# Number of query workers to start by default.
query_jobs = 10
# Number of delete workers to start by default.
delete_jobs = 1
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs = 1
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs = 1
# Minimum amount of space to reserve in megabytes
# default: 100
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space = 200
# Number of seconds to wait for a storage node to respond.
# default: 2
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout = 2
# Number of seconds to wait to connect to a storage node.
# default: 2
# Keep this low so overloaded nodes get skipped.
#conn_timeout = 2
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port = 1

7.创建用户启动

##需要以普通用户启动
adduser mogilefs
##创建启动路径
mkdir -p /var/run/mogilefsd
chown -R mogilefs.mogilefs /var/run/mogilefsd
su - mogile
cd /usr/local/bin
./mogilefsd -c /usr/local/mogilefs/mogilefsd.conf --daemon
[root@linux-node1 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1100/sshd
tcp        0      0 0.0.0.0:7001            0.0.0.0:*               LISTEN      27784/mogilefsd
tcp6       0      0 :::3306                 :::*                    LISTEN      2677/mysqld

3.5部署存储节点

##node2,node3,node4节点部署如下操作都需执行
[root@linux-node2 ~]# mkdir /usr/local/mogilefs
[root@linux-node2 ~]# cd /usr/local/mogilefs
[root@linux-node2 ~]# vim mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501    ##管理接口
docroot = /dfs/mogdata
##创建存储目录
[root@linux-node2 ~]# mkdir /dfs/mogdata -p                      ##专门挂载的存储设备每个挂载目录里只放一个存储目录
[root@linux-node2 ~]# adduser mogilefs
[root@linux-node2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/
[root@linux-node2 ~]# mkdir -p /dfs/mogdata/dev1                 ##创建存储目录
[root@linux-node2 ~]# mkdir -p /dfs/mogdata/dev3                 ##可不用执行
[root@linux-node2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/dev1/
[root@linux-node2 ~]# chown -R mogilefs.mogilefs /dfs/mogdata/dev3/
##node3节点创建存储目录
[root@linux-node3 mogilefs]# mkdir -p /dfs/mogdata/dev2
[root@linux-node3 mogilefs]# chown -R mogilefs.mogilefs /dfs/mogdata/dev2/
##启动服务
[root@linux-node2 ~]# mogstored -c /usr/local/mogilefs/mogstored.conf --daemon
[root@linux-node2 ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:7500            0.0.0.0:*               LISTEN      20917/mogstored
tcp        0      0 0.0.0.0:7501            0.0.0.0:*               LISTEN      20917/mogstored

4.添加mogstored节点进行测试

4.1Tracker节点进行操作

##监测Tracker状态
[root@linux-node1 mogilefs]# mogadm --trackers=118.190.201.11:7001 check
Checking trackers...
 118.190.201.11:7001 ... OK

Checking hosts...
No devices found on tracker(s).

##进行添加mogstored节点
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host add 118.190.201.12 --ip=118.190.201.12 --status=alive
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host list
118.190.201.12 [1]: alive
  IP:       118.190.201.12:7500

##添加设备
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device list  ##列出当前设备
118.190.201.12 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device add 118.190.201.12 001  ##添加
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device add 118.190.201.12 003
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device list
118.190.201.12 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      1.321     44.246     45.567        100
   dev3:   alive      1.487     45.954     47.441        100
##创建domain,任何一个所有存储空间里面是以domain来区分名称空间
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 domain add files  ##名称随意
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE

##添加node3节点
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host add 118.190.201.13 --ip=118.190.201.13 --status=alive
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 host list
118.190.201.12 [1]: alive
  IP:       118.190.201.12:7500

118.190.201.13 [2]: alive
  IP:       118.190.201.13:7500
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device add 118.190.201.13 002
[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 device list
118.190.201.12 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      1.487     45.954     47.441        100
   dev3:   alive      1.487     45.954     47.441        100

118.190.201.13 [2]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.321     44.246     45.567        100

4.2上传文件

[root@linux-node1 ~]# mogupload --trackers=118.190.201.11:7001 --domain=files --key='fstab.html' --file='/etc/fstab'

1.列出所有key

[root@linux-node1 ~]# moglistkeys --trackers=118.190.201.11:7001 --domain=files
fstab.html

2.获取file信息及访问路径

[root@linux-node1 ~]# mogfileinfo --tracker=118.190.201.11:7001 --domain=files --key='fstab.html'
- file: fstab.html
     class:              default
  devcount:                    1
    domain:                files
       fid:                    5
       key:           fstab.html
    length:                  465
 - http://118.190.201.13:7500/dev2/0/000/000/0000000005.fid   ###可复制浏览器访问

4.3创建专门存储图片的domain

[root@linux-node1 ~]# mogadm --trackers=118.190.201.11:7001 domain add images
[root@linux-node1 ~]# mogupload --trackers=118.190.201.11:7001 --domain=images --key='/logo.png' --file='/usr/share/backgrounds/default.png'
[root@linux-node1 ~]# mogfileinfo --tracker=118.190.201.11:7001 --domain=images --key='/logo.png'
- file: /logo.png
 class: default
 devcount: 1
 domain: images
 fid: 6
 key: /logo.png
 length: 2724666
 - http://118.190.201.13:7500/dev2/0/000/000/0000000006.fid

命令小结

mogadm --trackers=118.190.201.11:7001 device  mark 118.190.201.13 dev2 down ##关闭存储节点
mogfetch --trackers=118.190.201.11 --domain=files --key='fstab.html' --file='./output.txt' ##下载文件到本地

 

0
如无特殊说明,文章均为本站原创,转载请注明出处

该文章由 发布

这货来去如风,什么鬼都没留下!!!