MogileFS的實現 解決MogileFS的bug問題 ...
MogileFS的實現
準備三個主機:
centos7.1:tracker節點、database節點、storage節點:192.168.213.251
centos7.2、centos7.3:storage節點:192.168.213.251/252/253
註意關掉防火牆,iptables -F
1》在三個節點安裝如下軟體包
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO #先用yum安裝安裝環境需要的包
ls #將如下安裝包下載到本地,再用yum本地安裝如下包
MogileFS-Server-2.46-2.el7.centos.noarch.rpm #核心服務
MogileFS-Server-mogilefsd-2.46-2.el7.centos.noarch.rpm #tracker節點
MogileFS-Server-mogstored-2.46-2.el7.centos.noarch.rpm #storage節點
MogileFS-Utils-2.19-1.el7.centos.noarch.rpm #mogilefs的一些管理工具,如mogadm
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #依賴包
perl-MogileFS-Client-1.14-1.el7.centos.noarch.rpm
perl-Perlbal-1.78-1.el6.noarch.rpm
[root@node1 app]#yum localinstall ./* -y #在三個節點上都要安裝
2》在centos7.1上操作
yum install mariadb-server
systemctl start mariadb
ss -nlt
mogdbsetup --help #初始化資料庫的命令
mogdbsetup --dbuser=mogile --dbpass=123 #進行初始化資料庫,會創建了一個mogilefs的資料庫,同時裡面有很多表,授權了一個mogile用戶在任何主機都可以連接到此資料庫
vim /etc/mogilefs/mogilefsd.conf #修改tracker的配置文件
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1 #指明資料庫的主機
db_user = mogile #授權的用戶
db_pass = 123 #授權的密碼
listen = 0.0.0.0:7001
systemctl start mogilefsd #啟動tracker服務
ss -nltu #發現監聽在tcp/7001埠
3》在三個節點上對storage節點進行配置
vim /etc/mogilefs/mogstored.conf #配置storage節點
maxconns = 10000 #最大併發連接
httplisten = 0.0.0.0:7500 #監聽的埠
mgmtlisten = 0.0.0.0:7501 #管理命令監聽的埠
docroot = /app/mogdata/ #指明數據存放的目錄,一般這個目錄要使用單獨的磁碟進行掛載,本實驗就使用目錄代替了,沒有單獨掛載磁碟
mkdir /app/mogdata
chown mogilefs:mogilefs /app/mogdata -R
systemctl start mogstored #啟動storage服務
ss -nlt #發現監聽的是7500埠
4》在centos7.1上的操作
添加主機到trackers中,這樣storage節點才能被tracker節點所管理,並將主機信息註冊到資料庫中
mogadm check #查看狀態
mogadm host add centos7.1 --ip=192.168.213.251 --port=7500 --status=alive #添加storage節點的主機到tracker中
mogadm host add centos7.2 --ip=192.168.213.252 --port=7500 --status=alive
mogadm host add centos7.3 --ip=192.168.213.253 --port=7500 --status=alive
mogadm check #此時再查看發現三個節點都被添加進來了
mogadm host list #可以查看添加的主機
5》在三個節點上的設置
mkdir /app/mogdata/dev1 #在三個主機上創建三個目錄dev1、dev2、dev3做為存儲設備,1、2、3為設備的ID號,必須唯一
chown -R mogilefs:mogilefs /app/mogdata/dev1/ #修改許可權,註意三個節點都要操作
6》在centos7.1節點的操作,添加存儲設備到集群中
mogadm device add centos7.1 1
mogadm device add centos7.2 2
mogadm device add centos7.3 3
mogadm device list
centos7.1 [1]: alive
used(G) free(G) total(G) weight(%)
dev1: alive 0.032 39.011 39.043 100
centos7.2 [2]: alive
used(G) free(G) total(G) weight(%)
dev2: alive 0.031 39.012 39.043 100
centos7.3 [3]: alive
used(G) free(G) total(G) weight(%)
dev3: alive 0.031 39.012 39.043 100
mogadm check
Checking trackers...
127.0.0.1:7001 ... OK
Checking hosts...
[ 1] centos7.1 ... OK
[ 2] centos7.2 ... OK
[ 3] centos7.3 ... OK
Checking devices...
host device size(G) used(G) free(G) use% ob state I/O%
---- ------------ ---------- ---------- ---------- ------ ---------- -----
[ 1] dev1 39.043 0.032 39.011 0.08% writeable 0.0
[ 2] dev2 39.043 0.032 39.011 0.08% writeable 0.0
[ 3] dev3 39.043 0.032 39.011 0.08% writeable 0.0
---- ------------ ---------- ---------- ---------- ------
total: 117.130 0.097 117.034 0.08%
cd dev1/ ;ls #發現目錄中已經有東西了
test-write usage
cd test-write/ ;ls #此目錄是tracker節點測試storage節點是否是好的,會定期往目錄裡面寫一些東西來判斷個節點是不是可用的
test-write-21 test-write-35 test-write-44 test-write-49 test-write-55 test-write-7 test-write-8 test-write-87 test-write-93
test-write-23 test-write-40 test-write-47 test-write-53 test-write-64 test-write-76 test-write-84 test-write-9
mogadm device mark centos1 1 readonly #可將某個設備標記為只讀狀態,共有這幾種狀態(alive,dead,down,drain,readonly)
7 》添加創建域和類在centos7.1上的操作
mogadm domain add m25 #添加一個域m25
mogadm domain list #我們發現只要創建一個域,就會生成一個預設的class,並且副本數量為2個
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
m25 default 2 MultipleHosts() NONE
mogadm class --help
mogadm class add m25 img --mindevcount=3 #在m25域中添加一個類為在img,並指定最小的副本數量為3個
mogadm class add m25 doc --mindevcount=2
mogadm domain list #可以發現已經創建兩個類了,現在就可以向這兩個類中上傳數據了
domain class mindevcount replpolicy hashtype
-------------------- -------------------- ------------- ------------ -------
m25 default 2 MultipleHosts() NONE
m25 doc 2 MultipleHosts() NONE
m25 img 3 MultipleHosts() NONE
8》上傳數據(centos7上需要先解決bug問題)
在centos7.1上
mogupload --help #上傳
cd /app
find /usr/share/ -iname *.jpg -exec cp {} ./ \; #拷貝一些圖片文件到當前目錄
mogupload --tracker=172.18.21.107:7001 --domain=m25 --class=img --key=night --file=night.jpg #註意這裡要指定tracker,不然傳不上去,要設置一個key,根據這個key才能進行查找
md5sum night.jpg
a1cb1ab93a2d2b81e7943fbc0283f83f night.jpg
在centos7.2上
cd /app/data/dev2/
tree 0/ #在節點2上查看,發現已經存到設備目錄下,註意格式是這種格式的
0/
└── 000
└── 000
└── 0000000002.fid
md5sum 0/000/000/0000000002.fid #哈希運算的結果是一樣的,說明是同一個文件
a1cb1ab93a2d2b81e7943fbc0283f83f 0/000/000/0000000002.fid
9》查詢
在trackers上
mogfileinfo --trackers=192.168.213.251:7001 --domain=m25 --key=night #在一個域內key必須是唯一的
- file: night
class: img
devcount: 1
domain: m25
fid: 2
key: night
length: 569714
- http://192.168.213.252:7500/dev2/0/000/000/0000000002.fid
- http://192.168.213.253:7500/dev3/0/000/000/0000000002.fid
- http://192.168.213.251:7500/dev1/0/000/000/0000000002.fid
#告訴我們如何可以查到這個數據可以輸入這個網址下載下來就可以看到剛纔上傳的圖片了
moglistkeys -tracker=192.168.213.251:7001 --domain=m25 #查看這個域內的所有key
night
可以創建一個配置文件指明trackers是誰就不用每次輸入命令的時候指定了
vim /etc/mogilefs/mogilefs.conf
trackers=172.18.21.107:7001
moglistkeys --domain=m25
night
mogdelete --domain=m25 --key=night #刪除指定的文件
mogupload --domain=M25 --class=img --key=fish --file=/app/fish.jpg
mogfileinfo --domain=M25 --key=fish
- file: fish
class: img
devcount: 3
domain: M25
fid: 7
key: fish
length: 3225
- http://192.168.213.253:7500/dev3/0/000/000/0000000007.fid
- http://192.168.213.252:7500/dev2/0/000/000/0000000007.fid
- http://192.168.213.251:7500/dev1/0/000/000/0000000007.fid
資料庫中查詢
MariaDB [mogilefs]> select * from file; #進入資料庫中也可以查看一些信息
+-----+------+-------+--------+---------+----------+
| fid | dmid | dkey | length | classid | devcount |
+-----+------+-------+--------+---------+----------+
| 3 | 1 | puppy | 3461 | 1 | 1 |
| 4 | 1 | sky | 2964 | 2 | 1 |
+-----+------+-------+--------+---------+----------+
MariaDB [mogilefs]> select * from domain;
+------+-----------+
| dmid | namespace |
+------+-----------+
| 1 | m25 |
+------+-----------+
MariaDB [mogilefs]> select * from class;
+------+---------+-----------+-------------+----------+------------+
| dmid | classid | classname | mindevcount | hashtype | replpolicy |
+------+---------+-----------+-------------+----------+------------+
| 1 | 1 | img | 3 | NULL | NULL |
| 1 | 2 | doc | 2 | NULL | NULL |
+------+---------+-----------+-------------+----------+------------+
關閉主機
mogadm host mark centos7.1 down #也可以將主機設置為down狀態
mogadm host list
centos7.1 [1]: down
IP: 192.168.213.251:7500
centos7.2 [2]: alive
IP: 192.168.213.252:7500
centos7.3 [3]: alive
IP: 192.168.213.253:7500
mogadm host mark centos7.1 alive
解決MogileFS的bug問題
cd data/dev1/ ;ls #發現其他節點上並沒有我們上傳的數據目錄
test-write usage
ls #只有上傳東西的節點上才有
0 test-write usage
註意:
說明MogileFS在centos7上有個致命的bug,就是沒有複製副本到其他的節點上
解決方法如下:
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl-YAML perl-Time-HiRes #先安裝perl環境,三個storage主機都要安裝
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-Sys-Syscall/Sys-Syscall-0.23.tar.gz/be6dc2d791684a6f8abb3dd39ff2d1de/Sys-Syscall-0.23.tar.gz #下載軟體包到本地,也可以在google上搜索Syscall-0.23.tar.gz
在三個節點上都要安裝此源碼包
在三個節點上進行編譯安裝Sys-Syscall
tar -xf Sys-Syscall-0.23.tar.gz
cd Sys-Syscall-0.23/
perl Makefile.PL
Checking if your kit is complete...
Looks good
Warning: prerequisite Test::More 0 not found.
Writing Makefile for Sys::Syscall
make && make instal
在centos7.1節點上重啟下麵的三個服務
systemctl restart mogilefsd
systemctl restart mogstored
systemctl restart mariadb
在centos7.2和centos7.3節點上重啟mogstored服務,這裡需要註意,編譯安裝完Sys-Syscall後一定要重啟三個節點的所有服務,不然不會生效
systemctl restart mogstored
在centos7.1上
#mogupload --tracker=192.168.213.251:7001 --domain=m25 --class=img --key=morning --file=/app/morning.jpg #再上傳一個文件
tree 0
0
└── 000
└── 000
├── 0000000002.fid
└── 0000000004.fid
2 directories, 2 files
在centos7.2和centos7.3上
tree 0
0
└── 000
└── 000
├── 0000000002.fid
└── 0000000004.fid
2 directories, 2 files
發現在三個節點上結果相同文件