1. 程式人生 > >阿里中介軟體——diamond

阿里中介軟體——diamond

一、前言

       最近工作不忙閒來無事,仔細分析了公司整個專案架構,發現用到了很多阿里巴巴集團開源的框架,今天要介紹的是中介軟體diamond,訪問了對應開發團隊的部落格(http://jm-blog.aliapp.com),認真學習了一下diamond,下面是本人學習中的一些心得,故寫出來。

二、diamond學習筆記

      1、diamond簡介

      diamond是一個管理持久配置(持久配置是指配置資料會持久化到磁碟和資料庫中)的系統。無可厚非,淘寶內部正在使用diamond,在淘寶內部的絕大多數系統的配置都是由diamond統一管理的。diamond最大的特點就是簡單、可靠、易用。diamond的簡單是指diamond整體結構非常簡單,從而減少了出錯的可能性;diamond的可靠是指應用方在任何情況下都可以啟動,例如:淘寶的核心繫統最初一年多是由diamond所管理,在這期間並沒有發生什麼大的故障;diamond的易用是指客戶端使用只需要兩行程式碼,暴露出的介面都非常簡單,易於理解。

     對於應用系統而言,diamond為其提供獲取配置的服務,應用不僅可以在啟動時從diamond獲取相關的配置,而且可以在執行中對配置資料的變化進行感知並獲取變化後的配置資料。

      2、快速使用

      server搭建:

         a. mysql

         mysql的安裝(安裝步驟請自行查閱資料,本人建議按照mysql官方文件),以root使用者登入,建立使用者並賦予許可權,建立資料庫,然後建表。指令碼如下:

create database diamond;
grant all on diamond.* to [email protected]
'%' identified by 'abc'; use diamond create table config_info ( 'id' bigint(64) unsigned NOT NULL auto_increment, 'data_id' varchar(255) NOT NULL default ' ', 'group_id' varchar(128) NOT NULL default ' ', 'content' longtext NOT NULL, 'md5' varchar(32) NOT NULL default ' ', 'gmt_create' datetime NOT NULL default '2010-05-05 00:00:00', 'gmt_modified' datetime NOT NULL default '2010-05-05 00:00:00', PRIMARY KEY ('id'), UNIQUE KEY 'uk_config_datagroup' ('data_id','group_id') );
完成後,請將資料庫的配置資訊(IP,使用者名稱,密碼)新增到diamond-server工程的src/resources/jdbc.properties檔案中的db.url,db.user,db.password屬性上面,這裡建立的庫名,使用者名稱和密碼,必須和jdbc.properties中對應的屬性相同。

        b. tomcat

        tomcat是diamond server的執行容器,而對於tomcat的安裝請自行查閱資料,推薦使用tomcat7和安裝tomcat的官方文件。tomcat安裝後,不需要做任何改動。

        c. diamond server

        在diamond-server原始碼根目錄下,執行mvn clean package -Dmaven.test.skip,成功後會在diamond-server/target目錄下生成diamond-server.war(如果沒有安裝maven,請參考maven官方文件進行安裝)。打包完成後,將diamond-server.war放在tomcat的webapps目錄下。啟動tomcat,即啟動了diamond-server。

        d. http server

        http server用來存放diamond server等地址列表,可以選用任何http server,這裡以tomcat為例。一般來講,http server和diamond server是部署在不同機器上的,這裡簡單起見,將二者部署在同一個機器下的同一個tomcat的同一個應用中,注意,如果部署在不同的tomcat中,埠號一定是8080,不能修改(所以必須部署在不同的機器上)。在上一步的tomcat的webapps中的diamond-server中建立檔案diamond,檔案內容是diamond-server的地址列表,一行一個地址,地址為IP,例如:127.0.0.1。完成以上4步後,server端的搭建就完成了。

      釋出資料:

         diamond釋出資料通過手工的方式進行。在瀏覽器中輸入http://ip:8080/diamond-server/,ip為server搭建的第二步中的地址,以user為使用者名稱,123為密碼,登入後進入後臺管理介面,然後點選“配置資訊管理”—— “新增配置資訊”,在輸入框中輸入dataId、group、內容,最後點選“提交”即可。成功後,可以在“配置資訊管理”中查詢到釋出的資料。

      訂閱資料:

         diamond客戶端API主要提供了訂閱資料的功能:

         a. 客戶端獲取服務端地址
         獲取服務端地址對客戶端是透明的,客戶端僅僅需要在本地進行如下域名繫結即可:ip a.b.c,ip為前面搭建的http-server的ip。

         b. 建立訂閱者        

DiamondManager manager = new DefaultDiamondManager(group, dataId, new ManagerListener() {
   public Executor getExecutor() {
       return null;
   }

   public void receiveConfigInfo(String configInfo) {
      // 客戶端處理資料的邏輯

   }
});
        引數說明:group和dataId為String型別,二者結合為diamond-server端儲存資料的惟一key。ManagerListener 是客戶端註冊的資料監聽器, 它的作用是在執行中接受變化的配置資料,然後回撥receiveConfigInfo()方法,執行客戶端處理資料的邏輯。如果要在執行中對變化的配置資料進行處理,就一定要註冊ManagerListener。

        c. 獲取配置資料    

String configInfo = manager.getAvailableConfigureInfomation(timeout);

        diamond-server端儲存的配置全都為文字型別,返回給客戶端的配置資料為java.lang.String型別,timeout為從網路獲取配置資料的超時時間。客戶端呼叫每次呼叫該方法,都能夠保證獲取一份最新的可用的配置資料。

      2、核心原理

      diamond核心原理主要包括server叢集的資料同步、client獲取server地址、client從server獲取資料、client執行時感知server的資料變化,這四部分。

        a. server叢集的資料同步

        diamond-server將資料儲存在mysql和本地檔案中,mysql是一箇中心,diamond認為儲存在mysql中的資料絕對正確,除此之外,server會將資料儲存在本地檔案中。

        同步資料有兩種方式:

        server寫資料時,先將資料寫入mysql,然後寫入本地檔案,寫入完成後傳送一個HTTP請求給叢集中的其他server,其他server收到請求,從mysql中dump剛剛寫入的資料至本地檔案。

        server啟動後會啟動一個定時任務,定時從mysql中dump所有資料至本地檔案。

        b. client獲取server地址

        diamond-client在使用時沒有指定server地址的程式碼,地址獲取對使用者是透明的。server地址儲存在一臺具有域名的機器上的HTTP server中,我們稱它為地址伺服器,diamond-client使用前需要在本地進行正確的域名繫結,啟動時它會根據域名繫結,去對應環境的地址伺服器上獲取diamond-server地址列表。獲取的地址列表,會儲存在client本地,當出現網路異常,無法從網路獲取地址列表時,client會使用本地儲存的地址列表。client啟動後會啟動一個定時任務,定時從HTTP server上獲取地址列表並儲存在本地,以保證地址是最新的。

        c. client從server獲取資料

        client呼叫getAvailableConfigInfomation(), 即可獲取一份最新的可用的配置資料,獲取過程實際上是拼接http url,使用http-client呼叫http method的過程。為了避免短時間內大量的獲取資料請求發向server,client端實現了一個帶有過期時間的快取,client將本次獲取到的資料儲存在快取中,在過期時間內的所有請求,都返回快取內的資料,不向server發出請求。

        d. client執行時感知server的資料變化

        這是diamond最為核心的一個功能。這個特性是通過比較client和server的資料的MD5值實現的。server在啟動時,會將所有資料的MD5載入到記憶體中(MD5根據某演算法得出,保證資料內容不同,MD5不同,MD5儲存在mysql中),資料更新時,會更新記憶體中對應的MD5。client在啟動並第一次獲取資料後,會將資料的MD5儲存在記憶體中,並且在啟動時會啟動一個定時任務,定時去server檢查資料是否變化。每次檢查時,client將MD5傳給server,server比較傳來的MD5和自身記憶體中的MD5是否相同,如果相同,說明資料沒變,返回一個標示資料不變的字串給client;如果不同,說明資料變了,返回變化資料的dataId和group給client.  client收到變化資料的dataId和group,再去server請求一次資料,拿回資料後回撥監聽器。

     3、diamond架構

     diamond服務是一個叢集,是一個去除單點的協作叢集。如下圖所示:


     對該圖進行一些說明:

     a. 作為一個配置中心,diamond的功能分為釋出和訂閱兩部分。因為diamond存放的是持久資料,這些資料的變化頻率不會很高,甚至很低,所以釋出採用手工的形式,通過diamond後臺管理介面釋出;訂閱是diamond的核心功能,訂閱通過diamond-client的API進行。

     b. diamond服務端採用mysql加本地檔案的形式存放配置資料。釋出資料時,資料先寫到mysql,再寫到本地檔案;訂閱資料時,直接獲取本地檔案,不查詢資料庫,這樣可以最大程度減少對資料庫的壓力。

     c. diamond服務端是一個叢集,叢集中的每臺機器連線同一個mysql,叢集之間的資料同步通過兩種方式進行,一是每臺server定時去mysql dump資料到本地檔案,二是某一臺server接收發布資料請求,在更新完mysql和本機的本地檔案後,傳送一個HTTP請求(通知)到叢集中的其他幾臺server,其他server收到通知,去mysql中將剛剛更新的資料dump到本地檔案。

     d. 每一臺server前端都有一個nginx,用來做流量控制。

     e. 圖中沒有將地址伺服器畫出,地址伺服器是一臺有域名的機器,上面執行有一個HTTP server,其中有一個靜態檔案,存放著diamond伺服器的地址列表。客戶端啟動時,根據自身的域名繫結,連線到地址伺服器,取回diamond伺服器的地址列表,從中隨機選擇一臺diamond伺服器進行連線。

     4、容災機制

     diamond容災機制涉及到client和server兩部分,主要包括以下幾個方面:

     a. server儲存資料的方式

     server儲存資料是“資料庫 + 本地檔案”的方式,叢集間的資料同步我們在之前的文章中講過(請參考專題二的原理部分),client訂閱資料時,訪問的是本地檔案,不查詢資料庫,這樣即使資料庫出問題了,仍然不影響client的訂閱。

     b. server是一個叢集

     這是一個基本的容災機制,叢集中的一臺server不可用了,client發現後可以自動切換到其他server上進行訪問,自動切換在client內部實現。

     c. client儲存snapshot

     client每次從server獲取到資料後,都會將資料儲存在本地檔案系統,diamond稱之為snapshot,即資料快照。當client下次啟動發現在超時時間內所有server均不可用(可能是網路故障),它會使用snapshot中的資料快照進行啟動。

     d. client校驗MD5

     client每次從server獲取到資料後,都會進行MD5校驗(資料儲存在response body,MD5儲存在response header),以防止因網路故障造成的資料不完整,MD5校驗不通過直接丟擲異常。

     e. client與server分離

     client可以和server完全分離,單獨使用,diamond定義了一個“容災目錄”的概念,client在啟動時會建立這個目錄,每次主動獲取資料(即呼叫getAvailableConfigInfomation()方法),都會優先從“容災目錄”獲取資料,如果client按照一個固定的規則,在“容災目錄”下配置了需要的資料,那麼client直接獲取到資料返回,不再通過網路從diamond-server獲取資料。同樣的,在每次輪詢時,都會優先輪詢“容災目錄”,如果發現配置還存在於其中,則不再向server發出輪詢請求。 以上的情形, 會持續到“容災目錄”的配置資料被刪除為止。

    根據以上的容災機制,我們可以總結一下diamond整個系統完全不可用的條件:

    資料庫不可用;

    所有server均不可用;

    client主動刪除了snapshot;

    client沒有備份配置資料,導致其不能配置"容災目錄";

    本人在公司的線上環境仔細分析過,同時滿足這四點條件的概率那是相當小!

三、總結

    通過對diamond原始碼的閱讀及架構的分析,可以得出這樣一個結論:diamond簡單、可靠、易用的特點是相輔相成的,即diamond之所以簡單是因為使用的都是一些最常用的技術以及產品,它之所以表現得非常穩定,跟其架構簡單是分不開的,當然,穩定的另一個主要原因是它具備一套比較完善的容災機制。

相關推薦

阿里中介軟體——diamond

一、前言        最近工作不忙閒來無事,仔細分析了公司整個專案架構,發現用到了很多阿里巴巴集團開源的框架,今天要介紹的是中介軟體diamond,訪問了對應開發團隊的部落格(http://jm-blog.aliapp.com),認真學習了一下diamond,下面是本人學

阿里中介軟體開源元件:Sentinel 0.2.0正式釋出

Sentinel 是阿里中介軟體團隊開源的,面向分散式服務架構的輕量級流量控制組件,主要以流量為切入點,從流量控制、熔斷降級、系統負載保護等多個維度來幫助使用者保護服務的穩定性。 近日,Sentinel 0.2.0 正式釋出。作為一個重要的里程碑版本,Sentinel

Kafka、RabbitMQ、RocketMQ訊息中介軟體的對比 —— 訊息傳送效能(轉自阿里中介軟體

引言分散式系統中,我們廣泛運用訊息中介軟體進行系統間的資料交換,便於非同步解耦。現在開源的訊息中介軟體有很多,前段時間我們自家的產品 RocketMQ (MetaQ的核心) 也順利開源,得到大家的關注。那麼,訊息中介軟體效能究竟哪家強?帶著這個疑問,我們中介軟體測試組對常見的三類訊息產品(Kafka、Rabb

微服務架構上雲最佳實踐(轉自阿里中介軟體

摘要:7月27日,雲棲社群、阿里中介軟體舉辦了首屆阿里巴巴中介軟體技術峰會,揭祕阿里10年分散式技術乾貨。在首屆阿里巴巴中介軟體技術峰會上,具有10年研發經驗的阿里巴巴中介軟體技術專家李顏良結合EDAS團隊上雲兩年多以來積累的經驗為大家分享瞭如何進行微服務拆分、微服務架構上雲最佳實踐以及微服務架構常用的模式,

淘寶JAVA中介軟體Diamond詳解(一)---簡介&快速使用

大家好,今天開始為大家帶來我們通用產品團隊的產品 —— diamond的專題,本次為大家介紹diamond的概況和快速使用。 一、概況 diamond是淘寶內部使用的一個管理持久配置的系統,它的特點是簡單、可靠、易用,目前淘寶內部絕大多數系統的配置,由diamond來進行統一管理。 diamond為

淘寶JAVA中介軟體Diamond詳解(1)-簡介&快速使用

感謝有奉獻精神的人 轉自:http://my.oschina.net/u/435621/blog/270483?p=1 淘寶JAVA中介軟體Diamond詳解(一)---簡介&快速使用 大家好,今天開始為大家帶來我們通用產品團隊的產品 —— diamon

秋招筆記:2018阿里中介軟體部門C/C++崗線上測評

題目: 今天我們看到的阿里巴巴提供的任何一項服務後邊都有著無數子系統和元件的支撐,子系統之間也互相依賴關聯, 其中任意一個環節出現問題都可能對上游鏈路產生影響。小明做為新人接收到的第一個任務就是去梳理所有的依賴關係, 小明和每個系統的負責人確認了依賴關係,

[筆記]2016阿里中介軟體效能挑戰賽(三)

目錄 目錄 前言 正文 題目分析 索引設計 程式碼展示 關鍵優化 後記 前言 經過初賽的篩選後,我們就進入了複賽(名副其實的廢話)。接下來我簡單介紹下我們隊伍參加複賽一些情況吧。複賽相對初賽而言題目針對性比較強,所以對於比賽之外的人

【總結】阿里中介軟體效能大賽

抱大腿參加了一次中介軟體比賽,受益匪淺。學到了很多東西,更重要的是認識到了差距在哪。針對具體業務場景的優化就不提了,寫一下比較通用的優化策略。 1. Java 1.1 Split() Java原生的split方法在此次使用中效能有很大的問題,主要在於兩點。首先Split

第三屆阿里中介軟體效能挑戰賽 初賽記錄及原始碼分享

但是看日誌仍然有一到兩個concurrent mode failure,每次大概會有5s的停止,而整個消費才60s。說明只在讀檔案時進行清理操縱已經來不及了,所以必須在其他地方處理。選擇了在讀某個list沒有獲得值時清理。由於這裡會改動偏移,所以還必須先設定該topic對應的atomicBoolean變數為

分享一個讓我進入阿里中介軟體的個人專案

作者: vangoleo 官網: http://www.vangoleo.com/iris-java/ 背景 時光荏苒,進入阿里中介軟體團隊已經快兩年時間了。這期間,有幸參與了第四屆中介軟體效能挑戰賽的題目組,籌備了以“Dubbo Mesh”為主題的初賽題;和團隊一起開展了Dubbo線下meetup活動;

阿里螞蟻金服中介軟體6輪面試!實拍題目和6點血淚總結!

螞蟻金服一面:分散式架構 50分鐘 1、個人介紹加專案介紹20分鐘 2、微服務架構是什麼,它的優缺點? 3、ACID CAP BASE理論 4、分散式一致性協議,二段、三段、TCC,優缺點 5、RPC過程 6、服務註冊中心宕機了怎麼辦? 7、微服務還有其他什麼元件 8

騰訊 VS 阿里 VS 攜程訊息中介軟體設計方案及思路

原文連結:https://blog.csdn.net/lizhitao/article/details/51718156 背景 目前我們美團正在設計和不斷迭代、升級訊息中介軟體方案,為了避免走彎路,希望站在巨頭肩膀上,學習經驗、吸取精華,推動美團MQ快速演進,為美團業務高速擴張提供支撐 目標

阿里巴巴宣佈開源限流降級中介軟體——Sentinel

近日,阿里巴巴中介軟體團隊宣佈開源 Sentinel,併發布了首個社群版本v0.1.0。GitHub地址為:https://github.com/alibaba/Sentinel 。 關於Sentinel,阿里巴巴給出的描述比較簡單: A lightweight

阿里巴巴P9大佬雷卷與中介軟體小哥重新定義:高段位程式設計師的學習之道

每次看到和程式設計師相關的段子,我都會會心一笑:這是時代的進步啊! 上個世紀,桌面時代 Bacis、6502彙編 一切都是面向物件 Turbo Pascal 資訊學奧林匹克競賽的常用程式語言 那時候能搞程式設計的基本都是家裡有礦 或是家庭教育超前

阿里流控中介軟體sentinel的思考,主要分析下hytrix的優勢

優勢官網上已經說了很多,本篇主要想分析下hytrix的一些優勢   先說sentinel, 簡單說下,個人感覺比較有用的功能 sentinel的優勢: 友好的控制面板,支援實時監控 多種限流。支援QPS限流,執行緒數限流,多種限流策略,如:直接拒絕,勻速模式(漏斗),冷啟動(如設定

剛參加完阿里螞蟻金服中介軟體6輪面試!實拍題目和6點血淚總結!

螞蟻金服六面題目和經驗總結 螞蟻金服一面:分散式架構 50分鐘 1、個人介紹加專案介紹20分鐘 2、微服務架構是什麼,它的優缺點? 3、ACID CAP BASE理論 4、分散式一致性協議,二段、三段、TCC,優缺點 5、RPC過程 6、服務註冊中心宕機了怎

阿里巴巴中介軟體效能挑戰賽(RPC篇 同步阻塞模型)

賽題要求: 一個簡單的RPC框架 RPC(Remote Procedure Call )——遠端過程呼叫,它是一種通過網路從遠端計算機程式上請求服務,而不需要了解底層網路技術的協議。RPC協議假定某些傳輸協議的存在,如TCP或UDP,為通訊程式之間攜帶資訊資料。在OSI網

【分散式架構】阿里免費送你分散式訊息中介軟體MQ開發教程

課程介紹 阿里雲訊息佇列MQ(Message Queue)是企業級網際網路架構的核心產品,服務於整個阿里巴巴集團已超過8年,經過阿里巴巴交易核心鏈路反覆打磨與歷年雙十一嚴苛考驗,是一個真正具備低延遲、高併發、高可用、高可靠,可支撐萬億級資料洪峰的分散式訊息中介軟體。 訊息佇

阿里巴巴中介軟體TDDL用於連線資料庫,分表分庫查詢

1.建立資料來源           由DBA來做。            一般資料來源有3層:           (1)Matrix                      分庫分表,資料路由,對應一個應用,下面有若干個group           (2)Grou