Error[8]: Undefined offset: 111, File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 121
File: /www/wwwroot/outofmemory.cn/tmp/plugin_ss_superseo_model_superseo.php, Line: 473, decode(

共享存储之分布式文件系统应用及MogileFS基础应用

 **什么是分布式存储:
   分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。


分布式文件系统设计目标:
** 访问透明
** 位置透明
** 并发透明
** 失效透明
** 硬件透明
** 可扩展性
** 复制透明
** 迁移透明


CAP理论:

C:Consistency(一致性)  任何一个读 *** 作总是能够读取之前完成的写 *** 作。
A:Availability(可用性) 每一次 *** 作总是能够在确定的时间返回。
P:Partition Tolerance ( 分区容错性 )   在出现网络分区的情况下,仍然能够满足一致性和可用性。

  有科学家都在致力于 CAP  三元素并存的时候,Eric.Brewer教授指出 CAP  永远无法兼顾,只能根据具体应用来权衡和取舍,并且至多两个元素可以共存,后来由两位麻省理工学院的科学家证明此观点是具有前瞻性的,由此形成Brewer的 CAP定理。


  正所谓鱼和熊掌不可兼得,关注一致性就需要处理因系统不可用而带来写 *** 作失败的情况,反之关注可用性就无法保证每次都能读取到最新的写入 *** 作。传统关系型数据库侧重于CA,而非关系型键值数据库则侧重于AP。


  强一致性(ACID):在单机环境中,强一致性可以由数据库的事务来保证;在分布式环境中,强一致性很难做到,即便是做到也会因为分布式事物所带来的性能低下,不适合在互联网的环境中应用。


 弱一致性(包括最终一致性):系统不能保证后续访问返回最新的值,在访问到最新值之前这段时间称之为不一致窗口。  

 最终一致性:是弱一致性的一种特例,存储系统保证如果对象有多次更新,在渡过不一致窗口之后必将放回最后更新的值。  

 服务器的一致性:N代表节点的个数;W代表更新的时候需要确认已经被更新的节点个数; R代表读取数据需要的节点数量。


示意如下:

W + R > N  —->  强一致性(通常N=3,W=R=2)
W=N,R=1   —->  最佳读
W=1,R=N   —->  最佳写
W + R <= N —->  弱一致性


分布式存储及分布式文件系统概论

集中式:
共享存储:
  NAS
  SAN

分布式存储:
  专用的元数据节点:集中元数据存储,数据节点至负责存储数据
  无专用元数据几点:所有数据均完整存储元数据,存储了部分数据

分布式:
  文件系统:有文件系统接口:一般挂载使用
  存储:无文件系统接口,通过API访问


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

X/Open:XA
DTP:Distributed Transcationn Processing Reference Model
定义了三个组件
   AP:Application Program 应用程序
   RM:Resourse Manager,资源管理器
   TM:Transaction Manager 事务管理器

AP通过资源管理器管理资源,通过事务管理器管理事务,事务管理器通过资源管理器管理的资源进行控制,TM通过RM的XA管理RM
两段式提交:
  事务管理器提交不止一个数据,第一阶段准备,第二阶段提交,如果出现错误,第二阶段回滚.


分布式应用:

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

分布式存储:

不能mount,基于API进行存储

分布式文件系统(把存储空间抽象成文件的格式存储的格式):

mount VFS


常用分布式解决方案:

适合存储少量大文件:

GFS: Google File System 擅长处理单个单文件
HDFS:Hadoop Distributed File System  根据GFS思想开发的,擅长处理单个大文件 ,使用场景,数据不太多的大文件。
TFS:淘宝FS,在名称节点上将元数据存储于关系型数据中,文件数量不在受限于名称节点的内存空间,可以存储海量小文件
TFS:腾讯FS
Lustre:Oracle,企业级应用,重量级
GlusterFS:去中心化设计:擅长处理单个大文件 
MooseFS:基于FUSE的格式,可以挂载
Mogilefs:存储海量小数据
FastDFS
Perlbal:高性能的反向代理
ceph:整合到linux内核实现的文件系统,已经被收录在内核,是一个 Linux PB级别的分布式文件系统。


MogilesFS概述:

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



MogileFS的特性

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


MogileFS的核心
(1)Tracker–跟踪器,调度器
MogileFS的核心,是一个调度器,mogilefsd进程就是trackers进程程序,trackers的主要职责有:删除数据、复制数据、监控、查询等等.这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到多个"query workers"中,然后让 mogilefs的子进程去处理.

mogadm,mogtool的所有 *** 作都要跟trackers打交道,Client的一些 *** 作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡.trackers也可以只运行在一台机器上,使用负载均衡时可以使用搞一些简单的负载均衡解决方案,如haproxy,lvs,nginx等.

tarcker默认配置文件为/etc/mogilefs/mogilefsd.conf,监听在TCP的7001端口


(2)Database–数据库部分
主要用来存储mogilefs的元数据,所有的元数据都存储在数据库中,因此,这个数据相当重要,如果数据库挂掉,所有的数据都不能用于访问,因此,建议应该对数据库做高可用。


(3)mogstored–存储节点
数据存储的位置,通常是一个HTTP(webDAV)服务器,用来做数据的创建、删除、获取,任何 WebDAV 服务器都可以, 不过推荐使用 mogstored . mogilefsd可以配置到两个机器上使用不同端口

mogstored 来进行所有的 DAV *** 作和流量,IO监测, 并且你自己选择的HTTP服务器(默认为 perlbal)用来做 GET *** 作给客户端提供文件。

典型的应用是一个挂载点有一个大容量的SATA磁盘. 只要配置完配置文件后mogstored程序的启动将会使本机成为一个存储节点.当然还需要mogadm这个工具增加这台机器到Cluster中。

配置文件为/etc/mogilefs/mogstored.conf,监听在TCP的7500端口


MogileFS基本工作流程


过程如下所述:

1.应用程序请求打开一个文件 (通过RPC 通知到 tracker, 找到一个可用的机器). 做一个 “create_open” 请求.

2.tracker 做一些负载均衡(load balancing)处理,决定应该去哪儿,然后给应用程序一些可能用的位置。

3.应用程序写到其中的一个位置去 (如果写失败,他会重新尝试并写到另外一个位置去).

4.应用程序 (client) 通过”create_close” 告诉tracker文件写到哪里去了.

5.tracker 将该名称和域命的名空间关联 (通过数据库来做的)

6.tracker, 在后台, 开始复制文件,知道他满足该文件类别设定的复制规则

7.应用程序通过 “get_paths” 请求 domain+key (key == “filename”) 文件, tracker基于每一位置的I/O繁忙情况回复(在内部经过 database/memcache/etc 等的一些抉择处理), 该文件可用的完整 URLs地址列表.

8.应用程序然后按顺序尝试这些URL地址. (tracker’持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做..)


MogileFS应用术语:

tracker: 借助数据库保存各个节点文件的元数据信息, 便于检索定位数据位置并监控各个节点, 告知客户端存储区的位置并指挥storage节点复制数据副本, 进程为mogilefsd

database: 为tracker节点存储节点文件的元数据信息

storage: 将指定域中的键转换为特有的文件名存储于在特定的设备文件中, 转换后文件名为值, storage自动维护键值之间的对应关系, storage节点使用http进行数据传输, 依赖于perbal, 进程为mogstored, perbal

Domain: 一个域中的键值是唯一的, 一个MogileFS可以有多个域来存储不同类型的文件

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

device: 一个存储节点, 可以有多个device, 就是用来存放文件的目录, 每个设备都有一个设备ID, 需要在mogstored配置文件中docroot配置, 设备不能删除, 只能将设备的状态置为dead, 置为dead之后数据就无法恢复了, 并且设备ID也无法再使用


MogileFS组成:

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高可用架构



MogileFS安装配置:

实验环境:

node1 172.16.100.6 Centos6.5_x86_64 Tracker+Storage

node2 172.16.100.7 Centos6.5_x86_64 Storage

node3 172.16.100.8 Centos6.5_x86_64 Storage

node4 172.16.100.9 Centos6.5_x86_64 Database

准备好以下RPM包:

MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.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-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm

所有节点安装epel源:

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 
# rpm -Uvh remi-release-6.rpm epel-release-6-8.noarch.rpm

(1)安装配置Database数据库服务(node4)

--安装mysql,这里使用默认rpm安装
# yum -y install mysql-server mysql-devel mysql
--启动mysql服务
# service mysqld start
--授权root远程连接及创建mogilefs用户及授权
mysql> GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'redhat';
mysql> GRANT ALL ON *.* TO root@'node4.samlee.com' IDENTIFIED BY 'redhat';
mysql> GRANT ALL ON mogilefs.* TO mogileuser@'%' IDENTIFIED BY 'redhat';
mysql> FLUSH PRIVILEGES;
--创建mogilefs数据库
mysql> CREATE DATABASE mogilefs;
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mogilefs           |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.01 sec)

