集中配置管理(IMAGO)

概述

常規項目會有很多配置文件,比如數據庫鏈接信息, 緩存信息等. 我們通常的做法是通過配置文件進行管理可以達到只需要修改一個地方,整個項目都可以生效的目的.目前我們的開發項目繁多, 程序為了保持高可用,會進行集群部署. 這樣我們要對某一個或者某幾個項目進行配置文件變更時,需要逐個進行修改.這樣大量的人為操作可能會增加程序升級或發布的風險.與此同時修改配置文件之后會涉及到應用的重啟.為了減小發布風險,我們需要一個地方對各個系統配置進行統一的管理,這時統一配置管理系統誕生的背景,我們暫且取名為 “IMAGO”沒有特殊的含義,只是一個代號.

架構

imago架構圖

Imago分為兩部分:

  1. 配置管理控制臺(imago-admin)

    配置管理后臺提供配置管理, 簡單權限管理, 詳細配置變更日志管理等, 所有的配置數據最終以Mysql數據庫中存儲的配置為最終正確配置.

  2. 配置客戶端(imago-client)

    上圖中的箭頭方向表示數據的流向. 當應用啟動時, imago-client從Zookeeper獲取相關配置項到本地, 并存儲一份文件快照, 一份緩存快照, 應用直接從本地緩存中讀取相關配置. 當Zookeeper中的配置項發生變動時, imago-client會監聽到變動并更新本地文件快照和本地緩存. 在使用過程中如果Zookeeper不可用, 應用還可以從本地文件快照中獲取配置進行啟動. 應用始終都是從imago-client的本地緩存中獲取緩存, 提高效率.

存儲在Zookeeper中的數據結構

  1. 配置管理后臺負責配置數據的維護,如增、刪、改、查,配置數據存放于zookeeper節點之上,每個APP都有一個唯一的ID,如order的節點path為/imago/order,該節點下又可以有多個配置節點,如/imago/order/key1, /imago/order/key2… 管理后臺必須校驗節點PATH的唯一性.

  2. 應用可以有兩種類型

    (1). 公共應用, 該種應用會將一些公共資源的配置放在這種應用下面, 比如mysql的配置, redis的配置等, 這么做的目的是為了將來這些配置ip或者其他信息變更了,我們只需要修改一個地方.我們將來可以通過在imago-admin里面可以看到哪些應用引用了這些公共應用.
    比如,和交易相關的公共配置統一放在appkey為trade_public目錄下, 具體參考如下:

        /imago/trade_public_mysql/1.1
        /imago/trade_public_redis/1.1
    

    (2). 普通應用, 該種應用下的配置項可以設置一些該應用特有的一些配置.

容災設計

我們可以總結一下imago整個系統完全不可用的條件,下面是可能發生的情況:

  1. 數據庫不可用。
  2. 所有zookeeper均不可用。
  3. imago-client主動刪除了File Snapshot, Local cache.

在上面2, 3都不可用時才會發生不可用的情況.這在生產環境中出現的幾率是極小的.

測試用例

功能測試(在沒有任何異常的情況下進行)

  1. 創建測試數據

        /imago/app1/xxx1
        /imago/app1/xxx2
        /imago/app1/xxx3
    
  2. app啟動時client可以順利從zookeeper加載相關配置到file snapshot 和 local cache.

  3. 驗證是否可以生成文件快照

        ~/.imago/imago_snapshot/app1.properties
    
  4. 驗證本地緩存是否可以取到這些值.

  5. 當zookeeper其中某一個數據發生變動時, 相應的文件快照和本地緩存是否也相應變更.

容災測試

  1. zookeeper集群中其中一臺機器不可用, client是否可以正常從zookeeper獲取數據.

  2. client(非首次)啟動時無法從zookeeper獲取數據, 則可以從之前的文件快照獲取配置數據, 并加載到本地緩存中.

配置不可用的情況

  1. client第一次啟動時, zookeeper就不可用, 則無法從中獲取數據, 并生成文件快照和本地緩存.

Imago-admin 功能說明

首頁

首頁
  1. 集中配置管理主要提供如下功能點:

    • 應用管理
    • 配置項管理(具體的配置項數據在該節點設置)
    • 用戶管理
    • 資源管理(菜單和功能url的動態管理)
    • 用戶組管理(進行用戶的分組功能,可以給用戶組分配具體的功能權限和數據權限)
    • 日志查看(終于數據的增刪改的詳細記錄)
  2. 首頁關系圖可以查看某個ip上具體的pid引用了什么公共應用, 也可以查看哪些公共應用被什么程序引用了.

應用管理

