设为首页 收藏本站
查看: 2141|回复: 1

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

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-10-14 10:16:51 | 显示全部楼层 |阅读模式
**什么是分布式存储:
   分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。

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

CAP理论:

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



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

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

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

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

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

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

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




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

1
2
3
4
5
6
7
8
9
10
11
12
集中式:
共享存储:
  NAS
  SAN

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

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




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

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



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

分布式应用:

1
2
3
4
5
6
7
8
9
10
11
分布式计算
        MapReduce:分布式运算框架
            MapReduce
分布式存储
     GFS,Google File System
     HDFS
     只能存储k-v数据
     bigtable:列式数据库
     HBase
     NoSQL:
hadoop:



分布式存储:

1
不能mount,基于API进行存储



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

1
mount VFS




常用分布式解决方案:
适合存储少量大文件:
1
2
3
4
5
6
7
8
9
10
11
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
3
4
5
6
  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基本工作流程
wKioL1f9s0XC4XmnAAI2WFk983c337.jpg

过程如下所述:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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应用术语:
1
2
3
4
5
6
7
8
9
10
11
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
2
3
4
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高可用架构
wKioL1f9yIDRHMyxAAUadyknJmQ313.jpg


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包:
1
2
3
4
5
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源:
1
2
3
# wget http://dl.fedoraproject.org/pub/ ... ease-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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--安装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)
1
2
3
4
5
6
7
8
# 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)
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
# 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
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
# 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
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
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
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
--添加设备(第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)创建域
1
2
3
4
5
6
7
8
# mogadm domain add files
# mogadm domain add images
# mogadm domain list
domain               class                mindevcount   replpolicy   hashtype
-------------------- -------------------- ------------- ------------ -------
files                default                   2        MultipleHosts() NONE   

images               default                   2        MultipleHosts() NONE




(9)创建类
1
2
3
4
5
6
7
8
# 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   

images               default                   2        MultipleHosts() NONE



(10)测试上传文件并查看上传的文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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



wKioL1f-1qbDqU5hAADHvY809f0502.jpg
wKioL1f-1-LigvV4AAC18-mOKmI138.jpg

(11)综合应用命令查询:
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
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服务器上传一张图片作为测试文件
1
2
3
4
5
6
7
8
9
10
11
# mogupload --trackers=172.16.100.6 --domain=images --key='linux.jpg' --file=/root/1.jpg
# mogfileinfo --trackers=172.16.100.6 --domain=images --key='linux.jpg'
- file: linux.jpg
     class:              default
  devcount:                    2
    domain:               images
       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



wKiom1f-7ODRGNBGAALUFmLZsvw929.jpg

编译安装Nginx
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
# 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,内容如下:
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
127
# 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=\([^ ]*\).*/\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



而后为此脚本赋予执行权限:
1
# chmod +x /etc/rc.d/init.d/nginx



添加至服务管理列表,并让其开机自动启动:
1
2
# chkconfig --add nginx
# chkconfig nginx on



配置nginx常用环境变量

1
2
3
4
5
6
--配置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/



而后就可以启动服务了:
1
# service nginx start



配置Nginx
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
# 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  /images/ {
          mogilefs_tracker trackers;
          mogilefs_domain images;
          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服务并测试:
1
# service nginx restart



wKioL1f_BBjwFOK3AAK9jaDOmYQ230.jpg
mogadm命令Tips:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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中怎么删除主机:
在机器坏了的时候,就会给这些标坏掉了,但还是不能删除.下面是我建议的方式,当你给所有的硬盘设备标成不可用后,你然后再fsck,这样会同步文件到其它的机器同样的份数.接着为了确认进入MySQL中查一下。  

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



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

1
mysql > delete from device where devid=11;



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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-285864-1-1.html 上篇帖子: 分布式系统二、MogileFS 下篇帖子: MogileFS与FastDFS的见解
累计签到:70 天
连续签到:1 天
发表于 2016-11-14 08:59:32 | 显示全部楼层
感谢分享啊

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表