主頁 > 資料庫 > 基于Docker的Consul集群實作服務發現

基于Docker的Consul集群實作服務發現

2020-09-13 17:54:04 資料庫

 

服務發現

其實簡單說,服務發現就是解耦服務與IP地址之間的硬系結關系,
以典型的集群為例,對于集群來說,是有多個節點的,這些節點對應多個IP(或者同一個IP的不同埠號),集群中不同節點責任是不一樣的,
比如說一個資料集群中,可以分為讀節點或者寫節點,寫節點和讀節點都是相對的,不是硬系結的,某一個邏輯節點,隨著故障轉移及恢復,是可以變換身份的(寫變讀,讀變寫;主降從,從升主等等)
集群對外提供服務的時候,對于外界來說,集群中節點身份變換的時候需要對外透明,外界無需因為集群節點的身份變換而更改配置,這就需要一個解耦合的服務,
Consul,zookeeper等中間件,就是做這個透明轉換的,也就是服務發現,這里簡單測驗consul作為服務發現的實作,Consul是一種服務解耦解決方案(service mesh solution,糾結了好久不知道怎么翻譯)提供具有服務發現配置和分段功能的全功能控制系統(control plane)
這些功能中的每一個都可以根據需要單獨使用也可以一起使用以構建完整的服務解耦 即便是用了谷歌翻譯的情況下,這段翻譯糾結了半天,不知道怎么翻譯合適,

如下是按照自己對consul做服務發現的理解,簡單整理的邏輯結構圖,其原理還是比較容易理解的,
Consul is a service mesh solution providing a full featured control plane with service discovery, configuration, and segmentation functionality. Each of these features can be used individually as needed, or they can be used together to build a full service mesh. Consul requires a data plane and supports both a proxy and native integration model. Consul ships with a simple built-in proxy so that everything works out of the box, but also supports 3rd party proxy integrations such as Envoy. https://www.consul.io/intro/index.html它提供如下幾個關鍵功能服務發現  Consul的某些客戶端可以提供一個服務例如api或者mysql其它客戶端可以使用Consul去發現這個服務的提供者  使用DNS或者HTTP應用可以很容易的找到他們所依賴的服務健康檢查
  Consul客戶端可以提供一些健康檢查這些健康檢查可以關聯到一個指定的服務服務是否回傳200 OK),也可以關聯到本地節點記憶體使用率是否在90%以下),
  這些資訊可以被一個操作員用來監控集群的健康狀態被服務發現組件路由時用來遠離不健康的主機鍵值存盤 
  應用可以使用Consul提供的分層鍵值存盤用于一些目的包括動態配置特征標記協作leader選舉等等通過一個簡單的HTTP API可以很容易的使用這個組件
多資料中心 
  Consul對多資料中心有非常好的支持這意味著Consul用戶不必擔心由于創建更多抽象層而產生的多個區域
Consul被設計為對DevOps群體和應用開發者友好他非常適合現代的可伸縮的基礎設施  本文基于docker來實作consul的服務發現配置,方法consul agent是通過json注冊的模式實作服務注冊,
其中consul的服務端是3節點的集群,客戶點是6節點3主3從的redis服務器集群,consul實作redis集群中讀寫服務注冊于發現,

盡管Redis cluster有多IP方式驅動連接,這里僅僅為了測驗“服務發現”的,
其實本來想測驗MySQL單主模式的MGR,實作讀寫分離的服務發現,但是MySQL有點太重了,機器配置不夠,所以做了Redis的集群來測驗服務發現
  consul服務端集群安裝配置
作為服務發現的載體,consul是可以使用單節點運行的,作為決議服務的載體,是一個非常重要的角色,集群化具有更強的抗災性,因此更多的時候是以多節點集群的方式運行決議服務的這個載體,

這里使用三個節點作為consul的集群服務端來運行,三個consul的服務節點IP分別是:172.18.0.11 ,172.18.0.12,172.18.0.13,需要固定IPdocker network create --subnet=172.18.0.11/16 mynetwork docker run -itd --name consul01 --net mynetwork --ip 172.18.0.11 -v /usr/local/docker_file/consul01/:/usr/local/ centos  docker run -itd --name consul02 --net mynetwork --ip 172.18.0.12 -v /usr/local/docker_file/consul02/:/usr/local/ centos  docker run -itd --name consul03 --net mynetwork --ip 172.18.0.13 -v /usr/local/docker_file/consul03/:/usr/local/ centos  分別在每個容器中創建consul服務(unzip consul_1.6.2_linux_amd64.zip解壓縮即可,非常簡單)三個容器節點的server.json節點組態檔如下,唯一的區別就是bind_addr指定為當前節點的IP
如下是172.18.0.11節點的配置,不同節點僅需修改bind_addr為對應機器(容器)的IP