(3)安装配置Storage节点服务(node2\node3)

# yum -y install perl-Net-Netmask perl-IO-AIO
# ls
MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.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-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm
# yum -y install *.rpm


(4)安装配置Tracker节点服务(node1)

# yum -y install perl-Net-Netmask perl-IO-AIO 
# ls
MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.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-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm
# yum -y install *.rpm

--设定数据库
# mogdbsetup --dbhost=172.16.100.9 --dbuser=mogileuser --dbpass=redhat --dbname=mogilefs --dbrootpass=redhat

--查询表有没有生成
mysql> use mogilefs;
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.01 sec)


(5)配置mogilefsd

# vim /etc/mogilefs/mogilefsd.conf
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=172.16.100.9
db_user = mogileuser
db_pass = redhat
listen = 0.0.0.0:7001 --mogilefsd服务启动的监听端口地址及端口号
conf_port = 7001
query_jobs = 10    --允许的查询连接数
delete_jobs = 1    --允许删除的进程数
replicate_jobs = 5 --实现复制的进程数
reaper_jobs = 1

--添加主机(第1种方法)
# mogadm host add node1 --ip=172.16.100.6 alive
# mogadm host add node2 --ip=172.16.100.7 alive
# mogadm host add node3 --ip=172.16.100.8 alive
# mogadm host list
node1 [1]: down
  IP:       172.16.100.6:7500

node2 [2]: down
  IP:       172.16.100.7:7500

node3 [3]: down
  IP:       172.16.100.8:7500


