kv模型及redis搭建订阅、分布式存储及mogileFS

1、简述存储系统的三种分类及KV模型

存储系统的三种分类

1).对象存储

通常意义的键值存储,其接口就是简单的GET、PUT、DEL 和其他扩展,代表主要有 Swift 、S3 以及 Gluster 等;

2).块存储

这种接口通常以 QEMU Driver 或者 Kernel Module 的方式存在,这种接口需要实现 Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口,如 Sheepdog,AWS 的 EBS,青云的云硬盘和阿里云的盘古系统,还有 Ceph 的 RBD(RBD是Ceph面向块存储的接口)。在常见的存储中 DAS、SAN 提供的也是块存储;

3).文件存储

通常意义是支持 POSIX 接口,它跟传统的文件系统如 Ext4 是一个类型的,但区别在于分布式存储提供了并行化的能力,如 Ceph 的 CephFS (CephFS是Ceph面向文件存储的接口),但是有时候又会把 GlusterFS ,HDFS 这种非POSIX接口的类文件存储接口归入此类。当然 NFS、NAS也是属于文件系统存储;

kv模型的数据库

这一类数据库主要会使用到哈希表,在这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。

key value:键值存储,最著名产品的是DynamoDB, redis
内存数据库从范型上可以分为关系型内存数据库和键值型内存数据库。
在实际应用中内存数据库主要是配合oracle或mysql等大型关系数据库使用,关注性能。
作用类似于缓存,并不注重数据完整性和数据一致性。
基于键值型的内存数据库比关系型更加易于使用,性能和可扩展性更好,因此在应用上比关系型的内存数据库使用更多。

1).Memcached

Memcached是一种基于Key-Value开源缓存服务器系统,主要用做数据库的数据高速缓冲,并不能完全称为数据库。
memcached的API使用三十二位元的循环冗余校验(CRC-32)计算键值后,将资料分散在不同的机器上。当表格满了以后,接下来新增的资料会以LRU机制替换掉。由于 memcached通常只是当作缓存系统使用,所以使用memcached的应用程式在写回较慢的系统时(像是后端的数据库)需要额外的程序更新memcached内的资料。

2).Redis

Redis是一个高性能的key-value数据库。redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了C++、Java、Python,Ruby,Erlang,PHP客户端。

2、搭建redis服务并实现持久化存储、订阅和复制功能

1).发布信息

命令:publish channle message

2).订阅信息

命令:subscribe channle1 channel2 ...

3).注意

一、接收消息,必须先订阅消息
二、订阅之前,发布的消息无法接收到

4).使用通配符订阅信息

命令:psubscribe pattern1 pattern2 ...

5).redis 持久化

持久化的方式
主从:通过从服务器保存和持久化
日志:操作生成相关日志,并通过日志恢复数据
redis持久化方式
rdb:快照持久化。
aof:日志持久化
redis-rdb快照持久化配置,redis.conf文件
save 900 1  #900秒之后至少一个关键字发生变化,刷新快照到硬盘上
save 300 10 #300秒之后至少十个关键字发生变化,刷新快照到硬盘上
save 60 10000 #60秒之后至少10000个关键字发生变化,刷新快照到硬盘上
stop-writes-on-bgsave-error yes #后台存储错误时停止写操作
rdbchecksum yes #存储和加载rdb文件的时候校验
rdbcompression yes #使用LZF压缩rdb文件
dbfilename dump.rdb #设置rdb文件名
dir ./ #设置工作目录,rdb文件会写入到该目录
redis-rdb快照持久化的缺陷
由于rdb持久化方式是通过在某些时间点检查是否满足持久化要求的条件,从而判断是否进行持久化,这样的话如果在的时间点发生异常,但是还没有达到持久化要求,这样会使得数据丢失。
redis-aof日志持久化配置,redis.conf文件
appendonly no #是否打开aof日志功能,yes打开,no关闭
appendfilename "appendonly.aof" #日志文件名称
appendfsync always # 写入日志文件的时机配置,always:每一个命令都立即同步到aof,安全,速度慢;everysec:每一秒钟写一次;no:写入的工作交给操作系统,由操作系统判断缓冲区的大小统一写入到aof日志,同步频率低,速度快
no-appendfsync-on-rewrite no # 正在导出rdb的过程中要不要停止同步aof。no:不停止;yes:停止
auto-aof-rewrite-percentage 100 #aof文件大小比重写时的大小增长率100%时重写
auto-aof-rewrite-min-size 64mb #aof文件至少超过64M时重写

