1、簡述存儲系統(tǒng)的三種分類及KV模型
存儲系統(tǒng)的三種分類
1).對象存儲
通常意義的鍵值存儲沽损,其接口就是簡單的GET灯节、PUT、DEL 和其他擴(kuò)展缠俺,代表主要有 Swift 显晶、S3 以及 Gluster 等;
2).塊存儲
這種接口通常以 QEMU Driver 或者 Kernel Module 的方式存在壹士,這種接口需要實(shí)現(xiàn) Linux 的 Block Device 的接口或者 QEMU 提供的 Block Driver 接口磷雇,如 Sheepdog,AWS 的 EBS躏救,青云的云硬盤和阿里云的盤古系統(tǒng)唯笙,還有 Ceph 的 RBD(RBD是Ceph面向塊存儲的接口)。在常見的存儲中 DAS盒使、SAN 提供的也是塊存儲崩掘;
3).文件存儲
通常意義是支持 POSIX 接口,它跟傳統(tǒng)的文件系統(tǒng)如 Ext4 是一個類型的少办,但區(qū)別在于分布式存儲提供了并行化的能力苞慢,如 Ceph 的 CephFS (CephFS是Ceph面向文件存儲的接口),但是有時候又會把 GlusterFS 英妓,HDFS 這種非POSIX接口的類文件存儲接口歸入此類挽放。當(dāng)然 NFS、NAS也是屬于文件系統(tǒng)存儲蔓纠;
kv模型的數(shù)據(jù)庫
這一類數(shù)據(jù)庫主要會使用到哈希表辑畦,在這個表中有一個特定的鍵和一個指針指向特定的數(shù)據(jù)。Key/value模型對于IT系統(tǒng)來說優(yōu)勢在于簡單腿倚、易部署纯出。但是如果DBA只對部分值進(jìn)行查詢或更新的時候,Key/value就顯得效率低下了。
key value:鍵值存儲暂筝,最著名產(chǎn)品的是DynamoDB, redis
內(nèi)存數(shù)據(jù)庫從范型上可以分為關(guān)系型內(nèi)存數(shù)據(jù)庫和鍵值型內(nèi)存數(shù)據(jù)庫箩言。
在實(shí)際應(yīng)用中內(nèi)存數(shù)據(jù)庫主要是配合oracle或mysql等大型關(guān)系數(shù)據(jù)庫使用,關(guān)注性能焕襟。
作用類似于緩存分扎,并不注重數(shù)據(jù)完整性和數(shù)據(jù)一致性。
基于鍵值型的內(nèi)存數(shù)據(jù)庫比關(guān)系型更加易于使用胧洒,性能和可擴(kuò)展性更好,因此在應(yīng)用上比關(guān)系型的內(nèi)存數(shù)據(jù)庫使用更多墨状。
1).Memcached
Memcached是一種基于Key-Value開源緩存服務(wù)器系統(tǒng)卫漫,主要用做數(shù)據(jù)庫的數(shù)據(jù)高速緩沖,并不能完全稱為數(shù)據(jù)庫肾砂。
memcached的API使用三十二位元的循環(huán)冗余校驗(yàn)(CRC-32)計(jì)算鍵值后列赎,將資料分散在不同的機(jī)器上。當(dāng)表格滿了以后镐确,接下來新增的資料會以LRU機(jī)制替換掉包吝。由于 memcached通常只是當(dāng)作緩存系統(tǒng)使用,所以使用memcached的應(yīng)用程式在寫回較慢的系統(tǒng)時(像是后端的數(shù)據(jù)庫)需要額外的程序更新memcached內(nèi)的資料源葫。
2).Redis
Redis是一個高性能的key-value數(shù)據(jù)庫诗越。redis的出現(xiàn),很大程度補(bǔ)償了memcached這類keyvalue存儲的不足息堂,在部分場合可以對關(guān)系數(shù)據(jù)庫起到很好的補(bǔ)充作用嚷狞。它提供了C++、Java荣堰、Python床未,Ruby,Erlang振坚,PHP客戶端薇搁。
2、搭建redis服務(wù)并實(shí)現(xiàn)持久化存儲渡八、訂閱和復(fù)制功能
1).發(fā)布信息
命令:publish channle message
2).訂閱信息
命令:subscribe channle1 channel2 ...
3).注意
一啃洋、接收消息,必須先訂閱消息
二呀狼、訂閱之前裂允,發(fā)布的消息無法接收到
4).使用通配符訂閱信息
命令:psubscribe pattern1 pattern2 ...
5).redis 持久化
持久化的方式
主從:通過從服務(wù)器保存和持久化
日志:操作生成相關(guān)日志,并通過日志恢復(fù)數(shù)據(jù)
redis持久化方式
rdb:快照持久化哥艇。
aof:日志持久化
redis-rdb快照持久化配置,redis.conf文件
save 900 1 #900秒之后至少一個關(guān)鍵字發(fā)生變化绝编,刷新快照到硬盤上
save 300 10 #300秒之后至少十個關(guān)鍵字發(fā)生變化,刷新快照到硬盤上
save 60 10000 #60秒之后至少10000個關(guān)鍵字發(fā)生變化,刷新快照到硬盤上
stop-writes-on-bgsave-error yes #后臺存儲錯誤時停止寫操作
rdbchecksum yes #存儲和加載rdb文件的時候校驗(yàn)
rdbcompression yes #使用LZF壓縮rdb文件
dbfilename dump.rdb #設(shè)置rdb文件名
dir ./ #設(shè)置工作目錄十饥,rdb文件會寫入到該目錄
redis-rdb快照持久化的缺陷
由于rdb持久化方式是通過在某些時間點(diǎn)檢查是否滿足持久化要求的條件窟勃,從而判斷是否進(jìn)行持久化,這樣的話如果在的時間點(diǎn)發(fā)生異常逗堵,但是還沒有達(dá)到持久化要求秉氧,這樣會使得數(shù)據(jù)丟失。
redis-aof日志持久化配置蜒秤,redis.conf文件
appendonly no #是否打開aof日志功能汁咏,yes打開,no關(guān)閉
appendfilename "appendonly.aof" #日志文件名稱
appendfsync always # 寫入日志文件的時機(jī)配置作媚,always:每一個命令都立即同步到aof攘滩,安全,速度慢纸泡;everysec:每一秒鐘寫一次;no:寫入的工作交給操作系統(tǒng)漂问,由操作系統(tǒng)判斷緩沖區(qū)的大小統(tǒng)一寫入到aof日志,同步頻率低女揭,速度快
no-appendfsync-on-rewrite no # 正在導(dǎo)出rdb的過程中要不要停止同步aof蚤假。no:不停止;yes:停止
auto-aof-rewrite-percentage 100 #aof文件大小比重寫時的大小增長率100%時重寫
auto-aof-rewrite-min-size 64mb #aof文件至少超過64M時重寫
3吧兔、簡述通用的分布式存儲及專用的分布式存儲
參考鏈接:
https://blog.csdn.net/qq_15103197/article/details/82876688
https://blog.csdn.net/xuensong520/article/details/48269477
一磷仰、專用分布式存儲系統(tǒng)
1、最早的分布式系統(tǒng):Google File System: GFS Google的第一代分布式系統(tǒng)
Google公司為了滿足本公司需求而開發(fā)的基于Linux的專有分布式文件系統(tǒng)掩驱。一 個GFS集群由一個master和大量的chunkserver構(gòu)成芒划,并被許多客戶(Client)訪問。
一個GFS包括一個主服務(wù)器(master)和多個塊服務(wù)器(chunk server)欧穴,這樣一個GFS能夠同時為多個客戶端應(yīng)用程序(Application)提供文件服務(wù)民逼。文件被劃分為固定的塊,由主服務(wù)器安排存放到塊服務(wù)器的本地硬盤上涮帘。主服務(wù)器會記錄存放位置等數(shù)據(jù)拼苍,并負(fù)責(zé)維護(hù)和管理文件系統(tǒng),包括塊的租用调缨、垃圾塊的回收以及塊在不同塊服務(wù)器之間的遷移疮鲫。此外,主服務(wù)器還周期性地與每個塊服務(wù)器通過消息交互弦叶,以監(jiān)視運(yùn)行狀態(tài)或下達(dá)命令俊犯。應(yīng)用程序通過與主服務(wù)器和塊服務(wù)器的交互來實(shí)現(xiàn)對應(yīng)用數(shù)據(jù)的讀寫,應(yīng)用與主服務(wù)器之間的交互僅限于元數(shù)據(jù)伤哺,也就是一些控制數(shù)據(jù)燕侠,其他的數(shù)據(jù)操作都是直接與塊服務(wù)器交互的者祖。這種控制與業(yè)務(wù)相分離的架構(gòu),在互聯(lián)網(wǎng)產(chǎn)品方案上較為廣泛绢彤,也較為成功七问。
2、Hadoop Distributed FileSystem 仿照google分布式系統(tǒng)
Hadoop 實(shí)現(xiàn)了一個分布式文件系統(tǒng)(Hadoop Distributed File System)茫舶,簡稱HDFS械巡。 Hadoop是Apache Lucene創(chuàng)始人Doug Cutting開發(fā)的使用廣泛的文本搜索庫。
Hadoop 由許多元素構(gòu)成饶氏。其最底部是 Hadoop Distributed File System(HDFS)讥耗,它存儲 Hadoop 集群中所有存儲節(jié)點(diǎn)上的文件。HDFS的上一層是MapReduce引擎疹启,該引擎由 JobTrackers 和 TaskTrackers 組成葛账。通過對Hadoop分布式計(jì)算平臺最核心的分布式文件系統(tǒng)HDFS、MapReduce處理過程皮仁,以及數(shù)據(jù)倉庫工具Hive和分布式數(shù)據(jù)庫Hbase的介紹,基本涵蓋了Hadoop分布式平臺的所有技術(shù)核心菲宴。
HDFS對外部客戶機(jī)而言贷祈,就像一個傳統(tǒng)的分級文件系統(tǒng)『嚷停可以創(chuàng)建势誊、刪除、移動或重命名文件谣蠢,等等粟耻。但是 HDFS 的架構(gòu)是基于一組特定的節(jié)點(diǎn)構(gòu)建的,這是由它自身的特點(diǎn)決定的眉踱。這些節(jié)點(diǎn)包括 NameNode(僅一個)挤忙,它在 HDFS 內(nèi)部提供元數(shù)據(jù)服務(wù);DataNode谈喳,它為 HDFS 提供存儲塊册烈。由于僅存在一個 NameNode,因此這是 HDFS 的一個缺點(diǎn)(單點(diǎn)失斝銮荨)赏僧。
存儲在 HDFS 中的文件被分成塊,然后將這些塊復(fù)制到多個計(jì)算機(jī)中(DataNode)扭倾。這與傳統(tǒng)的 RAID 架構(gòu)大不相同淀零。塊的大小(通常為 64MB)和復(fù)制的塊數(shù)量在創(chuàng)建文件時由客戶機(jī)決定膛壹。NameNode 可以控制所有文件操作驾中。HDFS 內(nèi)部的所有通信都基于標(biāo)準(zhǔn)的 TCP/IP協(xié)議唉堪。
3、TFS:Taobao Filesystem 淘寶分布式系統(tǒng)
- TFS(Taobao FileSystem)是一個高可擴(kuò)展哀卫、高可用僵驰、高性能、面向互聯(lián)網(wǎng)服務(wù)的分布式文件系統(tǒng)汞窗,主要針對海量的非結(jié)構(gòu)化數(shù)據(jù)屎勘,它構(gòu)筑在普通的Linux機(jī)器 集群上,可為外部提供高可靠和高并發(fā)的存儲訪問共啃。
- TFS為淘寶提供海量小文件存儲占调,通常文件大小不超過1M,滿足了淘寶對小文件存儲的需求移剪,被廣泛地應(yīng)用 在淘寶各項(xiàng)應(yīng)用中究珊。它采用了HA架構(gòu)和平滑擴(kuò)容,保證了整個文件系統(tǒng)的可用性和擴(kuò)展性纵苛。同時扁平化的數(shù)據(jù)組織結(jié)構(gòu)剿涮,可將文件名映射到文件的物理地址,簡化 了文件的訪問流程攻人,一定程度上為TFS提供了良好的讀寫性能取试。
4、GlusterFS 去中心化設(shè)計(jì)分布式系統(tǒng)
Glusterfs是一個開源的分布式文件系統(tǒng),是Scale存儲的核心,能夠處理千數(shù)量級的客戶端.在傳統(tǒng)的解決 方案中能夠靈活的結(jié)合物理的,虛擬的和云資源去體現(xiàn)高可用和企業(yè)級的性能存儲.
Glusterfs通過TCP/IP或InfiniBand RDMA網(wǎng)絡(luò)鏈接將客戶端的存儲資塊源聚集在一起,使用單一的全局命名空間來管理數(shù)據(jù),磁盤和內(nèi)存資源.
Glusterfs基于堆疊的用戶空間設(shè)計(jì),可以為不同的工作負(fù)載提供高優(yōu)的性能.
Glusterfs支持運(yùn)行在任何標(biāo)準(zhǔn)IP網(wǎng)絡(luò)上標(biāo)準(zhǔn)應(yīng)用程序的標(biāo)準(zhǔn)客戶端怀吻,用戶可以在全局統(tǒng)一的命名空間中使用NFS/CIFS等標(biāo)準(zhǔn)協(xié)議來訪問應(yīng)用數(shù)據(jù).
5瞬浓、Lustre HPC
一個具有高性能、支持高并發(fā)讀寫蓬坡、文件共享的存儲系統(tǒng)猿棉。Lustre在HPC領(lǐng)域被廣泛使用,由于Lustre文件系統(tǒng)本身無數(shù)據(jù)安全機(jī)制屑咳,必須構(gòu)建于穩(wěn)定的磁盤陣列之上萨赁,通過硬件的穩(wěn)定性來解決數(shù)據(jù)的安全性。
硬件層面可以從兩個方面來保證數(shù)據(jù)的安全性兆龙。系統(tǒng)由RAID組位迂、節(jié)點(diǎn)冗余組成。這里節(jié)點(diǎn)冗余包括MDS和OSS節(jié)點(diǎn)详瑞,2個MDS節(jié)點(diǎn)互為active/stanby模式掂林,兩個OSS節(jié)點(diǎn)均為active模式“酉穑基本上實(shí)現(xiàn)數(shù)據(jù)訪問不中斷泻帮。
6、Ceph內(nèi)核級別構(gòu)建分布式存儲系統(tǒng)
- Ceph是可靠的计寇、可擴(kuò)展的锣杂、統(tǒng)一的脂倦、分布式的存儲系統(tǒng)≡可以同時提供對象存儲RADOSGW(Reliable赖阻、Autonomic、Distributed踱蠢、Object Storage Gateway)火欧、塊存儲RBD(Rados Block Device)、文件系統(tǒng)存儲Ceph FS(Ceph Filesystem)3種功能茎截。
- Ceph可以提供對象存儲苇侵、塊設(shè)備存儲和文件系統(tǒng)服務(wù),其對象存儲可以對接網(wǎng)盤(owncloud)應(yīng)用業(yè)務(wù)等企锌;其塊設(shè)備存儲可以對接(IaaS)榆浓,當(dāng)前主流的IaaS運(yùn)平臺軟件,如:OpenStack撕攒、CloudStack陡鹃、Zstack、Eucalyptus等以及kvm等抖坪。
二杉适、輕量級分布式存儲
1、Mogile Filesystem 分布式存儲 perl語言研發(fā)
2柳击、Moose Filesystem (MFS)
3、fastDFS 國內(nèi)開源項(xiàng)目 C語言研發(fā)
4片习、前端nginx反代后端mogilefs存儲實(shí)戰(zhàn)實(shí)例
參考文檔:
http://www.tuicool.com/articles/YniEnyf
http://joelhy.github.io/2015/01/27/FastDFS-v5-06-deploy/
https://blog.csdn.net/wangyj_bk/article/details/78858056
一捌肴、MogileFS存儲
1、MogileFS分布式文件存儲系統(tǒng)
MogileFS是一個開源的分布式文件存儲系統(tǒng)藕咏,由LiveJournal旗下的Danga Interactive公司開發(fā)状知。Danga團(tuán)隊(duì)開發(fā)了包括 Memcached、MogileFS孽查、Perlbal 等多個知名的開源項(xiàng)目饥悴。目前使用MogileFS 的公司非常多,如日本排名先前的幾個互聯(lián)公司及國內(nèi)的yupoo(又拍)盲再、digg西设、豆瓣、1號店答朋、大眾點(diǎn)評贷揽、搜狗和安居客等,分別為所在的組織或公司管理著海量的圖片梦碗。
2禽绪、MogileFS由3個部分組成:
-
(1) server:主要包括mogilefsd和mogstored兩個應(yīng)用程序蓖救。
- mogilefsd實(shí)現(xiàn)的是tracker,它通過數(shù)據(jù)庫來保存元數(shù)據(jù)信息印屁,包括站點(diǎn)domain循捺、class、host等雄人;
- mogstored是存儲節(jié)點(diǎn)(store node)从橘,它其實(shí)是個WebDAV服務(wù),默認(rèn)監(jiān)聽在7500端口柠衍,接受客戶端的文件存儲請求洋满。在MogileFS安裝完后,要運(yùn)行mogadm工具將所有的store node注冊到mogilefsd的數(shù)據(jù)庫里珍坊,mogilefsd會對這些節(jié)點(diǎn)進(jìn)行管理和監(jiān)控牺勾。
(2) utils(工具集):主要是MogileFS的一些管理工具,例如mogadm等阵漏。
(3) 客戶端API:MogileFS的客戶端API很多驻民,例如Perl、PHP履怯、Java回还、Python等,用這個模塊可以編寫客戶端程序叹洲,實(shí)現(xiàn)文件的備份管理功能等柠硕。
3、設(shè)備定義
存儲主機(jī)(節(jié)點(diǎn))
這個是 MogileFS 存儲文件存放在這些機(jī)器上,也是 mogstored 節(jié)點(diǎn),也叫 Storage Server,一臺存儲主要都要啟動一個 mogstored 服務(wù).擴(kuò)容就是增加這些機(jī)器.
設(shè)備(device)
一個存儲節(jié)點(diǎn),以就是上面的主機(jī),可以有多個 device, 就是用來存放文件的目錄(例如掛載的目錄),
每個設(shè)備都有一個設(shè)備id,需要在 mogstored 的配置文件中的 docroot 配置的項(xiàng)目 指定的目錄下面創(chuàng)建相應(yīng)的設(shè)備的目錄,目錄名為 $docroot/dev$id,設(shè)備是不能刪除的.
只能將其設(shè)備的狀態(tài)的值置為dead,當(dāng)一個設(shè)備 dead 之后,就真的 dead了,里面的數(shù)據(jù)也無法恢復(fù)了,且這個dead了的設(shè)備的 id 也不能再用.
存儲Domain域
- 一個MogileFS可以有多個Domain
- 用來存放不同的文件(大小运提、類型)
- 同一個Domain內(nèi)蝗柔,key必需唯一
- 不同的Domain內(nèi),key可以相同
存儲Class類
- 文件屬性
- 定義文件存儲在不同設(shè)備上的分?jǐn)?shù)
存儲key(Fid)文件地址
- Domain和文件的key(Fid)一起定位文件位置
二民泵、MogileFS存儲安裝
1癣丧、cpan安裝
# yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes
# cpan
App::cpanminus
MogileFS::Server
MogileFS::Utils
IO::AIO
IO::WrapTie
Danga::Socket
2、cpanm安裝
wget http://xrl.us/cpanm -O /usr/bin/cpanm; sudo chmod +x /usr/bin/cpanm
#cpanm DBD::mysql
#cpanm MogileFS::Server
#cpanm MogileFS::Utils
#cpanm MogileFS::Client
所有的perl程序可以編譯運(yùn)行:
# perl Makefile.PL
# make
# make test
# make install
# cpan -i App::cpanminus
cpan> install App:cpanminus
# cpan MogileFS::Server
conf:
/etc/mogilefs/{mogifsd.conf, mogstored.conf}
3栈妆、rpm安裝胁编,centos6支持較好
相關(guān)rpm包下載地址:http://rpmfind.net/
http://mirrors.sahedev.com/
MogileFS-Server-2.46-2.el6.noarch.rpm
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm
三、nginx反代后端mogilefs存儲示例
使用CentOS 7環(huán)境部署
192.168.1.22----節(jié)點(diǎn)1+mysql
192.168.1.60----節(jié)點(diǎn)2
192.168.1.61----節(jié)點(diǎn)3
192.168.1.62----nginx代理
節(jié)點(diǎn)1
#下載程序包
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Server-2.46-2.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/MogileFS-Utils-2.19-1.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/Perlbal-1.78-1.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/perl-MogileFS-Client-1.14-1.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/perl-Net-Netmask-1.9015-8.el6.noarch.rpm
wget http://mirrors.sahedev.com/MogileFS/perl-Perlbal-1.78-1.el6.noarch.rpm
wget http://rpmfind.net/linux/dag/redhat/el6/en/x86_64/dag/RPMS/perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
由于依賴于perl環(huán)境所以先安裝epel源
#安裝epel源和perl依賴包
[root@mongilefs-22 ~]# yum install epel-release
[root@mongilefs-22 ~]#yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y
[root@mongilefs-22 ~]# ls
Perlbal-1.78-1.el6.noarch.rpm
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #依賴包
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #tracker組件,調(diào)度查詢管理組件
MogileFS-Server-2.46-2.el6.noarch.rpm #核心服務(wù)公共組件鳞尔,都需要安裝
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #storage存儲節(jié)點(diǎn)
#安裝perl的rpm包
[root@mongilefs-22 ~]# yum install ./*.rpm -y
#安裝數(shù)據(jù)庫
[root@mongilefs-22 ~]# yum install mariadb-server -y
#查看文件目錄屬主屬組
[root@mongilefs-22 ~]# ls -ld /var/run/mogilefsd/
drwxr-xr-x 2 mogilefs mogilefs 40 Oct 8 2013 /var/run/mogilefsd/
#編輯配置文件
[root@mongilefs-22 ~]# cd /etc/mogilefs/
[root@mongilefs-22 mogilefs]# cp mogilefsd.conf{,.bak}
[root@mongilefs-22 mogilefs]# vim mogilefsd.conf
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
DBI:mysql:mogilefs:host=192.168.1.22 #驅(qū)動格式:數(shù)據(jù)庫類型:數(shù)據(jù)庫名稱:數(shù)據(jù)庫主機(jī)ip
db_user = moguser #數(shù)據(jù)庫用戶
db_pass = mogpass #數(shù)據(jù)庫密碼
listen = 0.0.0.0:7001 #監(jiān)聽端口
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
#數(shù)據(jù)庫初始化
[root@mongilefs-22 ~]# vim /etc/my.cnf.d/server.cnf
[mysqld]
skip_name_resolve = ON
innodb_file_per_table = ON
[root@mongilefs-22 ~]# systemctl start mariadb
#自定義創(chuàng)建數(shù)據(jù)庫用戶
MariaDB [(none)]> GRANT ALL ON mogilefs.* TO 'moguser'@'192.168.1.%' IDENTIFIED BY 'mogpass';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
#初始化
[root@mongilefs-22 ~]# mogdbsetup --dbhost=127.0.0.1 --dbuser=moguser --dbpass=mogpass
Continue? [N/y]: y #是否初始化數(shù)據(jù)庫
Create/Upgrade database name 'mogilefs'? [Y/n]: y #是否創(chuàng)建數(shù)據(jù)庫
Grant all privileges to user 'moguser', connecting from anywhere, to the mogilefs database 'mogilefs'? [Y/n]: y #是否創(chuàng)建數(shù)據(jù)庫用戶
![image.png](https://upload-images.jianshu.io/upload_images/11999111-a75b7bcffce1dd2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
#啟動mogilefsd報錯
[root@mongilefs-22 ~]# service mogilefsd start
Starting mogilefsd (via systemctl): Job for mogilefsd.service failed because a configured resource limit was exceeded. See "systemctl status mogilefsd.service" and "journalctl -xe" for details. [FAILED]
#結(jié)束mogilefsd進(jìn)程并刪除pid文件
[root@mongilefs-22 ~]# killall mogilefsd
[root@mongilefs-22 ~]# rm /var/run/mogilefsd/mogilefsd.pid
rm: remove regular file ‘/var/run/mogilefsd/mogilefsd.pid’? y
[root@mongilefs-22 ~]# rm /var/lock/subsys/mogilefsd
rm: remove regular empty file ‘/var/lock/subsys/mogilefsd’? y
# 啟動
[root@mongilefs-22 ~]# service mogilefsd start
Starting mogilefsd (via systemctl): [ OK ]
#設(shè)置
[root@mongilefs-22 ~]# cd /etc/mogilefs
[root@mongilefs-22 mogilefs]# cp mogstored.conf {,.bak}
[root@mongilefs-22 mogilefs]# vim mogstored.conf
maxconns = 10000 #最大連接數(shù)
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogilefs/data #儲存路徑
#創(chuàng)建存儲目錄嬉橙,設(shè)置屬主組為mogilefs
[root@mongilefs-22 mogilefs]# mkdir /mogilefs/data/dev1 -pv
[root@mongilefs-22 mogilefs]# chown -R mogilefs.mogilefs /mogilefs/
c
#啟動mogstored,由于centos7原因寥假,啟動文件在init.d下啟動會報錯憎夷,所以拷貝出來啟動
[root@mongilefs-22 ~]# cp /etc/init.d/mogstored ./
[root@mongilefs-22 ~]# ./mogstored start
Starting mogstored [ OK ]
#配置文件拷貝到其他節(jié)點(diǎn)上
[root@mongilefs-22 ~]# scp -r /etc/mogilefs/*.conf 192.168.1.60:/etc/mogilefs/
[root@mongilefs-22 ~]# scp -r /etc/mogilefs/*.conf 192.168.1.61:/etc/mogilefs/
#當(dāng)其他節(jié)點(diǎn)啟動后,添加主機(jī)
[root@mongilefs-22 ~]# mogadm host add 192.168.1.22 --ip=192.168.1.22 --port=7500 --status=alive
[root@mongilefs-22 ~]# mogadm host add 192.168.1.60 --ip=192.168.1.60 --port=7500 --status=alive
[root@mongilefs-22 ~]# mogadm host add 192.168.1.61 --ip=192.168.1.61 --port=7500 --status=alive
#檢查主機(jī)情況
[root@mongilefs-22 ~]# mogadm check
Checking trackers...
127.0.0.1:7001 ... OK
Checking hosts...
[ 1] 192.168.1.22 ... OK
[ 2] 192.168.1.60 ... OK
[ 3] 192.168.1.61 ... OK
#添加儲存設(shè)備
[root@mongilefs-22 ~]# mogadm device add 192.168.1.22 1
[root@mongilefs-22 ~]# mogadm device add 192.168.1.60 2
[root@mongilefs-22 ~]# mogadm device add 192.168.1.61 3
[root@mongilefs-22 ~]# mogadm device list
192.168.1.22 [1]: alive
used(G) free(G) total(G) weight(%)
dev1: alive 1.267 6.720 7.986 100
192.168.1.60 [4]: alive
used(G) free(G) total(G) weight(%)
dev2: alive 1.126 6.860 7.986 100
192.168.1.61 [5]: alive
used(G) free(G) total(G) weight(%)
dev3: alive 1.126 6.860 7.986 100
節(jié)點(diǎn)2和節(jié)點(diǎn)3配置
#同步時間
#安裝epel源
[root@node-60 ~]# yum install epel-release
[root@node-60 ~]#yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO -y
#安裝rpm包
[root@node-60 ~]# ls
anaconda-ks.cfg
mha4mysql-node-0.56-0.el6.noarch.rpm
MogileFS-Server-2.46-2.el6.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm
percona-toolkit-3.0.12-1.el7.x86_64.rpm
Perlbal-1.78-1.el6.noarch.rpm
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
perl-Net-Netmask-1.9015-8.el6.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
#創(chuàng)建目錄
[root@node-60 ~]# mkdir -pv /mogilefs/data/dev2
[root@node-60 ~]# chown -R mogilefs.mogilefs /mogilefs/
#其他節(jié)點(diǎn)拷貝過來的配置文件昧旨,所以可以直接啟動mogstored拾给,由于centos7原因祥得,啟動文件在init.d下啟動會報錯,所以拷貝出來啟動
[root@node-60 ~]# cp /etc/init.d/mogstored ./
[root@node-60 ~]# ./mogstored start
Starting mogstored [ OK ]
#啟動trarkers
[root@node-60 ~]# cp /etc/init.d/mogilefsd ./
[root@node-60 ~]# ./mogilefsd start
Starting mogilefsd [ OK ]
mog工具
mogadm
mogdelete #刪除文件
mogfileinfo #看文件信息
moglistkeys #列出所有文件的鍵
mogstored
mogautomount
mogfetch #獲取文件
mogilefsd
mogrename
mogtool
mogdbsetup
mogfiledebug
moglistfids #列出所有文件的id
mogstats
mogupload #上傳文件
#文件一致性檢測
[root@mongilefs-22 ~]# mogadm fsck start | stop
#文件系統(tǒng)信息
[root@mongilefs-22 ~]# mogadm fsck status
Running: No
Status: 38 / 38 (100.00%)
Time: 5s (7 fids/s; 0s remain)
Check Type: Normal (check policy + files)
[num_POVI]: 3
#檢測結(jié)果
[root@mongilefs-22 ~]# mogadm fsck printlog
unixtime event fid devid
1542121262 POVI 38 -
1542121262 POVI 37 -
1542121262 POVI 30 -
#負(fù)載均衡策略
[root@mongilefs-22 ~]# mogadm rebalance test
#使用默認(rèn)規(guī)則policy
[root@mongilefs-22 ~]# mogadm rebalance policy
#顯示負(fù)載均衡策略
[root@mongilefs-22 ~]# mogadm rebalance settings
mogilefs使用
#創(chuàng)建imgs域和text域
[root@mongilefs-22 ~]# mogadm domain add imgs
[root@mongilefs-22 ~]# mogadm domain add text
#查詢當(dāng)前域蒋得,副本存儲2個
[root@mongilefs-22 ~]# mogadm domain list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
imgs default 2 MultipleHosts() NONE
text default 2 MultipleHosts() NONE
#在imgs域中創(chuàng)建png類级及,哈希類型為MD5,副本存儲3個
[root@mongilefs-22 ~]# mogadm class add imgs png --hashtype=MD5 --mindevcount=3
#在imgs域中創(chuàng)建jpg類额衙,哈希類型為空饮焦,副本存儲2個
[root@mongilefs-22 ~]# mogadm class add imgs jpg --hashtype=NONE --mindevcount=2
#查詢當(dāng)前類
[root@mongilefs-22 ~]# mogadm class list
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
imgs default 2 MultipleHosts() NONE
imgs jpg 2 MultipleHosts() NONE
imgs png 3 MultipleHosts() MD5
text default 2 MultipleHosts() NONE
mog上傳文件
#上傳圖片文件到imgs域,key為1.jpg
[root@mongilefs-22 ~]# mogupload --trackers=192.168.1.22 --domain=imgs --key='1.jpg' --file='/usr/share/kde4/apps/ksplash/Themes/CentOS7/2560x1600/background.jpg'
#查詢上傳圖片位置
[root@mongilefs-22 ~]# mogfileinfo --trackers=192.168.1.22 --domain=imgs --key='1.jpg'
- file: 1.jpg
class: default
devcount: 1
domain: imgs
fid: 30
key: 1.jpg
length: 961243
- http://192.168.1.61:7500/dev3/0/000/000/0000000030.fid
#文件id位置窍侧,存儲到節(jié)點(diǎn)2服務(wù)器上
#上傳圖片文件到imgs域县踢,jpg類中,key為2.jpg
[root@mongilefs-22 ~]# mogupload --trackers=192.168.1.22 --domain=imgs --class=jpg --key='2.jpg' --file='/usr/share/wallpapers/CentOS7/contents/images/2560x1600.jpg'
[root@mongilefs-22 ~]# mogfileinfo --trackers=192.168.1.22 --domain=imgs --key='2.jpg'
- file: 2.jpg
class: jpg
devcount: 1
domain: imgs
fid: 31
key: 2.jpg
length: 961243
- http://192.168.1.60:7500/dev2/0/000/000/0000000031.fid
#文件id位置伟件,存儲到節(jié)點(diǎn)1服務(wù)器上
測試兩個tracker可用
#查詢節(jié)點(diǎn)1
[root@node-60 ~]# mogrileinfo --trackers=192.168.1.60 --domain=imgs --key='2.jpg'
-bash: mogrileinfo: command not found
[root@node-60 ~]# mogfileinfo --trackers=192.168.1.60 --domain=imgs --key='2.jpg'
- file: 2.jpg
class: jpg
devcount: 1
domain: imgs
fid: 31
key: 2.jpg
length: 961243
- http://192.168.1.60:7500/dev2/0/000/000/0000000031.fid
##查詢節(jié)點(diǎn)2硼啤,得到結(jié)果和節(jié)點(diǎn)1一致,證明兩個tracker節(jié)點(diǎn)正掣耍可用
[root@node-60 ~]# mogfileinfo --trackers=192.168.1.61 --domain=imgs --key='2.jpg'
- file: 2.jpg
class: jpg
devcount: 1
domain: imgs
fid: 31
key: 2.jpg
length: 961243
- http://192.168.1.60:7500/dev2/0/000/000/0000000031.fid
安裝nginx反代服務(wù)器
#安裝開發(fā)組件
[root@node-62 ~]# yum groupinstall "Development Tools" "Server Platform Development" -y
#安裝支持正則表達(dá)式組件
[root@node-62 ~]# yum install pcre-devel openssl-devel -y
#添加nginx用戶
[root@node-62 ~]# useradd -r nginx
[root@node-62 ~]# id nginx
uid=998(nginx) gid=996(nginx) groups=996(nginx)
#下載編譯安裝nginx
[root@node-62 ~]# wget http://nginx.org/download/nginx-1.6.3.tar.gz
[root@node-62 ~]# wget http://www.grid.net.ru/nginx/download/nginx_mogilefs_module-1.0.4.tar.gz
[root@node-62 ~]# cd nginx-1.6.3
[root@node-62 nginx-1.6.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
#跳過編譯錯誤
[root@node-62 nginx-1.6.3]# make CFLAGS="-pipe -O -W -Wall -Wpointer-arith -Wno-unused-parameter -g"
#安裝
[root@node-62 nginx-1.6.3]# make install
#啟動nginx
[root@node-62 ~]# vim /etc/rc.d/init.d/nginx #編輯啟動腳本
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig: - 85 15
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
# processname: nginx
# config: /etc/nginx/nginx.conf
# config: /etc/sysconfig/nginx
# pidfile: /var/run/nginx.pid
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0
nginx="/usr/sbin/nginx"
prog=$(basename $nginx)
NGINX_CONF_FILE="/etc/nginx/nginx.conf"
[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx
lockfile=/var/lock/subsys/nginx
make_dirs() {
# make required directories
user=`nginx -V 2>&1 | grep "configure arguments:" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
options=`$nginx -V 2>&1 | grep 'configure arguments:'`
for opt in $options; do
if [ `echo $opt | grep '.*-temp-path'` ]; then
value=`echo $opt | cut -d "=" -f 2`
if [ ! -d "$value" ]; then
# echo "creating" $value
mkdir -p $value && chown -R $user $value
fi
fi
done
}
start() {
[ -x $nginx ] || exit 5
[ -f $NGINX_CONF_FILE ] || exit 6
make_dirs
echo -n $"Starting $prog: "
daemon $nginx -c $NGINX_CONF_FILE
retval=$?
echo
[ $retval -eq 0 ] && touch $lockfile
return $retval
}
stop() {
echo -n $"Stopping $prog: "
killproc $prog -QUIT
retval=$?
echo
[ $retval -eq 0 ] && rm -f $lockfile
return $retval
}
restart() {
configtest || return $?
stop
sleep 1
start
}
reload() {
configtest || return $?
echo -n $"Reloading $prog: "
killproc $nginx -HUP
RETVAL=$?
echo
}
force_reload() {
restart
}
configtest() {
$nginx -t -c $NGINX_CONF_FILE
}
rh_status() {
status $prog
}
rh_status_q() {
rh_status >/dev/null 2>&1
}
case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac
[root@node-62 ~]# chmod +x /etc/rc.d/init.d/nginx
[root@node-62 ~]# service nginx start
Reloading systemd: [ OK ]
#添加至服務(wù)管理列表谴返,并讓其開機(jī)自動啟動:
[root@node-62 ~]# chkconfig --add nginx
[root@node-62 ~]# chkconfig nginx on
#編輯nginx反代規(guī)則
[root@node-62 ~]# cd /etc/nginx
[root@node-62 nginx]# cp nginx.conf{,.bak}
[root@node-62 nginx]# vim nginx.conf
......
worker_processes auto;
......
upstream mogsrvs { #定義服務(wù)器組
server 192.168.1.22:7001;
server 192.168.1.60:7001;
server 192.168.1.61: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 /imgs/ {
mogilefs_tracker mogsrvs; #調(diào)用服務(wù)器組
mogilefs_domain imgs; #默認(rèn)域
mogilefs_class png jpg; #默認(rèn)類
mogilefs_pass {
proxy_pass $mogilefs_path;
proxy_hide_header Content-Type;
proxy_buffering off;
}
}
[root@node-62 nginx]# nginx -t #語法檢查
[root@node-62 nginx]# nginx -s reload #重載nginx