--添加主机(第2种方法)  
# mogadm --trackers=172.16.100.6:7001 host add 172.16.100.6 --ip=172.16.100.6 --status=alive
# mogadm --trackers=172.16.100.6:7001 host add 172.16.100.6 --ip=172.16.100.7 --status=alive
# mogadm --trackers=172.16.100.6:7001 host add 172.16.100.6 --ip=172.16.100.8 --status=alive
# mogadm host list
node1 [1]: down
  IP:       172.16.100.6:7500

node2 [2]: down
  IP:       172.16.100.7:7500

node3 [3]: down
  IP:       172.16.100.8:7500
  
如果添加的主机状态为down,可以使用以下方式激活:
# mogadm host mark node1 alive
# mogadm host mark node2 alive
# mogadm host mark node3 alive

(6)配置mogstored

node1配置:
--创建分布式存储目录
# mkdir -pv  /dfs/mogilefs/dev1
--配置存储节点配置文件
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogilefs/
--目录授权启动服务
# chown -R mogilefs.mogilefs /dfs/mogilefs/
# service mogstored start

node2配置:
--创建分布式存储目录
# mkdir -pv  /dfs/mogilefs/dev2
--配置存储节点配置文件
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogilefs/
--目录授权启动服务
# chown -R mogilefs.mogilefs /dfs/mogilefs/
# service mogstored start

node3配置:
--创建分布式存储目录
# mkdir -pv  /dfs/mogilefs/dev3
--配置存储节点配置文件
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogilefs/
--目录授权启动服务
# chown -R mogilefs.mogilefs /dfs/mogilefs/
# service mogstored start

(7)添加设备并启用激活设备

--添加设备(第1种方法)
# mogadm device add node1 1
# mogadm device add node2 2
# mogadm device add node3 3
或
# mogadm device add node1 1 --status=alive
# mogadm device add node2 2 --status=alive
# mogadm device add node3 3 --status=alive

--添加设备(第2种方法)
# mogadm --trackers=172.16.100.6:7001 device add 172.16.100.6 --status=alive
# mogadm --trackers=172.16.100.6:7001 device add 172.16.100.7 --status=alive
# mogadm --trackers=172.16.100.6:7001 device add 172.16.100.8 --status=alive

# mogadm check
Checking trackers...
  127.0.0.1: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            18.686      4.564     14.122  24.43%  writeable   0.7
  [ 2] dev2            18.686      4.564     14.122  24.43%  writeable   0.0
  [ 3] dev3            18.686      4.564     14.122  24.43%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:    56.058     13.693     42.366  24.43%


(8)创建域

# mogadm domain add files
# mogadm domain add p_w_picpaths
# mogadm domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   

 p_w_picpaths               default                   2        MultipleHosts() NONE


(9)创建类

# mogadm class add files text --mindevcount=1
# mogadm class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   
 files                text                      1        MultipleHosts() NONE   

 p_w_picpaths               default                   2        MultipleHosts() NONE

(10)测试上传文件并查看上传的文件:

# mogupload --trackers=172.16.100.6 --domain=files --key='/fstab.html' --file=/etc/fstab
# mogfileinfo --trackers=172.16.100.6 --domain=files --key='/fstab.html'
- file: /fstab.html
     class:              default
  devcount:                    2
    domain:                files
       fid:                    2
       key:          /fstab.html
    length:                  921
 - http://172.16.100.6:7500/dev1/0/000/000/0000000002.fid
 - 
--最小副本数为1,只保留1份副本 
# mogupload --trackers=172.16.100.6 --domain=files --key='/test.html' --file=/root/text.txt --class=text
# mogfileinfo --trackers=172.16.100.6 --domain=files --key='/test.html'
- file: /test.html
     class:                 text
  devcount:                    1
    domain:                files
       fid:                    3
       key:           /test.html
    length:                   16
 - http://172.16.100.7:7500/dev2/0/000/000/0000000003.fid


(11)综合应用命令查询:

mogilefs状态查询:
# mogstats --db_dsn="DBI:mysql:mogilefs:host=172.16.100.9" --db_user="mogileuser" --db_pass="redhat" 
Fetching statistics... (all)

Statistics for devices...
  device     host                   files     status
  ---------- ---------------- ------------ ----------
  dev1       node1               1      alive
  dev2       node2               1      alive
  dev3       node3               1      alive
  ---------- ---------------- ------------ ----------

Statistics for file ids...
  Max file id: 3

Statistics for files...
  domain               class           files    size (m)  fullsize (m)
  -------------------- ----------- ---------- ----------- -------------
  files                default             1           0             0
  files                text                1           0             0
  -------------------- ----------- ---------- ----------- -------------

Statistics for replication...
  domain               class        devcount      files
  -------------------- ----------- ---------- ----------
  files                default             2          1
  files                text                1          1
  -------------------- ----------- ---------- ----------

Statistics for replication queue...
  status                      count
  -------------------- ------------
  -------------------- ------------

Statistics for delete queue...
  status                      count
  -------------------- ------------
  -------------------- ------------

Statistics for general queues...
  queue           status                      count
  --------------- -------------------- ------------
  --------------- -------------------- ------------

删除domain流程:删除文件class-domain
# moglistkeys -trackers=172.16.100.6:7001 -domain=files  列出files域下所有key