/usr/local/server.json {    "datacenter": "dc1",    "data_dir": "/usr/local/",    "log_level": "INFO",    "server": true,    "bootstrap_expect": 3,    "bind_addr": "172.18.0.11",    "client_addr": "0.0.0.0",    "start_join": ["172.18.0.11","172.18.0.12","172.18.0.13"],    "ui":true}
依次登錄三個容器中,以server模式啟動consul服務
./consul agent -server -config-dir=/usr/local > /usr/local/consul.log &
由于組態檔中制定了集群的IP串列,因此無需顯式加入集群(cluster join),正常情況下,啟動三個節點后,會自動組成一個集群,并且自動選舉出來一個leader,consul 集群服務的狀態./consul members --http-addr 172.18.0.11:8500./consul operator raft list-peers -http-addr=172.18.0.12:8500

consul客戶端安裝配置容器客戶端節點安裝,6個節點IP分別是:172.18.0.21,172.18.0.22,172.18.0.23,172.18.0.24,172.18.0.25,172.18.0.26
docker run -itd --name redis01 --net mynetwork --ip 172.18.0.21 -v /usr/local/docker_file/redis01/:/usr/local/ centos 
docker run -itd --name redis02 --net mynetwork --ip 172.18.0.22 -v /usr/local/docker_file/redis02/:/usr/local/ centos 
docker run -itd --name redis03 --net mynetwork --ip 172.18.0.23 -v /usr/local/docker_file/redis03/:/usr/local/ centos 
docker run -itd --name redis04 --net mynetwork --ip 172.18.0.24 -v /usr/local/docker_file/redis04/:/usr/local/ centos 
docker run -itd --name redis05 --net mynetwork --ip 172.18.0.25 -v /usr/local/docker_file/redis05/:/usr/local/ centos 
docker run -itd --name redis06 --net mynetwork --ip 172.18.0.26 -v /usr/local/docker_file/redis06/:/usr/local/ centos
 6個client節點的配置以及服務定義,服務探測腳本如下
如下是172.18.0.21節點的配置,不同節點僅需修改bind_addr為對應機器(容器)的IP

client.json{  "data_dir": "usr/local/consuldata",  "enable_script_checks": true,  "bind_addr": "172.18.0.21",  "retry_join": ["172.18.0.11","172.18.0.12","172.18.0.13"],  "retry_interval": "30s",  "rejoin_after_leave": true,  "start_join": ["172.18.0.11","172.18.0.12","172.18.0.13"]}
分別啟動三個client節點的consul服務,以client的模式運行,啟動后,正常情況下會自動加入到consul的服務端集群中,./consul agent -config-dir=/usr/local/consuldata > /usr/local/consuldata/consul.log &./consul members --http-addr 172.18.0.11:8500  consul客戶端代理服務注冊
6個容器節點依次安裝redis,做成一個集群(步驟略),這里的consul客戶端代理的是一個3中3從的Redis集群,這里不列出來Redis集群的安裝,
Redis集群安裝參考https://www.cnblogs.com/wy123/p/12012848.html,還是非常方便的,在本地(容器節點)一鍵創建6個節點3主3從的集群,
其中主節點是172.18.0.21,172.18.0.22,172.18.0.23,從節點是172.18.0.24,172.18.0.25,172.18.0.26

這里是使用 w-master-redis-8888.service.consul名字作為三個redis集群節點的服務代理,
172.18.0.21節點上的redis-master-8888.json(172.18.0.22,172.18.0.23,172.18.0.24,172.18.0.25,172.18.0.26 類同,僅需修改address)
{  "services":   [    {      "name": "w-master-redis-8888",      "tags": [        "master"      ],      "address": "172.18.0.21",      "port": 8888,      "checks": [        {         "args":["sh","-c","/usr/local/consuldata/check_redis_master.sh 172.18.0.21 8888 ******"],         "Shell":"/bin/bash",         "interval": "15s"        }      ]    }  ]}

redis-slave-8888.json 

{  "services":   [    {      "name": "r-slave-redis-8888",      "tags": [        "master"      ],      "address": "172.18.0.21",      "port": 8888,      "checks": [        {         "args":["sh","-c","/usr/local/consuldata/check_redis_slave.sh 172.18.0.21 8888 ******"],         "Shell":"/bin/bash",         "interval": "15s"        }      ]    }  ]}

