Mogilefs分佈式文件系統-Keepalived+Nginx雙主模型實現圖片分佈式存儲、訪問

一、分佈式文件系統:

  分佈式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網絡與節點相連。計算機通過文件系統管理、存儲數據,單純通過增加硬盤個數來擴展計算機文件系統的存儲容量的方式,在容量大小、容量增長速度、數據備份、數據安全等方面的表現都差強人意。

        分佈式文件系統可以有效解決數據的存儲和管理難題:將固定於某個地點的某個文件系統,擴展到任意多個地點/多個文件系統,衆多的節點組成一個文件系統網絡。每個節點可以分佈在不同的地點,通過網絡進行節點間的通信和數據傳輸。人們在使用分佈式文件系統時,無需關心數據是存儲在哪個節點上、或者是從哪個節點從獲取的,只需要像使用本地文件系統一樣管理和存儲文件系統中的數據。


二、常見的分佈式文件系統:

GFS

(Google File System)

Google公司爲了滿足本公司需求而開發的基於Linux的專有分佈式文件系統。

HDFS

(Hadoop Distributed File System)

Hadoop 實現的一個分佈式文件系統

TFS

  (Taobao File System)

是一個高可擴展、高可用、高性能、面向互聯網服務的分佈式文件系統,它構築在普通的Linux機器 集羣上,可爲外部提供高可靠和高併發的存儲訪問,主要針對海量的非結構化數據,TFS爲淘寶提供海量小文件存儲,通常文件大小不超過1M,滿足了淘寶對小文件存儲的需求

GlusterFS

(Gluster File System)

主要應用在集羣系統中,具有很好的可擴展性,通過網絡互聯成一個並行的網絡文件系統;與Hadoop HDFS不同的是:GlusterFS使用了彈性哈希算法來定位文件存儲的位置。 由於使用了彈性哈希算法,GlusterFS不需要專門的Meta-Data Server來保存元數據,因此可以避免因爲元數據服務器宕機導致的整個集羣不可用。也正是因爲不需要元數據服務器,所以GlusterFS在多個掛載點同時進行數據讀寫的時候,其整體性能很突出。
cephC++編寫的代碼,支持Fuse,並且沒有單點故障依賴, 於是下載安裝, 由於 ceph 使用 btrfs 文件系統, 而btrfs 文件系統需要 Linux 2.6.34 以上的內核才支持。
MooseFSmooseFS是一款網絡分佈式文件系統。它把數據分散在多臺服務器上,但對於用戶來講,看到的只是一個源。
MogileFS perl語言研發的; 性能好;海量圖片存儲
FastDFSc語言研發 


三、MogileFS介紹

 第1個部分: 是server端,包括mogilefsd和mogstored兩個程序。前者即是mogilefsd的tracker,它將一些全局信息保存在數據庫 裏,例如站點domain,class,host等,默認監聽在7001端口。後者即是存儲節點(store node),它其實是個HTTP Daemon,默認偵聽在7500端口,接受客戶端的文件備份請求。在安裝完後,要運行mogadm工具將所有的store node註冊到mogilefsd的數據庫裏,

mogilefsd會對這些節點進行管理和監控。

 第2個部分:是utils(工具集),主要是MogileFS的一些管理工具,例如mogadm等。
 第3個部分:是客戶端API,目前只有Perl API(MogileFS.pm)、PHP,用這個模塊可以編寫客戶端程序,實現文件的備份管理功能,提供MogileFS.pm。

 
 四、Keepalived+Nginx雙主模型實現圖片分佈式存儲、訪問
wKiom1ZDe_3gJCp5AAB-Aab00DM683.png

   ip地址  主機名     安裝包
172.16.16.3①  master1 keepalived+nginx
172.16.16.4② master2 keepalived+nginx
172.16.16.2③ mogilefs1 mogilefs相關軟件包
172.16.16.8④ mogilefs2 mogilefs相關軟件包
172.16.116.233⑤ mysql mariadb-server


① mster1 

####keepalived相關配置
[root@master1 ~]# yum install -y keepalived
[root@master1 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111aaaa2222
    }
    virtual_ipaddress {
        172.16.16.40/16
    }
}

vrrp_instance VI_2 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 99
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 2222aaaa1111
    }
    virtual_ipaddress {
       172.16.16.41/16
    }
}


