zookeeper在dubbo到底起了什麼作用,dubno如何解決了阿里的高並發問題?

dubbo。zookeeper。java 高並發。分散式服務框架


zookeeper用來註冊服務和進行負載均衡,哪一個服務由哪一個機器來提供必需讓調用者知道,簡單來說就是ip地址和服務名稱的對應關係。當然也可以通過硬編碼的方式把這種對應關係在調用方業務代碼中實現,但是如果提供服務的機器掛掉調用者無法知曉,如果不更改代碼會繼續請求掛掉的機器提供服務。zookeeper通過心跳機制可以檢測掛掉的機器並將掛掉機器的ip和服務對應關係從列表中刪除。至於支持高並發,簡單來說就是橫向擴展,在不更改代碼的情況通過添加機器來提高運算能力。通過添加新的機器向zookeeper註冊服務,服務的提供者多了能服務的客戶就多了。


client端需要知道server端在哪裡,在幹嘛,zk就是用來干這個的


分散式系統是一個由很多進程組成的整體,這個整體中每個成員部分,都會具備一些狀態,比如自己的負責模塊,自己的負載情況,對某些數據的掌握等等。而這些和其他進程相關的數據,在故障恢復、擴容縮容的時候變得非常重要。

Zookeeper 是java方向一個非常可靠好用的分散式服務,dubbo或者kafka只不過是利用了這個項目,沒有自己再重新造輪子而已。

-------------------------------------------------------------------------------------------------------------------------------------------

簡單的分散式系統,可以通過靜態的配置文件,來記錄這些數據:進程之間的連接對應關係,他們的IP地址和埠,等等。然而一個自動化程度高的分散式系統,必然要求這些狀態數據都是動態保存的。這樣才能讓程序自己去做容災和負載均衡的工作。

一些程序員會專門自己編寫一個DIR服務(目錄服務),來記錄集群中進程的運行狀態。集群中進程會和這個DIR服務產生自動關聯,這樣在容災、擴容、負載均衡的時候,就可以自動根據這些DIR服務里的數據,來調整請求的發送目地,從而達到繞開故障機器、或連接到新的伺服器的操作。

然而,如果我們只是用一個進程來充當這個工作。那麼這個進程就成為了這個集群的「單點」——意思就是,如果這個進程故障了,那麼整個集群可能都無法運行的。所以存放集群狀態的目錄服務,也需要是分散式的。幸好我們有ZooKeeper這個優秀的開源軟體,它正是一個分散式的目錄服務區。

ZooKeeper可以簡單啟動奇數個進程,來形成一個小的目錄服務集群。這個集群會提供給所有其他進程,進行讀寫其巨大的「配置樹」的能力。這些數據不僅僅會存放在一個ZooKeeper進程中,而是會根據一套非常安全的演算法,讓多個進程來承載。這讓ZooKeeper成為一個優秀的分散式數據保存系統。

由於ZooKeeper的數據存儲結構,是一個類似文件目錄的樹狀系統,所以我們常常會利用它的功能,把每個進程都綁定到其中一個「分枝」上,然後通過檢查這些「分支」,來進行伺服器請求的轉發,就能簡單的解決請求路由(由誰去做)的問題。另外還可以在這些「分支」上標記進程的負載的狀態,這樣負載均衡也很容易做了。

目錄服務是分散式系統中最關鍵的組件之一。而ZooKeeper是一個很好的開源軟體,正好是用來完成這個任務。


dubbo是管理中間層的工具,在業務層到數據倉庫間有非常多服務的接入和服務提供者需要調度,dubbo提供一個框架解決這個問題。

注意這裡的dubbo只是一個框架,至於你架子上放什麼是完全取決於你的,就像一個汽車骨架,你需要配你的輪子引擎。這個框架中要完成調度必須要有一個分散式的註冊中心,儲存所有服務的元數據,你可以用zk,也可以用別的,只是大家都用zk。

至於怎麼解決高並發。。百度一下dubbo吧,太多了懶得搬。主要是負載策略豐富,調度無中心點擴展性強,協議靈活效率高。


Dubbo視頻教程:《Dubbo項目實戰》免費在線學習

http://www.roncoo.com


阿里解決高並發其實不是依賴dubbo,dubbo只是阿里後來各部門服務合併多出來的產品,他們有自己內部的解決方案


Dubbo建議使用Zookeeper作為服務的註冊中心。

http://www.roncoo.com/details?cid=f614343765bc4aac8597c6d8b38f06fd

註冊中心伺服器(192.168.3.71)配置,安裝Zookeeper:

1、 修改操作系統的/etc/hosts文件中添加:

# zookeeper servers

192.168.3.71 edu-provider-01

2、 到http://apache.fayea.com/zookeeper/下載zookeeper-3.4.6:

$ wget http://apache.fayea.com/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz

3、 解壓zookeeper安裝包:

$ tar -zxvf zookeeper-3.4.6.tar.gz

4、 在/home/wusc/zookeeper-3.4.6目錄下創建以下目錄:

$ cd /home/wusc/zookeeper-3.4.6

$ mkdir data

$ mkdir logs

