① myidisaniesandroy,howaoutyou什麼意思
my id is an ies an droy,how a out you
我的身份是一個工嘩芹瞎程師一個特洛伊,亂空怎麼了你
id
n. 身份證; 遺傳首租素質; 本能沖動; 標識符
IES
[計]= Illuminating Engineering Society,照明工程協會
② Zookeeper在windows下建立偽集群,myid存在,並且內容我設置為1.還是一直報myid is missing
我也是在windows下搭建環境,同樣問題,最後結合了回答中兩位大佬的方法搞定慎耐了:
windows下路徑得這么寫:D:\Zookeeper\zookeeper-3.3.6-server1\bin\xxx
myid後綴名刪除,無論是.text還是.txt都不行,一律刪除就好了
順便吐槽:同樣版本的zk,單機啟動時,上述兩點都不需要遵守就可以,集群就不行,這是最坑的。如果單機也一樣問題沒准早就發現了!折騰一上午,靠!PS,旁邊研發同學跟我說ZK其實單機和集群完全是兩套代碼,嗯寬圓春,看來他說的是對的腔辯。
③ ZooKeeper ZAB協議
最近在學習ZooKeeper,一直想寫篇相關博文記錄下學習內容,礙於自己是個拖延症重度患者總是停留在准備階段,直到今天心血來潮突然想干點什麼,於是便一不做二不休,通過對《從Paxos到Zookeeper 分布式一致性原理與實踐》一書中ZAB相關內容的總結,以及對一些優秀博文的整理碼出來這篇簡文。本文首先對ZooKeeper進行一個簡單的介紹,然後重點介紹ZooKeeper採用的ZAB(ZooKeeper Atomic Broadcast)一致性協議演算法,加深自己對ZAB協議的理解的同時也希望與簡友們一起分享討論。
ZooKeeper是一個具有高效且可靠的分布式協調服務, 由Yahoo創建的基於Google的Chubby開源實現,並於空陵2010年11月正式成為Apache軟體基金會的頂級項目。
ZooKeeper是一個典型的分布式數據一致性解決方案,分布式應用程序可基於它實現諸如數據發布/訂閱、負載均衡、命名服務、分布式協調/通知、集群管理、Master選舉、分布式鎖和分布式隊列等功能。
保證如下分布式一致性特性
順序一致性
從同一個客戶端發起的事務請求,最終將會嚴格地按照其發生順序被應用到ZooKeeper中。
原子一致性
所有事務請求的處理結果在整個集群中所有機器上的應用情況是一致的,即要麼整個集群所有機器都成功應用了某一個事務,要麼都沒有應用,一定不會出現集群中部分機器應用了該事務,而另外一部分沒有應用的情況。
單一視圖
無論客戶端連接的是哪個ZK伺服器,其看到的服務端數據模型都是一致的。
可靠性
一旦服務端成功地應用了一個事務並完成對客戶端的響咐虧祥應,那麼該事務所引起的服務端狀態變更將會被一直保留下來,除非另外一個事務又對其進行了變更。
實時性
通常人們看到實時性的第一反應是,一旦一個事務被成功應用,那麼客戶端能夠立即從服務端上讀取到這個事務變更後的最新數據狀態。但這個需要注意的是, ZooKeeper僅僅保證在一定時間段內 , 客戶端最終一定能夠從服務端上讀取到最新的數據狀態 。
Leader 一個ZooKeeper集群同一時間只會有一個實際工作的Leader,它會發起並維護與各Follwer及Observer間的心跳。所有的寫操作必須要通過Leader完成再由Leader將寫操作廣播給其它伺服器。
Follower 一個ZooKeeper集群可能同時存在多個Follower,它會響應Leader的心跳。Follower可直接處理並返回客戶端的讀請求,同時會將寫請求轉發給Leader處理衡搏,並且負責在Leader處理寫請求時對請求進行投票。
Observer 角色與Follower類似,但是無投票權。
ZooKeeper Atomic Broadcast (ZAB, ZooKeeper原子消息廣播協議)是ZooKeeper實現分布式數據一致性的核心演算法,ZAB借鑒Paxos演算法,但又不像Paxos演算法那樣,是一種通用的分布式一致性演算法, 它是一種特別為ZooKeeper專門設計的支持崩潰恢復的原子廣播協議 。
ZAB協議的核心是定義了對於那些會改變ZooKeeper伺服器數據狀態的事務請求處理方式,即:
所有事務請求必須由一個全局唯一的伺服器來協調處理,這樣的伺服器被稱為Leader伺服器,而餘下的其他伺服器稱為Follower伺服器。Leader伺服器負責將一個客戶端事務請求轉換成一個事務Proposal(提議),並將該Proposal分發給集群中所有的Follower伺服器。之後Leader伺服器需要等待所有的Follower伺服器的反饋,一旦超過半數的Follower伺服器進行了正確的反饋後,那麼Leader就會再次向所有的Follower伺服器分發Commit消息,要求其將前一個Proposal進提交。
ZAB協議整體可劃分為兩個基本的模式: 消息廣播和崩潰恢復
按協議原理可細分為四個階段: 選舉(Leader Election)、發現(Discovery)、同步(Synchronization)和廣播(Broadcast)
按協議實現分為三個時期: 選舉(Fast Leader Election)、恢復(Recovery Phase)和廣播(Broadcast Phase)
ZAB協議的消息廣播過程使用的是一個原子廣播協議,類似於一個二階段提交過程。針對客戶端的事務請求,Leader伺服器會為其生成對應的事務Proposal,並將其發送給集群中其餘所有的機器,然後在分別收集各自的選票,最後進行事務提交,此處與二階段提交過程略有不同,ZAB協議的二階段提交過程中, 移除了中斷邏輯 ,所有的Follower伺服器要麼正常反饋Leader提出的事務Proposal,要麼就拋棄Leader伺服器。同時,ZAB協議將二階段提交中的中斷邏輯移除意味著 我們可以在過半的Follower伺服器已經反饋Ack之後就開始提交事務Proposal了,而不需求等待集群中所有的Follower伺服器都反饋響應 。
然而,在這種簡化的二階段提交模型下,無法處理Leader伺服器崩潰退出而帶來的數據不一致問題,因此ZAB協議添加了 崩潰恢復 模式來解決這個問題,另外,整個消息廣播協議是基於有FIFO特性的TCP協議來進行網路通信的,因此很容易地保證消息廣播過程中消息接收和發送的順序性。
在整個消息廣播過程中,Leader伺服器會為每個事務請求生成對應的Proposal來進行廣播,並且在廣播事務Proposal之前,Leader伺服器會首先為這個事務Proposal分配一個全局單調遞增的唯一ID,我們稱之為事務ID(即ZXID)。由於ZAB協議需要保證每一個消息嚴格的因果關系,因此必須將每一個事務Proposal按照其ZXID的先後順序進行排序和處理。
具體的,在消息廣播過程中,Leader伺服器會為每個Follower伺服器都各自分配一個單獨的隊列,然後將需要廣播的事務Proposal依次放入這些隊列中取,並且根據FIFO策略進行消息發送。每一個Follower伺服器在接收到這個事務Proposal之後,都會首先將其以事務日誌的形式寫入本地磁碟中,並且成功寫入後反饋給Leader伺服器一個Ack相應。當Leader伺服器接收到過半數Follower的Ack響應後,就會廣播一個Commit消息給所有的Follower伺服器以通知其進行事務提交,同時Leader自身也會完成對事務的提交,而每個Follower伺服器在接收到Commit消息後,也會完成對事務的提交。
上面講解的ZAB協議的這個基於原子廣播協議的消息廣播過程,在正常運行情況下運行非常良好,但是一旦Leader伺服器出現崩潰或者由於網路原因導致Leader伺服器失去了與過半Follower的聯系,那麼就會進入崩潰恢復模式。在ZAB協議中,為了保證程序的正確運行,整個恢復過程結束後需要選舉出一個新的Leader伺服器。因此,ZAB協議需要一個高效且可靠的Leader選舉演算法,從而確保能夠快速選舉出新的Leader。同時,Leader選舉演算法不僅僅需要讓Leader自己知道其自身已經被選舉為Leader,同時還需要讓集群中的所有其他伺服器也快速地感知到選舉產生的新的Leader伺服器。崩潰恢復主要包括Leader選舉和數據恢復兩部分,下面將詳細講解 Leader選舉和數據恢復流程 。
現有的選舉演算法有一下四種: 基於UDP的LeaderElection 、 基於UDP的FastLeaderElection 、 基於UDP和認證的FastLeaderElection 和 基於TCP的FastLeaderElection ,在3.4.10版本中棄用其他三種演算法
myid —— zk伺服器唯一ID
zxid —— 最新事務ID
高32位 是Leader的 epoch ,從1開始,每次選出新的Leader,epoch加一;
低32位 為該epoch 內的序號 ,每次epoch變化,都將低32位的序號重置;
保證了zkid的 全局遞增性 。
logicClock 表示這是該伺服器發起的第多少輪投票,從1開始計數
state 當前伺服器的狀態
self_id 當前伺服器的 唯一ID
self_zxid 當前伺服器上所保存的數據的 最大事務ID ,從0開始計數
vote_id 被推舉的伺服器的 唯一ID
vote_zxid 被推舉的伺服器上所保存的數據的 最大事務ID ,從0開始計數
LOOKING 不確定Leader狀態。該狀態下的伺服器認為當前集群中沒有Leader,會發起Leader選舉。
FOLLOWING 跟隨者狀態。表明當前伺服器角色是Follower,並且它知道Leader是誰。
LEADING 領導者狀態。表明當前伺服器角色是Leader。
OBSERVING 觀察者狀態, 不參與選舉 ,也不參與集群寫操作時的投票。
能夠確保提交已經被Leader提交的事務Proposal,同時丟棄已經被跳過的事務Proposal。針對這個要求,如果讓Leader選舉演算法能夠保證新選舉出來的Leader伺服器擁有集群中所有機器最高編號(即ZXID最大)的事務Proposal,那麼就可以保證這個新選舉出來的Leader一定具有所有已經提交的提案。更為重要的是,如果讓具有最高編號事務Proposal的機器成為Leader,就可以省去Leader伺服器檢查Proposal的提交和丟棄工作的這一步操作了。
ZooKeeper規定所有有效的投票都必須在同一輪次中。每個伺服器在開始新一輪投票時,會先對自己維護的logicClock進行自增操作。
每個伺服器在廣播自己的選票前,會將自己的投票箱清空。該投票箱記錄了所收到的選票。例:伺服器2投票給伺服器3,伺服器3投票給伺服器1,則伺服器1的投票箱為(2, 3), (3, 1), (1, 1)。 票箱中只會記錄每一投票者的最後一票 ,如投票者更新自己的選票,則其它伺服器收到該新選票後會在自己票箱中更新該伺服器的選票。
每個伺服器最開始都是通過廣播把票投給自己。
伺服器會嘗試從其它伺服器獲取投票,並記入自己的投票箱內。如果無法獲取任何外部投票,則會確認自己是否與集群中其它伺服器保持著有效連接。如果是,則再次發送自己的投票;如果否,則馬上與之建立連接。
根據選票logicClock -> vote_zxid -> vote_id依次判斷
1 判斷選舉輪次
收到外部投票後,首先會根據投票信息中所包含的logicClock來進行不同處理:
外部投票的logicClock > 自己的logicClock: 說明該伺服器的選舉輪次落後於其它伺服器的選舉輪次,立即清空自己的投票箱並將自己的logicClock更新為收到的logicClock,然後再對比自己之前的投票與收到的投票以確定是否需要變更自己的投票,最終再次將自己的投票廣播出去;
外部投票的logicClock < 自己的logicClock: 當前伺服器直接忽略該投票,繼續處理下一個投票;
外部投票的logickClock = 自己的: 當時進行選票PK。
2 選票PK
選票PK是基於(self_id, self_zxid)與(vote_id, vote_zxid)的對比:
若logicClock一致,則對比二者的vote_zxid,若外部投票的vote_zxid比較大,則將自己的票中的vote_zxid與vote_myid更新為收到的票中的vote_zxid與vote_myid並廣播出去,另外將收到的票及自己更新後的票放入自己的票箱。如果票箱內已存在(self_myid, self_zxid)相同的選票,則直接覆蓋
若二者vote_zxid一致,則比較二者的vote_myid,若外部投票的vote_myid比較大,則將自己的票中的vote_myid更新為收到的票中的vote_myid並廣播出去,另外將收到的票及自己更新後的票放入自己的票箱
如果已經確定有過半伺服器認可了自己的投票(可能是更新後的投票),則終止投票。否則繼續接收其它伺服器的投票。
投票終止後,伺服器開始更新自身狀態。若過半的票投給了自己,則將自己的伺服器狀態更新為LEADING,否則將自己的狀態更新為FOLLOWING。
註: 圖中箭頭上的(1,1,0) 三個數一次代表該選票的伺服器的 LogicClock 、被推薦的伺服器的myid (即 vote_myid ) 以及被推薦的伺服器的最大事務ID(即 vote_zxid );
(1, 1) 2個數分別代表投票伺服器myid(即 self_myid )和被推薦的伺服器的myid (即 vote_myid )
選舉流程如下:
自增選票輪次&初始化選票&發送初始化選票
首先,三台伺服器自增選舉輪次將LogicClock=1;然後初始化選票,清空票箱;最後發起初始化投票給自己將各自的票通過廣播的形式投個自己並保存在自己的票箱里。
接受外部投票&更新選票
以Server 1 為例,分別經歷 Server 1 PK Server 2 和 Server 1 PK Server 3 過程
Server 1 PK Server 2
Server 1 接收到Server 2的選票(1,2,0) 表示,投票輪次LogicClock為1,投給Server 2,並且Server 2的最大事務ID,ZXID 為0;
這時Server 1將自身的選票輪次和Server 2 的選票輪次比較,發現 LogicClock=1相等 ,接著Server 2比較比較最大事務ID,發現也 zxid=0也相等 ,最後比較各自的myid,發現Server 2的 myid=2 大於自己的myid=1 ;
根據選票PK規則,Server 1將自己的選票由 (1, 1) 更正為 (1, 2),表示選舉Server 2為Leader,然後將自己的新選票 (1, 2)廣播給 Server 2 和 Server 3,同時更新票箱子中自己的選票並保存Server 2的選票,至此Server 1票箱中的選票為(1, 2) 和 (2, 2);
Server 2收到Server 1的選票同樣經過輪次比較和選票PK後確認自己的選票保持不變,並更新票箱中Server 1的選票由(1, 1)更新為(1, 2),注意此次Server 2自己的選票並沒有改變所有不用對外廣播自己的選票。
Server 1 PK Server 3
更加Server 1 PK Server 2的流程類推,Server 1自己的選票由(1, 2)更新為(1, 3), 同樣更新自己的票箱並廣播給Server 2 和 Server 3;
Server 2再次接收到Server 1的選票(1, 3)時經過比較後根據規則也要將自己的選票從(1, 2)更新為(1, 3), 並更新票箱里自己的選票和Server 1的選票,同時向Server 1和 Server 3廣播;
同理 Server 2 和 Server 3也會經歷上述投票過程,依次類推,Server 1 、Server 2 和Server 3 在倆倆之間在經歷多次 選舉輪次比較 和 選票PK 後最終確定各自的選票。
選票確定後伺服器根據自己票箱中的選票確定各自的角色和狀態,票箱中超過半數的選票投給自己的則為Leader,更新自己的狀態為LEADING,否則為Follower角色,狀態為FOLLOWING,
成為Leader的伺服器要主動向Follower發送心跳包,Follower做出ACK回應,以維持他們之間的長連接。
1.《從Paxos到Zookeeper 分布式一致性原理與實踐》 [倪超著]
2. 《實例詳解ZooKeeper ZAB協議、分布式鎖與領導選舉》
3.《ZooKeeper』s atomic broadcast protocol:Theory and practice》[Andr ́e Medeiros]
④ 新手求助,賦值給data的問題
下面的一個代碼片段是一個有效的HTML5標記:
<div id="awesome"
data-myid="3e4ae6c4e">Some awesome data</div>
可是,怎麼來讀取這些數據呢?你當然可以遍歷頁面元睜沒素來讀取你想要的屬性,但jquery已經內置了方法來操作這些屬性。使用jQuery的.data()方法來訪問這些"data-*" 屬性。其中一個方法就是 .data(obj),這個方法是在jQuery1.4.3版本後出現的,它能返回相應的data屬性。
舉個例子,你可以用下面的寫法讀取 data-myid屬性值:
var myid= jQuery("#awesome").data('myid');
console.log(myid);
你還可以在"data-*" 屬性里使用json語法,例如,如果你寫出下面的html:
<div id="awesome-json" data-awesome='{"game":"on"}'此早散></div>
你森氏可以通過js直接訪問這個數據,通過json的key值,你能得到相應的value:
var gameStatus= jQuery("#awesome-json").data('awesome').game;
console.log(gameStatus);
你也可以通過.data(key,value)方法直接給"data-*" 屬性賦值。一個重要的你要注意的事情是,這些"data-*" 屬性應該和它所在的元素有一定的關聯,不要把它當成存放任意東西的存儲工具。
⑤ zookeeper在配置偽集群模式時,myid文件是什麼,什麼格式
myid的值是zoo.cfg文件里定義的server.A項A的值。Zookeeper啟動時會讀取這個文件。解決方法如下:
1、首先獲取zookeeper安慧粗迅裝包,zookeeper包的獲取可以直接到Apache的網站獲取。
⑥ 安裝了MPI,可是Fortran仍然不能識別use mpi
個人經驗啊,你要確定一下你的編譯器的設置是否塵畝包伍答含mpi的腔兄慧頭文件目錄,
options/directories 有沒有你安裝的mpi目錄
.../mpich/sdk/include
.../mpich/sdk/lib
而且在你的工程裡面要有
ws2_32.lib和mpich.lib這兩個庫
我沒用過windows下的mpi啊,個人覺得還是在linux下比較好。
⑦ 如何讓value attr重新賦值
jQuery提供了attr() 方法用於設置/改變屬性值。這段代碼就慶爛悔可以獲取下拉框被選中的value值var type = $('select option:selected').val();alert(type)。