3、简述通用的分布式存储及专用的分布式存储

参考链接:
https://blog.csdn.net/qq_15103197/article/details/82876688
https://blog.csdn.net/xuensong520/article/details/48269477

一、专用分布式存储系统

1、最早的分布式系统:Google File System: GFS Google的第一代分布式系统
image
  • Google公司为了满足本公司需求而开发的基于Linux的专有分布式文件系统。一 个GFS集群由一个master和大量的chunkserver构成,并被许多客户(Client)访问。

  • 一个GFS包括一个主服务器(master)和多个块服务器(chunk server),这样一个GFS能够同时为多个客户端应用程序(Application)提供文件服务。文件被划分为固定的块,由主服务器安排存放到块服务器的本地硬盘上。主服务器会记录存放位置等数据,并负责维护和管理文件系统,包括块的租用、垃圾块的回收以及块在不同块服务器之间的迁移。此外,主服务器还周期性地与每个块服务器通过消息交互,以监视运行状态或下达命令。应用程序通过与主服务器和块服务器的交互来实现对应用数据的读写,应用与主服务器之间的交互仅限于元数据,也就是一些控制数据,其他的数据操作都是直接与块服务器交互的。这种控制与业务相分离的架构,在互联网产品方案上较为广泛,也较为成功。

2、Hadoop Distributed FileSystem 仿照google分布式系统
  • Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。

  • Hadoop 由许多元素构成。其最底部是 Hadoop Distributed File System(HDFS),它存储 Hadoop 集群中所有存储节点上的文件。HDFS的上一层是MapReduce引擎,该引擎由 JobTrackers 和 TaskTrackers 组成。通过对Hadoop分布式计算平台最核心的分布式文件系统HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库Hbase的介绍,基本涵盖了Hadoop分布式平台的所有技术核心。

  • HDFS对外部客户机而言,就像一个传统的分级文件系统。可以创建、删除、移动或重命名文件,等等。但是 HDFS 的架构是基于一组特定的节点构建的,这是由它自身的特点决定的。这些节点包括 NameNode(仅一个),它在 HDFS 内部提供元数据服务;DataNode,它为 HDFS 提供存储块。由于仅存在一个 NameNode,因此这是 HDFS 的一个缺点(单点失败)。

  • 存储在 HDFS 中的文件被分成块,然后将这些块复制到多个计算机中(DataNode)。这与传统的 RAID 架构大不相同。块的大小(通常为 64MB)和复制的块数量在创建文件时由客户机决定。NameNode 可以控制所有文件操作。HDFS 内部的所有通信都基于标准的 TCP/IP协议。

3、TFS:Taobao Filesystem 淘宝分布式系统

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

4、GlusterFS 去中心化设计分布式系统

  • Glusterfs是一个开源的分布式文件系统,是Scale存储的核心,能够处理千数量级的客户端.在传统的解决 方案中能够灵活的结合物理的,虚拟的和云资源去体现高可用和企业级的性能存储.

  • Glusterfs通过TCP/IP或InfiniBand RDMA网络链接将客户端的存储资块源聚集在一起,使用单一的全局命名空间来管理数据,磁盘和内存资源.

  • Glusterfs基于堆叠的用户空间设计,可以为不同的工作负载提供高优的性能.

  • Glusterfs支持运行在任何标准IP网络上标准应用程序的标准客户端,用户可以在全局统一的命名空间中使用NFS/CIFS等标准协议来访问应用数据.

5、Lustre HPC

  • 一个具有高性能、支持高并发读写、文件共享的存储系统。Lustre在HPC领域被广泛使用,由于Lustre文件系统本身无数据安全机制,必须构建于稳定的磁盘阵列之上,通过硬件的稳定性来解决数据的安全性。
    硬件层面可以从两个方面来保证数据的安全性。系统由RAID组、节点冗余组成。

  • 这里节点冗余包括MDS和OSS节点,2个MDS节点互为active/stanby模式,两个OSS节点均为active模式。基本上实现数据访问不中断。

