一、分散式儲存系統簡介
隨著資訊科技不斷的發展,為我們帶來便利的同時,不斷增加的資料量級、資訊之間的連接關聯越來越複雜、資料存取的並發量日益增加對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 nodemysql直接用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.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。安裝元件:
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
注:可以在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、7501
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、7501
5.用在n1上用mogadm命令将所有节点整合成集群。
添加存储节点,并检查:
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是将冗余存储在不同设备中的,每一个节点都应该被识别为不同的设备。
在n1、n2、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
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
~]# 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集群(文件事先在本地准备好):
~]# 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.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
3.配置nginx
单trackers示例:
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 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配置段添:
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访问之前上传的图片:
以上是Nginx反代Mogilefs分散式儲存的方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!