####nginx編譯安裝及配置
[root@master1 ~]# tar xf nginx_mogilefs_module-1.0.4.tar.gz
[root@master1 ~]# yum install openssl-devel pcre-devel
[root@master1 ~]# groupadd -r nginx
[root@master1 ~]# useradd -r -g nginx nginx
[root@master1 ~]# tar xf nginx-1.8.0.tar.gz 
[root@master1 ~]# cd nginx-1.8.0
[root@master1 ~]# ./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=/root/nginx_mogilefs_module-1.0.4

[root@master1 ~]# make && make install
[root@master1 ~]# mkdir -p /var/tmp/nginx/{client,proxy,fcgi,uwsgi,scgi}
[root@master1 ~]# nginx -t

注:nginx-1.8.0編譯安裝添加第三方模塊:nginx_mogilefs_module-1.0.2.tar.gz,

反向代理客戶端請求訪問mogilefs分佈式文件系統的圖片時候總是不成功~訪問日誌的響應碼爲000,不知道爲什麼??改換爲nginx_mogilefs_module-1.0.4.tar.gz;成功~~ 


② mseter2 

####keepalived相關配置
[root@master1 ~]# yum install -y keepalived
[root@master2 ~]# vim /etc/keepalived/keepalived.conf 

! Configuration File for keepalived

global_defs {
   notification_email {
        root@localhost
   }
   notification_email_from keepalived@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111aaaa2222
    }
    virtual_ipaddress {
        172.16.16.40/16
    }
}

vrrp_instance VI_2 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
       auth_type PASS
       auth_pass 2222aaaa1111
    }
    virtual_ipaddress {
       172.16.16.41/16
    }
}


#####nginx編譯過程同master1


測試如下列圖所示:

wKiom1ZDaFvixdbIAABSwEK4JHg953.png

wKiom1ZDaFyyb1YYAABU5EcKpeA534.png

wKioL1ZDfMzAH1N2AABoA2jMUFw306.png


③ mogilefs1

#### 
[root@mogilefs1 ~]# mogdbsetup --dbhost=172.16.116.233 --dbuser=mfs --dbpass=mfspass --dbrootpass=123456

### 配置tracker
[root@mogilefs1 ~]# vim /etc/mogilefs/mogilefsd.conf 
daemonize = 1
pidfile = /var/run/mogilefsd/mogilefsd.pid
db_dsn = DBI:mysql:mogilefs:host=172.16.116.233
db_user = mfs
db_pass = mfspass
listen = 172.16.16.2:7001
conf_port = 7001
query_jobs = 10
delete_jobs = 1
replicate_jobs = 5
reaper_jobs = 1

####配置存儲節點
[root@mogilefs1 ~]# vim /etc/mogilefs/mogstored.conf 
maxconns = 10000
httplisten = 0.0.0.0:7500
mgmtlisten = 0.0.0.0:7501
docroot = /mogstore


#####腳本創建邏輯分區作爲數據存儲使用
#!/bin/bash
pvcreate /dev/sda5
vgcreate myvg /dev/sda5
lvcreate -L 8G -n mogstore myvg
mkdir -p /mogstore
mke2fs -t ext4 /dev/myvg/mogstore
echo "/dev/myvg/mogstore  /mogstore  ext4  defaults  0 0" >> /etc/fstab
mount -a
mount

#### 創建數據存放位置 
[root@mogilefs1 ~]# mkdir /mogstore/dev1
[root@mogilefs1 ~]# chown -R mogilefs.mogilefs /mogstore/dev1/


####啓動服務
[root@mogilefs1  ~]# service mogilefsd start
[root@mogilefs1  ~]# service mogstored start
Starting mogstored                [  OK  ]

[root@mogilefs1 ~]# ss -tanlp
State      Recv-Q Send-Q  Local Address:Port     Peer Address:Port 
LISTEN     0      128   172.16.16.2:7001         *:*     
 users:(("mogilefsd",1247,6))
LISTEN     0      128     *:7500              *:*     
 users:(("mogstored",1366,4))
LISTEN     0      128     *:7501              *:*     
 users:(("mogstored",1366,9))
 
 
### 配置host
[root@mogilefs1 ~]# mogadm host add 172.16.16.2 --ip=172.16.16.2 --status=alive
[root@mogilefs1 ~]# mogadm host add 172.16.16.8 --ip=172.16.16.8 --status=alive
[root@mogilefs1 ~]# mogadm host list
172.16.16.2 [1]: alive
  IP:       172.16.16.2:7500

