分布式文件伺服器搭建
1. 如何部署hadoop分布式文件系統
一、實戰環境
系統版本:CentOS 5.8x86_64
java版本:JDK-1.7.0_25
Hadoop版本:hadoop-2.2.0
192.168.149.128namenode (充當namenode、secondary namenode和ResourceManager角色)
192.168.149.129datanode1 (充當datanode、nodemanager角色)
192.168.149.130datanode2 (充當datanode、nodemanager角色)
二、系統准備
1、Hadoop可以從Apache官方網站直接下載最新版本Hadoop2.2。官方目前是提供了linux32位系統可執行文件,所以如果需要在64位系統上部署則需要單獨下載src 源碼自行編譯。(如果是真實線上環境,請下載64位hadoop版本,這樣可以避免很多問題,這里我實驗採用的是32位版本)
1234 Hadoop
Java
2、我們這里採用三台CnetOS伺服器來搭建Hadoop集群,分別的角色如上已經註明。
第一步:我們需要在三台伺服器的/etc/hosts裡面設置對應的主機名如下(真實環境可以使用內網DNS解析)
[root@node1 hadoop]# cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1localhost.localdomain localhost
192.168.149.128node1
192.168.149.129node2
192.168.149.130node3
(注* 我們需要在namenode、datanode三台伺服器上都配置hosts解析)
第二步:從namenode上無密碼登陸各台datanode伺服器,需要做如下配置:
在namenode 128上執行ssh-keygen,一路Enter回車即可。
然後把公鑰/root/.ssh/id_rsa.pub拷貝到datanode伺服器即可,拷貝方法如下:
ssh--id -i .ssh/id_rsa.pub [email protected]
ssh--id -i .ssh/id_rsa.pub [email protected]
三、Java安裝配置
tar -xvzf jdk-7u25-linux-x64.tar.gz &&mkdir -p /usr/java/ ; mv /jdk1.7.0_25 /usr/java/ 即可。
安裝完畢並配置java環境變數,在/etc/profile末尾添加如下代碼:
export JAVA_HOME=/usr/java/jdk1.7.0_25/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$JAVE_HOME/lib/dt.jar:$JAVE_HOME/lib/tools.jar:./
保存退出即可,然後執行source /etc/profile 生效。在命令行執行java -version 如下代表JAVA安裝成功。
[root@node1 ~]# java -version
java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b15)
Java HotSpot(TM) 64-Bit Server VM (build 23.25-b01, mixed mode)
(注* 我們需要在namenode、datanode三台伺服器上都安裝Java JDK版本)
四、Hadoop版本安裝
官方下載的hadoop2.2.0版本,不用編譯直接解壓安裝就可以使用了,如下:
第一步解壓:
tar -xzvf hadoop-2.2.0.tar.gz &&mv hadoop-2.2.0/data/hadoop/
(注* 先在namenode伺服器上都安裝hadoop版本即可,datanode先不用安裝,待會修改完配置後統一安裝datanode)
第二步配置變數:
在/etc/profile末尾繼續添加如下代碼,並執行source /etc/profile生效。
export HADOOP_HOME=/data/hadoop/
export PATH=$PATH:$HADOOP_HOME/bin/
export JAVA_LIBRARY_PATH=/data/hadoop/lib/native/
(注* 我們需要在namenode、datanode三台伺服器上都配置Hadoop相關變數)
五、配置Hadoop
在namenode上配置,我們需要修改如下幾個地方:
1、修改vi /data/hadoop/etc/hadoop/core-site.xml 內容為如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href=\'#\'" Put site-specific property overrides inthisfile. -->
<configuration>
<property>
<name>fs.default.name</name>
<value>hdfs://192.168.149.128:9000</value>
</property>
<property>
<name>hadoop.tmp.dir</name>
<value>/tmp/hadoop-${user.name}</value>
<description>A base forother temporary directories.</description>
</property>
</configuration>
2、修改vi /data/hadoop/etc/hadoop/mapred-site.xml內容為如下:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl"href=\'#\'" Put site-specific property overrides inthisfile. -->
<configuration>
<property>
<name>mapred.job.tracker</name>
<value>192.168.149.128:9001</value>
</property>
</configuration>
3、修改vi /data/hadoop/etc/hadoop/hdfs-site.xml內容為如下:
<?xml version="1.0"encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl"href=\'#\'" /name>
<value>/data/hadoop/data_name1,/data/hadoop/data_name2</value>
</property>
<property>
<name>dfs.data.dir</name>
<value>/data/hadoop/data_1,/data/hadoop/data_2</value>
</property>
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
</configuration>
4、在/data/hadoop/etc/hadoop/hadoop-env.sh文件末尾追加JAV_HOME變數:
echo "export JAVA_HOME=/usr/java/jdk1.7.0_25/">> /data/hadoop/etc/hadoop/hadoop-env.sh
5、修改 vi /data/hadoop/etc/hadoop/masters文件內容為如下:
192.168.149.128
6、修改vi /data/hadoop/etc/hadoop/slaves文件內容為如下:
192.168.149.129
192.168.149.130
如上配置完畢,以上的配置具體含義在這里就不做過多的解釋了,搭建的時候不明白,可以查看一下相關的官方文檔。
如上namenode就基本搭建完畢,接下來我們需要部署datanode,部署datanode相對簡單,執行如下操作即可。
1 fori in`seq 129130` ; doscp -r /data/hadoop/ [email protected].$i:/data/ ; done
自此整個集群基本搭建完畢,接下來就是啟動hadoop集群了。
2. C++實現分布式文件解析系統
整個分布式文件解析系統一共有四個角色:任務分配伺服器、文件解析伺服器、工作站和管理平台。在一個大型的網路中,有若干個用戶(即「工作站」)隨機地通過「任務分配伺服器」向若干個「文件解析伺服器」提交文本文件。「文件解析伺服器」將收到的文件解析後寫入log文件中。「管理平台」負責以可視化的界面觀察所有連接到的「任務分配伺服器」和「工作站」的ip及工作狀態。
任務分配伺服器的作用是輪流地將來自「工作站」的文件傳送請求轉發到每個在線的「文件解析伺服器」上,從而避免某個特定的「文件解析伺服器」工作負載太重。「任務分配伺服器」輪流給所有在線的「文件解析伺服器」分配任務。輪流的原則是按每工作站每批輪流,不考慮每批文件的數量多少。當有「工作站」准備傳送一批文件時,首先連接任務分配伺服器,通知任務分配伺服器有一批文件待傳。任務分配伺服器則把該工作站的IP和埠告訴選定的「文件解析伺服器」,以便讓「文件分析伺服器」能主動和「工作站」連接,並完成該批文件傳輸。
ps:主動的含義是文件分析伺服器主動通過 connect 連接工作站。「任務分配伺服器」本身不接收或轉發文件。工作站每次都是按批提交文件,一批文件的數量不等。
「文件解析伺服器」每收到用戶的一批文件後,就自動對該批文件進行「文件解析」。「文件解析」的功能是:
管理平台的作用是採用圖形化的方式展示目前在線的工作站,文件分析伺服器的工作狀態。能展示工作站的IP,工作狀態(傳文件中或沒有傳文件)。能展示文件分析伺服器的IP,工作狀態(接收文件中,文件分析中,沒有傳文件,沒有文件被分析)。當一個工作站或文件分析伺服器宕機,能實時更新狀態。
整個系統的工作流程如下圖所示:
該項目源碼在 https://github.com/toMyLord/DistributedFileParsingSystem
src目錄下包含 Server 類、 Client 類、 SpecificTime 類。 Server 類用於伺服器初始化,監聽 socket_fd ,接受來自客戶端的連接請求,接收或發送信息,關閉套接字。 Client 類用於客戶端初始化,連接伺服器,與伺服器進行全雙工通信,關閉連接。 SpecificTime 類用於獲取當前系統的時間,並以規定的格式返回一個 std::string 類型的字元串。上述三個類會被用於所有角色,因此以一個目錄的形式單獨放在所有角色所屬目錄外,通過CmakeLists.txt將這些文件的編譯相關性聯系在一起,從而生成可執行文件。
該目錄下為編譯 TaskDistribution 所需要的專屬文件。在當前目錄下的src目錄內,定義了 DistributionServer 類,該類內組合了DistributedFileParsingSystem/src目錄下的 Server 類。實現 DistributionServer 類的目的是為了使用該類監聽特定埠的所有網路連接,並將所有連接的客戶端信息都存儲在一個 std::vector 容器內。 DistributionServer 類的定義如下:
在 ClientNode 結構體內嵌套的 ClientInfo 結構體聲明和定義在DistributedFileParsingSystem/src/server.h文件內, ClientInfo 結構體保存了連接到 server 的客戶端的 sockaddr_in 、 socket_fd 以及ip信息。 ClientNode 結構體擴展了一個新的欄位 client_state ,該欄位用來描述客戶端的傳輸狀態。
通過 std::vector<ClientNode> 將所有連接的客戶端信息都保存下來。每當有新的客戶端連接,就使用 client_node.push_back() 將信息保存在內存中。如果有已連接的客戶端斷開連接,需要用 find_if() 函數配合 lambda 表達式找到在 vector 中的迭代器,然後斷開連接並刪除 client_node 中對應的數據。具體過程如下:
TaskDistribution_main.cpp是任務分配伺服器可執行文件編譯所需的主函數。在該文件內聲明了兩個 DistributionServer 類的實例 workstation_server 和 parsing_server ,一個 Server 類的實例 manager_server ,分別用來處理來自工作站、文件解析伺服器、管理平台的連接。因為任務分配伺服器只允許一個管理平台連接,因此管理平台選擇 Server 類,因為可能會有大量工作站和文件解析伺服器連接至任務分配伺服器,因此選擇 DistributionServer 來分別監聽工作站和文件解析伺服器的連接埠。
在主函數中,我選擇使用 epoll ——IO多路復用技術來監聽工作站、文件解析伺服器和管理平台的連接請求,從而實現在單進程中對三個埠進行監聽。
當有管理平台連接至任務分配伺服器後,任務分配伺服器就不再處理來自管理平台的連接請求,直到當前管理平台退出。
當有文件解析伺服器連接至任務分配伺服器後,任務分配伺服器會將文件解析添加至就緒隊列,等待來自工作站的請求。每當有工作站發出文件傳輸請求,就將處於就緒隊列頂端的文件解析伺服器出隊列,並分配給當前工作站用來處理解析任務。處理完文件解析任務後,任務分配伺服器會將文件解析伺服器重新加入隊列。
當工作站連接至任務分配伺服器後,任務分配伺服器會建立一個新的線程用來處理工作站發出的請求。當工作站發出文件解析請求後,該線程會將就緒隊列頂端的文件解析伺服器分配給工作站,並一直監控整個解析過程,直到解析完成,將文件解析伺服器重新入隊列。完成後此線程會重新監聽來自工作站的解析請求,直到工作站斷開連接,該線程就會消亡。如果工作站發出解析請求後,沒有任務文件解析伺服器就緒,那麼任務分配伺服器會每過1s檢測一次是否有就緒的文件解析伺服器(此處可以改進,將每秒輪詢的方式改為等待時長者優先策略)。
該目錄下為編譯 TaskDistribution 所需要的專屬文件。在當前目錄下的src目錄內,主要實現兩個功能: 使用單例模式實現日誌文件記錄 、 使用狀態模式實現文件解析伺服器在等待狀態和解析狀態之間的切換 。
使用單例模式來實現日誌記錄的 RecordingLog 類的實例只會創建一次,從而避免創建多個日誌類實例,造成寫入混亂的情況。 RecordingLog 類會將特定信息以 filesteam 的方式寫入文件中,具體被記錄在日誌文件中的信息包括接收來自工作站文件的時間、日期、工作站ip、工作站埠、文件名、文件前8個位元組內容、文件總長度。該類的聲明情況如下所示:
在本系統的FileParsing程序中,使用狀態模式用來處理文件解析伺服器的狀態轉換。文件解析伺服器主要有兩種狀態——等待任務分配伺服器發送解析文件請求狀態和接受來自工作站的文件並完成解析,寫入日誌文件的狀態。
在第一種狀態下,文件解析伺服器收到來自任務分配伺服器的解析請求後,會將需要主動連接的工作站的ip及埠保存下來,並切換到第二種狀態。
在第二種狀態下,文件解析伺服器根據保存的ip和埠主動連接工作站,連接完成後接收來自工作站的文件信息,解析後通過 RecordingLog 類中的 getLogInstance() 函數將解析後的結果寫入日誌文件,完成後會將解析完成情況回傳給任務分配伺服器,在任務分配伺服器中,將該文件解析伺服器重新添加到就緒隊列。之後會主動切換到第一種狀態,再次等待任務請求。
這部分程序使用了狀態模式,使得文件解析伺服器在等待分配任務狀態及解析文件狀態自動切換,從而保證了兩種狀態上的邏輯分離,具有非常好的封裝性,並體現了開閉原則和單一職責原則:每個狀態都是一個子類,如果需要增加狀態就只需要增加子類,如果需要修改狀態,就只需要修改一個子類即可完成,具有很高的擴展性。
該目錄下為編譯 WorkStation 所需要的專屬文件。在當前目錄下的src目錄內,定義了 SendDirectory 類。通過該類,可以實現根據輸入的一個目錄,自動發送該目錄下的所有文件。注意,該目錄下不可再包含目錄。
該目錄下為編譯 Managerplatform 所需要的專屬文件。此目錄可以使用QtCreater打開,但是編譯還是需要根據DistributedFileParsingSystem/CMakeLists.txt文件通過cmake編譯。
該目錄下的 ClientThread 類通過繼承 QThread 類,實現在Qt中使用線程。在該部分程序運行時,就會創建一個 ClientThread 線程,用於與任務分配伺服器建立連接,並不斷接受來自任務分配服務發送的有關工作站及文件解析伺服器的在線狀態以及傳輸狀態。每當有新的信息後,就通過Qt的槽機制,發送給 QDialog ,顯示在界面中。
編譯完成後會生成四個可執行文件:TaskDistribution、FileParsing、WorkStation、ManagerPlatform。
運行過程如下所示:
首先分別運行每個可執行程序,其中運行兩個FileParsing程序(上線兩個文件解析伺服器):
在WorkStation程序下輸入需要發送的文件目錄:
可以在任務分配伺服器的log中看到有新上線的文件解析伺服器,同時在管理平台也可以看到對應的文件解析伺服器。我們通過工作站連續發送三次文件。
實現了整個分布式任務解析伺服器框架,整個項目可以正常實現需求功能。
缺陷:任務分配伺服器存在不能正常處理所有連接的正常close。
在任務分配伺服器處新增了心跳包機制——任務分配伺服器會每隔5s向所有連接在線的文件解析伺服器和工作站發送心跳包,文件解析伺服器和工作站在收到心跳包後,也會主動回應心跳。通過心跳包機制可以很好的處理來自其他連接的斷開情況。同時新增了在管理平台退出後,任務分配伺服器可以重新接受來自管理平台的連接。
3. GlusterFS分布式文件系統的安裝配置教程
GlusterFS主要應用在集群系統中,具有很好的可擴展性。軟體的結構設計良好,易於擴展和配置,通過各個模塊的靈活搭配以得到針對性的解決方案。可解決以下問題:網路存儲,聯合存儲(融合多個節點上的存儲空間),冗餘備份,大文件的負載均衡(分塊)。
由於缺乏一些關鍵特性,可靠性也未經過長時間考驗,還不適合應用於需要提供 24 小時不間斷服務的產品環境。目前適合應用於大數據量的離線應用,下面一起來看GlusterFS分布式文件系統的安裝配置
GlusterFS是一個開源的分布式文件系統,用戶可以使用多台伺服器,並通過乙太網或者Infiniband RDMA互聯從而組成一個GlusterFS的集群
。
GlusterFS集群對外提供NFS,CIFS和Gluster Native(通過FUSE進行掛載)的介面以便用戶訪問GlusterFS的存儲池。
GlusterFS使用了彈性哈希演算法來定位文件存儲的位置。 由於使用了彈性哈希演算法,GlusterFS不需要專門的Meta-Data Server來保存元數據,因此可以避免因為元數據伺服器宕機導致的整個集群不可用。
也正是因為不需要元數據伺服器,所以GlusterFS在多個掛載點同時進行數據讀寫的時候,其整體性能很突出。
fuse-2.9.3.tar.gz #依賴於fuse
glusterfs-3.6.0.tar.gz #本文用的版本
准備2台機器,系統為centos6.5 64位。
IP地址 主機名
192.168.0.107 g1
192.168.0.136 g2
首先關閉iptables和selinux。
修改主機名,並添加hosts映射:
g1:
[root@localhost ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=g1
[root@localhost ~]# hostname
g1
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.107 g1
192.168.0.136 g2
g2:
[root@localhost ~]# cat /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=g2
[root@localhost ~]# hostname
g2
[root@localhost ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.0.107 g1
192.168.0.136 g2
安裝預編譯環境:
[root@localhost ~]# yum install -y gcc gcc-c++ flex flex-devel bison bison-devel openssl openssl-devel libxml2 libxml2-devel
安裝fuse:
[root@localhost ~]# cd fuse-2.9.3
[root@localhost fuse-2.9.3]# ./configure make make install
[root@localhost fuse-2.9.3]# cd
安裝gluster:
[root@localhost ~]# cd glusterfs-3.6.0
[root@localhost glusterfs-3.6.0]# ./configure --prefix=/usr/local/glusterfs make make install
g1和g2均執行上面操作。
g1和g2啟動gluster:
[root@localhost ~]# service glusterd start
添加集群:
[root@localhost ~]# ln -s /usr/local/glusterfs/sbin/gluster /usr/bin/gluster #做一個軟鏈接方便執行命令
[root@localhost ~]# gluster peer probe g2 #在g1中將g2加入到gluster集群中,本機(g1)不需要加入。
peer probe: success. Probe on localhost not needed
查看集群信息:
[root@localhost ~]# gluster peer status
Number of Peers: 1
Hostname: g2
Uuid: c7aa664a-3161-4716-9f81-2dc4b4718fa1
State: Peer in Cluster (Connected) #已連接
剔除機器:
[root@localhost ~]# gluster peer detach g2
peer detach: success
創建卷:
[root@localhost ~]# gluster volume create test-volume replica 2 transport tcp g1:/data g2:/data force
volume create: test-volume: success: please start the volume to access data
test-volume 卷名 replica 副本數 transport 傳輸協議 g1:/data 伺服器名及存儲路徑
啟動卷:
[root@localhost ~]# gluster volume start test-volume
volume start: test-volume: success
查看卷:
[root@localhost ~]# gluster volume info
Volume Name: test-volume
Type: Replicate
Volume ID: 104d73c5-17f5-4150-a40d-b97cd78dd6bb
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: g1:/data
Brick2: g2:/data
客戶端1掛載(同樣安裝fuse和glusterfs才能支持glusterfs文件系統):
[root@localhost ~]# mkdir /mnt/gfs
[root@localhost ~]# mount -t glusterfs g1:test-volume /mnt/gfs/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 77G 3.7G 70G 6% /
tmpfs 499M 0 499M 0% /dev/shm
g1:test-volume 77G 3.8G 70G 6% /mnt/gfs
客戶端2掛載:
[root@localhost ~]# mkdir /mnt/gfs
[root@localhost ~]# mount -t glusterfs g2:test-volume /mnt/gfs
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 77G 3.8G 70G 6% /
tmpfs 499M 0 499M 0% /dev/shm
g2:test-volume 77G 3.8G 70G 6% /mnt/gfs
可以看到g1和g2都支持掛載。
gluster支持的參
[root@localhost ~]# gluster help #查看參數
安裝配置完成。
4. 如何用java 建立一個分布式系統
分布式架構的演進
系統架構演化歷程-初始階段架構
初始階段 的小型系統 應用程序、資料庫、文件等所有的資源都在一台伺服器上通俗稱為LAMP
特徵:
應用程序、資料庫、文件等所有的資源都在一台伺服器上。
描述:
通常伺服器操作系統使用Linux,應用程序使用PHP開發,然後部署在Apache上,資料庫使用Mysql,匯集各種免費開源軟體以及一台廉價伺服器就可以開始系統的發展之路了。
系統架構演化歷程-應用服務和數據服務分離
好景不長,發現隨著系統訪問量的再度增加,webserver機器的壓力在高峰期會上升到比較高,這個時候開始考慮增加一台webserver
特徵:
應用程序、資料庫、文件分別部署在獨立的資源上。
描述:
數據量增加,單台伺服器性能及存儲空間不足,需要將應用和數據分離,並發處理能力和數據存儲空間得到了很大改善。
系統架構演化歷程-使用緩存改善性能
特徵:
資料庫中訪問較集中的一小部分數據存儲在緩存伺服器中,減少資料庫的訪問次數,降低資料庫的訪問壓力。
描述:
系統訪問特點遵循二八定律,即80%的業務訪問集中在20%的數據上。
緩存分為本地緩存和遠程分布式緩存,本地緩存訪問速度更快但緩存數據量有限,同時存在與應用程序爭用內存的情況。
系統架構演化歷程-使用應用伺服器集群
在做完分庫分表這些工作後,資料庫上的壓力已經降到比較低了,又開始過著每天看著訪問量暴增的幸福生活了,突然有一天,發現系統的訪問又開始有變慢的趨勢了,這個時候首先查看資料庫,壓力一切正常,之後查看webserver,發現apache阻塞了很多的請求,而應用伺服器對每個請求也是比較快的,看來 是請求數太高導致需要排隊等待,響應速度變慢
特徵:
多台伺服器通過負載均衡同時向外部提供服務,解決單台伺服器處理能力和存儲空間上限的問題。
描述:
使用集群是系統解決高並發、海量數據問題的常用手段。通過向集群中追加資源,提升系統的並發處理能力,使得伺服器的負載壓力不再成為整個系統的瓶頸。
系統架構演化歷程-資料庫讀寫分離
享受了一段時間的系統訪問量高速增長的幸福後,發現系統又開始變慢了,這次又是什麼狀況呢,經過查找,發現資料庫寫入、更新的這些操作的部分資料庫連接的資源競爭非常激烈,導致了系統變慢
特徵:
多台伺服器通過負載均衡同時向外部提供服務,解決單台伺服器處理能力和存儲空間上限的問題。
描述:
使用集群是系統解決高並發、海量數據問題的常用手段。通過向集群中追加資源,使得伺服器的負載壓力不在成為整個系統的瓶頸。
系統架構演化歷程-反向代理和CDN加速
特徵:
採用CDN和反向代理加快系統的 訪問速度。
描述:
為了應付復雜的網路環境和不同地區用戶的訪問,通過CDN和反向代理加快用戶訪問的速度,同時減輕後端伺服器的負載壓力。CDN與反向代理的基本原理都是緩存。
系統架構演化歷程-分布式文件系統和分布式資料庫
隨著系統的不斷運行,數據量開始大幅度增長,這個時候發現分庫後查詢仍然會有些慢,於是按照分庫的思想開始做分表的工作
特徵:
資料庫採用分布式資料庫,文件系統採用分布式文件系統。
描述:
任何強大的單一伺服器都滿足不了大型系統持續增長的業務需求,資料庫讀寫分離隨著業務的發展最終也將無法滿足需求,需要使用分布式資料庫及分布式文件系統來支撐。
分布式資料庫是系統資料庫拆分的最後方法,只有在單表數據規模非常龐大的時候才使用,更常用的資料庫拆分手段是業務分庫,將不同的業務資料庫部署在不同的物理伺服器上。
系統架構演化歷程-使用NoSQL和搜索引擎
特徵:
系統引入NoSQL資料庫及搜索引擎。
描述:
隨著業務越來越復雜,對數據存儲和檢索的需求也越來越復雜,系統需要採用一些非關系型資料庫如NoSQL和分資料庫查詢技術如搜索引擎。應用伺服器通過統一數據訪問模塊訪問各種數據,減輕應用程序管理諸多數據源的麻煩。
系統架構演化歷程-業務拆分
特徵:
系統上按照業務進行拆分改造,應用伺服器按照業務區分進行分別部署。
描述:
為了應對日益復雜的業務場景,通常使用分而治之的手段將整個系統業務分成不同的產品線,應用之間通過超鏈接建立關系,也可以通過消息隊列進行數據分發,當然更多的還是通過訪問同一個數據存儲系統來構成一個關聯的完整系統。
縱向拆分:
將一個大應用拆分為多個小應用,如果新業務較為獨立,那麼就直接將其設計部署為一個獨立的Web應用系統
縱向拆分相對較為簡單,通過梳理業務,將較少相關的業務剝離即可。
橫向拆分:將復用的業務拆分出來,獨立部署為分布式服務,新增業務只需要調用這些分布式服務
橫向拆分需要識別可復用的業務,設計服務介面,規范服務依賴關系。
系統架構演化歷程-分布式服務
特徵:
公共的應用模塊被提取出來,部署在分布式伺服器上供應用伺服器調用。
描述:
隨著業務越拆越小,應用系統整體復雜程度呈指數級上升,由於所有應用要和所有資料庫系統連接,最終導致資料庫連接資源不足,拒絕服務。
Q:分布式服務應用會面臨哪些問題?
A:
(1) 當服務越來越多時,服務URL配置管理變得非常困難,F5硬體負載均衡器的單點壓力也越來越大。
(2) 當進一步發展,服務間依賴關系變得錯蹤復雜,甚至分不清哪個應用要在哪個應用之前啟動,架構師都不能完整的描述應用的架構關系。
(3) 接著,服務的調用量越來越大,服務的容量問題就暴露出來,這個服務需要多少機器支撐?什麼時候該加機器?
(4) 服務多了,溝通成本也開始上升,調某個服務失敗該找誰?服務的參數都有什麼約定?
(5) 一個服務有多個業務消費者,如何確保服務質量?
(6) 隨著服務的不停升級,總有些意想不到的事發生,比如cache寫錯了導致內存溢出,故障不可避免,每次核心服務一掛,影響一大片,人心慌慌,如何控制故障的影響面?服務是否可以功能降級?或者資源劣化?
Java分布式應用技術基礎
分布式服務下的關鍵技術:消息隊列架構
消息對列通過消息對象分解系統耦合性,不同子系統處理同一個消息
分布式服務下的關鍵技術:消息隊列原理
分布式服務下的關鍵技術:服務框架架構
服務框架通過介面分解系統耦合性,不同子系統通過相同的介面描述進行服務啟用
服務框架是一個點對點模型
服務框架面向同構系統
適合:移動應用、互聯網應用、外部系統
分布式服務下的關鍵技術:服務框架原理
分布式服務下的關鍵技術:服務匯流排架構
服務匯流排同服務框架一樣,均是通過介面分解系統耦合性,不同子系統通過相同的介面描述進行服務啟用
服務匯流排是一個匯流排式的模型
服務匯流排面向同構、異構系統
適合:內部系統
分布式服務下的關鍵技術:服務匯流排原理
分布式架構下系統間交互的5種通信模式
request/response模式(同步模式):客戶端發起請求一直阻塞到服務端返回請求為止。
Callback(非同步模式):客戶端發送一個RPC請求給伺服器,服務端處理後再發送一個消息給消息發送端提供的callback端點,此類情況非常合適以下場景:A組件發送RPC請求給B,B處理完成後,需要通知A組件做後續處理。
Future模式:客戶端發送完請求後,繼續做自己的事情,返回一個包含消息結果的Future對象。客戶端需要使用返回結果時,使用Future對象的.get(),如果此時沒有結果返回的話,會一直阻塞到有結果返回為止。
Oneway模式:客戶端調用完繼續執行,不管接收端是否成功。
Reliable模式:為保證通信可靠,將藉助於消息中心來實現消息的可靠送達,請求將做持久化存儲,在接收方在線時做送達,並由消息中心保證異常重試。
五種通信模式的實現方式-同步點對點服務模式
五種通信模式的實現方式-非同步點對點消息模式1
五種通信模式的實現方式-非同步點對點消息模式2
五種通信模式的實現方式-非同步廣播消息模式
分布式架構下的服務治理
服務治理是服務框架/服務匯流排的核心功能。所謂服務治理,是指服務的提供方和消費方達成一致的約定,保證服務的高質量。服務治理功能可以解決將某些特定流量引入某一批機器,以及限制某些非法消費者的惡意訪問,並在提供者處理量達到一定程度是,拒絕接受新的訪問。
基於服務框架Dubbo的服務治理-服務管理
可以知道你的系統,對外提供了多少服務,可以對服務進行升級、降級、停用、權重調整等操作
可以知道你提供的服務,誰在使用,因業務需求,可以對該消費者實施屏蔽、停用等操作
基於服務框架Dubbo的服務治理-服務監控
可以統計服務的每秒請求數、平均響應時間、調用量、峰值時間等,作為服務集群規劃、性能調優的參考指標。
基於服務框架Dubbo的服務治理-服務路由
基於服務框架Dubbo的服務治理-服務保護
基於服務匯流排OSB的服務治理-功能介紹
基於服務匯流排OSB的服務治理
Q:Dubbo到底是神馬?
A:
淘寶開源的高性能和透明化的RPC遠程調用服務框架
SOA服務治理方案
Q:Dubbo原理是?
A:
-結束-
5. 如何搭建分布式伺服器
如何搭建分布式網站伺服器,比如我有3台伺服器ABC,需要搭建分布式服務。也就需要建立IIS 還由DNS WIN 伺服器的 還有更改主機名 很麻煩的,這個需要專業的IT人員來操作的。
以下資料作為參考:
DNS輪循
首先介紹一個DNS系統:傳統的DNS解析都是一個域名對應一個IP地址,但是通過DNS輪循技術(負載平衡技術)可以做到一個域名對應到多個IP 上. 這樣大家難免就會問,這個技術有什麼用呢?
DNS輪循是指將相同的域名解釋到不同的IP,隨機使用其中某台主機的技術,該項技術可以智能的調整網站的訪問量到不同伺服器上,減輕網站伺服器的壓力,實現負載勻衡;如果您感覺到單一的主機已經不堪負載你網站日益增長的訪問,那麼建議您採用我們的DNS輪循技術。
DNS輪循系統可以根據您的需求設置N台主機作為WEB伺服器。目前已有越來多大型的WEB伺服器使用DNS輪循來實現負載均衡,服務的分布規劃更便捷,擴展性更好,從而提高了網站的穩定性和訪問效率,那些大量數據文件請求的客戶也得到了更快的響應。
DNS輪循還將給您的網站提供這樣的改進,諸如您的網站的數據使用量一直處於不斷的增長當中,當達到伺服器資源運行瓶頸的情況
下,由於採用了DNS輪循技術,您只需要增加伺服器數量就可以平滑升級,而且偶然故障或其他意外情況造成的損失得以避免,7×24小時可靠性的持續的運行
成為可能。
如果您真的希望自己的網站能夠一直穩定的在線運行,盡量的減少宕機的比率,那麼除了採用比較好的網站空間技術支持之外,還可以採用時代互聯域名的DNS輪循功能來實現網站的永久在線負載平衡
負載均衡是由多台伺服器以對稱的方式組成一個伺服器集合,每台伺服器都具有等價的地位,都可以單獨對外提供服務而無須其
他伺服器的輔助。通過某種負載分擔技術,將外部發送來的請求均勻分配到對稱結構中的某一台伺服器上,而接收到請求的伺服器獨立地回應客戶的請求。均衡負載
能夠平均分配客戶請求到伺服器列陣,籍此提供快速獲取重要數據,解決大量並發訪問服務問題。這種群集技術可以用最少的投資獲得接近於大型主機的性能。
網路負載均衡的優點
第一,網路負載均衡能將傳入的請求傳播到多達32台伺服器上,即可以使用最多32台伺服器共同分擔對外的網路請求服務。網路負載均衡技術保證即使是在負載很重的情況下,伺服器也能做出快速響應;
第二,網路負載均衡對外只需提供一個IP地址(或域名);
第三,當網路負載均衡中的一台或幾台伺服器不可用時,服務不會中斷。網路負載均衡自動檢測到伺服器不可用時,能夠迅速在剩餘的
伺服器中重新指派客戶機通訊。這項保護措施能夠幫助你為關鍵的業務程序提供不中斷的服務,並可以根據網路訪問量的增加來相應地增加網路負載均衡伺服器的數
量;
第四,網路負載均衡可在普通的計算機上實現。
網路負載均衡的實現過程
在Windows Server 2003中,網路負載均衡的應用程序包括Internet信息服務(IIS)、ISA
Server 2000防火牆與代理伺服器、VPN虛擬專用網、終端伺服器、Windows Media
Services(Windows視頻點播、視頻廣播)等服務。同時,網路負載均衡有助於改善伺服器的性能和可伸縮性,以滿足不斷增長的基於
Internet客戶端的需求。
網路負載均衡可以讓客戶端用一個邏輯Internet名稱和虛擬IP地址(又稱群集IP地址)訪問群集,同時保留每台計算機各自的名稱。下面,我們將在兩台安裝Windows Server 2003的普通計算機上,介紹網路負載均衡的實現及應用。
這兩台計算機中,一台計算機名稱為A,IP地址為192.168.0.7;另一台名為B,IP地址為192.168.0.8。
規劃網路負載均衡專用虛擬IP地址為192.168.0.9。當正式應用時,客戶機只需要使用IP地址192.168.0.9來訪問伺服器,網路服務均衡
會根據每台伺服器的負載情況自動選擇192.168.0.7或者192.168.0.8對外提供服務。具體實現過程如下:
在實現網路負載均衡的每一台計算機上,只能安裝TCP/IP協議,不要安裝任何其他的協議(如IPX協議或者NetBEUI協議),這可以從「網路連接屬性」中查看。
第一步,分別以管理員身份登錄A機和B機,打開兩台機的「本地連接」屬性界面,勾選「此連接使用下列項目」中的「負載均衡」項並進入「屬性」對話框,將IP地址都設為192.168.0.9(即負載均衡專用IP),將子網掩碼設置為255.255.255.0;
第二步,分別進入A機和B機的「Internet協議(TCP/IP)」屬性設置界面,點擊「高級」按鈕後,在彈出的「高級TCP/IP設置」界面中添加IP地址192.168.0.9和子網掩碼設置為255.255.255.0。
第三步,退出兩台計算機的「本地連接屬性」窗口,耐心等一會兒讓系統完成設置。
以後,如果這兩台伺服器不能滿足需求,可以按以上步驟添加第三台、第四台計算機到網路負載均衡系統中以滿足要求。
6. 基於mogileFS搭建分布式文件系統--海量小文件的存儲利器
1.簡介
分布式文件系統(Distributed File System)是指文件系統管理的物理存儲資源不一定直接連接在本地節點上,而是通過計算機網路與節點相連。分布式文件系統的設計基於客戶機/伺服器模式。一個典型的網路可能包括多個供多用戶訪問的伺服器。另外,對等特性允許一些系統扮演客戶機和伺服器的雙重角色。例如,用戶可以「發表」一個允許其他客戶機訪問的目錄,一旦被訪問,這個目錄對客戶機來說就像使用本地驅動器一樣。
當下我們處在一個互聯網飛速發展的信息 社會 ,在海量並發連接的驅動下每天所產生的數據量必然以幾何方式增長,隨著信息連接方式日益多樣化,數據存儲的結構也隨著發生了變化。在這樣的壓力下使得人們不得不重新審視大量數據的存儲所帶來的挑戰,例如:數據採集、數據存儲、數據搜索、數據共享、數據傳輸、數據分析、數據可視化等一系列問題。
傳統存儲在面對海量數據存儲表現出的力不從心已經是不爭的事實,例如:縱向擴展受陣列空間限制、橫向擴展受交換設備限制、節點受文件系統限制。
然而分布式存儲的出現在一定程度上有效的緩解了這一問題,之所以稱之為緩解是因為分布式存儲在面對海量數據存儲時也並非十全十美毫無壓力,依然存在的難點與挑戰例如:節點間通信、數據存儲、數據空間平衡、容錯、文件系統支持等一系列問題仍處在不斷摸索和完善中。
2.分布式文件系統的一些解決方案
Google Filesystem適合存儲海量大個文件,元數據存儲與內存中
HDFS(Hadoop Filesystem)GFS的山寨版,適合存儲大量大個文件
TFS(Taobao Filesystem)淘寶的文件系統,在名稱節點上將元數據存儲與關系資料庫中,文件數量不在受限於名稱節點的內容空間,可以存儲海量小文件LustreOracle開發的企業級分布式系統,較重量級MooseFS基於FUSE的格式,可以進行掛載使用MogileFS
擅長存儲海量的小數據,元數據存儲與關系型資料庫中
1.簡介
MogileFS是一個開源的分布式文件系統,用於組建分布式文件集群,由LiveJournal旗下DangaInteractive公司開發,Danga團隊開發了包括 Memcached、MogileFS、Perlbal等不錯的開源項目:(註:Perlbal是一個強大的Perl寫的反向代理伺服器)。MogileFS是一個開源的分布式文件系統。
目前使用 MogileFS 的公司非常多,比如國外的一些公司,日本前幾名的公司基本都在使用這個.
國內所知道的使用 MogileFS 的公司有圖片託管網站 yupoo又拍,digg, 土豆, 豆瓣,1 號店, 大眾點評,搜狗,安居客等等網站.基本很多網站容量,圖片都超過 30T 以上。
2.MogileFS特性
1) 應用層提供服務,不需要使用核心組件
2)無單點失敗,主要有三個組件組成,分為tracker(跟蹤節點)、mogstore(存儲節點)、database(資料庫節點)
3)自動復制文件,復制文件的最小單位不是文件,而是class
4)傳輸中立,無特殊協議,可以通過NFS或HTTP實現通信
5)簡單的命名空間:沒有目錄,直接存在與存儲空間上,通過域來實現
6)不用共享任何數據
3.MogileFS的組成
1)Tracker--跟蹤器,調度器
MogileFS的核心,是一個調度器,mogilefsd進程就是trackers進程程序,trackers的主要職責有:刪除數據、復制數據、監控、查詢等等.這個是基於事件的( event-based ) 父進程/消息匯流排來管理所有來之於客戶端應用的交互(requesting operations to be performed), 包括將請求負載平衡到多個"query workers"中,然後讓 mogilefs的子進程去處理.
mogadm,mogtool的所有操作都要跟trackers打交道,Client的一些操作也需要定義好trackers,因此最好同時運行多個trackers來做負載均衡.trackers也可以只運行在一台機器上,使用負載均衡時可以使用搞一些簡單的負載均衡解決方案,如haproxy,lvs,nginx等,
tarcker的配置文件為/etc/mogilefs/mogilefsd.conf,監聽在TCP的7001埠
2)Database--資料庫部分
主要用來存儲mogilefs的元數據,所有的元數據都存儲在資料庫中,因此,這個數據相當重要,如果資料庫掛掉,所有的數據都不能用於訪問,因此,建議應該對資料庫做高可用
3)mogstored--存儲節點
數據存儲的位置,通常是一個HTTP(webDAV)伺服器,用來做數據的創建、刪除、獲取,任何 WebDAV 伺服器都可以, 不過推薦使用 mogstored . mogilefsd可以配置到兩個機器上使用不同埠… mogstored 來進行所有的 DAV 操作和流量,IO監測, 並且你自己選擇的HTTP伺服器(默認為 perlbal)用來做 GET 操作給客戶端提供文件.
典型的應用是一個掛載點有一個大容量的SATA磁碟. 只要配置完配置文件後mogstored程序的啟動將會使本機成為一個存儲節點.當然還需要mogadm這個工具增加這台機器到Cluster中.
配置文件為/etc/mogilefs/mogstored.conf,監聽在TCP的7500埠
4.基本工作流程
應用程序請求打開一個文件 (通過RPC 通知到 tracker, 找到一個可用的機器). 做一個 「create_open」 請求.
tracker 做一些負載均衡(load balancing)處理,決定應該去哪兒,然後給應用程序一些可能用的位置。
應用程序寫到其中的一個位置去 (如果寫失敗,他會重新嘗試並寫到另外一個位置去).
應用程序 (client) 通過」create_close」 告訴tracker文件寫到哪裡去了.
tracker 將該名稱和域命的名空間關聯 (通過資料庫來做的)
tracker, 在後台, 開始復制文件,知道他滿足該文件類別設定的復制規則
然後,應用程序通過 「get_paths」 請求 domain+key (key == 「filename」) 文件, tracker基於每一位置的I/O繁忙情況回復(在內部經過 database/memcache/etc 等的一些抉擇處理), 該文件可用的完整 URLs地址列表.
應用程序然後按順序嘗試這些URL地址. (tracker』持續監測主機和設備的狀態,因此不會返回死連接,默認情況下他對返回列表中的第一個元素做雙重檢查,除非你不要他這么做..)
1.拓撲圖
說明:1.用戶通過URL訪問前端的nginx
2.nginx根據特定的挑選演算法,挑選出後端一台tracker來響應nginx請求
3.tracker通過查找database資料庫,獲取到要訪問的URL的值,並返回給nginx
4.nginx通過返回的值及某種挑選演算法挑選一台mogstored發起請求
5.mogstored將結果返回給nginx
6.nginx構建響應報文返回給客戶端
2.ip規劃
角色運行軟體ip地址反向代理nginx192.168.1.201存儲節點與調度節點1
mogilefs192.168.1.202存儲節點與調度節點2
mogilefs192.168.1.203資料庫節點
MariaDB192.168.1.204
3.資料庫的安裝操作並為授權
關於資料庫的編譯安裝,請參照本人相關博文http://wangfeng7399.blog.51cto.com/3518031/1393146,本處將不再累贅,本處使用的為yum源的安裝方式安裝mysql
4.安裝mogilefs. 安裝mogilefs,可以使用yum安裝,也可以使用編譯安裝,本處通過yum安裝
5.初始化資料庫
可以看到在資料庫中創建了一些表
6.修改配置文件,啟動服務
7.配置mogilefs
添加存儲主機
添加存儲設備
添加域
添加class
8.配置192.168.1.203的mogilefs 。切記不要初始化資料庫,配置應該與192.168.1.202一樣
9.嘗試上傳數據,獲取數據,客戶端讀取數據
上傳數據,在任何一個節點上傳都可以
獲取數據
客戶端查看數據
我們可以通過任何一個節點查看到數據
要想nginx能夠實現對後端trucker的反向代理,必須結合第三方模塊來實現
1.編譯安裝nginx
2.准備啟動腳本
3.nginx與mofilefs互聯
查看效果
5.配置後端truckers的集群
查看效果
大功告成了,後續思路,前段的nginx和資料庫都存在單點故障,可以實現高可用集群