Nginx反代Mogilefs分布式储存示例详解

一、分布式存储系统简介

随着信息技术不断的发展,给我们带来便利的同时,不断增加的数据量级、信息之间的连接关联越来越复杂、数据访问的并发量日益增加对I/O的要求越来越高、数据类型越来越复杂等难题也成为信息技术继续高速发展亟需解决的难题。分布式存储系统的出现在很大程度上解决了以上大部分难题。

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

分布式存储系统在接口类型上可分为通用分布式储存和专用分布式储存。通用分布式储存是指没有文件系统接口,需要通过API接口进行访问;专用分布式储存也称为分布式文件系统,它们一般都会有文件系统接口,可以直接挂载。通用分布式储存有mogilefs、fastdfs等,专用分布式储存系统有moosefs等。

二、Mogilefs

MogileFS是一个开源的分布式文件存储系统,MogileFS适用于存储海量小文件的工作场景,由LiveJournal旗下的Danga Interactive公司开发,该团队开发了包括 Memcached、MogileFS、Perlbal 等多个知名的开源项目。

1.Mogilefs架构图:

2.组成Mogliefs的组件:

1.Trackers(mogilefsd):Mogliefs的核心组件,主要功能是(Replication)节点文件复制、(Deletion)文件删除、(Query)元数据查询、(Monitor)健康监测、(Reaper)储存失败重置等等。它通常称为元数据服务器,但它不会去储存元数据,而是将元数据储存在如MySQL这一类的数据库中。为保证架构的可靠性,Trackers一般有多个。Trackers可看作是一个旁挂式代理,只负责处理元数据信息。

2.数据库:数据库用来存放Mogliefs的元数据,而由Trackers来管理数据。因此通常建议做HA。

3.mogstored(储存节点):实际文件存放的地方。通常会将实际文件保存至少两份副本。

3.示例演示拓扑图

在三个节点同时安装Trackers和mogstored,选择其中一个节点安装MySQL。在生产环境最好是能单独将MySQL部署并且做主从复制。Trackers和mogstored也可以分开部署在不同节点上,这些都需要根据实际的生产环境来决定。这里主要是演示mogilefs,不做MySQL主从复制演示。若想要Mogilefs能挂载,可以用FUSE来实现。

需要注意的是:mogilefs存储的文件URL很特殊(后面会解释mogilefs文件名生产的过程),如存储一张图片时文件URL可能会是类似6060/0000/0000/0000/00000021.jpg这样的格式,对用户来讲就不太友好,用户可能需要直观的类似image.hello.com/21.jpg这样的URL。所以通常会使用Nginx来反代Mogilefs。

4.系统环境与安装

Mogilefs是一个相对较年代较久但成熟的分布式储存,考虑到可能在Centos7上会出现兼容问题,这里Centos6来演示。

操作系统:CentOS release 6.6

Mogilefs:2.46

nginx:1.10

mysql:5.1

IP分配:

n1:192.168.29.111,n2:192.168.29.112,n3:192.168.29.113,n4:192.168.29.114

结构如上图所示。

1.在n1节点上安装MySQL、mogilefsd、mogstored,并将n1配置为Trackers、Storage Node

MySQL直接用yum安装。

~]# yum install -y mysql mysql-server

安装Mogilefs的Trackers和Storage Node组件,安装时一定要安装Perl相关的依赖包,依赖包有:

perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
perl-IO-stringy-2.110-1.2.el6.rfx.noarch.rpmperl-Net-Netmask-1.9015-8.el6.noarch.rpm
Perlbal-1.78-1.el6.noarch.rpmperl-Perlbal-1.78-1.el6.noarch.rpm
Perlbal-doc-1.78-1.el6.noarch.rpmperl-IO-AIO-3.71-2.el6.x86_64.rpm

上述依赖包一定要安装后才能安装Mogilefs。安装组件:

yum install -y MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm MogileFS-Server-2.46-2.el6.noarch.rpm

配置MogileFS-Server-mogilefsd:

