基於GridFS+NGinx構建分佈式文件系統 之實戰(三)

基於GridFS構建分佈式文件系統 
首先看看什麼是GridFS: 
GridFS is a mechanism for storing large binary files in MongoDB. There are several
reasons why you might consider using GridFS for file storage:
• Using GridFS can simplify your stack. If you’re already using MongoDB, GridFS
obviates the need for a separate file storage architecture.
• GridFS will leverage any existing replication or autosharding that you’ve set up for
MongoDB, so getting failover and scale-out for file storage is easy.
• GridFS can alleviate some of the issues that certain filesystems can exhibit when
being used to store user uploads. For example, GridFS does not have issues with
storing large numbers of files in the same directory.
• You can get great disk locality with GridFS, because MongoDB allocates data files
in 2GB chunks.
 
上面這段話摘自《MongoDB權威指南》 
到如今爲止你大概知道GridFS能爲咱們作點什麼了,簡單點就是能夠幫咱們存儲文件。那麼如何將文件存儲到GridFS中呢? 
你確保已經安裝了MongoDB,如何安裝配置請參考《MongoDB權威指南》APPENDIX A 部分,這裏就很少說了。 
下面以java爲例子,看看如何實現。下載mongo-java-driver驅動包。 html

File uploadfile = new File("C://Users/bdjb0201/Desktop/default.jpg"); //待上傳的文件
  DB db = mongoTemplate.getDb();//得到db
  GridFS gridFS = new GridFS(db, "FSimgs");
  GridFSInputFile file;
  try {
   file = gridFS.createFile(uploadfile);
   file.setFilename(uploadfile.getName());
   file.save();//保存
   //下面用來查詢
   List<GridFSDBFile> list = gridFS.find(uploadfile.getName());
   for (GridFSDBFile gridFSDBFile : list) {
    System.out.println(gridFSDBFile.getUploadDate());//輸出上傳時間
   }
  } catch (IOException e) {
   e.printStackTrace();
  }

    
上面的短短几行代碼就實現了文件的上傳,以及查看功能。 
看起來很方便,可是在大多數的應用中,應用服務器只負責處理動態請求,靜態資源通常由專門的web服務器去處理(apache、nginx等)。 
前端

那麼不少狀況就像下面圖中描述的同樣:java

    

如今應用服務器將文件寫入到MongoDB中已經完成,接下來就是如何讓web服務器(圖中NG)能夠直接訪問那個被存入GridFS的文件就能夠 了。在github上有個項目nginx-gridfs就是幹這個事情的,項目首頁(https://github.com/mdirolf /nginx-gridfs),上面詳細講解了如何安裝配置nginx-gridfs。linux

下面是個人安裝筆記:nginx

//確保你已經安裝了mongodb和git工具  git

 // 下載nginx-gridfsgithub

    cd/opt
    git clonegit://github.com/mdirolf/nginx-gridfs.git
    cdnginx-gridfs
    gitsubmodule init
    gitsubmodule updateweb

 //安裝 nginx
    tar -zxvfnginx-xxx.tar.gz
    cdnginx-xxx
    ./configure--add-module=/opt/nginx-gridfs/
     makemongodb

     make installshell

     注【/opt/nginx-gridfs/ 爲nginx-gridfs下載目錄】

//配置nginx

    在nginx.conf中server加入:
       location /gridfs/ {
          gridfs my_app field=filename type=string;
       }

    注【my_app 爲mongodb存儲文件的數據庫名字】

    //啓用nginx 
//打開瀏覽器輸入要訪問的圖片:http://192.168.1.109:28118/gridfs/6b6e567cjw1dmea3323e1j.jpg。 你看到了以前上傳的文件

 

***************************一下是下載jar包的實戰**********************

 

Mongodb GridFS圖片文件存儲解決方案

    以前解決方案是接收圖片數據後,將圖片直接存儲到盤陣,而後經過Apache作服務器,將圖片信息存儲到數據庫,而且存儲一個Apache的訪問路徑。

    目前須要後臺服務存儲圖片,將圖片存儲到MongoDB集羣中,而後經過Nginx中的nginx-gridfs模塊進行訪問,在瀏覽器中經過url訪問,效果與Apache訪問本地文件同樣。

1、安裝MongoDB(參照:Linux 安裝mongoDB 2.2.7http://my.oschina.net/MrMichael/blog/266501

2、安裝nginx-gridfs 

    (1)下載nginx-gridfs插件

      網上有傳出使用git安裝此插件的,這個比較麻煩,我在文章的附件中留了下載包。本人測試可用。

      下載後還要下載mongo的c語言驅動包,這個也能夠在附件中下載。

      下載完成後進行解壓:tar -zxf nginx-gridfs.tar.gz

                                         tar -zxf mongo-c-driver-0.94.2.tar.gz

[root@bdjb-0197 opt]# tar -zxf nginx-gridfs.tar.gz 
[root@bdjb-0197 opt]# tar -zxf mongo-c-driver-0.94.2.tar.gz

    解壓完成後將驅動包內容所有拷貝到nginx-gridfs目錄下的mongo-c-driver目錄中:

 [root@bdjb-0197 opt]# mv mongo-c-driver-0.94.2/*  nginx-gridfs/mongo-c-driver/

     若是有提示已經存在src目錄,沒有關係,忽略。而後就是下載Nginx,編譯安裝的過程了。

mv:是否覆蓋"nginx-gridfs/mongo-c-driver/src"? y
mv: 沒法將"mongo-c-driver-0.94.2/src" 移動至"nginx-gridfs/mongo-c-driver/src": 目錄非空

 3、安裝NGinx

    有人說:「Nginx版本過高對支持nginx-gridfs模塊不是很成功,使用的Nginx1.7弄了一天都出不來圖片。換成1.0.1就行了。」可是我用的是1.5.1是能夠的。

    下載:nginx-1.5.1.tar.gz  和  pcre-8.32.tar.gz

     1 . 安裝 pcre 讓nginx支持rewrite

            pcre-8.32.tar.gz上傳到/opt 目錄下面

            1) 解壓 pcre

   tar -zxf pcre-8.32.tar.gz//解壓 pcre 後 /opt下面會有 pcre-8.32 文件夾

             2)配置pcre

 cd /opt/pcre-8.32

             3)make

