王曉建,袁 磊
(云南師范大學,云南 昆明 650500)
隨著信息技術的快速發展和高校信息化建設的不斷完善和深入,越來越多的高校搭建了自己的開源軟件鏡像站點,大部分高校搭建自己的鏡像站點都是在內網,有少部分也對外服務,但是高校師生在訪問這些站點時也會出現速度慢,同步時間長等問題,還有許多開源軟件應用在科學計算等專業領域,如果高校沒有自己的開源鏡像,就會導致一方面用戶必須忍受緩慢不穩定的網絡連接、浪費大量時間,另一方面學校也浪費了大量入口帶寬,而隨著互聯網和分布式存儲技術的發展,搭高校急需搭建屬于自己的開源軟件鏡像站點來滿足師生的學習和科研需求,而HDFS具備了容錯性高、成本低、通用性好等特點[1-2],易于搭建能存儲大量碎片文件的分布式存儲系統。
HDFS 分布式文件系統是Hadoop 核心技術之一,提供了開源的存儲框架,是一個實現數據分布式存儲的文件系統[3]。該系統通過高效的分布式算法集成多集群節點,對大數據量的數據進行分布式存儲和有效備份,當其中一個節點宕機時,系統可以讀取其他有效節點的數據,并且系統對每個節點的物理性能要求并不高。因此,HDFS 采用主/從架構,包括客戶端、主控節點(NameNode)和數據節(DataNode)。其中,NameNode 主要負責管理文件系統的命名空間、元數據信息及客戶端對文件的訪問;DataNode 主要負責接收并處理客戶端的讀寫請求和NameNode 的調度,存儲并檢索HDFS 的數據塊,是文件存儲的實際位置,并通過周期性的心跳報文將所有數據塊信息發送給NameNode。HDFS 的這種主/從設計結構使得用戶數據不會流經主控節點,從而提高系統性能和效率。
Hadoop 是典型的主從(Master/Slave)結構。其構成包括一個NameNode(名稱節點)和多個DataNode(數據節點)。主服務器是由NameNode 構成的,它的主要作用是管理HDFS(分布式文件系統)的NameSpace(命名空間),其中保存了FsImage和EditLog兩個核心的數據結構。前者用來對文件系統樹和文件樹中所有文件的元數據進行維護;后者則用來進行創建文件、刪除文件、重命名文件等一系列操作,并執行Client提出的文件訪問命令。本文使用HDFS 作為主要的后端存儲系統,能較好地利用服務器資源和存儲資源,并且達到很好地冗余效果。
HDFS 采用master/worker 架構[4]。一 個HDFS 集群是有一個Namenode 和若干Datanode 組成[5]。Namenode 是一個中心服務器,負責管理文件系統的namespace 和客端對文件的訪問。Datanode 在集群中一般是一個節點一個,負責管理節點上它們附帶的存儲。在內部,一個文件其實分成一個或多個block,這些block 存儲在Datanode 集合里。Namenode 執行文件系統的namespace 操作,例如打開、關閉、重命名文件和目錄,同時決定block 到具體Datanode 節點的映射。Datanode 在Namenode 的指揮下進行block 的創建、刪除和復制。Namenode 和Datanode 都是設計成可以跑在普通的廉價的運行Linux 的機器上。HDFS采用java 語言開發,因此可以部署在很大范圍的機器上。一個典型的部署場景是一臺機器跑一個單獨的Namenode節點,集群中的其他機器各跑一個Datanode實例。Namenode 是所有HDFS 元數據的仲裁者和管理者,這樣,用戶數據永遠不會流過Namenode,便于管理和維護。Hadoop的架構圖如圖1所示。

圖1 Hadoop架構圖
鏡像站使用HDFS存儲數據有下面四個優點:
⑴故障檢測、硬件容錯、數據冗余
HDFS 文件系統中的所有文件都以block 的方式存儲在集群的節點上,而且還有多副本的特性,保證了硬件的容錯,當某一節點損壞時,數據不會丟失。如果出現一些不可抗拒的因素導致其中某節點損壞時,能通過Hdfs Trash(回收箱)或HdfsSnapShot(快照)方式恢復數據。
⑵處理流式的數據訪問
流式數據處理方式:一次寫入,多次讀取[6]。HDFS 的數據處理規模比較大,應用一次需要訪問大量的數據,同時這些應用一般都是批量處理,而不是用戶交互式處理。應用程序能以流的形式訪問數據集。鏡像站的文件大多數都是ISO或者一些軟件的安裝包,所有流式處理數據對這些文件的訪問是有好處的。
⑶適合存儲大文件
搭建鏡像系統需要存儲大量的ISO 文件和一些Linux的軟件包,所需要的文件是通過同步的方式下載到本地,這些文件大部分都是幾百GB,甚至達TB 大小的文件,很適合使用HDFS的文件系統來存儲。
⑷可構建在廉價的機器上
很多高校并不像很多商業公司一樣,有足夠的服務器資源和存儲資源,很多服務器性能可能不是很高,而HDFS 文件系統不需要很高的服務器性能也能完成部署。
云南師范大學信息管理處現在共有四臺閑置服務器,需要部署Hadoop 文件系統,選擇存存儲容量最大的一臺服務器作為master,用來存儲鏡像的相關數據,其余作為服務節點,其中worker01 節點部署備份節點,以便在數據丟失的情況下進行數據的恢復,worker1 和worker2 作為數據節點,用來存儲發行版的相關更新文件,服務器規劃詳情見表1。

