分布式存储集群MogileFS的详细部署

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

一、常见的分布式存储系统

  目前我们使用的分布式存储方面的应用均是有google的几篇论文演化出来的,下面就是这几篇论文所出现的架构:

      Google File System(大规模分散文件系统) :用于分布式存储

      MapReduce (大规模分散FrameWork) :用于分布式计算

      BigTable(大规模分散数据库) :用于列式数据库

      Chubby(分散锁服务)

1、GFS(Google File System)

    Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。 下面分布式文件系统都是类 GFS的产品。

2、HDFS

    Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。

3、Ceph

    是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。并使用Ceph完成了他的论文。 说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。 可是ceph太不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。

4、Lustre

    Lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由甲骨文公司开发和维护的。 该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统。 目前Lustre已经运用在一些领域,例如HP SFS产品等。

5、MogileFS

    由memcahed的开发公司danga一款perl开发的产品,目前国内使用mogielFS的有图片托管网站yupoo等。 MogileFS是一套高效的文件自动备份组件,由Six Apart开发,广泛应用在包括LiveJournal等web2.0站点上。 

MogileFS由3个部分组成:

  第1个部分是server端,包括mogilefsd和mogstored两个程序。前者即是 mogilefsd的tracker,它将一些全局信息保存在数据库里,例如站点domain,class,host等。后者即是存储节点(store node),它其实是个HTTP Daemon,默认侦听在7500端口,接受客户端的文件备份请求。在安装完后,要运行mogadm工具将所有的store node注册到mogilefsd的数据库里,mogilefsd会对这些节点进行管理和监控。

  第2个部分是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。

  第3个部分是客户端API,目前只有Perl API(MogileFS.pm)、PHP,用这个模块可以编写客户端程序,实现文件的备份管理功能。

6、MooseFS

    支持FUSE,相对比较轻量级,对master服务器有单点依赖,用perl编写,性能相对较差,国内用的人比较多。

7、FastDFS

   是一款类似Google FS的开源分布式文件系统,是纯C语言开发的。 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。