~]# vim /etc/mogilefs/mogilefsd.conf #Mogilfs Trackers的主配置文件
# Enable daemon mode to work in background and use syslog
daemonize = 1 #是否以守护进程的方式运行。
# Where to store the pid of the daemon (must be the same in the init script)
pidfile = /var/run/mogilefsd/mogilefsd.pid #pid文件路径
# Database connection information
db_dsn = DBI:mysql:mogilefs:host=192.168.29.111 #数据库的地址
db_user = moguser #配置数据库的用户名及密码
db_pass = 123456
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0:7001 #监听的地址与端口
# Optional, if you don't define the port above.
conf_port = 7001 #默认端口
# Number of query workers to start by default.
query_jobs = 10 #查询进程数量
# Number of delete workers to start by default.
delete_jobs = 1
# Number of replicate workers to start by default.
replicate_jobs = 5
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs = 1
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs = 1
# Minimum amount of space to reserve in megabytes
# default: 100
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space = 200
# Number of seconds to wait for a storage node to respond.
# default: 2
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout = 2
# Number of seconds to wait to connect to a storage node.
# default: 2
# Keep this low so overloaded nodes get skipped.
#conn_timeout = 2
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port = 1

修改完配置后,进入数据库创建一个可以远程连接的root用户,或者使用mogdbsetup初始化数据库:

mysql> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.29.%' IDENTIFIED BY '123456'; #创建用户moguser,拥有管理mogilefs库的所有权限,并允许192.168.29.*的用户远程连接。
mysql> FLUSH PRIVILEGES;
mysql> quit
~]# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=123456

初始化完成后可以在MySQL中看到创建好的mogilefs库以及里面的表:

启动mogilefs并确认7001端口处于监听状态:

~]# service mogilefsd start
Starting mogilefsd      [ OK ]
~]# ss -lnt

注:可以在n2、n3节点都安装Trackers服务,从而消除单点故障风险也能平均I/O压力。

3.在n1上配置Storage Node

Storage Node配置文件路径为/etc/mogilefs/mogstored.conf:

~]# vim /etc/mogilefs/mogstored.conf
maxconns = 10000 #最大并发连接数
httplisten = 0.0.0.0:7500 #Mogilefs数据的传输是通过http协议实现的,这里是监听的地址和端口
mgmtlisten = 0.0.0.0:7501 #健康监测的监听地址和端口
docroot = /mogliefs/mogdata #数据的存储路径,目录的属组和属主必须是mogilefs

创建数据存储目录并修改属组和属主为mogilefs:

~]# mkdir -pv /mogliefs/mogdata
~]# chown -R mogilefs.mogilefs /mogliefs/

启动mogstored,查看进程是否正常启动端口是否监听:

~]# service mogstored start
~]# ss -lnt #监听端口为7500、7501

4.按照n1的步骤在节点n2、n3上安装Mogilefs,并将n1上的配置文件复制到n2、n3。

~]# scp /etc/mogilefs/*.conf root@192.168.29.112:/etc/mogilefs/
~]# scp /etc/mogilefs/*.conf root@192.168.29.113:/etc/mogilefs/

启动mogstored服务并确认监听:

~]# service mogstored start
~]# ss -lnt #监听端口为7500、7501

5.用在n1上用mogadm命令将所有节点整合成集群。

添加存储节点,并检查:

1 ~]# mogadm host add 192.168.29.111 --ip=192.168.29.111 --port=7500 --status=alive
2 ~]# mogadm host add 192.168.29.112 --ip=192.168.29.112 --port=7500 --status=alive
3 ~]# mogadm host add 192.168.29.113 --ip=192.168.29.113 --port=7500 --status=alive
~]# mogadm check

若想让mogilefs集群中的存储被识别成不同设备,需要在创建的/mogliefs/mogdata目录下再创建名为dev*的目录,使每个节点被当做存储设备使用。mogilefs是将冗余存储在不同设备中的,每一个节点都应该被识别为不同的设备。

在n1、n2、n3上的/mogliefs/mogdata/目录下分别创建dev1,dev2,dev3目录,并在Trackers上添加设备:

1 ~]# mogadm device add 192.168.29.111 1
2 ~]# mogadm device add 192.168.29.112 2
3 ~]# mogadm device add 192.168.29.113 3

6.创建Domain和Class