表1 服務器規劃
⑴主機名和防火墻設置
在服務器配置之前,需要關閉防火墻,設置靜態IP,且IP 地址為內網的IP 地址,使服務器無法暴露在外部網絡之中,設置為上表中的IP 地址,修改hosts 文件,而且需要重新配置,部署完成之后需要讓worker節點和slave節點能互相識別,將所有服務器的IP地址和主機名添加到該文件中,同時能夠使節點之間免密遠程連接。
⑵配置SSH免密登錄
關于ssh 免密碼的設置,要求每兩臺主機之間設置免密碼,自己的主機與自己的主機之間也要求設置免密碼。這項操作可以在root 用戶下執行,執行完畢公鑰在/root/.ssh/id_rsa.pub。
⑶配置Hadoop 相關文件,配置HDFS 中namenode 的地址和Hadoop運行時產生的的臨時文件的目錄。
修改core-site.xml文件:

⑷配置同步工具tunasync
同步原理是使用rsync 做增量同步。本文使用的是清華大學開源軟件鏡像站開發的tunasync,這個工具使用的是自動化腳本進行增量同步,簡單易用。因為tunasync 使用Golang 開發,所以需要先配置Golang 環境。使用命令行安裝Golang 環境即可。配置完成后使用以下命令啟動同步的任務:

啟動之后可以使用:tunasynctl list-p 12345-all查看同步的進程和狀態,如圖2所示。

圖2 同步進程和狀態
前端頁面的配置使用的是清華大學的開源軟件鏡像站點的模板,需要配置站點信息。部署前需要修改頁面相關信息,編輯_config.yml文件:

配置完前端信息之后,使用bundle exec jekyll serve--detach-H 0.0.0.0 在本地生成前端所需要的_site目錄,然后將其軟連接到存放同步鏡像的文件夾,開啟Nginx 服務之后在Nginx 的配置文件中添加鏡像的存放目錄為網站的根目錄。為了便于在前臺頁面查看同步的相關信息,可以在后臺設置定時任務,每天凌晨將當天同步信息的JSON 文件下載并輸出到_site目錄的static文件夾,便于在前臺頁面中展示。
鏡像站的前端使用的是ruby 語言,使用在后臺生成的頁面,后端使用的是Nginx,服務器端在后臺生成頁面,一個簡單的Web 服務器軟件(例如TUNA 使用的Nginx),將所有有關文件設置好路徑提供下載,就可以實現最基本的鏡像站功能。鏡像站絕大多數業務均為靜態文件服務,因此類似的高性能靜態文件Web 服務器軟件均可按需選擇,本文使用的是Nginx服務器來提供對外服務。Nginx 服務器將靜態頁面通過軟連接的方式同步到前端。同步完成之后可以通過同步狀態頁面查看上一次同步的時間、大小、狀態、上游、下一次同步時間等信息,同步成功后的狀態如圖3所示。

圖3 同步狀態
鏡像站的搭建,存儲上的充分利用和同步是關鍵。對信息中心存儲資源,基于HDFS 的分布式文件存儲系統,能將存儲資源集中使用,而且有較好的冗余性,能在一部分節點失效的情況下對數據進行恢復,為高校建設屬于自己的鏡像站點提供了建議。本鏡像站點還在測試中,在完成后端的所有鏡像文件和軟件的同步之后可將其部署到公網,一方面能使校園網的用戶直接用內網進行訪問,方便師生使用開源軟件鏡像站點,另一方面互聯網用戶也能訪問使用,推動開源軟件社區的發展。
本文描述的鏡像站還存在一定的不足和需改進之處,比如數據丟失時的恢復機制;同時因為磁盤空間有限,所以只是同步了一部分常用的鏡像文件和Linux 常用的軟件包,如果磁盤充足,可以同步更多的鏡像文件和軟件包,能達到很多商業軟件公司的效果。此外,由于目前的服務器是掛載在信息中心的備用服務器上,所以外網訪問還是會受到很多影響,帶寬和校園網走的是同一條,所以當校園網在線人數過多時就會出現網速變慢,如果有條件可以使用專門的寬帶進行升級,能有效提升網絡訪問的速度。