8、TFS

   TFS(Taobao !FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,主要针对海量的非结构化数据,它构筑在普通的Linux机器 集群上,可为外部提供高可靠和高并发的存储访问。TFS为淘宝提供海量小文件存储,通常文件大小不超过1M,满足了淘宝对小文件存储的需求,被广泛地应用 在淘宝各项应用中。它采用了HA架构和平滑扩容,保证了整个文件系统的可用性和扩展性。同时扁平化的数据组织结构,可将文件名映射到文件的物理地址,简化 了文件的访问流程,一定程度上为TFS提供了良好的读写性能。

9、GridFS文件系统

   MongoDB是一种知名的NoSql数据库,GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文件内容,文件内容按一定大小分成若干块,每一块存在一个Document中,这种方法不仅提供了文件存储,还提供了对文件相关的一些附加属性(比如MD5值,文件名等等)的存储。文件在GridFS中会按4MB为单位进行分块存储。


二、MogileFS

1、MogileFS的特性 

     应用层提供服务,不需要使用核心组件 

     无单点(tracker(跟踪点)mogstore(存储节点)database(MySQL)) 

     自动文件复制:复制的最小单位不是文件,而是class 

     传输中立:无特殊协议,可以通过NFS或HTTP实现通信 

     简单的命名空间:没有目录,直接存在存储空间上,通过域来实现 

     不共享任何数据:

2、Mogilefs基本原理

    MogileFS是一个开源的分布式文件系统,用于组建分布式文件集群,由LiveJournal旗下DangaInteractive公司开发,Danga团队开发了包括 Memcached、MogileFS、Perlbal等不错的开源项目:(注:Perlbal是一个强大的Perl写的反向代理服务器)。其主要特性包括:应用层的组件、无单点故障、自动文件复制、具有比RAID更好的可靠性、无需RAID支持等……核心角色如下:

   Tracker节点:借助数据库保存各节点文件的元数据信息,保存每个域中所有键的存储位置分布,方便检索定位数据位置的同时监控各节点,告诉客户端存储区位置并指挥storage节点复制数据副本,进程名为mogilefsd(7001)。 

   Database节点:数据库用来存放MogileFS的元数据 (命名空间, 和文件在哪里). 这应该设置一个高可用性(HA)的环境以防止单点失败。

   Storage节点:实际文件存放的地方. 存储节点是一个HTTP服务器,用来做 删除,存放等事情,任何WebDAV服务器都可以,将指定域中的键转换为其特有的文件名存储在指定的设备文件中,转换后的文件名为值,storage节点自动维护键值的对应关系,storage节点前端可以使用nginx进行反向代理,但需要安装nginx-mogilefs-module-master模块进行名称转换,进程名mogstored(7501),perbal(7500)。 

   Domain:一个域中的键值是惟一的,一个MogileFS可以有多个域,域可以用来存储不同应用类型的数据的容器。

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

   Class:复制最小单位,文件属性管理,定义文件存储在不同设备上份数。

三、集群部署

1、集群架构

wKiom1ZT9Z7yuWzhAADcOGSD1Vk679.jpg

2、服务器IP配置情况

名称
hostname IP 安装软件
系统
反向代理 nginx 192.168.0.9 nginx CentOS 6.4 X86
tracker/storage节点 node1 192.168.0.10 mogilefs
CentOS 6.4 X86
tracker/storage节点 node2 192.168.0.11 mogilefs CentOS 6.4 X86
tracker/storage节点 node3 192.168.0.12 mogilefs CentOS 6.4 X86
database节点
mysql 192.168.0.13 mysql CentOS 6.4 X86


四、集群软件安装

1、数据库授权   

 mysql-server的安装我这里不再介绍,我这里是使用的Yum进行安装的。

1
2
3
4
5
6
7
8
mysql> grant all privileges on *.* to  'root' @ '192.168.%.%' ;
Query OK, 0 rows affected (0.00 sec)
 
mysql> grant all on mogilefs.* to  'moguser' @ '192.168.%.%'  identified by  'mogpass' ;
Query OK, 0 rows affected (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)


2、node1节点安装mogilefs

    正常情况下我们可以通过perl进行安装,这里我们为了简便准备了rpm包,大家可以通过附件下载我准备好的rpm安装包。

1
2
3
4
5
6
7
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
1
yum  install  *.rpm perl-IO-AIO -y


3、数据库初始化

    可以通过mogdbsetup -h查看使用帮助,默认选项的可以不用填写

1
mogdbsetup --dbhost=192.168.0.13 --dbuser=moguser --dbpass=mogpass -- yes

    初始化成功之后,可以登陆数据库查看是否生成了表格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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)

4、配置teacker服务

# cat /etc/mogilefs/mogilefsd.conf 

1
2
3
4
5
6
7
8
9
10
11
daemonize = 1                            #是否以守护进程运行
pidfile =  /var/run/mogilefsd/mogilefsd .pid
db_dsn = DBI:mysql:mogilefs:host=192.168.0.13   #定义数据库名及主机
db_user = moguser                        #数据库用户名
db_pass = mogpass                        #数据库用户密码
listen = 0.0.0.0:7001                    #监听地址
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1

 到目前为止,tracker服务配置就算完成了,现在就可以启动tracker服务了,下面我们配置存储服务。

5、mogstored配置

# cat /etc/mogilefs/mogstored.conf 

1
2
3
4
maxconns = 10000
httplisten = 0.0.0.0:7500    
mgmtlisten = 0.0.0.0:7501      #管理接口,和tracker交互
docroot =  /mogdata             #数据存放目录,一般是新磁盘挂在目录

  创建好/mogdata目录,并设定好权限,就可以启动mogstored服务了。