172.16.16.8 [2]: alive
  IP:       172.16.16.8:7500


###配置device
[root@mogilefs1 ~]# mogadm device add 172.16.16.2 1
[root@mogilefs1 ~]# mogadm device add 172.16.16.8 2


####配置domain
[root@mogilefs1 ~]# mogadm domain add images
[root@mogilefs1 ~]# mogadm domain list
 domain      class       mindevcount   replpolicy   hashtype
-------------------- ---------------- ------------- ------------ -   ------
 images        default         2   MultipleHosts() NONE   

####配置class 
[root@mogilefs1 ~]# mogadm class add images jpg
[root@mogilefs1 ~]# mogadm class list
 domain          class      mindevcount   replpolicy   hashtype
-------------------- ----------------   -------------   ------------   -------
 images       default      2        MultipleHosts() NONE   
 images       jpg        2        MultipleHosts() NONE

 #####上傳圖片
 [root@mogilefs1 ~]# ll
-rw-r--r--. 1 root root 149855 Nov 12 01:24 1.jpg
 [root@mogilefs1 ~]# mogupload --trackers=172.16.16.2:7001 --domain=images --key='h.jpg' --file='/root/1.jpg'
 [root@mogilefs1 ~]# mogfileinfo --trackers=172.16.16.2:7001 --domain=images --key='h.jpg'
- file: h.jpg
     class:              default
  devcount:                    2
    domain:               images
       fid:                    9
       key:                h.jpg
    length:               149855
 - http://172.16.16.2:7500/dev1/0/000/000/0000000009.fid
 - http://172.16.16.8:7500/dev2/0/000/000/0000000009.fid


④ mogilefs2

[root@mogilefs2 ~]# mkdir /mogstore/dev2
[root@mogilefs2 ~]# chown -R mogilefs.mogilefs /mogstore/dev2/

[root@mogilefs2 ~]# mogadm check
Checking trackers...
  127.0.0.1:7001 ... OK

Checking hosts...
  [ 1] 172.16.16.2 ... OK
  [ 2] 172.16.16.8 ... OK

Checking devices...
  host device         size(G)    used(G)    free(G)   use%   ob state   I/O%
  ---- ------------ ---------- ---------- ---------- ------ ---------- -----
  [ 1] dev1             7.349      0.018      7.331   0.25%  writeable   N/A
  [ 2] dev2             7.349      0.018      7.331   0.25%  writeable   N/A
  ---- ------------ ---------- ---------- ---------- ------
             total:    14.699      0.036     14.662   0.25%

[root@mogilefs2 ~]# mogfileinfo --trackers=172.16.16.2:7001 --domain=images --key='h.jpg'
- file: h.jpg
     class:              default
  devcount:                    2
    domain:               images
       fid:                    9
       key:                h.jpg
    length:               149855
 - http://172.16.16.2:7500/dev1/0/000/000/0000000009.fid
 - http://172.16.16.8:7500/dev2/0/000/000/0000000009.fid


⑤ mysql

#### 安裝mysql 
[root@mysql ~]# yum install mariadb-server 
[root@mysql ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
innodb_file_per_table=1
skip_name_resolve=1
log_bin=mysql-bin

#### 授權一個用戶可以遠程登錄mysql數據庫並管理mogilefs數據庫
MariaDB [(none)]> grant all on *.* to 'mfs'@'172.16.%.%' identified by 'mfspass';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> grant all on *.* to 'root'@'172.16.%.%' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.01 sec)


五、Nginx反向代理配置並測試

   #####http段加入下面的代碼
   upstream Mogilefs {
          server 172.16.16.2:7001 max_fails=5  fail_timeout=10s;
          server 172.16.16.8:7001 max_fails=5  fail_timeout=10s;
   }
   
   #####server段加入下面的代碼
    location /images/ {
           mogilefs_tracker Mogilefs;
           mogilefs_domain images;
            mogilefs_methods GET;
            mogilefs_noverify on;
           mogilefs_pass {
              proxy_pass $mogilefs_path;
              proxy_hide_header Content-Type;
              proxy_buffering off;
           }
       }

wKiom1ZEiZ6RqW7zAAHK9RWGDB8266.png

wKioL1ZEifHC5QduAAGuZTp3Z7E873.png

可以通過DNS服務器將一個主機名定義2條A記錄,實現負載均衡的效果~望朋友們自行完成

好了,Mogilefs分佈式文件系統介紹就到這裏,O(∩_∩)O~~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章