随着信息技术不断的发展,给咱们带来便利的同时,不断增长的数据量级、信息之间的链接关联愈来愈复杂、数据访问的并发量日益增长对I/O的要求愈来愈高、数据类型愈来愈复杂等难题也成为信息技术继续高速发展亟需解决的难题。分布式存储系统的出如今很大程度上解决了以上大部分难题。node
分布式存储系统,是将数据分散存储在多台独立的设备上。传统的网络存储系统采用集中的存储服务器存放全部数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能知足大规模存储应用的须要。分布式存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提升了系统的可靠性、可用性和存取效率,还易于扩展。mysql
分布式存储系统在接口类型上可分为通用分布式储存和专用分布式储存。通用分布式储存是指没有文件系统接口,须要经过API接口进行访问;专用分布式储存也称为分布式文件系统,它们通常都会有文件系统接口,能够直接挂载。通用分布式储存有mogilefs、fastdfs等,专用分布式储存系统有moosefs等。nginx
1.Trackers(mogilefsd):Mogliefs的核心组件,主要功能是(Replication)节点文件复制、(Deletion)文件删除、(Query)元数据查询、(Monitor)健康监测、(Reaper)储存失败重置等等。它一般称为元数据服务器,但它不会去储存元数据,而是将元数据储存在如MySQL这一类的数据库中。为保证架构的可靠性,Trackers通常有多个。Trackers可看做是一个旁挂式代理,只负责处理元数据信息。c++
2.数据库:数据库用来存放Mogliefs的元数据,而由Trackers来管理数据。所以一般建议作HA。sql
3.mogstored(储存节点):实际文件存放的地方。一般会将实际文件保存至少两份副本。数据库
在三个节点同时安装Trackers和mogstored,选择其中一个节点安装MySQL。在生产环境最好是能单独将MySQL部署而且作主从复制。Trackers和mogstored也能够分开部署在不一样节点上,这些都须要根据实际的生产环境来决定。这里主要是演示mogilefs,不作MySQL主从复制演示。若想要Mogilefs能挂载,能够用FUSE来实现。apache
须要注意的是mogilefs存储的文件URL很特殊(后面会解释mogilefs文件名生产的过程),如存储一张图片时文件URL可能会是相似6060/0000/0000/0000/00000021.jpg这样的格式,对用户来说就不太友好,用户可能须要直观的相似image.hello.com/21.jpg这样的URL。因此一般会使用Nginx来反代Mogilefs。编程
Mogilefs是一个相对较年代较久但成熟的分布式储存,考虑到可能在Centos7上会出现兼容问题,这里Centos6来演示。vim
操做系统: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
结构如上图所示。
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.rpm perl-Net-Netmask-1.9015-8.el6.noarch.rpm Perlbal-1.78-1.el6.noarch.rpm perl-Perlbal-1.78-1.el6.noarch.rpm Perlbal-doc-1.78-1.el6.noarch.rpm perl-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
注:能够在n二、n3节点都安装Trackers服务,从而消除单点故障风险也能平均I/O压力。
Java架构交流学习圈:874811168 面向1-3年经验 Java开发人员 帮助突破瓶颈 提高思惟能力
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
~]# 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
添加存储节点,并检查:
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是将冗余存储在不一样设备中的,每个节点都应该被识别为不一样的设备。
在n一、n二、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
在Mogilefs中,在多个节点上为了方便文件副本管理,一般在设备中不会以文件为单位进行管理,而是以class(类)作管理,复制删除等操做都是以class为最小单位进行的。每一个class中能够放不少文件,class的容积也不是固定的。
在Mogilefs的存储空间中,全部数据文件都在同一平面,因此不能有同名的状况发生,这样会影响Mogilefs的灵活性,因此引入了Domain(名称空间)的概念。Domain包含Class,在不一样的Domain中能够有相同的文件名。Java架构交流学习圈:874811168 面向1-3年经验 Java开发人员 帮助突破瓶颈 提高思惟能力
~]# 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
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的步骤。
~]# service mogilefsd start
安装依赖包:
~]# 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
单Trackers示例:
1 location /imgs/ { 2 mogilefs_tracker 192.168.29.111:7001; #单Trackers示例 Java架构交流学习圈:874811168 面向1-3年经验 Java开发人员 帮助突破瓶颈 提高思惟能力 3 mogilefs_domain imgs; #指定Domain 4 mogilefs_class png jpg; #指定Class 5 6 mogilefs_pass { #传输相关配置 7 proxy_pass $mogilefs_path; 8 proxy_hide_header Content-Type; 9 proxy_buffering off; 10 } 11 }
多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配置段添:
1 location /imgs/ { 2 mogilefs_tracker mogsvr; 3 mogilefs_domain imgs; 4 mogilefs_class png jpg; 5 6 mogilefs_pass { 7 proxy_pass $mogilefs_path; 8 proxy_hide_header Content-Type; 9 proxy_buffering off; 10 } 11 }
从新启动nginx,并经过nginx访问以前上传的图片:
在上传文件时遇到一个错误提示MogileFS::Backend: couldn't connect to mogilefsdbackend at /usr/local/share/perl/5.8.4/Client.pm line 282,这是因为mogilefsd服务于MySQL没法链接形成的,检查它们之间的链接状况就能发现错误所在。