5、 將zookeeper-3.4.6/conf目錄下的zoo_sample.cfg文件拷貝一份,命名為為zoo.cfg

$ cp zoo_sample.cfg zoo.cfg

6、 修改zoo.cfg配置文件:

$ vi zoo.cfg

# The number of milliseconds of each tick

tickTime=2000

# The number of ticks that the initial

# synchronization phase can take

initLimit=10

# The number of ticks that can pass between

# sending a request and getting an acknowledgement

syncLimit=5

# the directory where the snapshot is stored.

# do not use /tmp for storage, /tmp here is just

# example sakes.

dataDir=/home/wusc/zookeeper-3.4.6/data

dataLogDir=/home/wusc/zookeeper-3.4.6/logs

# the port at which the clients will connect

clientPort=2181

#2888,3888 are election port

server.1=edu-provider-01:2888:3888

其中,

2888埠號是zookeeper服務之間通信的埠。

3888是zookeeper與其他應用程序通信的埠。

edu-provider-01是在hosts中已映射了IP的主機名。

initLimit:這個配置項是用來配置 Zookeeper 接受客戶端(這裡所說的客戶端不是用戶連接 Zookeeper伺服器的客戶端,而是 Zookeeper 伺服器集群中連接到 Leader 的 Follower 伺服器)初始化連接時最長能忍受多少個心跳時間間隔數。當已經超過 10 個心跳的時間(也就是 tickTime)長度後 Zookeeper 伺服器還沒有收到客戶端的返回信息,那麼表明這個客戶端連接失敗。總的時間長度就是 5*2000=10 秒。

syncLimit:這個配置項標識 Leader 與 Follower 之間發送消息,請求和應答時間長度,最長不能超過多少個 tickTime 的時間長度,總的時間長度就是 2*2000=4 秒。

server.A=B:C:D:其中 A 是一個數字,表示這個是第幾號伺服器;B 是這個伺服器的IP地址或/etc/hosts文件中映射了IP的主機名;C 表示的是這個伺服器與集群中的 Leader 伺服器交換信息的埠;D 表示的是萬一集群中的 Leader 伺服器掛了,需要一個埠來重新進行選舉,選出一個新的 Leader,而這個埠就是用來執行選舉時伺服器相互通信的埠。如果是偽集群的配置方式,由於 B 都是一樣,所以不同的 Zookeeper 實例通信埠號不能一樣,所以要給它們分配不同的埠號。

7、 在dataDir=/home/wusc/zookeeper-3.4.6/data下創建myid文件

編輯myid文件,並在對應的IP的機器上輸入對應的編號。如在zookeeper上,myid文件內容就是1。如果只在單點上進行安裝配置,那麼只有一個server.1。

$ vi myid

1

8、 wusc用戶下修改vi /home/wusc/.bash_profile,增加zookeeper配置:

# zookeeper env

export ZOOKEEPER_HOME=/home/wusc/zookeeper-3.4.6

export PATH=$ZOOKEEPER_HOME/bin:$PATH

使配置文件生效

$ source /home/wusc/.bash_profile

9、 在防火牆中打開要用到的埠2181、2888、3888

切換到root用戶許可權,執行以下命令:

# chkconfig iptables on

# service iptables start

編輯/etc/sysconfig/iptables

# vi /etc/sysconfig/iptables

增加以下3行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT

重啟防火牆:

# service iptables restart

查看防火牆埠狀態:

# service iptables status

Table: filter

Chain INPUT (policy ACCEPT)

num target prot opt source destination

1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED

2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0

3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0

4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22

5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:2181

6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:2888

7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:3888

8 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)

num target prot opt source destination

1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)

num target prot opt source destination

10、 啟動並測試zookeeper(要用wusc用戶啟動,不要用root):

(1) 使用wusc用戶到/home/wusc/zookeeper-3.4.6/bin目錄中執行:

$ zkServer.sh start

(2) 輸入jps命令查看進程:

$ jps

1456 QuorumPeerMain

1475 Jps

其中,QuorumPeerMain是zookeeper進程,啟動正常

(3) 查看狀態:

$ zkServer.sh status

(4) 查看zookeeper服務輸出信息:

由於服務信息輸出文件在/home/wusc/zookeeper-3.4.6/bin/zookeeper.out

$ tail -500f zookeeper.out

11、 停止zookeeper進程:

$ zkServer.sh stop

12、 配置zookeeper開機使用wusc用戶啟動:

編輯/etc/rc.local文件,加入:

su - wusc -c "/home/wusc/zookeeper-3.4.6/bin/zkServer.sh start"


dubbo可以理解為:zk+rpc。所以你知道zk大概都做什麼了吧


不了解具體分散式架構

也不了解dubbo

假設是 主從好了 (一般也是這種模式居多)

主從模式下

zookeeper就提供下列功能 跟他搭在哪個具體的架構上無關

1. Master election

2. Crash detection

3. Group membership management

4. Metadata management

zookeeper提供的recipe並不多

因為他的角色就是協調者 不能要求更多 其實他已經做好多了


推薦閱讀:

TAG:Java編程 | 高並發 | 負載均衡 | ZooKeeper | dubbo |