# moglistkeys -trackers=172.16.100.6:7001 -domain=files -key=/test.html

# mogadm class delete files text


案例:Nginx代理MogileFS并实现负载均衡和高可用

准备如下:

(1)准备publi主机 eth0:172.16.100.1 Nginx

(2)在MogileFS服务器上传一张图片作为测试文件

# mogupload --trackers=172.16.100.6 --domain=p_w_picpaths --key='linux.jpg' --file=/root/1.jpg
# mogfileinfo --trackers=172.16.100.6 --domain=p_w_picpaths --key='linux.jpg'
- file: linux.jpg
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                    5
       key:            linux.jpg
    length:                37272
 - http://172.16.100.7:7500/dev2/0/000/000/0000000005.fid
 - http://172.16.100.6:7500/dev1/0/000/000/0000000005.fid


编译安装Nginx

# yum -y groupinstall "Development Tools" "Server Platform Developments"  --安装开发包组
# yum -y install pcre-devel openssl-devel --安装依赖模块包
# groupadd -r nginx
# useradd -r -g nginx nginx
# tar xf nginx-1.11.3.tar.gz -C /usr/local/
# tar xf nginx_mogilefs_module-1.0.4.tar.gz -C /usr/local/
# cd /usr/local/nginx-1.11.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 \
> --with-pcre \
> --with-debug \
> --add-module=/usr/local/nginx_mogilefs_module-1.0.4/
# make && make install

为nginx提供SysV init脚本:

新建文件/etc/rc.d/init.d/nginx,内容如下:

