• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
維健廣律 显示全部楼层 发表于 2021-10-25 20:23:35 |阅读模式 打印 上一主题 下一主题
一、分布式存储系统简介
随着信息技能不停的发展,给我们带来便利的同时,不停增加的数据量级、信息之间的毗连关联越来越复杂、数据访问的并发量日益增加对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安装。
  1. ~]# yum install -y mysql mysql-server
复制代码
安装Mogilefs的Trackers和Storage Node组件,安装时肯定要安装Perl相关的依赖包,依赖包有:
  1. perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
  2. perl-IO-stringy-2.110-1.2.el6.rfx.noarch.rpmperl-Net-Netmask-1.9015-8.el6.noarch.rpm
  3. Perlbal-1.78-1.el6.noarch.rpmperl-Perlbal-1.78-1.el6.noarch.rpm
  4. 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. # Enable daemon mode to work in background and use syslog
  2. daemonize = 1 #是否以守护进程的方式运行。
  3. # Where to store the pid of the daemon (must be the same in the init script)
  4. pidfile = /var/run/mogilefsd/mogilefsd.pid #pid文件路径
  5. # Database connection information
  6. db_dsn = DBI:mysql:mogilefs:host=192.168.29.111 #数据库的地址
  7. db_user = moguser #配置数据库的用户名及密码
  8. db_pass = 123456
  9. # IP:PORT to listen on for mogilefs client requests
  10. listen = 0.0.0.0:7001 #监听的地址与端口
  11. # Optional, if you don't define the port above.
  12. conf_port = 7001 #默认端口
  13. # Number of query workers to start by default.
  14. query_jobs = 10 #查询进程数量
  15. # Number of delete workers to start by default.
  16. delete_jobs = 1
  17. # Number of replicate workers to start by default.
  18. replicate_jobs = 5
  19. # Number of reaper workers to start by default.
  20. # (you don't usually need to increase this)
  21. reaper_jobs = 1
  22. # Number of fsck workers to start by default.
  23. # (these can cause a lot of load when fsck'ing)
  24. #fsck_jobs = 1
  25. # Minimum amount of space to reserve in megabytes
  26. # default: 100
  27. # Consider setting this to be larger than the largest file you
  28. # would normally be uploading.
  29. #min_free_space = 200
  30. # Number of seconds to wait for a storage node to respond.
  31. # default: 2
  32. # Keep this low, so busy storage nodes are quickly ignored.
  33. #node_timeout = 2
  34. # Number of seconds to wait to connect to a storage node.
  35. # default: 2
  36. # Keep this low so overloaded nodes get skipped.
  37. #conn_timeout = 2
  38. # Allow replication to use the secondary node get port,
  39. # if you have apache or similar configured for GET's
  40. #repl_use_get_port = 1
复制代码
修改完设置后,进入数据库创建一个可以远程毗连的root用户,或者使用mogdbsetup初始化数据库:
  1. mysql> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.29.%' IDENTIFIED BY '123456'; #创建用户moguser,拥有管理mogilefs库的所有权限,并允许192.168.29.*的用户远程连接。
  2. mysql> FLUSH PRIVILEGES;
  3. mysql> quit
复制代码
  1. ~]# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=123456
复制代码
初始化完成后可以在MySQL中看到创建好的mogilefs库以及里面的表:

启动mogilefs并确认7001端口处于监听状态:
  1. ~]# service mogilefsd start
  2. Starting mogilefsd      [ OK ]
  3. ~]# ss -lnt
复制代码
注:可以在n2、n3节点都安装Trackers服务,从而消除单点故障风险也能平均I/O压力。
3.在n1上设置Storage Node
Storage Node设置文件路径为/etc/mogilefs/mogstored.conf:
  1. ~]# vim /etc/mogilefs/mogstored.conf
  2. maxconns = 10000 #最大并发连接数
  3. httplisten = 0.0.0.0:7500 #Mogilefs数据的传输是通过http协议实现的,这里是监听的地址和端口
  4. mgmtlisten = 0.0.0.0:7501 #健康监测的监听地址和端口
  5. docroot = /mogliefs/mogdata #数据的存储路径,目录的属组和属主必须是mogilefs
复制代码
创建数据存储目次并修改属组和属主为mogilefs:
  1. ~]# mkdir -pv /mogliefs/mogdata
  2. ~]# chown -R mogilefs.mogilefs /mogliefs/
复制代码
启动mogstored,查察进程是否正常启动端口是否监听:
  1. ~]# service mogstored start
  2. ~]# ss -lnt #监听端口为7500、7501
复制代码
4.按照n1的步调在节点n2、n3上安装Mogilefs,并将n1上的设置文件复制到n2、n3。
  1. ~]# scp /etc/mogilefs/*.conf root@192.168.29.112:/etc/mogilefs/
  2. ~]# scp /etc/mogilefs/*.conf root@192.168.29.113:/etc/mogilefs/
复制代码
启动mogstored服务并确认监听:
  1. ~]# service mogstored start
  2. ~]# ss -lnt #监听端口为7500、7501