6、node2、node3的配置

    在这里我就不写代码了,node2、node3的配置和node1的配置一模一样,只是不要对数据库进行初始化了,只需安装并且配置tracker和storge就可以了。

    然后启动服务

1
2
service mogstored start
service mogilefsd start

    所有配置好之后要通过netstat -tlnp查看一下服务是否正确启动起来了。

7、增加节点

    我们可以通过命令mogadm -h查看命令的帮助,可以随便选择一个tracker上面进行操作,因为所以的tracker连接的数据库都是一个,所以哪个上面操作效果都是一样的,我们选择node1节点进行操作。

1
2
3
mogadm --trackers=192.168.0.10:7001 host add node1 --ip=192.168.0.10 --status=alive
mogadm --trackers=192.168.0.11:7001 host add node2 --ip=192.168.0.11 --status=alive
mogadm --trackers=192.168.0.12:7001 host add node3 --ip=192.168.0.12 --status=alive

查看添加的host

# mogadm --trackers=192.168.0.10:7001 host list

1
2
3
4
5
6
7
8
node1 [1]: alive
   IP:       192.168.0.10:7500
   
node2 [2]: alive
   IP:       192.168.0.11:7500
   
node3 [3]: alive
   IP:       192.168.0.12:7500

可以看到我们都已经添加上了。


8、添加设备

1
2
3
mogadm --trackers=192.168.0.10:7001 device add node1 1
mogadm --trackers=192.168.0.10:7001 device add node2 2
mogadm --trackers=192.168.0.10:7001 device add node3 3

添加设备时所使用的设备ID号必须要/mogdata中的dev编号一致查看添加的设备

# mogadm --trackers=192.168.0.10:7001 device list

1
2
3
4
5
6
7
8
9
10
11
node1 [1]: alive
                     used(G)     free (G)   total(G)  weight(%)
    dev1:   alive      0.000      0.000      0.000        100
    
node2 [2]: alive
                     used(G)     free (G)   total(G)  weight(%)
    dev2:   alive      0.000      0.000      0.000        100
    
node3 [3]: alive
                     used(G)     free (G)   total(G)  weight(%)
    dev3:   alive      0.000      0.000      0.000        100

    我们可以看到dev1、dev2、dev3的可以空间都为0,那是因为我们还有没有创建,下面我们分别在node1、node2、node3节点的存储目录/mogdata下面创建dev1、dev2、dev3,并设定好属主属组权限,然后重启modstored服务,然后我们在查看添加的设备情况。

1
2
3
4
5
6
7
8
9
10
11
node1 [1]: alive
                     used(G)     free (G)   total(G)  weight(%)
    dev1:   alive      1.079     15.307     16.386        100
    
node2 [2]: alive
                     used(G)     free (G)   total(G)  weight(%)
    dev2:   alive      0.800     15.586     16.386        100
    
node3 [3]: alive
                     used(G)     free (G)   total(G)  weight(%)
    dev3:   alive      0.804     15.582     16.386        100

状态检查

# mogadm --trackers=192.168.0.10:7001 check

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Checking trackers...
   192.168.0.10:7001 ... OK
   
Checking hosts...
   [ 1] node1 ... OK
   [ 2] node2 ... OK
   [ 3] node3 ... OK
   
Checking devices...
   host device         size(G)    used(G)     free (G)   use%   ob state   I /O %
   ---- ------------ ---------- ---------- ---------- ------ ---------- -----
   [ 1] dev1            16.387      1.079     15.307   6.59%  writeable   N /A
   [ 2] dev2            16.387      0.801     15.586   4.89%  writeable   N /A
   [ 3] dev3            16.387      0.804     15.582   4.91%  writeable   N /A
   ---- ------------ ---------- ---------- ---------- ------
              total:    49.160      2.685     46.475   5.46%

9、添加domain

1
2
3
mogadm --trackers=192.168.0.11:7001 domain add files    
mogadm --trackers=192.168.0.11:7001 domain add images
mogadm --trackers=192.168.0.11:7001 domain add html