App管理
  1. 可以通過應用類型, 應用key, 應用value進行簡單檢索

  2. 點擊應用key上的超鏈接, 將會進入該應用下的配置項列表.

  3. 在進行數據遷移時, 只需要將mysql數據進行遷移, 然后點擊”同步全量數據到Zookeeper”按鈕,會將mysql中所有數據同步到zookeeper節點上,如果已經有數據在zookeeper上,并且已經有程序watch了這些節點, 那么該操作將會觸發大量的watch操作. 所有,該按鈕建議只在初始化時使用.

  4. 可以針對某個應用進行配置項的導入, 導入文件可是遵循 *.properties屬性文件格式.

  5. 可以將某個應用下的配置項導出為 *.properties屬性文件.

  6. 可以只針對某個應用從mysql中同步數據到Zookeeper.

  7. 刪除某個應用, 該操作是邏輯刪除, 同時會邏輯刪除該應用下所有的配置項, 同時也會物理刪除zookeepr上對應的數據.

App新增,修改

進行應用的新增和修改時,需要設置應用的類型:

  • 公共應用

    該類型的應用,會是多個項目中使用, 比如mysql,redis,kafka等配置放在公共應用中. 同時首頁上會顯示公共應用被哪些程序使用的關系圖.

  • 普通應用

    普通應用是區分公共應用而存在的, 一般應用下的獨有的一下配置項放在普通應用下.

配置項管理

配置項管理
  1. 點擊某個配置項Key上的鏈接,可以查看該配置項的所有歷史版本.

  2. 可以針對配置項Key,Value進行簡單檢索.

  3. 配置項的添加功能, 只能通過具體的應用頁面引導進來才能操作, 直接通過菜單上的配置項管理進入沒有新增配置項功能按鈕.

配置項新增,修改

在進行配置項的新增或修改時, 需要注意配置項的value值有模板設定, 默認下是走的文本, 但是為了便于對一些公共資源的管理,加入了類似mysql,redis,kafka等配置項的模板.

獲取配置代碼

每一個配置項后面都可以通過配置代碼按鈕獲取到某一個配置項在各個語言中的配置代碼.

獲取配置項在zk中的數據

可以通過該方法獲取該配置項在zk中具體的數據, 不用再去zookeepr上通過命令行查詢.

獲取配置項在zk中的數據

可以獲取到某一配置項的所有版本變更記錄, 并可以通過某一個版本進行恢復.

資源管理(功能權限管理)

獲取配置代碼

在用戶組管理中我們可以進行資源管理,資源管理主要可以通過樹形菜單配置來控制哪些用戶組里面的用戶可以操作哪些功能url.用戶登錄后看到的左側菜單也是通過該功能進行動態配置.

數據權限管理

獲取配置代碼

該功能可以配置哪些用戶可以對哪些數據進行哪些操作,這里主要集中控制對app數據的控制. 如果涉及到公共應用的如果用戶只有查詢權限,那么他們會針對該公共應用下的配置項中的密碼選項是不可見的. 這個數據操作權限由App延伸到配置項.

日志管理

獲取配置代碼
獲取配置代碼

對系統中比較關鍵的數據操作都會進行詳細的日志記錄, 便于進行用戶行為的跟蹤.

部署

初始化Imago-admin

當首次啟動imago-admin時需要初始化zookeeper中的數據庫配置,進入到zookeeper命令行執行以下命令:

 create /imago ""
 create /imago/trade_public_mysql ""
 create /imago/trade_public_mysql/1.1 {"ip":"xxx.xxx.xxx.xxx","port":"3231","type":"master","dbs":[{"name":"xxx","user":"trade_user","pwd":"xxx"}]}

Imago-java-client 配置說明

具體使用步驟總結如下:

  1. 在pom.xml中加入:

    <dependency>
    <groupId>com.xxx.xxx</groupId>
        <artifactId>imago-java-client</artifactId>
        <version>1.8.0-SNAPSHOT</version>
        <exclusions>
            <exclusion>
                <groupId>org.jboss.netty</groupId>
                <artifactId>netty</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    
  2. 大家可以在spring配置文件中嵌入:

    因為測試環境是復雜的, 為了應對各種情況下, imago-java-client都可用, 我將各種場景列舉如下, 大家根據具體情況進行變通:
    (1) 普通配置, 在dns正常, zookeeper服務正常的情況下:

    <bean id="configManager" class="com.xxx.imago.client.ConfigManager” />
    

    (2) 應對測試環境dns不可用的情況, 我們可以自己指定 zookeeper地址

    <bean id="configManager" class="com.xxx.imago.client.ConfigManager”>
        <constructor-arg name="serverList" value="192.168.1.100:2181,192.168.1.101:2181,192.168.1.102:2181"/>
    </bean>
    

    (3) 應對測試環境zookeeper 不可用情況, 在 ~/.imago/imago_snapshot/ 目錄下創建 .closezk文件(windows系統在程序所在盤符的根目錄下尋找該路徑)該情況, 需要快照文件已經在該路徑下.(如果初始化時也不可用, 可以從imago-admin 中下載相應的配置文件放在該路徑下.)

    <bean id="configManager" class="com.xxx.imago.client.ConfigManager” />
    
  1. 在spring中的配置示例代碼如下:
    (1) 簡單引用