在Mogilefs中,在多个节点上为了方便文件副本管理,通常在设备中不会以文件为单位进行管理,而是以class(类)做管理,复制删除等操作都是以class为最小单位进行的。每个class中可以放很多文件,class的容积也不是固定的。

在Mogilefs的存储空间中,所有数据文件都在同一平面,所以不能有同名的情况发生,这样会影响Mogilefs的灵活性,所以引入了Domain(名称空间)的概念。Domain包含Class,在不同的Domain中可以有相同的文件名。

~]# mogadm domain add imgs #创建名为imgs的Domain
~]# mogadm domain add text #创建名为text的Domain
~]# mogadm domain list #查看Domain list

可以自定义Class的属性,格式为:mogadm class add <domain> <class> [opts]

~]# mogadm class add imgs png --mindevcount=3 --hashtype=MD5 #在Domain imgs中定义名为png的class,在不同设备中复制3份,并用MD5做校验
~]# mogadm class add imgs jpg --mindevcount=3 --hashtype=MD5 #在Domain imgs中定义名为jpg的class,在不同设备中复制3份,并用MD5做校验
~]# mogadm domain list

7.使用Mogilefs做上传下载测试

Mogilefs可以用自建的API接口进行交互,其中有很多用于管理存储数据的命令。例如上传数据命令为mogupload,查看数据命令为mogfileinfo等。

例:测试将文件/test/123.png上传至Mogilefs集群(文件事先在本地准备好):

~]# mogupload --trackers=192.168.29.111 --domain=imgs --class=png --key='/111.png' --file='/test/123.png' #通过IP为192.168.29.111的Trackers将123.png文件上传,并保存至Domain为imgs,Class为png的空间中,并重命名为111.png
~]# mogfileinfo --trackers=192.168.29.111 --domain=imgs --class=png --key='/111.png' #查看Domain为imgs,Class为png中key为111.png的文件的存储情况。

至此,Mogilefs分布式储存集群就搭建完成了,但若想要使客户端能与之通信,就需要在接口上进行编程,这样就很麻烦了,好在我们能用Nginx做反代进行通信。下面来演示Nginx反代Mogilefs的步骤。

5.Nginx反代Mogilefs

1.打开n2,n3的mogilefsd服务,将3个节点全部设置为Trackers(保证配置文件与n1相同):

~]# service mogilefsd start

2.在n4节点编译安装Nginx

安装依赖包:

~]# yum install gcc gcc-c++ perl pcre-devel openssl openssl-devel

下载Nginx编译安装包nginx-1.10.3.tar.gz与Nginx_Mogilefs模块nginx_mogilefs_module-1.0.4.tar.gz并展开:

~]# ls
nginx-1.10.3   nginx_mogilefs_module-1.0.4
nginx-1.10.3.tar.gz nginx_mogilefs_module-1.0.4.tar.gz
~]# cd nginx-1.10.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/ #一定记得添加Mogilefs模块所在的路径,不可少。
~]# make & make install

  添加nginx用户并启动nginx:

~]# useradd -s /sbin/nologin -M nginx
~]# /usr/sbin/nginx

3.配置Nginx

单Trackers示例:

location /imgs/ {
   mogilefs_tracker 192.168.29.111:7001; #单Trackers示例
   mogilefs_domain imgs; #指定Domain
   mogilefs_class png jpg; #指定Class

   mogilefs_pass { #传输相关配置
    proxy_pass $mogilefs_path;
    proxy_hide_header Content-Type;
    proxy_buffering off;
   }
  }

多Trackers示例:

在nginx配置中的http配置段添加调度模块:

1 upstream mogsvr {
2   server 192.168.29.111:7001;
3   server 192.168.29.112:7001;
4   server 192.168.29.113:7001;
5   }

在nginx配置中的server配置段添:

location /imgs/ {
    mogilefs_tracker mogsvr;
   mogilefs_domain imgs;
   mogilefs_class png jpg;

   mogilefs_pass {
    proxy_pass $mogilefs_path;
    proxy_hide_header Content-Type;
    proxy_buffering off;
   }
  }

重新启动nginx,并通过nginx访问之前上传的图片:

总结:

