站長資訊網
        最全最豐富的資訊網站

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

        服務發現

        其實簡單說,服務發現就是解耦服務與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,需要固定IP

        docker 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
        基于Docker的Consul集群實現服務發現

        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
        基于Docker的Consul集群實現服務發現
         
         

        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

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

        這里是使用 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/bash  host=$1  myport=$2  auth=$3 if [ ! -n "$auth" ]  then  auth='""' fi  comm="/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'|$comm  if [ $role -ne 1 ]  then      exit 2 fi

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

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

         

        Consul服務發現

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

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

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

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

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

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

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

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

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

        遇到的問題:
        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連接驅動的數據庫連接。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久久久无码精品国产| 国产精品久久久久久福利69堂| 欧产日产国产精品精品| 最新国产の精品合集| 无码国内精品久久人妻蜜桃| 国产午夜精品久久久久九九| 99视频在线观看精品| 亚洲AV永久无码精品| 惠民福利中文字幕人妻无码乱精品| 国产精品一级片| 国产精品视频二区不卡| 综合人妻久久一区二区精品| 精品国产一区二区三区在线观看 | 国产精品v欧美精品v日韩| 国产精品免费无遮挡无码永久视频 | 久久国产精品成人影院| 亚洲精品国产va在线观看蜜芽| 国产香蕉国产精品偷在线观看| 91不卡在线精品国产| 久久久91精品国产一区二区三区| 国产精品美女久久久久| 久久国产欧美日韩精品| 亚洲av成人无码久久精品| 亚洲精品国产福利一二区| 久久亚洲AV永久无码精品| 久久精品无码一区二区日韩AV| 精品91自产拍在线观看| 国产网红主播无码精品| 国产在线观看一区精品| 国产精品视频免费一区二区| 成人免费精品网站在线观看影片 | 亚洲精品一级无码中文字幕| 久久久久久久久久久免费精品 | 久久亚洲私人国产精品| 亚洲AV日韩精品久久久久| 亚洲AV成人精品一区二区三区| 亚洲Av无码精品色午夜| 精品人妻中文av一区二区三区| 精品人妻人人做人人爽 | 日韩精品在线播放| 中文字幕精品亚洲无线码二区|