confd+etcd實現高可用自動發現
Confd是什麼
Confd是一個輕量級的配置管理工具。
通過查詢後端儲存,結合配置模板引擎,保持本地配置最新,同時具備定期探測機制,配置變更自動reload。
對應的後端儲存可以是etcd,redis、zookeeper等等
我們以etcd為後端來演示confd的使用,用最簡單粗暴的方式教大家學會動態生成配置
一.準備confd依賴的儲存etcd
etcd -listen-client-urls="http://0.0.0.0:2379" --advertise-client-urls="http://0.0.0.0:2379" &
etcd搭建如果不會可以檢視前面一篇文章 《從零開始搭建etcd分散式儲存系統+web管理介面》
二.安裝confd
# 下載 wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64 # 安裝 mv confd-0.16.0-linux-amd64 /usr/local/bin/confd chmod +x /usr/local/bin/confd #檢查是否安裝成功 root@ubuntu:/home/chenqionghe/test/confd# confd --version confd 0.16.0 (Git SHA: 7217b0ca, Go Version: go1.10.2)
- confd配置檔案預設在/etc/confd中,可以通過引數-confdir指定。目錄中包含兩個子目錄,分別是:conf.d templates。
- confd會先讀取conf.d目錄中的配置檔案(toml格式),然後根據檔案指定的模板
路徑去渲染模板 ,再執行 。
我們先建立
mkdir -p /etc/confd/{conf.d,templates}
confd的配置檔案,主要包含配置的生成邏輯,例如模板源,後端儲存對應的keys,命令執行等。
templates:配置模板Template,即基於不同元件的配置,修改為go語言的模板檔案。
三.配置使用confd
1. 建立配置檔案 /etc/confd/conf.d/chenqionghe.toml
[template] # 模板檔案路徑 src = "chenqionghe.tmpl" # 生成最終檔案路徑 dest = "/home/chenqionghe/test/confd/gym-data.txt" keys = [ "/chenqionghe/deap_squat", "/chenqionghe/bench_press", "/chenqionghe/dead_lift", ] # 生成檔案後執行的命令 reload_cmd = "echo 'light weight baby' >> /home/chenqionghe/test/confd/reaload.txt"
2. 建立模板檔案 /etc/confd/templates/chenqionghe.tmpl
[陳瓊和] 深蹲 = {{getv "/chenqionghe/deap_squat"}} 臥槽 = {{getv "/chenqionghe/bench_press"}} 硬拉 = {{getv "/chenqionghe/dead_lift"}}
3.初始化etcd中的資料
endpoints=http://127.0.0.1:2379 etcdctl --endpoints=$endpoints set /chenqionghe/deap_squat '130kg' etcdctl --endpoints=$endpoints set /chenqionghe/bench_press '100kg' etcdctl --endpoints=$endpoints set /chenqionghe/dead_lift '160kg'
4. 啟動confd的服務
confd支援以daemon或者onetime兩種模式執行
onetime模式:只會生成一次配置,之後key無論變化不會再生成
confd -onetime -backend etcd -node http://127.0.0.1:2379
- daemon模式:confd會監聽後端儲存的配置變化,根據配置模板動態生成目標配置檔案。
confd -watch -backend etcd -node http://127.0.0.1:2379 &
我們以daemon模式執行,然後改變key的值,觀察檔案變化,
可以看到reload.txt檔案在持續的追加light weight baby

gym-data.txt跟隨3個key的變化不斷的更新

四.關於-模板語法
confd使用的模板就是go語言的template,對go語言熟悉的同學應該會覺得非常簡單
confd已經集成了很多模板函式, 參考連結
五.思考擴充套件-confd能做些什麼
我們大概知道了confd的原理
1.讀取配置檔案 -> 2.使用模板生成指定檔案 -> 3.執行過載命令(可選)
所以基本使用配置和reload命令的地方都可以使用confd,比如下邊的需求
- nginx動態生成upstream實現服務發現
- prometheus動態生成prometheus.yml實現自動報警
- php-fpm動態生成php.ini檔案實現動態效能調參
- 動態生成報表檔案再發送通知
只有想不到,沒有做不到,以前想過自己寫一個nginx的動態生成upstream,沒想到已經有人寫出來了,真的是厲害,小夥伴們趕緊high起來吧