# 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/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=\([^ ]*\).*//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 "" in
    start)
        rh_status_q && exit 0
        
        ;;
    stop)
        rh_status_q || exit 0
        
        ;;
    restart|configtest)
        
        ;;
    reload)
        rh_status_q || exit 7
        
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: 而后为此脚本赋予执行权限: {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

# chmod +x /etc/rc.d/init.d/nginx

添加至服务管理列表,并让其开机自动启动:

# chkconfig --add nginx
# chkconfig nginx on

配置nginx常用环境变量

--配置nginx程序执行环境变量
# echo "export PATH=/usr/local/nginx/sbin:$PATH" > /etc/profile.d/nginx.sh
# . /etc/profile.d/nginx.sh 
--配置nginx语法着色
# mkdir .vim
# cp -ra /usr/local/nginx-1.11.3/contrib/vim/* .vim/

而后就可以启动服务了:

# service nginx start

配置Nginx

# vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
    upstream trackers {
    server 172.16.100.6:7001;
    server 172.16.100.7:7001;
    server 172.16.100.8:7001;
    }


    server {
        listen       80;
        server_name  localhost;



        location / {
            root   html;
            index  index.html index.htm;
        }

      location  /p_w_picpaths/ {
          mogilefs_tracker trackers;
          mogilefs_domain p_w_picpaths;
          mogilefs_methods GET;
          mogilefs_noverify on;

          mogilefs_pass {
                  proxy_pass $mogilefs_path;
                  proxy_hide_header Content-Type;
                  proxy_buffering off;
          }
      }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

重启nginx服务并测试:

# service nginx restart

mogadm命令Tips:

mogadm slave ##由于文件元数据信息是保存在MySQL中的,每次请求文件需要读取MySQL一旦请求量太大,MySQL必定会成为性能瓶颈,这时我们要给MySQL做主从,这个指令就是用来添加从节点的,可以实现tracker与主从架构的MySQL交互时,实现读写分离。

mogadm fsck  ##文件系统检测,一般不要使用,除非集群意外断电,在上线时执行。

mogadm rebalance  ##重新平衡,当数据出现热区时使用,在执行之前需要定义平衡策略。

mogadm rebalance start ##启动平衡策略。

mogadm rebalance policy  ##定义平衡策略。

mogadm rebalance test  ##用于测试是否出现数据不平衡的问题。

mogadm settings  ##定义mogilefs工作属性。

mogadm class modify <domain> <class> –mindevcount= ##定义文件最小的副本份数


技巧总结:

MogileFS中怎么删除主机:

mysql > select count (*) from file_on where devid=11;

在机器坏了的时候,就会给这些标坏掉了,但还是不能删除.下面是我建议的方式,当你给所有的硬盘设备标成不可用后,你然后再fsck,这样会同步文件到其它的机器同样的份数.接着为了确认进入MySQL中查一下。  

mysql > delete from device where devid=11;

看看是不是去掉的硬盘设备,真的没有文件的记录在上面了. 接着我们就可以安全的删除这个设备了。

[+++]

当对那个主机上的硬盘 *** 作完时,你就可以删除你的主机了。

)
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 126, InsideLink()
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 165, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
共享存储之分布式文件系统应用及MogileFS基础应用_服务器_内存溢出

共享存储之分布式文件系统应用及MogileFS基础应用

共享存储之分布式文件系统应用及MogileFS基础应用,第1张

共享存储之分布式文件系统应用及MogileFS基础应用

 **什么是分布式存储:
   分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。


分布式文件系统设计目标:
** 访问透明
** 位置透明
** 并发透明
** 失效透明
** 硬件透明
** 可扩展性
** 复制透明
** 迁移透明


CAP理论:

C:Consistency(一致性)  任何一个读 *** 作总是能够读取之前完成的写 *** 作。
A:Availability(可用性) 每一次 *** 作总是能够在确定的时间返回。
P:Partition Tolerance ( 分区容错性 )   在出现网络分区的情况下,仍然能够满足一致性和可用性。

  有科学家都在致力于 CAP  三元素并存的时候,Eric.Brewer教授指出 CAP  永远无法兼顾,只能根据具体应用来权衡和取舍,并且至多两个元素可以共存,后来由两位麻省理工学院的科学家证明此观点是具有前瞻性的,由此形成Brewer的 CAP定理。


  正所谓鱼和熊掌不可兼得,关注一致性就需要处理因系统不可用而带来写 *** 作失败的情况,反之关注可用性就无法保证每次都能读取到最新的写入 *** 作。传统关系型数据库侧重于CA,而非关系型键值数据库则侧重于AP。


  强一致性(ACID):在单机环境中,强一致性可以由数据库的事务来保证;在分布式环境中,强一致性很难做到,即便是做到也会因为分布式事物所带来的性能低下,不适合在互联网的环境中应用。


 弱一致性(包括最终一致性):系统不能保证后续访问返回最新的值,在访问到最新值之前这段时间称之为不一致窗口。  

 最终一致性:是弱一致性的一种特例,存储系统保证如果对象有多次更新,在渡过不一致窗口之后必将放回最后更新的值。  

 服务器的一致性:N代表节点的个数;W代表更新的时候需要确认已经被更新的节点个数; R代表读取数据需要的节点数量。


示意如下:

W + R > N  —->  强一致性(通常N=3,W=R=2)
W=N,R=1   —->  最佳读
W=1,R=N   —->  最佳写
W + R <= N —->  弱一致性


分布式存储及分布式文件系统概论

集中式:
共享存储:
  NAS
  SAN

分布式存储:
  专用的元数据节点:集中元数据存储,数据节点至负责存储数据
  无专用元数据几点:所有数据均完整存储元数据,存储了部分数据

分布式:
  文件系统:有文件系统接口:一般挂载使用
  存储:无文件系统接口,通过API访问


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

X/Open:XA
DTP:Distributed Transcationn Processing Reference Model
定义了三个组件
   AP:Application Program 应用程序
   RM:Resourse Manager,资源管理器
   TM:Transaction Manager 事务管理器

AP通过资源管理器管理资源,通过事务管理器管理事务,事务管理器通过资源管理器管理的资源进行控制,TM通过RM的XA管理RM
两段式提交:
  事务管理器提交不止一个数据,第一阶段准备,第二阶段提交,如果出现错误,第二阶段回滚.


分布式应用:

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

分布式存储:

不能mount,基于API进行存储

分布式文件系统(把存储空间抽象成文件的格式存储的格式):

mount VFS


常用分布式解决方案:

适合存储少量大文件:

GFS: Google File System 擅长处理单个单文件
HDFS:Hadoop Distributed File System  根据GFS思想开发的,擅长处理单个大文件 ,使用场景,数据不太多的大文件。
TFS:淘宝FS,在名称节点上将元数据存储于关系型数据中,文件数量不在受限于名称节点的内存空间,可以存储海量小文件
TFS:腾讯FS
Lustre:Oracle,企业级应用,重量级
GlusterFS:去中心化设计:擅长处理单个大文件 
MooseFS:基于FUSE的格式,可以挂载
Mogilefs:存储海量小数据
FastDFS
Perlbal:高性能的反向代理
ceph:整合到linux内核实现的文件系统,已经被收录在内核,是一个 Linux PB级别的分布式文件系统。


MogilesFS概述:

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



MogileFS的特性

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


MogileFS的核心
(1)Tracker–跟踪器,调度器
MogileFS的核心,是一个调度器,mogilefsd进程就是trackers进程程序,trackers的主要职责有:删除数据、复制数据、监控、查询等等.这个是基于事件的( event-based ) 父进程/消息总线来管理所有来之于客户端应用的交互(requesting operations to be performed), 包括将请求负载平衡到多个"query workers"中,然后让 mogilefs的子进程去处理.

mogadm,mogtool的所有 *** 作都要跟trackers打交道,Client的一些 *** 作也需要定义好trackers,因此最好同时运行多个trackers来做负载均衡.trackers也可以只运行在一台机器上,使用负载均衡时可以使用搞一些简单的负载均衡解决方案,如haproxy,lvs,nginx等.

tarcker默认配置文件为/etc/mogilefs/mogilefsd.conf,监听在TCP的7001端口


(2)Database–数据库部分
主要用来存储mogilefs的元数据,所有的元数据都存储在数据库中,因此,这个数据相当重要,如果数据库挂掉,所有的数据都不能用于访问,因此,建议应该对数据库做高可用。


(3)mogstored–存储节点
数据存储的位置,通常是一个HTTP(webDAV)服务器,用来做数据的创建、删除、获取,任何 WebDAV 服务器都可以, 不过推荐使用 mogstored . mogilefsd可以配置到两个机器上使用不同端口

mogstored 来进行所有的 DAV *** 作和流量,IO监测, 并且你自己选择的HTTP服务器(默认为 perlbal)用来做 GET *** 作给客户端提供文件。

典型的应用是一个挂载点有一个大容量的SATA磁盘. 只要配置完配置文件后mogstored程序的启动将会使本机成为一个存储节点.当然还需要mogadm这个工具增加这台机器到Cluster中。

配置文件为/etc/mogilefs/mogstored.conf,监听在TCP的7500端口


MogileFS基本工作流程


过程如下所述:

1.应用程序请求打开一个文件 (通过RPC 通知到 tracker, 找到一个可用的机器). 做一个 “create_open” 请求.

2.tracker 做一些负载均衡(load balancing)处理,决定应该去哪儿,然后给应用程序一些可能用的位置。

3.应用程序写到其中的一个位置去 (如果写失败,他会重新尝试并写到另外一个位置去).

4.应用程序 (client) 通过”create_close” 告诉tracker文件写到哪里去了.

5.tracker 将该名称和域命的名空间关联 (通过数据库来做的)

6.tracker, 在后台, 开始复制文件,知道他满足该文件类别设定的复制规则

7.应用程序通过 “get_paths” 请求 domain+key (key == “filename”) 文件, tracker基于每一位置的I/O繁忙情况回复(在内部经过 database/memcache/etc 等的一些抉择处理), 该文件可用的完整 URLs地址列表.

8.应用程序然后按顺序尝试这些URL地址. (tracker’持续监测主机和设备的状态,因此不会返回死连接,默认情况下他对返回列表中的第一个元素做双重检查,除非你不要他这么做..)


MogileFS应用术语:

tracker: 借助数据库保存各个节点文件的元数据信息, 便于检索定位数据位置并监控各个节点, 告知客户端存储区的位置并指挥storage节点复制数据副本, 进程为mogilefsd

database: 为tracker节点存储节点文件的元数据信息

storage: 将指定域中的键转换为特有的文件名存储于在特定的设备文件中, 转换后文件名为值, storage自动维护键值之间的对应关系, storage节点使用http进行数据传输, 依赖于perbal, 进程为mogstored, perbal

Domain: 一个域中的键值是唯一的, 一个MogileFS可以有多个域来存储不同类型的文件

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

device: 一个存储节点, 可以有多个device, 就是用来存放文件的目录, 每个设备都有一个设备ID, 需要在mogstored配置文件中docroot配置, 设备不能删除, 只能将设备的状态置为dead, 置为dead之后数据就无法恢复了, 并且设备ID也无法再使用


MogileFS组成:

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高可用架构



MogileFS安装配置:

实验环境:

node1 172.16.100.6 Centos6.5_x86_64 Tracker+Storage

node2 172.16.100.7 Centos6.5_x86_64 Storage

node3 172.16.100.8 Centos6.5_x86_64 Storage

node4 172.16.100.9 Centos6.5_x86_64 Database

准备好以下RPM包:

MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.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-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm

所有节点安装epel源:

# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm 
# rpm -Uvh remi-release-6.rpm epel-release-6-8.noarch.rpm

(1)安装配置Database数据库服务(node4)

--安装mysql,这里使用默认rpm安装
# yum -y install mysql-server mysql-devel mysql
--启动mysql服务
# service mysqld start
--授权root远程连接及创建mogilefs用户及授权
mysql> GRANT ALL ON *.* TO root@'%' IDENTIFIED BY 'redhat';
mysql> GRANT ALL ON *.* TO root@'node4.samlee.com' IDENTIFIED BY 'redhat';
mysql> GRANT ALL ON mogilefs.* TO mogileuser@'%' IDENTIFIED BY 'redhat';
mysql> FLUSH PRIVILEGES;
--创建mogilefs数据库
mysql> CREATE DATABASE mogilefs;
mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mogilefs           |
| mysql              |
| test               |
+--------------------+
4 rows in set (0.01 sec)

(3)安装配置Storage节点服务(node2\node3)

# yum -y install perl-Net-Netmask perl-IO-AIO
# ls
MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.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-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm
# yum -y install *.rpm


(4)安装配置Tracker节点服务(node1)

# yum -y install perl-Net-Netmask perl-IO-AIO 
# ls
MogileFS-Server-2.46-2.el6.noarch.rpm            Perlbal-doc-1.78-1.el6.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-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm             perl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpm
# yum -y install *.rpm

--设定数据库
# mogdbsetup --dbhost=172.16.100.9 --dbuser=mogileuser --dbpass=redhat --dbname=mogilefs --dbrootpass=redhat

--查询表有没有生成
mysql> use mogilefs;
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.01 sec)