查看domain信息

# mogadm --trackers=192.168.0.11:7001 domain list

1
2
3
4
5
  domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
  files                default                   2        MultipleHosts() NONE   
  html                 default                   2        MultipleHosts() NONE   
  images               default                   2        MultipleHosts() NONE

10、上传文件

1
2
3
mogupload --trackers=192.168.0.11:7001 --domain=html --key= 'issue.html'  -- file = '/etc/issue'
mogupload --trackers=192.168.0.11:7001 --domain=files --key= 'fstab'  -- file = '/etc/fstab'    
mogupload --trackers=192.168.0.11:7001 --domain=images --key= 'pass.jpg'  -- file = '/etc/passwd'

查看是否上传成功

# mogfileinfo --trackers=192.168.0.11:7001 --domain=html --key='issue.html'

1
2
3
4
5
6
7
8
9
file : issue.html
      class:              default
   devcount:                    2
     domain:                 html
        fid:                    7
        key:           issue.html
     length:                   47
  - http: //192 .168.0.11:7500 /dev2/0/000/000/0000000007 .fid
  - http: //192 .168.0.10:7500 /dev1/0/000/000/0000000007 .fid

mogfileinfo --trackers=192.168.0.11:7001 --domain=images --key='pass.jpg'

1
2
3
4
5
6
7
8
9
file : pass.jpg
      class:              default
   devcount:                    2
     domain:               images
        fid:                    9
        key:             pass.jpg
     length:                  901
  - http: //192 .168.0.12:7500 /dev3/0/000/000/0000000009 .fid
  - http: //192 .168.0.11:7500 /dev2/0/000/000/0000000009 .fid

查看存储结果

# mogstats --config=/etc/mogilefs/mogilefsd.conf

wKiom1ZVVXvwzxRHAAEhnZu-Frc515.jpg

验证结果

wKioL1ZVJCSSJSijAAEZ6qRvn4o023.jpg这里只展示了文件的演示,图片等其他都是可以显示的,我这里不再贴图,下面查看一下我们的存储目录是什么结构

wKiom1ZVJeKQ_607AACqfVf_XhM418.jpg

wKiom1ZVJmCy5vatAACdhTTRXJo655.jpg

wKiom1ZVJm_RdEoMAACLdZY6vNU769.jpg



五、配置nginx反向代理

1、安装nginx


1
2
3
4
5
6
7
groupadd -r nginx
useradd  -r -g nginx nginx
wget http: //nginx .org /download/nginx-1 .8.0. tar .gz
tar  xf nginx-1.8.0. tar .gz 
wget http: //www .grid.net.ru /nginx/download/nginx_mogilefs_module-1 .0.4.zip
unzip nginx_mogilefs_module-1.0.4.zip 
cd  nginx-1.8.0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
. /configure  \
   --prefix= /usr  \
   --sbin-path= /usr/sbin/nginx  \
   --conf-path= /etc/nginx/nginx .conf \
   --error-log-path= /var/log/nginx/error .log \
   --http-log-path= /var/log/nginx/access .log \
   --pid-path= /var/run/nginx/nginx .pid  \
   --lock-path= /var/lock/nginx .lock \
   --user=nginx \
   --group=nginx \
   --with-http_ssl_module \
   --with-http_flv_module \
   --with-http_stub_status_module \
   --with-http_gzip_static_module \
   --http-client-body-temp-path= /var/tmp/nginx/client/  \
   --http-proxy-temp-path= /var/tmp/nginx/proxy/  \
   --http-fastcgi-temp-path= /var/tmp/nginx/fcgi/  \
   --http-uwsgi-temp-path= /var/tmp/nginx/uwsgi  \
   --http-scgi-temp-path= /var/tmp/nginx/scgi  \
   --with-pcre \
   --with-debug \
   --add-module= /root/nginx_mogilefs_module-1 .0.4