Consul client節點的Redis主節點(寫節點)服務檢查腳本check_redis_master.sh
以下腳本來源于https://www.cnblogs.com/gomysql/p/8010552.html,做了簡單的修改,在節點的身份判斷邏輯上需要加強,

#!/bin/bashhost=$1myport=$2auth=$3if [ ! -n "$auth" ]thenauth='\"\"'ficomm="/usr/local/redis_instance/redis8888/bin/redis-cli -h $host -p $myport -a $auth " role=`echo 'INFO Replication'|$comm |grep -Ec 'role:master'`echo 'INFO Replication'|$commif [ $role -ne 1 ]then    exit 2fi

Consul client節點的Redis從節點服務檢查腳本check_redis_slave.sh

#!/bin/bashhost=$1myport=$2auth=$3if [ ! -n "$auth" ]thenauth='\"\"'ficomm="/usr/local/redis_instance/redis8888/bin/redis-cli -h $host -p $myport -a $auth "role=`echo 'INFO Replication'|$comm |grep -Ec 'role:slave'`echo $roleecho 'INFO Replication'|$commif [ $role -ne 1 ]then    exit 2fi

 

Consul服務發現

redis集群配置成功后,重新加載代理服務,consul reload,一切正常的話,consul服務端就可以決議配置的服務了,
如下注冊了兩個服務,分別是r-slave-redis-8888,w-master-redis-8888,分別代表Redis集群的讀寫節點,

可以看到,成功地決議了 w-master-redis-8888.service.consul這個服務,映射到172.18.0.21,172.18.0.22,172.18.0.23三個節點,
需要注意的是,這三個節點都是寫節點,這里僅僅是為了實作服務發現(盡管redis 有多IP的驅動支持)

r-slave-redis-8888.service.consul服務的決議,指向了三個從節點,172.18.0.24,172.18.0.25,172.18.0.26

故障轉移之后的服務發現:模擬主節點故障,對172.18.0.21節點手動故障轉移,現在172.18.0.21與172.18.0.24角色交換

Redis集群故障轉以后的服務發現決議結果 對于w-master-redis-8888.service.consul這個服務,成功決議到172.18.0.24,172.18.0.22,172.18.0.23三個主節點

Redis集群故障轉以后的服務發現決議結果 對于w-master-redis-8888.service.consul這個服務,成功決議到172.18.0.24,172.18.0.22,172.18.0.23三個主節點

 

遇到的問題:
1,cosnul服務端集群的時候,clustercenter一開始自定義了一個名稱myconsule_datacenter,導致client節點死活加不進來,按照默認的dc1就沒有問題
目前還不理解這個datacenter的命名規則是什么?
2,容器節點中的shell腳本要授予可執行權限chmod +x check_XXX.sh
3,其他例外問題,一定要看日志,搜索一下基本上都有結果,
以下純粹是Redis集群的問題,與Consul沒有直接關系,僅作為本測驗中遇到的問題,
4,容器節點的Redis集群時,需要移除bind_ip的127.0.0.1節點,直接配置docker創建容器時候的IP,創建集群的時候會一致等待,waiting for the cluster to join
這一點redis-cli --cluster做的很扯淡,明明找不到節點,還要死等,不人為終止的話,他會一直waiting
5,Redis集群時候,因為主從都是相對的,需要相互識別對方,主從節點都要指定“masterauth”和“requirepass”,且密碼一致,否則執行cluster  failover提示成功,但故障轉移不成功
6,遇到一個靈異的問題(之前單機多實體的時候也遇到過),在啟動容器上的Redis服務的時候,如果使用絕對路徑啟動,在創建集群的時候會出現從節點無法添加到集群中去的情況,停止服務,以相對路徑方式重啟之后就沒有這個問題


總的來說consul這個中間件使用起來還算是比較簡單,配置也很清爽,不像某些中間件令人作嘔的配置結構(mycat???)
這里沒有配置多資料中心模式,僅配置了單資料中心模式,作為一款服務發現的中間件,是完全沒有問題的,尤其是作為MySQL集群不支持多IP連接驅動的資料庫連接,


參考:

https://www.cnblogs.com/gomysql/p/8010552.html
https://blog.csdn.net/jeffscott/article/details/88888708https://www.cnblogs.com/duanxz/p/10564502.htmlhttps://www.cnblogs.com/gomysql/p/8010552.htmlhttps://segmentfault.com/a/1190000016677665https://blog.csdn.net/liuzhuchen/article/details/81913562

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/26240.html

標籤:NoSQL

上一篇:redis初識

下一篇:一臺服務器搭建部署兩個或多個Redis實體

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more