在上传文件时遇到一个错误提示MogileFS::Backend: couldn't connect to mogilefsdbackend at /usr/local/share/perl/5.8.4/Client.pm line 282,这是由于mogilefsd服务于MySQL无法连接造成的,检查它们之间的连接情况就能发现错误所在。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Nginx服务器的反向代理proxy_pass配置方法讲解

    就普通的反向代理来讲 Nginx的配置还是比较简单的,如: location ~ /* { proxy_pass http://127.0.0.1:8008; } 或者可以 location / { proxy_pass http://127.0.0.1:8008; } Apache2的反向代理的配置是: ProxyPass /ysz/ http://localhost:8080/ 然而,如果要配置一个相对复杂的反向代理 Nginx相对Apache2就要麻烦一些了 比如,将url中以/wap/开

  • 使用nginx实现分布式限流的方法

    1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可以, 各位有兴趣可以去研究哈 . 2.首先部署一个对外暴露接口的程序 我这里部署的是一个spring boot 项目 里面暴露了如下接口, 很简单 暴露了一个 get 请求返回 hello world 的restful 接口. 将此程序部署到 linux 服务器上. 部署步奏不再赘述, 自行百度 s

  • nginx学习总结五(nginx反向代理)

    Nginx代理与负载均衡配置与优化 Nginx代理 Nginx从0.7.48版本开始,支持了类似Squid的缓存功能.Nginx的Web缓存服务主要由proxy_cache相关指令集和fastcgi_cache相关指令集构成,前者用于反向代理时,对后端内容源服务器进行缓存,后者主要用于对FastCGI的动态程序进行缓存.两者的功能基本上一样. Nginx 0.8.32版本,proxy_cache和fastcgi_cache已经比较完善,加上第三方的ngx_cache_purge模块(用于清除指定

  • Nginx反向代理websocket配置实例

    最近有一个需求,就是需要使用 nginx 反向代理 websocket,经过查找一番资料,目前已经测试通过,本文只做一个记录 复制代码 代码如下: 注: 看官方文档说 Nginx 在 1.3 以后的版本才支持 websocket 反向代理,所以要想使用支持 websocket 的功能,必须升级到 1.3 以后的版本,因此我这边是下载的 Tengine 的最新版本测试的 1.下载 tengine 最近的源码 复制代码 代码如下: wget http://tengine.taobao.org/dow

  • nginx 作为反向代理实现负载均衡的例子

    nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 〉直接作为http server(代替apache,对PHP需要FastCGI处理器支持): 〉另外一个功能就是作为反向代理服务器实现负载均衡 以下我们就来举例说明如何使用 nginx 实现负载均衡.因为nginx在处理并发方面的优势,现在这个应用非常常见.当然了Apache的 mod_proxy和mod_cache结合使用也可以实现对多台app server的反向代理和负载均衡,但是在并发处理方面apache还是没有

  • nginx的FastDFS分布式存储模块测试方法

    再回过头来看FastDFS更新很快,还看到fastdfs-nginx-module_v1.01.tar.gz nginx模块,所以今天在一台测试机上测试了·测试几天看稳定不稳定,在考虑换掉浪费资源的 lustre ! 环境: storage1:192.168.6.100 storage2:192.168.6.101 tracker:192.168.6.102 1. 在每个机器上,下载安装 FastDFS nginx $> wget http://fastdfs.googlecode.com/fi

  • Nginx反代Mogilefs分布式储存示例详解

    一.分布式存储系统简介 随着信息技术不断的发展,给我们带来便利的同时,不断增加的数据量级.信息之间的连接关联越来越复杂.数据访问的并发量日益增加对I/O的要求越来越高.数据类型越来越复杂等难题也成为信息技术继续高速发展亟需解决的难题.分布式存储系统的出现在很大程度上解决了以上大部分难题. 分布式存储系统,是将数据分散存储在多台独立的设备上.传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要.分布式存储系统采用可

  • nginx pod hook钩子优雅关闭示例详解

    目录 一.系统环境 二.前言 三.pod hook(pod钩子) 四.如何优雅的关闭nginx pod 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架构 CentOS Linux release 7.4.1708 (Core) Docker version 20.10.12 v1.21.9 x86_64 Kubernetes集群架构:k8scloude1作为master节点,k8scloude2,k8scloude3作为worker节点 服务器

  • JS中原始值和引用值的储存方式示例详解

    在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfined 引用值指的是复合数据类型的值,包括:Object.Function.Array.Date.RegExp 根据数据类型不同,有的变量储存在栈中,有的储存在堆中.具体区别如下: 原始变量及他们的值储存在栈中,当把一个原始变量传递给另一个原始变量时,是把一个栈房间的东西复制到另一个栈房间,且这两个原始

  • LyScript实现绕过反调试保护的示例详解

    LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的目的. LyScript项目地址: https://github.com/lyshark/LyScript 绕过反调试机制: 最常用的反调试机制就是用IsDebuggerPresent该标志检查PEB+2位置处的内容,如果为1则表示正在被调试,我们运行脚本直接将其设置为0即可绕过反调试机制. 也就是

  • nginx sticky实现基于cookie负载均衡示例详解

    目录 前言 思考 1.cookie_jsessionid 负载均衡 1.1 后端准备 1.2 hash $cookie_jsessionid;配置 2.nginx sticky 负载均衡 2.1 下载 sticky 2.2 重新编译升级nginx 2.3 upstream 配置 sticky 2.4 修改后端不再创建session 2.5 再次 多次请求 3.sticky 其他用法 总结 前言 sticky 是一个nginx的第三方模块 它不在nginx发行版中 需要额外编译这个模块的, 它的思

  • redis分布式ID解决方案示例详解

    目录 常用的分布式ID解决方案 UUID Snowflake Snowflake算法的Java代码: Leaf Leaf算法的Java代码: 基于数据库自增ID生成 基于UUID生成 基于Redis生成 基于ZooKeeper生成 常用的分布式ID解决方案 在分布式系统中,生成全局唯一ID是非常重要的,因为在分布式系统中,多个节点同时生成ID可能会导致ID冲突. 下面介绍几种常用的分布式ID解决方案. UUID UUID(通用唯一标识符)是由128位数字组成的标识符,它可以保证在全球范围内的唯一

  • 利用Python实现智能合约的示例详解

    目录 智能合约 1. 是什么 2. 使用场景 用Python如何实现 1. 设计智能合约 2. 编写智能合约源代码 3. 编译智能合约 4. 部署智能合约 5. 调用智能合约方法 6. 监控智能合约事件 7. 升级智能合约 智能合约 1. 是什么 智能合约是一种由计算机程序编写的自动化合约,它可以在没有第三方干预的情况下执行交易和契约条款.智能合约使用区块链技术实现,可以实现不同的功能,例如交易.投票.代币发放和数据存储等.智能合约的执行是基于其代码的逻辑,并且在既定条件满足时自动执行.智能合约

  • JavaScript作用域示例详解

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理.今天这篇文章对JavaScript作用域示例详解的介绍,希望能帮助大家更好的学习JavaScript. 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期.在JavaScript中,变量的作用域有全局作用域和局部作用域两种. 一.JavaScript中无块级作用域 在Java或C#中存在块级作用域

  • 正则表达式使用示例详解

    正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式使用单个字符串来描述.匹配一系列匹配某个句法规则的字符串. 下面通过实例代码介绍下正则表达式使用 //一个数据类型,记录文本规则,一些事先定义好的一些特殊字符,对字符串的过滤逻辑 //表单验证账号长度,字母或数字组合,高级搜索 //特点,不仅js有:极简的方式操作字符串:灵活,功能强大 // 正则表达式大全 var patt1=new

  • Go语言中的字符串处理方法示例详解

    1 概述 字符串,string,一串固定长度的字符连接起来的字符集合.Go语言的字符串是使用UTF-8编码的.UTF-8是Unicode的实现方式之一. Go语言原生支持字符串.使用双引号("")或反引号(``)定义. 双引号:"", 用于单行字符串. 反引号:``,用于定义多行字符串,内部会原样解析. 示例: // 单行 "心有猛虎,细嗅蔷薇" // 多行 ` 大风歌 大风起兮云飞扬. 威加海内兮归故乡. 安得猛士兮守四方! ` 字符串支持转义

随机推荐