1
2
make
make  install

2、提供启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15 
# description:  Nginx is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid
  
# Source function library.
/etc/rc .d /init .d /functions
  
# Source networking configuration.
/etc/sysconfig/network
  
# Check that networking is up.
"$NETWORKING"  "no"  ] &&  exit  0
  
nginx= "/usr/sbin/nginx"
prog=$( basename  $nginx)
  
NGINX_CONF_FILE= "/etc/nginx/nginx.conf"
  
[ -f  /etc/sysconfig/nginx  ] && .  /etc/sysconfig/nginx
  
lockfile= /var/lock/subsys/nginx
  
make_dirs() {
    # make required directories
    user=`nginx -V 2>&1 |  grep  "configure arguments:"  sed  's/[^*]*--user=\([^ ]*\).*/\1/g'  -`
    options=`$nginx -V 2>&1 |  grep  'configure arguments:' `
    for  opt  in  $options;  do
        if  [ ` echo  $opt |  grep  '.*-temp-path' ` ];  then
            value=` echo  $opt |  cut  -d  "="  -f 2`
            if  [ ! -d  "$value"  ];  then
                # echo "creating" $value
                mkdir  -p $value &&  chown  -R $user $value
            fi
        fi
    done
}
  
start() {
     [ -x $nginx ] ||  exit  5
     [ -f $NGINX_CONF_FILE ] ||  exit  6
     make_dirs
     echo  -n $ "Starting $prog: "
     daemon $nginx -c $NGINX_CONF_FILE
     retval=$?
     echo
     [ $retval - eq  0 ] &&  touch  $lockfile
     return  $retval
}
  
stop() {
     echo  -n $ "Stopping $prog: "
     killproc $prog -QUIT
     retval=$?
     echo
     [ $retval - eq  0 ] &&  rm  -f $lockfile
     return  $retval
}
  
restart() {
     configtest ||  return  $?
     stop
     sleep  1
     start
}
  
reload() {
     configtest ||  return  $?
     echo  -n $ "Reloading $prog: "
     killproc $nginx -HUP
     RETVAL=$?
     echo
}
  
force_reload() {
     restart
}
  
configtest() {
   $nginx -t -c $NGINX_CONF_FILE
}
  
rh_status() {
     status $prog
}
  
rh_status_q() {
     rh_status > /dev/null  2>&1
}
  
case  "$1"  in
     start)
         rh_status_q &&  exit  0
         $1
         ;;
     stop)
         rh_status_q ||  exit  0
         $1
         ;;
     restart|configtest)
         $1
         ;;
     reload)
         rh_status_q ||  exit  7
         $1
         ;;
     force-reload)
         force_reload
         ;;
     status)
         rh_status
         ;;
     condrestart|try-restart)
         rh_status_q ||  exit  0
             ;;
     *)
         echo  $ "Usage: $0 {start|stop|status|restart|reload|configtest}"
         exit  2
esac
1
2
chmod  +x  /etc/init .d /nginx
chkconfig nginx on

3、配置nginx

具体配置参数可以查找官方文档,我这里只是贴出一个事例

文档地址:http://www.grid.net.ru/nginx/mogilefs.en.html

# cat /etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
worker_processes  1;
events {
     worker_connections  1024;
}
http {
     include       mime.types;
     default_type  application /octet-stream ;
     sendfile        on;
     keepalive_timeout  65;
upstream trackers {
     server 192.168.0.10:7001;
     server 192.168.0.11:7001;
     server 192.168.0.12:7001;   
  }
   
server {
     listen       80;
     location ~*  /images/   {
        mogilefs_tracker trackers;
        mogilefs_domain images;
        mogilefs_pass  {
             proxy_pass $mogilefs_path;
             proxy_hide_header Content-Type;
             proxy_buffering off;
        }
      }
     location ~*  /html/  {
         mogilefs_tracker trackers;
         mogilefs_domain html;
         mogilefs_pass  {
              proxy_pass $mogilefs_path;
              proxy_hide_header Content-Type;
              proxy_buffering off;
         }
      }
      location ~*  /files/  {  
             mogilefs_tracker trackers;
             mogilefs_domain files;
             mogilefs_methods GET PUT DELETE;          #可以设定对文件的操作方法
             mogilefs_pass {
                 proxy_pass $mogilefs_path;
                 proxy_hide_header Content-Type;
                 proxy_buffering off;
             }
         }
}
}