./configure

#./configure
#make

            命令後屏幕會生成一堆文件,不用去管它

             4)安裝

              在linux 中輸入

 make install

        2.安裝 nginx

             nginx-1.5.1.tar.gz上傳到/opt 目錄下面

             1) 解壓 nginx

               tar zxvf    nginx-1.5.1.tar.gz  解壓 nginx 後 /opt 下面會有nginx-1.5.1 文件夾

              2 配置nginx

               cd   nginx-1.5.1

> ./configure --prefix=/usr/local/nginx --with-openssl=/usr/include/openssl --with-http_stub_status_module --add-module=/opt/nginx-gridfs

    ./configure --prefix=/usr/local/nginx --with-http_stub_status_module

              3)make

                在linux 中輸入 make 命令後屏幕會生成一堆文件,不用去管它

             4)安裝 make install

               在linux 中輸入 make install

             5) 檢查是否安裝成功

        >cd  /usr/local/nginx/sbin
        >./nginx -t

                 可能出錯:sbin/nginx: error while loading shared libraries: libpcre.so.1: cannot open shared object file: No such file or directory

解決方法(直接運行):
32位系統 [root@sever lib]# ln -s /usr/local/lib/libpcre.so.1 /lib
64位系統 [root@sever lib]# ln -s /usr/local/lib/libpcre.so.1 /lib64
 
而後執行ps -ef | grep nginx 查看nginx進程確認是否真的已經啓動了,在進程列表裏會有最起碼兩個, worker(nginx工做進程)和master(nginx主進程)
 
root 4349 1 0 02:24 ? 00:00:00 nginx: master process sbin/nginx -c conf/nginx.conf
nginx 4350 4349 0 02:24 ? 00:00:00 nginx: worker process 
root 4356 28335 0 02:30 pts/1 00:00:00 grep nginx
NGINX 就 OK了

  

       6)啓動nginx 

          cd  /usr/local/nginx/sbin 目錄下面 輸入

./nginx   //啓動 nginx

       7 )檢查是否啓動成功

          ie 瀏覽器中輸入 http://192.168.15.132

     

         出現nginx 歡迎界面說明啓動成功

說明:nginx 默認配置端口是80.配置文件主要是conf 文件夾中的nginx.conf  文件

        8)中止nginx

               pkill -9 nginx

 

4、配置GridFS+NGinx

        

配置mogon-gridfs地址:

      在vim /usr/local/nginx/conf/nginx.conf配置文件中,增長下面的內容:

        location /pics/ {
                gridfs rms
                field=filename
                type=string;
                mongo 127.0.0.1:27017;
        }

      

     gridfs:nginx識別插件的名字

     rms:數據庫名稱

     [root_collection]: 選擇collection,如root_collection=blog, mongod就會去找blog.files與blog.chunks兩個塊,默認是fs

     [field]:查詢字段,保證mongdb裏有這個字段名,支持_id, filename, 可省略, 默認是_id

     [type]:解釋field的數據類型,支持objectid, int, string, 可省略, 默認是int

     [user]:用戶名, 可省略

     [pass]:密碼, 可省略    

     mongo:mongodb url mongo名稱 地址:端口