复制代码
5.用在n1上用mogadm下令将所有节点整合成集群。
添加存储节点,并查抄:
  1. 1 ~]# mogadm host add 192.168.29.111 --ip=192.168.29.111 --port=7500 --status=alive
  2. 2 ~]# mogadm host add 192.168.29.112 --ip=192.168.29.112 --port=7500 --status=alive
  3. 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. 1 ~]# mogadm device add 192.168.29.111 1
  2. 2 ~]# mogadm device add 192.168.29.112 2
  3. 3 ~]# mogadm device add 192.168.29.113 3
复制代码
6.创建Domain和Class
在Mogilefs中,在多个节点上为了方便文件副本管理,通常在设备中不会以文件为单元进行管理,而是以class(类)做管理,复制删除等操作都是以class为最小单元进行的。每个class中可以放很多文件,class的容积也不是固定的。
在Mogilefs的存储空间中,所有数据文件都在同一平面,所以不能有同名的情况发生,这样会影响Mogilefs的机动性,所以引入了Domain(名称空间)的概念。Domain包罗Class,在不同的Domain中可以有雷同的文件名。
  1. ~]# mogadm domain add imgs #创建名为imgs的Domain
  2. ~]# mogadm domain add text #创建名为text的Domain
  3. ~]# mogadm domain list #查看Domain list
复制代码
可以自定义Class的属性,格式为:mogadm class add <domain> <class> [opts]
  1. ~]# mogadm class add imgs png --mindevcount=3 --hashtype=MD5 #在Domain imgs中定义名为png的class,在不同设备中复制3份,并用MD5做校验
  2. ~]# mogadm class add imgs jpg --mindevcount=3 --hashtype=MD5 #在Domain imgs中定义名为jpg的class,在不同设备中复制3份,并用MD5做校验
  3. ~]# mogadm domain list
复制代码
7.使用Mogilefs做上传下载测试
Mogilefs可以用自建的API接口进行交互,其中有很多用于管理存储数据的下令。比方上传数据下令为mogupload,查察数据下令为mogfileinfo等。
例:测试将文件/test/123.png上传至Mogilefs集群(文件事先在当地准备好):
  1. ~]# 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
  2. ~]# 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. ~]# ls
  2. nginx-1.10.3   nginx_mogilefs_module-1.0.4
  3. nginx-1.10.3.tar.gz nginx_mogilefs_module-1.0.4.tar.gz
复制代码
  1. ~]# cd nginx-1.10.3
  2. ./configure \
  3. > --prefix=/usr \
  4. > --sbin-path=/usr/sbin/nginx \
  5. > --conf-path=/etc/nginx/nginx.conf \
  6. > --error-log-path=/var/log/nginx/error.log \
  7. > --http-log-path=/var/log/nginx/access.log \
  8. > --pid-path=/var/run/nginx/nginx.pid \
  9. > --lock-path=/var/lock/nginx.lock \
  10. > --user=nginx \
  11. > --group=nginx \
  12. > --with-http_ssl_module \
  13. > --with-http_flv_module \
  14. > --with-http_stub_status_module \
  15. > --with-http_gzip_static_module \
  16. > --http-client-body-temp-path=/var/tmp/nginx/client/ \
  17. > --http-proxy-temp-path=/var/tmp/nginx/proxy/ \
  18. > --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \
  19. > --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \
  20. > --http-scgi-temp-path=/var/tmp/nginx/scgi \
  21. > --with-pcre \
  22. > --with-debug \
  23. > --add-module=../nginx_mogilefs_module-1.0.4/ #一定记得添加Mogilefs模块所在的路径,不可少。
复制代码
  1. ~]# make & make install
复制代码
  添加nginx用户并启动nginx:
  1. ~]# useradd -s /sbin/nologin -M nginx
  2. ~]# /usr/sbin/nginx
复制代码
3.设置Nginx
单Trackers示例:
  1. location /imgs/ {
  2.    mogilefs_tracker 192.168.29.111:7001; #单Trackers示例
  3.    mogilefs_domain imgs; #指定Domain
  4.    mogilefs_class png jpg; #指定Class
  5.    mogilefs_pass { #传输相关配置
  6.     proxy_pass $mogilefs_path;
  7.     proxy_hide_header Content-Type;
  8.     proxy_buffering off;
  9.    }
  10.   }
复制代码
多Trackers示例:
在nginx设置中的http设置段添加调理模块:
  1. 1 upstream mogsvr {
  2. 2   server 192.168.29.111:7001;
  3. 3   server 192.168.29.112:7001;
  4. 4   server 192.168.29.113:7001;
  5. 5   }
复制代码
在nginx设置中的server设置段添:
  1. location /imgs/ {
  2.     mogilefs_tracker mogsvr;
  3.    mogilefs_domain imgs;
  4.    mogilefs_class png jpg;
  5.    mogilefs_pass {
  6.     proxy_pass $mogilefs_path;
  7.     proxy_hide_header Content-Type;
  8.     proxy_buffering off;
  9.    }
  10.   }
复制代码
重新启动nginx,并通过nginx访问之前上传的图片:

总结:
在上传文件时碰到一个错误提示MogileFS::Backend: couldn't connect to mogilefsdbackend at /usr/local/share/perl/5.8.4/Client.pm line 282,这是由于mogilefsd服务于MySQL无法毗连造成的,查抄它们之间的毗连情况就能发现错误地点。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有肯定的参考学习价值,假如有疑问大家可以留言交流,谢谢大家对草根技能分享的支持。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作