(5)配置mogilefsd

# vim /etc/mogilefs/mogilefsd.conf
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=172.16.100.9
db_user = mogileuser
db_pass = redhat
listen = 0.0.0.0:7001 --mogilefsd服务启动的监听端口地址及端口号
conf_port = 7001
query_jobs = 10    --允许的查询连接数
delete_jobs = 1    --允许删除的进程数
replicate_jobs = 5 --实现复制的进程数
reaper_jobs = 1

--添加主机(第1种方法)
# mogadm host add node1 --ip=172.16.100.6 alive
# mogadm host add node2 --ip=172.16.100.7 alive
# mogadm host add node3 --ip=172.16.100.8 alive
# mogadm host list
node1 [1]: down
  IP:       172.16.100.6:7500

node2 [2]: down
  IP:       172.16.100.7:7500

node3 [3]: down
  IP:       172.16.100.8:7500


--添加主机(第2种方法)  
# mogadm --trackers=172.16.100.6:7001 host add 172.16.100.6 --ip=172.16.100.6 --status=alive
# mogadm --trackers=172.16.100.6:7001 host add 172.16.100.6 --ip=172.16.100.7 --status=alive
# mogadm --trackers=172.16.100.6:7001 host add 172.16.100.6 --ip=172.16.100.8 --status=alive
# mogadm host list
node1 [1]: down
  IP:       172.16.100.6:7500

