一、导言
MogileFS是由LiveJournal的子公司DangaInteractive开发的开源分布式文件存储系统。Danga团队开发了很多知名的开源项目,包括Memcached、MogileFS、Perlbal等。目前,MogileFS越来越多的公司在使用该解决方案,如日本的优派、digg,中国的豆瓣、1号店、大众点评、搜狗、安居客等。,它们为各自的组织或公司管理大量图片。与传统的网络存储不同,分布式文件系统将数据分散存储在多个服务器上,而网络文件系统往往将所有数据存储在一起,存储服务器会成为系统可用性的瓶颈,无法满足大规模存储所有数据的需求。分布式文件系统采用可扩展的体系结构,使用多个存储设备存储和分担服务器负载,使用位置服务器定位和存储信息。因此,它不仅可以提高系统性能,而且易于扩展。
二。实现组件
MogileFS主要由三部分组成:
①服务器,包括两部分,mogilefsd和mogstored应用。tracker是mogilefsd的实现,通过数据库保证元数据信息,如domian、class、host等。的网站。mogstored是存储节点,默认情况下监视端口7500,并接受来自客户服务的文件存储请求。MogileFS安装完成后,运行mogadm工具在mogilefsd数据库中注册所有存储节点,mogilefsd将管理和监控这些节点。
②utils工具集,主要是MogileFS的一些管理工具如mogadm等。
③客服API,MogileFS的API接口很多,常用的时间模式有php、perl、python、java等。这些语言可以用来编写客户服务程序,实现文件的备份管理功能。
三。MogileFS的特点和原理
MogileFS功能:
1.应用层服务,不需要使用合兴组件
2.不存在单点故障。tracker是跟踪点,mogstored是存储节点,mysql是元数据存储节点。建议使用MySQL实现高可用性
3.传输是中性的,没有特别的协议。可以通过nfs和http
实现通信
4.简单命名空房间,没有目录,直接存储在存储空房间,通过域实现,不共享任何数据
MogileFS的工作原理:mogilefs主要由mogilefsd和mogstored两个应用提供。tracker节点以数据库的方式保存每个节点文件的元数据信息和每个域中的存储位置分布,用于实现快速定位,同时监控每个节点,通知客户端存储区域位置,并指示存储节点复制数据。进程名为mogilefsd监控和端口7001。存储节点是实际存储文件的地方。存储节点可以是http服务器和其他web服务。存储节点可以自动维护键值之间的对应关系。存储节点的前端可以用nginx代替。此时需要nginx-mogilefs-module-master模块。该服务监控与端口7501的连接,该过程称为mogstored。域中的键值是唯一的。一个mogilefs可以有多个域,一个域可以有多个存储设备。每个设备都有一个数据容器,称为域。每个存储节点都是一个主机,一个主机可以有多个存储设备。每个设备都有一个id号,用于定位。复制的最小单位是类,即文件属性管理,它定义了存储在不同设备上的文件的副本数量。
四。MogileFS
的安装和配置
安装说明:这个实验只能对两个服务进行,一个服务作为服务器,一个存储节点和一个mysql服务器。tracker部署在每台服务器上,用于管理和监控节点。
创建数据库并授权修改相应的配置文件。
grant all privileges on mogdb.* to 'moguser'@'127.0.0.1' identified by 'pass'; grant all privileges on mogdb.* to 'moguser'@'localhost' identified by 'pass'; flush privileges; #修改mogilefsd.conf配置文件 # 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 # Database connection information db_dsn = DBI:mysql:mogdb:host=127.0.0.1 #修改为上面授权的账号密码及其主机 db_user = moguser #修改为上面授权的账号密码及其主机 db_pass = pass #修改为上面授权的账号密码及其主机 # 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 #mogstored配置文件,一般无需修改,自行根据业务需求做决定 maxconns = 10000 httplisten = 0.0.0.0:7500 mgmtlisten = 0.0.0.0:7501 docroot = /data/mogstored #将上诉配置考别一份至其他主机,并且启动服务,安装后默认在Init.d下有启动脚本 service mogilefsd start service mogstored start [root@centos6 mogilefs]# ss -tnl |grep *.7.* #默认mogilefsd监听7001,mogstored监听7501及其7501 LISTEN 0 128 *:7500 *:* LISTEN 0 128 *:7501 *:* LISTEN 0 128 *:7001 *:* [root@node mogilefs]# #设置数据库,存储元数据 mogdbsetup --dbhost=127.0.0.1 --dbpass=pass mogdbsetup --dbname=mogdb --dbuser=moguser --dbhost=127.0.0.1 --dbpass=pass mogadm host add 10.1.100.1 --ip=10.1.100.1 --port=7500 --status=alive #添加host,storaged mogadm domain add files #添加域 mogadm domain add p_w_picpaths [root@centos6 ~]# mogstats --db_dsn="DBI:mysql:mogdb:host=localhost" --db_user="moguser" --db_pass="pass" --stats="all" Fetching statistics... (all) Statistics for devices... #表示此storage设备存活 device host files status ---------- ---------------- ------------ ---------- dev1 10.1.100.1 2 alive dev3 10.1.100.2 1 alive dev4 10.1.100.2 1 alive ---------- ---------------- ------------ ---------- Statistics for file ids... Max file id: 9 Statistics for files... #添加的域显示结果 domain class files size (m) fullsize (m) -------------------- ----------- ---------- ----------- ------------- files default 1 0 0 p_w_picpaths default 1 0 0 -------------------- ----------- ---------- ----------- ------------- Statistics for replication... #默认的类示结果 domain class devcount files -------------------- ----------- ---------- ---------- files default 2 1 p_w_picpaths default 2 1 -------------------- ----------- ---------- ---------- Statistics for replication queue... status count -------------------- ------------ -------------------- ------------ Statistics for delete queue... status count -------------------- ------------ -------------------- ------------ Statistics for general queues... queue status count --------------- -------------------- ------------ --------------- -------------------- ------------ done [root@node ~]# [root@node~]# mogupload --trackers=10.1.100.1 --domain=files --key='/issue' --file='/etc/issue' #上传文件至files域内,指明可Key和上传的文件目录 [root@node ~]# moglistkeys --trackers=10.1.100.1 --domain=files #显示域内文件 /fstab.txt /issue [root@node ~]# mogfetch --trackers=10.1.100.1 --domain=files --key='/issue' --file='/tmp/issue' #下载域内文件至某目录 [root@node ~]# ll /tmp/issue -rw-r--r--. 1 root root 47 11月 25 16:48 /tmp/issue -bash: ogfileinfo: command not found [root@node2 ~]# mogfileinfo --tracker=10.1.100.1 --domain=files --key='/fstab.txt' - file: /fstab.txt class: default devcount: 2 domain: files fid: 5 key: /fstab.txt length: 1115 -http://10.1.100.2:7500/dev4/0/000/000/0000000005.fid #可通过此URL访问到相应的资源 -http://10.1.100.1:7500/dev1/0/000/000/0000000005.fid #可通过此URL访问到相应的资源 [root@node2 ~]#实验结果图解:
五、nginx前端替换mogfilefs和负载均衡的实战
需求:前期nginx被配置为逆向将用户的请求调度到后端的MogileFS。这个实验依赖于nginx-mogilefs-module模块,需要在编译时添加。
#实战配置如下所示: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #log_format main '$remote_addr - $remote_user [$time_local] "$request" ' # '$status $body_bytes_sent "$http_referer" ' # '"$http_user_agent" "$http_x_forwarded_for"'; #access_log logs/access.log main; sendfile on; #tcp_nopush on; #keepalive_timeout 0; keepalive_timeout 65; #gzip on; # upstream mogtrackers { #定义一个upstream组 server 10.1.100.1:7001; server 10.1.100.2:7001; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /p_w_picpaths/ { mogilefs_tracker mogtrackers; #在此调用此mogtrackers即可实现反代至mogilefs后端 mogilefs_domain p_w_picpaths; #域为p_w_picpaths域 mogilefs_methods get; #请求的方法为get mogilefs_pass { proxy_pass $mogilefs_path; proxy_hide_header Content-Type; proxy_buffering off; } expires 1h; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ \.php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # #location ~ \.php$ { # root html; # fastcgi_pass 127.0.0.1:9000; # fastcgi_index index.php; # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; # include fastcgi_params; #} # deny access to .htaccess files, if Apache's document root # concurs with nginx's one # #location ~ /\.ht { # deny all; #} } # another virtual host using mix of IP-, name-, and port-based configuration # #server { # listen 8000; # listen somename:8080; # server_name somename alias another.alias; # location / { # root html; # index index.html index.htm; # } #} # HTTPS server # #server { # listen 443 ssl; # server_name localhost; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_cache shared:SSL:1m; # ssl_session_timeout 5m; # ssl_ciphers HIGH:!aNULL:!MD5; # ssl_prefer_server_ciphers on; # location / { # root html; # index index.html index.htm; # } #} }图示:此时可以通过http://uri/p_w_picpaths/aqua.jpg而不是原来的长路径名进行访问。
总结:在大型站点中,mogilefs的重要性不言而喻,尤其是对于图片存储量较大的站点,如某宝、某东等。在这个配置过程中,mysql很容易成为单点故障,所以可以复制为主从。同时结合MySQL半同步复制,可以降低数据丢失的风险。在将nginx配置为逆向代理时,大部分步骤与其他逆向生成类的不同之处在于,需要将模块编译到nginx中才能使用这个模块函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)