然后测试我们前面上传的三个文件,

wKioL1ZVUK3CUU0aAAAy4VcOgac706.jpg

wKioL1ZVUK7h12tAAAEV-mcxVHU876.jpg

wKiom1ZVUFKy_JtHAACsaMBhreg688.jpg


到此之后呢,我们可以开发上传文件的程序,和tracker的API进行对接。

附录

    我们知道在每个domain下面都会有一个class,不特定设置的话都是默认的,如下

# mogadm class list

wKiom1ZVWCbjPWaDAAB-HDTYZuQ908.jpg

可以看到files和html都是使用的默认的类,每个文件保存两份(mindevcount),images的类是我后来添加的,添加方法可以查看# mogadm class add -h,我添加命令如下

1
2
3
4
mogadm --trackers=192.168.0.10:7001 class add images class0 --mindevcount=4
mogadm --trackers=192.168.0.10:7001 class add images class1 --mindevcount=4
mogadm --trackers=192.168.0.10:7001 class add images class2 --mindevcount=4
mogadm --trackers=192.168.0.10:7001 class add images class3 --mindevcount=4

具体文件上传的时候可以在原有的基础上面添加--class来说明放到哪个class下面








     本文转自 wzlinux 51CTO博客,原文链接:http://blog.51cto.com/wzlinux/1716499,如需转载请自行联系原作者



相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
Java 测试技术 Linux
jmeter-分布式部署之负载机的设置
jmeter-分布式部署之负载机的设置
46 1
|
4月前
|
关系型数据库 MySQL 网络安全
利用ansbile部署lamp并部署Discuz(非分布式)
利用ansbile部署lamp并部署Discuz(非分布式),实验准备,设置ansbile的hosts文件,在192.168.115.148上完成相关准备,编写roles,执行
53 0
|
5月前
|
数据库
分布式集群时钟同步问题及解决方案
分布式集群时钟同步问题及解决方案
184 1
|
14天前
|
Docker 容器 关系型数据库
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
本期课程将于4月11日19:00开始直播,内容包括源码编译基础知识和实践操作,课程目标是使学员掌握源码编译部署技能,为未来发展奠定基础,期待大家在课程中取得丰富的学习成果!
【PolarDB-X从入门到精通】 第四讲:PolarDB分布式版安装部署(源码编译部署)
|
2月前
|
Java Linux 开发工具
Centos7搭建minio分布式集群
Centos7搭建minio分布式集群
|
3月前
|
存储 负载均衡 大数据
【分布式】集群和分布式
【1月更文挑战第25天】【分布式】集群和分布式
|
3月前
|
存储 分布式计算 负载均衡
集群与分布式:区别与联系
集群与分布式:区别与联系
69 0
|
3月前
|
存储 Kubernetes Cloud Native
云原生离线工作流编排利器 -- 分布式工作流 Argo 集群
云原生离线工作流编排利器 -- 分布式工作流 Argo 集群
105121 2
|
3月前
|
数据库 OceanBase
OceanBase数据库是一个分布式集群产品,在部署时对硬件资源有特定的需求
OceanBase数据库是一个分布式集群产品,在部署时对硬件资源有特定的需求【1月更文挑战第12天】【1月更文挑战第56篇】
29 2
|
3月前
集群和分布式
集群和分布式

热门文章

最新文章