node2 [2]: down
  IP:       172.16.100.7:7500

node3 [3]: down
  IP:       172.16.100.8:7500
  
如果添加的主机状态为down,可以使用以下方式激活:
# mogadm host mark node1 alive
# mogadm host mark node2 alive
# mogadm host mark node3 alive

(6)配置mogstored

node1配置:
--创建分布式存储目录
# mkdir -pv  /dfs/mogilefs/dev1
--配置存储节点配置文件
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogilefs/
--目录授权启动服务
# chown -R mogilefs.mogilefs /dfs/mogilefs/
# service mogstored start

node2配置:
--创建分布式存储目录
# mkdir -pv  /dfs/mogilefs/dev2
--配置存储节点配置文件
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogilefs/
--目录授权启动服务
# chown -R mogilefs.mogilefs /dfs/mogilefs/
# service mogstored start

node3配置:
--创建分布式存储目录
# mkdir -pv  /dfs/mogilefs/dev3
--配置存储节点配置文件
# vim /etc/mogilefs/mogstored.conf
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /dfs/mogilefs/
--目录授权启动服务
# chown -R mogilefs.mogilefs /dfs/mogilefs/
# service mogstored start

(7)添加设备并启用激活设备

--添加设备(第1种方法)
# mogadm device add node1 1
# mogadm device add node2 2
# mogadm device add node3 3
或
# mogadm device add node1 1 --status=alive
# mogadm device add node2 2 --status=alive
# mogadm device add node3 3 --status=alive

--添加设备(第2种方法)
# mogadm --trackers=172.16.100.6:7001 device add 172.16.100.6 --status=alive
# mogadm --trackers=172.16.100.6:7001 device add 172.16.100.7 --status=alive
# mogadm --trackers=172.16.100.6:7001 device add 172.16.100.8 --status=alive

# mogadm check
Checking trackers...
  127.0.0.1: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            18.686      4.564     14.122  24.43%  writeable   0.7
  [ 2] dev2            18.686      4.564     14.122  24.43%  writeable   0.0
  [ 3] dev3            18.686      4.564     14.122  24.43%  writeable   0.0
  ---- ------------ ---------- ---------- ---------- ------
             total:    56.058     13.693     42.366  24.43%


(8)创建域

# mogadm domain add files
# mogadm domain add p_w_picpaths
# mogadm domain list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   

 p_w_picpaths               default                   2        MultipleHosts() NONE


(9)创建类

# mogadm class add files text --mindevcount=1
# mogadm class list
 domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
 files                default                   2        MultipleHosts() NONE   
 files                text                      1        MultipleHosts() NONE   

 p_w_picpaths               default                   2        MultipleHosts() NONE

(10)测试上传文件并查看上传的文件:

# mogupload --trackers=172.16.100.6 --domain=files --key='/fstab.html' --file=/etc/fstab
# mogfileinfo --trackers=172.16.100.6 --domain=files --key='/fstab.html'
- file: /fstab.html
     class:              default
  devcount:                    2
    domain:                files
       fid:                    2
       key:          /fstab.html
    length:                  921
 - http://172.16.100.6:7500/dev1/0/000/000/0000000002.fid
 - 
--最小副本数为1,只保留1份副本 
# mogupload --trackers=172.16.100.6 --domain=files --key='/test.html' --file=/root/text.txt --class=text
# mogfileinfo --trackers=172.16.100.6 --domain=files --key='/test.html'
- file: /test.html
     class:                 text
  devcount:                    1
    domain:                files
       fid:                    3
       key:           /test.html
    length:                   16
 - http://172.16.100.7:7500/dev2/0/000/000/0000000003.fid


(11)综合应用命令查询:

mogilefs状态查询:
# mogstats --db_dsn="DBI:mysql:mogilefs:host=172.16.100.9" --db_user="mogileuser" --db_pass="redhat" 
Fetching statistics... (all)

Statistics for devices...
  device     host                   files     status
  ---------- ---------------- ------------ ----------
  dev1       node1               1      alive
  dev2       node2               1      alive
  dev3       node3               1      alive
  ---------- ---------------- ------------ ----------

Statistics for file ids...
  Max file id: 3

Statistics for files...
  domain               class           files    size (m)  fullsize (m)
  -------------------- ----------- ---------- ----------- -------------
  files                default             1           0             0
  files                text                1           0             0
  -------------------- ----------- ---------- ----------- -------------

Statistics for replication...
  domain               class        devcount      files
  -------------------- ----------- ---------- ----------
  files                default             2          1
  files                text                1          1
  -------------------- ----------- ---------- ----------

Statistics for replication queue...
  status                      count
  -------------------- ------------
  -------------------- ------------

