首页 > 代码库 > 共享存储之分布式文件系统应用及MogileFS基础应用
共享存储之分布式文件系统应用及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 images # mogadm domain list domain class mindevcount replpolicy hashtype -------------------- -------------------- ------------- ------------ ------- files default 2 MultipleHosts() NONE images 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 images 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=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
编译安装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=\([^ ]*\).*/\1/g‘ -` options=`$nginx -V 2>&1 | grep ‘configure arguments:‘` for opt in $options; do if [ `echo $opt | grep ‘.*-temp-path‘` ]; then value=http://www.mamicode.com/`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
而后为此脚本赋予执行权限:
# 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 /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服务并测试:
# 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中怎么删除主机:
在机器坏了的时候,就会给这些标坏掉了,但还是不能删除.下面是我建议的方式,当你给所有的硬盘设备标成不可用后,你然后再fsck,这样会同步文件到其它的机器同样的份数.接着为了确认进入MySQL中查一下。
mysql > select count (*) from file_on where devid=11;
看看是不是去掉的硬盘设备,真的没有文件的记录在上面了. 接着我们就可以安全的删除这个设备了。
mysql > delete from device where devid=11;
当对那个主机上的硬盘操作完时,你就可以删除你的主机了。
本文出自 “Opensamlee” 博客,请务必保留此出处http://gzsamlee.blog.51cto.com/9976612/1861430
共享存储之分布式文件系统应用及MogileFS基础应用