6、Ceph内核级别构建分布式存储系统

  • Ceph是可靠的、可扩展的、统一的、分布式的存储系统。可以同时提供对象存储RADOSGW(Reliable、Autonomic、Distributed、Object Storage Gateway)、块存储RBD(Rados Block Device)、文件系统存储Ceph FS(Ceph Filesystem)3种功能。
  • Ceph可以提供对象存储、块设备存储和文件系统服务,其对象存储可以对接网盘(owncloud)应用业务等;其块设备存储可以对接(IaaS),当前主流的IaaS运平台软件,如:OpenStack、CloudStack、Zstack、Eucalyptus等以及kvm等。

二、轻量级分布式存储

1、Mogile Filesystem 分布式存储 perl语言研发

2、Moose Filesystem (MFS)

3、fastDFS 国内开源项目 C语言研发


4、前端nginx反代后端mogilefs存储实战实例

参考文档:
http://www.tuicool.com/articles/YniEnyf
http://joelhy.github.io/2015/01/27/FastDFS-v5-06-deploy/
https://blog.csdn.net/wangyj_bk/article/details/78858056

一、MogileFS存储

1、MogileFS分布式文件存储系统

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

2、MogileFS由3个部分组成:

image
  • (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等,用这个模块可以编写客户端程序,实现文件的备份管理功能等。

3、设备定义

存储主机(节点)

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

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

image
存储Domain域
  • 一个MogileFS可以有多个Domain
  • 用来存放不同的文件(大小、类型)
  • 同一个Domain内,key必需唯一
  • 不同的Domain内,key可以相同
存储Class类
  • 文件属性
  • 定义文件存储在不同设备上的分数
存储key(Fid)文件地址
  • Domain和文件的key(Fid)一起定位文件位置

二、MogileFS存储安装

1、cpan安装

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

# cpan
App::cpanminus
MogileFS::Server
MogileFS::Utils
IO::AIO
IO::WrapTie
Danga::Socket

2、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

所有的perl程序可以编译运行:
# perl Makefile.PL
# make
# make test
# make install

# cpan -i App::cpanminus
cpan> install App:cpanminus

# cpan MogileFS::Server

conf:
/etc/mogilefs/{mogifsd.conf, mogstored.conf}

3、rpm安装,centos6支持较好

相关rpm包下载地址:http://rpmfind.net/
http://mirrors.sahedev.com/

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
perl-Perlbal-1.78-1.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm

三、nginx反代后端mogilefs存储示例

使用CentOS 7环境部署
192.168.1.22----节点1+mysql
192.168.1.60----节点2
192.168.1.61----节点3
192.168.1.62----nginx代理

节点1

#下载程序包
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Server-2.46-2.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Utils-2.19-1.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/Perlbal-1.78-1.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/perl-MogileFS-Client-1.14-1.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/perl-Net-Netmask-1.9015-8.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/perl-Perlbal-1.78-1.el6.noarch.rpm
 wget http://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm

由于依赖于perl环境所以先安装epel源

#安装epel源和perl依赖包
[root@mongilefs-22 ~]# yum install epel-release
[root@mongilefs-22 ~]#yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y

[root@mongilefs-22 ~]# ls
Perlbal-1.78-1.el6.noarch.rpm
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm   #依赖包 
 perl-MogileFS-Client-1.14-1.el6.noarch.rpm    #tracker组件,调度查询管理组件
MogileFS-Server-2.46-2.el6.noarch.rpm            #核心服务公共组件,都需要安装     
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm 
perl-Perlbal-1.78-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm  #storage存储节点

#安装perl的rpm包
[root@mongilefs-22 ~]# yum install ./*.rpm -y

#安装数据库
[root@mongilefs-22 ~]# yum install mariadb-server -y

#查看文件目录属主属组
[root@mongilefs-22 ~]# ls -ld /var/run/mogilefsd/
drwxr-xr-x 2 mogilefs mogilefs 40 Oct  8  2013 /var/run/mogilefsd/

#编辑配置文件
[root@mongilefs-22 ~]# cd /etc/mogilefs/
[root@mongilefs-22 mogilefs]# cp mogilefsd.conf{,.bak}
[root@mongilefs-22 mogilefs]# vim mogilefsd.conf

daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
DBI:mysql:mogilefs:host=192.168.1.22  #驱动格式:数据库类型:数据库名称:数据库主机ip
db_user = moguser  #数据库用户
db_pass = mogpass #数据库密码
listen = 0.0.0.0:7001 #监听端口
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5

#数据库初始化
[root@mongilefs-22 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve = ON
innodb_file_per_table = ON
[root@mongilefs-22 ~]# systemctl start mariadb

#自定义创建数据库用户
MariaDB [(none)]> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.1.%' IDENTIFIED BY 'mogpass';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

#初始化
[root@mongilefs-22 ~]# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=mogpass

Continue? [N/y]: y #是否初始化数据库
Create/Upgrade database name 'mogilefs'? [Y/n]: y #是否创建数据库
Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y  #是否创建数据库用户
![image.png](https://upload-images.jianshu.io/upload_images/11999111-a75b7bcffce1dd2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

#启动mogilefsd报错
[root@mongilefs-22 ~]# service mogilefsd start
Starting mogilefsd (via systemctl):  Job for mogilefsd.service failed because a configured resource limit was exceeded. See "systemctl status mogilefsd.service" and "journalctl -xe" for details.                                                        [FAILED]
#结束mogilefsd进程并删除pid文件   
[root@mongilefs-22 ~]# killall mogilefsd
[root@mongilefs-22 ~]# rm /var/run/mogilefsd/mogilefsd.pid 
rm: remove regular file ‘/var/run/mogilefsd/mogilefsd.pid’? y
[root@mongilefs-22 ~]# rm /var/lock/subsys/mogilefsd 
rm: remove regular empty file ‘/var/lock/subsys/mogilefsd’? y
# 启动
[root@mongilefs-22 ~]# service mogilefsd start
Starting mogilefsd (via systemctl):                        [  OK  ]

#设置
[root@mongilefs-22 ~]# cd /etc/mogilefs
[root@mongilefs-22 mogilefs]# cp mogstored.conf {,.bak}
[root@mongilefs-22 mogilefs]# vim mogstored.conf 

maxconns = 10000  #最大连接数
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogilefs/data #储存路径
#创建存储目录,设置属主组为mogilefs
[root@mongilefs-22 mogilefs]# mkdir /mogilefs/data/dev1 -pv
[root@mongilefs-22 mogilefs]# chown -R mogilefs.mogilefs /mogilefs/
c
#启动mogstored,由于centos7原因,启动文件在init.d下启动会报错,所以拷贝出来启动
[root@mongilefs-22 ~]# cp /etc/init.d/mogstored  ./
[root@mongilefs-22 ~]# ./mogstored start
Starting mogstored                                         [  OK  ]

#配置文件拷贝到其他节点上
[root@mongilefs-22 ~]# scp -r /etc/mogilefs/*.conf 192.168.1.60:/etc/mogilefs/
[root@mongilefs-22 ~]# scp -r /etc/mogilefs/*.conf 192.168.1.61:/etc/mogilefs/

#当其他节点启动后,添加主机
[root@mongilefs-22 ~]# mogadm host add 192.168.1.22 --ip=192.168.1.22 --port=7500 --status=alive
[root@mongilefs-22 ~]# mogadm host add 192.168.1.60 --ip=192.168.1.60 --port=7500 --status=alive
[root@mongilefs-22 ~]# mogadm host add 192.168.1.61 --ip=192.168.1.61 --port=7500 --status=alive

#检查主机情况
[root@mongilefs-22 ~]# mogadm check
Checking trackers...
  127.0.0.1:7001 ... OK

Checking hosts...
  [ 1] 192.168.1.22 ... OK
  [ 2] 192.168.1.60 ... OK
  [ 3] 192.168.1.61 ... OK

#添加储存设备
[root@mongilefs-22 ~]# mogadm device add 192.168.1.22 1
[root@mongilefs-22 ~]# mogadm device add 192.168.1.60 2
[root@mongilefs-22 ~]# mogadm device add 192.168.1.61 3
[root@mongilefs-22 ~]# mogadm device list
192.168.1.22 [1]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev1:   alive      1.267      6.720      7.986        100

192.168.1.60 [4]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev2:   alive      1.126      6.860      7.986        100

192.168.1.61 [5]: alive
                    used(G)    free(G)   total(G)  weight(%)
   dev3:   alive      1.126      6.860      7.986        100

节点2和节点3配置

#同步时间
#安装epel源
[root@node-60 ~]# yum install epel-release
[root@node-60 ~]#yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y

#安装rpm包
[root@node-60 ~]# ls
anaconda-ks.cfg
mha4mysql-node-0.56-0.el6.noarch.rpm
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
percona-toolkit-3.0.12-1.el7.x86_64.rpm
Perlbal-1.78-1.el6.noarch.rpm
perl-Danga-Socket-1.61-1.el6.rf.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

#创建目录
[root@node-60 ~]# mkdir -pv /mogilefs/data/dev2
[root@node-60 ~]# chown -R mogilefs.mogilefs /mogilefs/

#其他节点拷贝过来的配置文件,所以可以直接启动mogstored,由于centos7原因,启动文件在init.d下启动会报错,所以拷贝出来启动
[root@node-60 ~]# cp /etc/init.d/mogstored  ./
[root@node-60 ~]# ./mogstored start
Starting mogstored                                         [  OK  ]

#启动trarkers
[root@node-60 ~]# cp /etc/init.d/mogilefsd ./
[root@node-60 ~]# ./mogilefsd start
Starting mogilefsd                                         [  OK  ]

mog工具

mogadm       
mogdelete   #删除文件
mogfileinfo #看文件信息
moglistkeys #列出所有文件的键
mogstored
mogautomount
mogfetch  #获取文件
mogilefsd    
mogrename   
mogtool
mogdbsetup   
 mogfiledebug  
moglistfids   #列出所有文件的id
mogstats     
 mogupload #上传文件

#文件一致性检测
[root@mongilefs-22 ~]# mogadm fsck start | stop   

#文件系统信息
[root@mongilefs-22 ~]# mogadm fsck status

    Running: No
     Status: 38 / 38 (100.00%)
       Time: 5s (7 fids/s; 0s remain)
 Check Type: Normal (check policy + files)

 [num_POVI]: 3

#检测结果
[root@mongilefs-22 ~]# mogadm fsck printlog
unixtime             event           fid      devid
1542121262            POVI            38          -
1542121262            POVI            37          -
1542121262            POVI            30          -

#负载均衡策略
[root@mongilefs-22 ~]# mogadm rebalance test
#使用默认规则policy
[root@mongilefs-22 ~]# mogadm rebalance policy
#显示负载均衡策略
[root@mongilefs-22 ~]# mogadm rebalance settings

mogilefs使用

 #创建imgs域和text域
[root@mongilefs-22 ~]# mogadm domain add imgs 
[root@mongilefs-22 ~]# mogadm domain add text

#查询当前域,副本存储2个
[root@mongilefs-22 ~]# mogadm domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 imgs                 default                   2        MultipleHosts() NONE    

 text                 default                   2        MultipleHosts() NONE   

#在imgs域中创建png类,哈希类型为MD5,副本存储3个
[root@mongilefs-22 ~]# mogadm class add imgs png --hashtype=MD5 --mindevcount=3

#在imgs域中创建jpg类,哈希类型为空,副本存储2个
[root@mongilefs-22 ~]# mogadm class add imgs jpg --hashtype=NONE --mindevcount=2

#查询当前类
[root@mongilefs-22 ~]# mogadm class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 imgs                 default                   2        MultipleHosts() NONE   
 imgs                 jpg                       2        MultipleHosts() NONE   
 imgs                 png                       3        MultipleHosts() MD5    

 text                 default                   2        MultipleHosts() NONE

mog上传文件

#上传图片文件到imgs域,key为1.jpg
[root@mongilefs-22 ~]# mogupload --trackers=192.168.1.22 --domain=imgs --key='1.jpg' --file='/usr/share/kde4/apps/ksplash/Themes/CentOS7/2560x1600/background.jpg'

#查询上传图片位置  
[root@mongilefs-22 ~]# mogfileinfo --trackers=192.168.1.22 --domain=imgs --key='1.jpg'
- file: 1.jpg
     class:              default
  devcount:                    1
    domain:                 imgs
       fid:                   30
       key:               1.jpg
    length:               961243
 - http://192.168.1.61:7500/dev3/0/000/000/0000000030.fid  
 #文件id位置,存储到节点2服务器上

#上传图片文件到imgs域,jpg类中,key为2.jpg
[root@mongilefs-22 ~]# mogupload --trackers=192.168.1.22 --domain=imgs --class=jpg --key='2.jpg' --file='/usr/share/wallpapers/CentOS7/contents/images/2560x1600.jpg'
[root@mongilefs-22 ~]# mogfileinfo --trackers=192.168.1.22 --domain=imgs --key='2.jpg'
- file: 2.jpg
     class:                  jpg
  devcount:                    1
    domain:                 imgs
       fid:                   31
       key:               2.jpg
    length:               961243
 - http://192.168.1.60:7500/dev2/0/000/000/0000000031.fid
 #文件id位置,存储到节点1服务器上

测试两个tracker可用

#查询节点1
[root@node-60 ~]# mogrileinfo --trackers=192.168.1.60 --domain=imgs --key='2.jpg' 
-bash: mogrileinfo: command not found
[root@node-60 ~]# mogfileinfo --trackers=192.168.1.60 --domain=imgs --key='2.jpg' 
- file: 2.jpg
     class:                  jpg
  devcount:                    1
    domain:                 imgs
       fid:                   31
       key:               2.jpg
    length:               961243
 - http://192.168.1.60:7500/dev2/0/000/000/0000000031.fid

##查询节点2,得到结果和节点1一致,证明两个tracker节点正常可用
[root@node-60 ~]# mogfileinfo --trackers=192.168.1.61 --domain=imgs --key='2.jpg' 
- file: 2.jpg
     class:                  jpg
  devcount:                    1
    domain:                 imgs
       fid:                   31
       key:               2.jpg
    length:               961243
 - http://192.168.1.60:7500/dev2/0/000/000/0000000031.fid

image

安装nginx反代服务器

#安装开发组件
[root@node-62 ~]# yum groupinstall "Development Tools" "Server Platform Development" -y

#安装支持正则表达式组件
[root@node-62 ~]# yum install pcre-devel openssl-devel -y

#添加nginx用户
[root@node-62 ~]# useradd -r nginx
[root@node-62 ~]# id nginx
uid=998(nginx) gid=996(nginx) groups=996(nginx)

#下载编译安装nginx
[root@node-62 ~]# wget http://nginx.org/download/nginx-1.6.3.tar.gz

[root@node-62 ~]# wget http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.tar.gz

[root@node-62 ~]# cd nginx-1.6.3
[root@node-62 nginx-1.6.3]#  ./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=../nginx_mogilefs_module-1.0.4

#跳过编译错误
[root@node-62 nginx-1.6.3]# make CFLAGS="-pipe  -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g"

#安装
[root@node-62 nginx-1.6.3]# make install

#启动nginx
[root@node-62 ~]# vim /etc/rc.d/init.d/nginx #编辑启动脚本
#!/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|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

[root@node-62 ~]# chmod +x /etc/rc.d/init.d/nginx 
[root@node-62 ~]# service nginx start
Reloading systemd:                                         [  OK  ]

#添加至服务管理列表,并让其开机自动启动:
[root@node-62 ~]#  chkconfig --add nginx
[root@node-62 ~]#  chkconfig nginx on

#编辑nginx反代规则
[root@node-62 ~]# cd /etc/nginx
[root@node-62 nginx]# cp nginx.conf{,.bak}
[root@node-62 nginx]# vim nginx.conf
......
worker_processes  auto;
......
upstream mogsrvs {              #定义服务器组
        server 192.168.1.22:7001;
        server 192.168.1.60:7001;
        server 192.168.1.61:7001;

         }

   server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main; 

        location / {
            root   html;
            index  index.html index.htm;
        }
     location /imgs/ {
          mogilefs_tracker mogsrvs; #调用服务器组
         mogilefs_domain imgs; #默认域
          mogilefs_class png jpg; #默认类

         mogilefs_pass {
         proxy_pass $mogilefs_path;
         proxy_hide_header Content-Type;
         proxy_buffering off;
        }
      }
[root@node-62 nginx]# nginx -t #语法检查
[root@node-62 nginx]# nginx -s reload #重载nginx

image
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容