Statistics for delete queue...
  status                      count
  -------------------- ------------
  -------------------- ------------

Statistics for general queues...
  queue           status                      count
  --------------- -------------------- ------------
  --------------- -------------------- ------------

删除domain流程:删除文件class-domain
# moglistkeys -trackers=172.16.100.6:7001 -domain=files  列出files域下所有key

# moglistkeys -trackers=172.16.100.6:7001 -domain=files -key=/test.html

# mogadm class delete files text


案例:Nginx代理MogileFS并实现负载均衡和高可用

准备如下:

(1)准备publi主机 eth0:172.16.100.1 Nginx

(2)在MogileFS服务器上传一张图片作为测试文件

# mogupload --trackers=172.16.100.6 --domain=p_w_picpaths --key='linux.jpg' --file=/root/1.jpg
# mogfileinfo --trackers=172.16.100.6 --domain=p_w_picpaths --key='linux.jpg'
- file: linux.jpg
     class:              default
  devcount:                    2
    domain:               p_w_picpaths
       fid:                    5
       key:            linux.jpg
    length:                37272
 - http://172.16.100.7:7500/dev2/0/000/000/0000000005.fid
 - http://172.16.100.6:7500/dev1/0/000/000/0000000005.fid


编译安装Nginx

# yum -y groupinstall "Development Tools" "Server Platform Developments"  --安装开发包组
# yum -y install pcre-devel openssl-devel --安装依赖模块包
# groupadd -r nginx
# useradd -r -g nginx nginx
# tar xf nginx-1.11.3.tar.gz -C /usr/local/
# tar xf nginx_mogilefs_module-1.0.4.tar.gz -C /usr/local/
# cd /usr/local/nginx-1.11.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 \
> --with-pcre \
> --with-debug \
> --add-module=/usr/local/nginx_mogilefs_module-1.0.4/
# make && make install

为nginx提供SysV init脚本:

新建文件/etc/rc.d/init.d/nginx,内容如下:

# 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/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=\([^ ]*\).*//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 "" in
    start)
        rh_status_q && exit 0
        
        ;;
    stop)
        rh_status_q || exit 0
        
        ;;
    restart|configtest)
        
        ;;
    reload)
        rh_status_q || exit 7
        
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: 而后为此脚本赋予执行权限: {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

# chmod +x /etc/rc.d/init.d/nginx

添加至服务管理列表,并让其开机自动启动:

# chkconfig --add nginx
# chkconfig nginx on

配置nginx常用环境变量

--配置nginx程序执行环境变量
# echo "export PATH=/usr/local/nginx/sbin:$PATH" > /etc/profile.d/nginx.sh
# . /etc/profile.d/nginx.sh 
--配置nginx语法着色
# mkdir .vim
# cp -ra /usr/local/nginx-1.11.3/contrib/vim/* .vim/

而后就可以启动服务了:

# service nginx start

配置Nginx

# vim /etc/nginx/nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;

    keepalive_timeout  65;
    upstream trackers {
    server 172.16.100.6:7001;
    server 172.16.100.7:7001;
    server 172.16.100.8:7001;
    }


    server {
        listen       80;
        server_name  localhost;



        location / {
            root   html;
            index  index.html index.htm;
        }

      location  /p_w_picpaths/ {
          mogilefs_tracker trackers;
          mogilefs_domain p_w_picpaths;
          mogilefs_methods GET;
          mogilefs_noverify on;

          mogilefs_pass {
                  proxy_pass $mogilefs_path;
                  proxy_hide_header Content-Type;
                  proxy_buffering off;
          }
      }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

    }

}

重启nginx服务并测试:

# service nginx restart

mogadm命令Tips:

mogadm slave ##由于文件元数据信息是保存在MySQL中的,每次请求文件需要读取MySQL一旦请求量太大,MySQL必定会成为性能瓶颈,这时我们要给MySQL做主从,这个指令就是用来添加从节点的,可以实现tracker与主从架构的MySQL交互时,实现读写分离。

mogadm fsck  ##文件系统检测,一般不要使用,除非集群意外断电,在上线时执行。

mogadm rebalance  ##重新平衡,当数据出现热区时使用,在执行之前需要定义平衡策略。

mogadm rebalance start ##启动平衡策略。

mogadm rebalance policy  ##定义平衡策略。

mogadm rebalance test  ##用于测试是否出现数据不平衡的问题。

mogadm settings  ##定义mogilefs工作属性。

mogadm class modify <domain> <class> –mindevcount= ##定义文件最小的副本份数


技巧总结:

MogileFS中怎么删除主机:

mysql > select count (*) from file_on where devid=11;

在机器坏了的时候,就会给这些标坏掉了,但还是不能删除.下面是我建议的方式,当你给所有的硬盘设备标成不可用后,你然后再fsck,这样会同步文件到其它的机器同样的份数.接着为了确认进入MySQL中查一下。  

mysql > delete from device where devid=11;

看看是不是去掉的硬盘设备,真的没有文件的记录在上面了. 接着我们就可以安全的删除这个设备了。

当对那个主机上的硬盘 *** 作完时,你就可以删除你的主机了。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/778319.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-03
下一篇 2022-05-03

发表评论

登录后才能评论

评论列表(0条)

保存