```
    <property name="jdbcUrl" value="#{configManager.getMysqlConfig('trade_public_mysql','1.1','trade').url}"/>
```
(2) 參數是變量,可以支持參數是變量的引用
```
    <constructor-arg name="redisIp" value="#{configManager.getRedisConfig('trade_public_redis’,{configManager.getConfigValue('trade_eagleye','redis_key')}).ip}"/>
```

關于通過DNS獲取zookeeper集群地址

我們的集中配置管理統一使用的域名為: zk.xxx.com, 通過dns來獲取zk集群地址是為了將來如果該地址變更,每個應用可以不用修改zk集群地址.

什么樣的配置適合放在imago中進行管理

  1. 靜態配置, 不會頻繁變更的配置(比如一些業務上的開關, 閾值).
  2. 公共資源配置, 比如: mysql, redis, kafka, mongodb, zookeeper等.
  3. 下面這些配置不建議放在imago中進行管理.
    (1) 基本不會變更的配置(比如: c3p0的一些基礎配置, redis, kafka,mongodb等除了ip, 端口, 權限之外的一些基礎配置)這些配置可以直接寫死在應用中.
    (2) 如果接入loom進行服務治理之后,消費服務的地址和端口.

備注(重要):

  1. 在imago-admin首頁, 可以看到哪些應用的實例引用了以trade_public為前綴的公共資源.
  2. 從數據庫同步數據到zookeeper的功能, 僅限于初次搭建imago進行數據遷移,初始化imago時使用.該功能會觸發所有數據庫中存儲的配置項的使用, 如果在執行時,已經有大量的imago-java-client監聽了zk的數據節點, 會觸發所有watch事件.

版本變更記錄

imago-admin 版本變更列表

2.0.0
1. 增加功能權限,app數據權限控制
2. 增加配置項的版本管理
1.7.0
1、首頁換成公共資源引用的關系圖
2、修復導出屬性文件被截斷的bug
3、限制只能管理員權限的用戶才能添加公共的app
4、再添加公共資源的配置時提示配置key的規則驗證
5、去掉修改配置時value必填的驗證
6、修復在瀏覽器直接輸入無權限頁面時無法跳轉的bug
1.6.1
1、添加驗證,登陸頁面用戶名或者密碼為空,回車失效。
1.6.0
1、添加kafka模板
2、修復搜素框回車查詢失效的問題
3、配置代碼加入java寫法樣例
1.5.0
增加應用對應的配置項導出功能
1.4.0
增加批量上傳propertes文件的方法,減少初始化時的工作量
1.3.1
啟用spring3.2之后的beans特性,使運維操作與配置無關
1.3.0
增加mongo模板
1.2.1
1、修復bug,配置項管理頁面(從應用管理點擊配置項跳轉而來),點擊添加,自動選中所屬應用
2、應用列表頁,顯示備注列
1.2.0
支持mysql,redis的json模板設置,服務嵌入代碼樣例
1.1.0
添加用戶權限管理, 配置項修改日志跟蹤
1.0.0
簡單的app, config管理

imago-java-client 版本變更列表

1.8.0-SNAPSHOT
增加獲取公共資源(mysql,redis,kafka等)引用關系圖
1.7.0
添加PropertiesUtil訪問類,可以用來靜態訪問配置
修正啟動時知道appList時會注冊監聽, 在取配置時會再次注冊監聽的問題
1.6.0
添加kafka模板
1.5.0
使配置不需要關心appList,會根據用戶的使用情況,動態添加對appKey的監聽和快照文件
1.4.2
修正了如果通過添加.closezk文件來屏蔽zk后,還需要通過dns獲取zk地址的問題
1.4.1
修正文件快照不支持windows的情況
1.4.0
增加mongo模板
1.3.0
可以通過數據庫名獲取數據庫配置
1.2.0
增加支持redis, mysql的json解析支持
1.1.0
添加本地文件快照, 增加客戶端高可用
1.0.0
配置項獲取, 監聽變更
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容