Nginx反代Mogilefs分布式储存示例
一、分布式存储系统简介
随着信息技术不断的发展,给我们带来便利的同时,不断增加的数据量级、信息之间的连接关联越来越复杂、数据访问的并发量日益增加对I/O的要求越来越高、数据类型越来越复杂等难题也成为信息技术继续高速发展亟需解决的难题。分布式存储系统的出现在很大程度上解决了以上大部分难题。
分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。
分布式存储系统在接口类型上可分为通用分布式储存和专用分布式储存。通用分布式储存是指没有文件系统接口,需要通过API接口进行访问;专用分布式储存也称为分布式文件系统,它们一般都会有文件系统接口,可以直接挂载。通用分布式储存有mogilefs、fastdfs等,专用分布式储存系统有moosefs等。
二、Mogilefs
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-.el6.rf.noarch.rpm
perl-IO-stringy-2.110-1.2.el6.rfx.noarch.rpm
perl-Net-Netmask-1.9015-.el6.noarch.rpm
Perlbal-1.78-.el6.noarch.rpm
perl-Perlbal-1.78-.el6.noarch.rpm
Perlbal-doc-1.78-.el6.noarch.rpm
perl-IO-AIO-3.71-2.el6.x86_64.rpm
上述依赖包一定要安装后才能安装Mogilefs。安装组件:
yum install -y MogileFS-Server-mogstored-2.46-.el6.noarch.rpm MogileFS-Server-mogilefsd-2.46-.el6.noarch.rpm MogileFS-Server-2.46-.el6.noarch.rpm
配置 MogileFS-Server-mogilefsd :
~]# vim /etc/mogilefs/mogilefsd.conf #Mogilfs Trackers的主配置文件
# Enable daemon mode to work in background and use syslog
daemonize = #是否以守护进程的方式运行。
# 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 =
# IP:PORT to listen on for mogilefs client requests
listen = 0.0.0.0: #监听的地址与端口
# Optional, if you don't define the port above.
conf_port = #默认端口
# Number of query workers to start by default.
query_jobs = #查询进程数量
# Number of delete workers to start by default.
delete_jobs =
# Number of replicate workers to start by default.
replicate_jobs =
# Number of reaper workers to start by default.
# (you don't usually need to increase this)
reaper_jobs =
# Number of fsck workers to start by default.
# (these can cause a lot of load when fsck'ing)
#fsck_jobs =
# Minimum amount of space to reserve in megabytes
# default:
# Consider setting this to be larger than the largest file you
# would normally be uploading.
#min_free_space =
# Number of seconds to wait for a storage node to respond.
# default:
# Keep this low, so busy storage nodes are quickly ignored.
#node_timeout =
# Number of seconds to wait to connect to a storage node.
# default:
# Keep this low so overloaded nodes get skipped.
#conn_timeout =
# Allow replication to use the secondary node get port,
# if you have apache or similar configured for GET's
#repl_use_get_port =
修改完配置后,进入数据库创建一个可以远程连接的root用户,或者使用 mogdbsetup 初始化数据库:
mysql> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.29.%' IDENTIFIED BY ''; #创建用户moguser,拥有管理mogilefs库的所有权限,并允许192.168.29.*的用户远程连接。
mysql> FLUSH PRIVILEGES;
mysql> quit
~]# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=
初始化完成后可以在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、
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、
5.用在n1上用mogadm命令将所有节点整合成集群。
添加存储节点,并检查:
~]# mogadm host add 192.168.29.111 --ip=192.168.29.111 --port= --status=alive
~]# mogadm host add 192.168.29.112 --ip=192.168.29.112 --port= --status=alive
~]# mogadm host add 192.168.29.113 --ip=192.168.29.113 --port= --status=alive
~]# mogadm check
若想让mogilefs集群中的存储被识别成不同设备,需要在创建的 /mogliefs/mogdata 目录下再创建名为 dev* 的目录,使每个节点被当做存储设备使用。mogilefs是将冗余存储在不同设备中的,每一个节点都应该被识别为不同的设备。
在n1、n2、n3上的 /mogliefs/mogdata/ 目录下分别创建dev1,dev2,dev3目录,并在Trackers上添加设备:
~]# mogadm device add 192.168.29.111
~]# mogadm device add 192.168.29.112
~]# mogadm device add 192.168.29.113
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= --hashtype=MD5 #在Domain imgs中定义名为png的class,在不同设备中复制3份,并用MD5做校验
~]# mogadm class add imgs jpg --mindevcount= --hashtype=MD5 #在Domain imgs中定义名为jpg的class,在不同设备中复制3份,并用MD5做校验
~]# mogadm domain list
7.使用Mogilefs做上传下载测试
Mogilefs可以用自建的API接口进行交互,其中有很多用于管理存储数据的命令。例如上传数据命令为 mogupload ,查看数据命令为 mogfileinfo 等。
例:测试将文件 /test/.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..tar.gz 与Nginx_Mogilefs模块 nginx_mogilefs_module-1.0..tar.gz 并展开:
~]# ls
nginx-1.10. nginx_mogilefs_module-1.0.
nginx-1.10..tar.gz nginx_mogilefs_module-1.0..tar.gz
~]# cd nginx-1.10.
./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./ #一定记得添加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:; #单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配置段添加调度模块:
upstream mogsvr {
server 192.168.29.111:;
server 192.168.29.112:;
server 192.168.29.113:;
}
在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无法连接造成的,检查它们之间的连接情况就能发现错误所在。
Nginx反代Mogilefs分布式储存示例的更多相关文章
- Nginx反代MogileFS集群
上一篇博文我们主要聊了下分布式文件系统MogileFS的组件以及部署使用,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/13677279.html:今天我们主要 ...
- [日常] nginx反代websocket
去年的事 , 随便记记 ============================================================= 2017年11月6日 记录: 获取包的选择状态: d ...
- Nginx反代服务器进阶学习最佳配置实践指南
转载自:https://www.bilibili.com/read/cv16150010?spm_id_from=333.999.0.0 0x00 编译实践 描述:在企业线上生产环境中推荐进行Ngin ...
- Nginx反代服务器基础配置实践案例
转载自:https://www.bilibili.com/read/cv16149433?spm_id_from=333.999.0.0 方式1: 轮询 RR(默认轮询)每个请求按时间顺序逐一分配到不 ...
- Django Nginx反代 获取真实ip
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Andale Mono"; color: #28fe14; backgr ...
- Nginx反代,后端一个IP绑定多个SSL证书,导致连接失败之解决方法:HTTPS和SNI扩展
默认:SSL协议进行握手协商进行连接的时候,默认是不会发送主机名的,也就是是以IP的形式来进行https连接握手协商的,这就导致一个问题,当一台服务器上有多个虚拟主机使用同一个IP的时候, Nginx ...
- nginx反代及后端web配置
一.反代配置,proxy_pass指向的upstream需要在反代的nginx.conf中配置 server {access_log /home/nginx/front_access.log;erro ...
- Nginx反代至Tomcat基于memcached的session保持
实现功能:基于前面tomcat基础简介与示例文章 (1) tomcat cluster将会话保存至memcached中:实现模型: 这里写图片描述 配置B,C主机安装openjdk与tomcat[本次 ...
- 在CentOS 7中 使用 Nginx 反代 .Net Core
很久没弄 .Net Core 了,然后忽然发现Windows自带的 Hyper-V 虚拟机貌似挺好用的 .Net Core 之前都是用 Jexus 来做服务器,忽然想用下Nginx来试试 1.在 Ce ...
随机推荐
- Chapter3_操作符_方法调用中的别名问题
接下来展示方法调用中的别名问题,方法调用中的别名问题指的是,将一个对对象的引用传递给某一个方法时,方法操作的是这一个特定的引用而不是这个引用的拷贝. class Person{ float heigh ...
- SpringMVC 学习 十一 springMVC控制器向jsp或者别的控制器传递参数的四种方法
以后的开发,大部分是发送ajax,因此这四种传递参数的方法,并不太常用.作为了解吧 第一种:使用原生 Servlet 在控制器的响应的方法中添加Servlet中的一些作用域:HttpRequestSe ...
- IOS内存管理详解
一. 基本原理 1. 什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空 ...
- ActiveMQ_6持久化
activemq持久化 ActiveMQ提供了插件式的消息存储,主要有有如下几种: 1.AMQ消息存储-基于文件的存储方式,是以前的默认消息存储 2.KahaDB消息存储-提供了容量的提升和恢复能力, ...
- JS图片验证码
!(function(window, document) { var size = 5;//设置验证码长度 function GVerify(options) { //创建一个图形验证码对象,接收op ...
- pyhon_day1 格式化输出
格式化输出 我们在写Python的在很多时候输出的内容需要规定格式的,这样就引入到了格式化输出 定义: 盗用下大咖的例子: ------------ info of alex ----------- ...
- 关不掉的小姐姐程序python tkinter实现 学习---打包教程
首先,我们先准备两个.py文件,还要图片文件 代码//是我自己手写的,copy时记得删掉,不然有可能错误,比如中英文啥的 当然 一些语法的无问题就百度,都能给你答案 第一个.py ...
- django自定义user认证系统
第一种,彻底推翻django的user认证系统,重新定义我们想要的字段 from django.contrib.auth.models import AbstractBaseUser,Permissi ...
- Vuejs——(8)Vuejs组件的定义
版权声明:出处http://blog.csdn.net/qq20004604 目录(?)[+] 本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...
- 使用netstat命令查看端口的使用情况
Windows如何查看端口占用情况操作步骤如下: 开始--运行--cmd 进入命令提示符,输入netstat -ano 即可看到所有连接的PID 之后在任务管理器中找到这个PID所对应的程序如果任务管 ...