具體shell如:

        #access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
        location /pics/ {
                gridfs rms
                field=filename
                type=string;
                mongo 127.0.0.1:27017;
        }
        #error_page  404              /404.html;
        # redirect server error pages to the static page /50x.html

      啓動:/usr/local/nginx/sbin/nginx

      查看日誌:tail -f /usr/local/nginx/logs/error.log

4、測試開發

      測試例子使用java開發,代碼在附件中

    (1)圖片寫入

     所有的例子在附件中,GridFSTest.rar,例子還須要mongodb的驅動jar包mongo-java-driver-2.9.3.jar 。

                try {
   Mongo mongo = new Mongo("192.168.100.52", 27017);// 建立鏈接
   DB db = mongo.getDB("pics"); // 選擇數據庫
   byte[] files = createImage(800, 600, "800 X 600"); // 建立圖片
   save(files, "test3.jpg", db); // 存儲圖片
  } catch (Exception e) {
   e.printStackTrace();
  }

(2)文件獲取

        經過代碼獲取圖片就不寫了。只寫如何在程序中傳遞文件路徑,而後在前端展現。

       存儲圖片信息時,能夠加上ip地址:http://192.168.1.237/pics/default.jpg ,而後前端應用經過給定的URL地址就能夠獲取圖片內容了。

       在瀏覽器中輸入地址能夠得到相同的效果。

 

 

    *********************************************NGinx啓動、中止***************************************

啓動操做:

    命令:

 nginx -c /usr/nginx/conf/nginx.conf

    -c參數指定了要加載的nginx配置文件路徑。

中止操做:

    中止操做是經過向nginx進程發送信號(什麼是信號請參閱linux文章)來進行的

    步驟1:查詢nginx主進程號

 ps -ef | grep nginx

        在進程列表裏面找master進程,它的編號就是主進程號了。

    步驟2:發送信號

        從容中止Nginx:

 kill -QUIT 主進程號

        快速中止Nginx:

 kill -TERM 主進程號

         強制中止Nginx:

 pkill -9 nginx

 

另外,若在nginx.conf配置了pid文件存放路徑則該文件存放的就是Nginx主進程號,若是沒指定則放在nginx的logs目錄下。有了pid文件,咱們就不用先查詢Nginx的主進程號,而直接向Nginx發送信號了,命令以下:

 kill -信號類型 '/usr/nginx/logs/nginx.pid'

 平滑重啓

        若是更改了配置就要重啓Nginx,要先關閉Nginx再打開?不是的,能夠向Nginx發送信號,平滑重啓。

平滑重啓命令:

 kill -HUP 住進稱號或進程號文件路徑

 

        注意,修改了配置文件後最好先檢查一下修改過的配置文件是否正確,以避免重啓後Nginx出現錯誤影響服務器穩定運行。判斷Nginx配置是否正確命令以下:

 nginx -t -c /usr/nginx/conf/nginx.conf

         平滑升級

若是服務器正在運行的Nginx要進行升級、添加或刪除模塊時,咱們須要停掉服務器並作相應修改,這樣服務器就要在一段時間內中止服務,Nginx能夠在不停機的狀況下進行各類升級動做而不影響服務器運行。

        步驟1:

若是升級Nginx程序,先用新程序替換舊程序文件,編譯安裝的話新程序直接編譯到Nginx安裝目錄中。

        步驟2:執行命令

 kill -USR2 舊版程序的主進程號或進程文件名

此時舊的Nginx主進程將會把本身的進程文件更名爲.oldbin,而後執行新版Nginx。新舊Nginx會同市運行,共同處理請求。

這時要逐步中止舊版Nginx,輸入命令:

 kill -WINCH 舊版主進程號

慢慢舊的工做進程就都會隨着任務執行完畢而退出,新版的Nginx的工做進程會逐漸取代舊版工做進程。

 

此時,咱們能夠決定使用新版仍是恢復到舊版。

不重載配置啓動新/舊工做進程

kill -HUP 舊/新版主進程號

從容關閉舊/新進程

kill -QUIT 舊/新主進程號

若是此時報錯,提示還有進程沒有結束就用下面命令先關閉舊/新工做進程,再關閉主進程號:

kill -TERM 舊/新工做進程號

這樣下來,若是要恢復到舊版本,只須要上面的幾個步驟都是操做新版主進程號,若是要用新版本就上面的幾個步驟都操做舊版主進程號就好了。

上面就是Nginx的一些基本的操做,但願之後Nginx能有更好的方法來處理這些操做,最好是Nginx的命令而不是向Nginx進程發送系統信號

         

相關文章
相關標籤/搜索