- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Nginx反代Mogilefs分布式储存示例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、分布式存储系统简介 。
随着信息技术不断的发展,给我们带来便利的同时,不断增加的数据量级、信息之间的连接关联越来越复杂、数据访问的并发量日益增加对I/O的要求越来越高、数据类型越来越复杂等难题也成为信息技术继续高速发展亟需解决的难题。分布式存储系统的出现在很大程度上解决了以上大部分难题.
分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展.
分布式存储系统在接口类型上可分为通用分布式储存和专用分布式储存。通用分布式储存是指没有文件系统接口,需要通过API接口进行访问;专用分布式储存也称为分布式文件系统,它们一般都会有文件系统接口,可以直接挂载。通用分布式储存有mogilefs、fastdfs等,专用分布式储存系统有moosefs等.
2、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安装.
1
|
~]
# yum install -y mysql mysql-server
|
安装Mogilefs的Trackers和Storage Node组件,安装时一定要安装Perl相关的依赖包,依赖包有:
1
2
3
4
|
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。安装组件:
1
|
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:
1
|
~]
# vim /etc/mogilefs/mogilefsd.conf #Mogilfs Trackers的主配置文件
|
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
|
# 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初始化数据库:
1
2
3
|
mysql> GRANT ALL ON mogilefs.* TO
'moguser'
@
'192.168.29.%'
IDENTIFIED BY
'123456'
;
#创建用户moguser,拥有管理mogilefs库的所有权限,并允许192.168.29.*的用户远程连接。
mysql> FLUSH PRIVILEGES;
mysql> quit
|
1
|
~]
# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=123456
|
初始化完成后可以在MySQL中看到创建好的mogilefs库以及里面的表:
启动mogilefs并确认7001端口处于监听状态
1
2
3
|
~]
# service mogilefsd start
Starting mogilefsd [ OK ]
~]
# ss -lnt
|
注:可以在n2、n3节点都安装Trackers服务,从而消除单点故障风险也能平均I/O压力.
3.在n1上配置Storage Node 。
Storage Node配置文件路径为/etc/mogilefs/mogstored.conf:
1
2
3
4
5
|
~]
# 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:
1
2
|
~]
# mkdir -pv /mogliefs/mogdata
~]
# chown -R mogilefs.mogilefs /mogliefs/
|
启动mogstored,查看进程是否正常启动端口是否监听:
1
2
|
~]
# service mogstored start
~]
# ss -lnt #监听端口为7500、7501
|
4.按照n1的步骤在节点n2、n3上安装Mogilefs,并将n1上的配置文件复制到n2、n3.
1
2
|
~]
# scp /etc/mogilefs/*.conf root@192.168.29.112:/etc/mogilefs/
~]
# scp /etc/mogilefs/*.conf root@192.168.29.113:/etc/mogilefs/
|
启动mogstored服务并确认监听:
1
2
|
~]
# service mogstored start
~]
# ss -lnt #监听端口为7500、7501
|
5.用在n1上用mogadm命令将所有节点整合成集群.
添加存储节点,并检查:
1
2
3
|
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
|
1
|
~]
# mogadm check
|
若想让mogilefs集群中的存储被识别成不同设备,需要在创建的/mogliefs/mogdata目录下再创建名为dev*的目录,使每个节点被当做存储设备使用。mogilefs是将冗余存储在不同设备中的,每一个节点都应该被识别为不同的设备.
在n1、n2、n3上的/mogliefs/mogdata/目录下分别创建dev1,dev2,dev3目录,并在Trackers上添加设备:
1
2
3
|
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中可以有相同的文件名.
1
2
3
|
~]
# mogadm domain add imgs #创建名为imgs的Domain
~]
# mogadm domain add text #创建名为text的Domain
~]
# mogadm domain list #查看Domain list
|
可以自定义Class的属性,格式为:mogadm class add <domain> <class> [opts] 。
1
2
3
|
~]
# 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集群(文件事先在本地准备好):
1
2
|
~]
# 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相同):
1
|
~]
# service mogilefsd start
|
2.在n4节点编译安装Nginx 。
安装依赖包:
1
|
~]
# 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并展开:
1
2
3
|
~]
# 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
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
~]
# 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模块所在的路径,不可少。
|
1
|
~]
# make & make install
|
添加nginx用户并启动nginx:
1
2
|
~]
# useradd -s /sbin/nologin -M nginx
~]
# /usr/sbin/nginx
|
3.配置Nginx 。
单Trackers示例:
1
2
3
4
5
6
7
8
9
10
11
|
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
2
3
4
5
|
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配置段添:
1
2
3
4
5
6
7
8
9
10
11
|
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无法连接造成的,检查它们之间的连接情况就能发现错误所在.
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我的支持.
原文链接:http://www.cnblogs.com/readygood/p/9899230.html 。
最后此篇关于Nginx反代Mogilefs分布式储存示例详解的文章就讲到这里了,如果你想了解更多关于Nginx反代Mogilefs分布式储存示例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Sample data for IPv6? 除了 wireshark 在其网站上提供的内容之外,是否有可以下
我正在寻找可以集成到现有应用程序中并使用多拖放功能的示例或任何现成的解决方案。我在互联网上找到的大多数解决方案在将多个项目从 ListBox 等控件拖放到另一个 ListBox 时效果不佳。谁能指出我
我是 GATE Embedded 的新手,我尝试了简单的示例并得到了 NoClassDefFoundError。首先我会解释我尝试了什么 在 D:\project\gate-7.0 中下载并提取 Ga
是否有像 Eclipse 中的 SWT 示例那样的多合一 JFace 控件示例?搜索(在 stackoverflow.com 上使用谷歌搜索和搜索)对我没有帮助。 如果它是一个独立的应用程序或 ecl
我找不到任何可以清楚地解释如何通过 .net API(特别是 c#)使用谷歌计算引擎的内容。有没有人可以指点我什么? 附言我知道 API 引用 ( https://developers.google.
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
最近在做公司的一个项目时,客户需要我们定时获取他们矩阵系统的数据。在与客户进行对接时,提到他们的接口使用的目前不常用的BASIC 认证。天呢,它好不安全,容易被不法人监听,咋还在使用呀。但是没办法呀,
我正在尝试为我的应用程序设计配置文件格式并选择了 YAML。但是,这(显然)意味着我需要能够定义、解析和验证正确的 YAML 语法! 在配置文件中,必须有一个名为 widgets 的集合/序列。 .这
你能给我一个使用 pysmb 库连接到一些 samba 服务器的例子吗?我读过有类 smb.SMBConnection.SMBConnection(用户名、密码、my_name、remote_name
linux服务器默认通过22端口用ssh协议登录,这种不安全。今天想做限制,即允许部分来源ip连接服务器。 案例目标:通过iptables规则限制对linux服务器的登录。 处理方法:编
我一直在寻找任何 PostProjectAnalysisTask 工作代码示例,但没有看。 This页面指出 HipChat plugin使用这个钩子(Hook),但在我看来它仍然使用遗留的 Po
我发现了 GWT 的 CustomScrollPanel 以及如何自定义滚动条,但我找不到任何示例或如何设置它。是否有任何示例显示正在使用的自定义滚动条? 最佳答案 这是自定义 native 滚动条的
我正在尝试开发一个 Backbone Marionette 应用程序,我需要知道如何以最佳方式执行 CRUD(创建、读取、更新和销毁)操作。我找不到任何解释这一点的资源(仅适用于 Backbone)。
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题?通过 editing this post 添加详细信息并澄清问题. 去年关闭。 Improve this
我需要一个提交多个单独请求的 django 表单,如果没有大量定制,我找不到如何做到这一点的示例。即,假设有一个汽车维修店使用的表格。该表格将列出商店能够进行的所有可能的维修,并且用户将选择他们想要进
我有一个 Multi-Tenancy 应用程序。然而,这个相同的应用程序有 liquibase。我需要在我的所有数据源中运行 liquibase,但是我不能使用这个 Bean。 我的应用程序.yml
我了解有关单元测试的一般思想,并已在系统中发生复杂交互的场景中使用它,但我仍然对所有这些原则结合在一起有疑问。 我们被警告不要测试框架或数据库。好的 UI 设计不适合非人工测试。 MVC 框架不包括一
我正在使用 docjure并且它的 select-columns 函数需要一个列映射。我想获取所有列而无需手动指定。 如何将以下内容生成为惰性无限向量序列 [:A :B :C :D :E ... :A
$condition使用说明和 $param在 findByAttributes在 Yii 在大多数情况下,这就是我使用 findByAttributes 的方式 Person::model()->f
我在 Ubuntu 11.10 上安装了 qtcreator sudo apt-get install qtcreator 安装的版本有:QT Creator 2.2.1、QT 4.7.3 当我启动
我是一名优秀的程序员,十分优秀!