Docker 容器部署 Consul 集群

Docker 容器部署 Consul 集群

Consul 介紹

Consul 提供了分布式系統的服務發現和配置的解決方案。基于go語言實現。并且在git上開放了源碼consul-git。consul還包括了分布式一致協議的實現,健康檢查和管理UI。Consul和zk相比較起來,更加輕量級,而且一致性上基于RAFT算法,zk使用的Paxos 算法。跟zk比較起來更加輕量級,Consul提供了通過一個DNS或者HTTP接口的方式來控制執行,而zk卻需要自己定制解決方案。同樣比較被廣泛使用的服務發現解決方案中也有etcd 。etcd也是采用RAFT算法實現,但是etcd不提供管理UI。Consul跟Vagrant都是Hashicorp 公司的產品。作為一整套的分布式系統解決方案,配合同樣基于go語言實現的Docker開源技術,都是一個不錯的選擇。Docker 的簡單介紹,可以參考 Docker 介紹 (本文后面將不再介紹docker 命令以及容器等相關概念)。配合Docker來做應用容器,用Consul 來做集群的服務發現和健康檢查,并且還可以輕量級得做到水平和垂直可擴展。

Consul Agent、Server、Client

通過運行 consul agent 命令,可以通過后臺守護進程的方式運行在所有consul集群節點中。并且可以以server或者client 模式運行。并且以HTTP或者DNS 接口方式,負責運行檢查和服務同步。Server模式的agent負責維護consul集群狀態,相應RPC查詢,并且還要負責和其他數據中心(DataCenter)進行WAN Gossips交換。Client 節點是相對無狀態的,Client的唯一活動就是轉發(foward)請求給Server節點,以保持低延遲和少資源消耗。
??如下圖,是官網的一個典型系統結構,Consul建議我們每個DataCenter的Server的節點最好在3到5個之間,以方便在失敗以及數據復制的性能。Client的數量可以任意。圖中,最重要的兩個概念一個是Gossip協議,一個是Consensus 協議。DataCenter的所有節點都會參與到Gossip協議。Client 到Server 會通過LAN Gossip。所有的節點都在Gossip pool中,通過消息層來實現節點之間的通信以達到故障檢測的目的,并且不需要給Client配置Server的地址。而Server節點還會參與到WAN Gossip池中。這樣,通過Server節點就可以讓DataCenter之間做簡單的服務發現。比如增加一個Datacenter就只需要讓Server節點參與到Gossip Pool中。并且,DataCneter之間的通信和服務請求就可以通過WAN Gossip 來隨機請求另外一個DataCenter的Server節點,然后被請求的Server 會再把請求foward到本DataCenter的leader節點。Server leader的選舉是通過Consul的Raft 算法實現。Leader 節點需要負責所有請求和處理,并且這些請求也必須復制給所有的其他非leader的Server節點。同樣,非Leader節點接收到RPC請求的時候也會foward 到Leader節點。
??

在Docker 容器中啟動Consul Agent

  1. 下載 progrium/consul 鏡像
  2. 以Server 模式在容器中啟動一個agent
    docker run -p 8600:53/udp -h node1 progrium/consul -server -bootstrap
docker@boot2docker:~$ docker run -p 8600:53/udp -h node1 progrium/consul -server -bootstrap 
==> WARNING: Bootstrap mode enabled! Do not enable unless necessary
==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1
==> Starting raft data migration...
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!Node name: 'node1'Datacenter: 'dc1'Server: true (bootstrap: true)Client Addr: 0.0.0.0 (HTTP: 8500, HTTPS: -1, DNS: 53, RPC: 8400)Cluster Addr: 172.17.0.1 (LAN: 8301, WAN: 8302)Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: falseAtlas: <disabled>==> Log data will now stream in as it occurs:2015/09/29 03:13:43 [INFO] serf: EventMemberJoin: node1 172.17.0.12015/09/29 03:13:43 [INFO] serf: EventMemberJoin: node1.dc1 172.17.0.12015/09/29 03:13:43 [INFO] raft: Node at 172.17.0.1:8300 [Follower] entering Follower state2015/09/29 03:13:43 [INFO] consul: adding server node1 (Addr: 172.17.0.1:8300) (DC: dc1)2015/09/29 03:13:43 [INFO] consul: adding server node1.dc1 (Addr: 172.17.0.1:8300) (DC: dc1)2015/09/29 03:13:43 [ERR] agent: failed to sync remote state: No cluster leader2015/09/29 03:13:45 [WARN] raft: Heartbeat timeout reached, starting election2015/09/29 03:13:45 [INFO] raft: Node at 172.17.0.1:8300 [Candidate] entering Candidate state2015/09/29 03:13:45 [INFO] raft: Election won. Tally: 12015/09/29 03:13:45 [INFO] raft: Node at 172.17.0.1:8300 [Leader] entering Leader state2015/09/29 03:13:45 [INFO] consul: cluster leadership acquired2015/09/29 03:13:45 [INFO] raft: Disabling EnableSingleNode (bootstrap)2015/09/29 03:13:45 [INFO] consul: New leader elected: node12015/09/29 03:13:45 [INFO] consul: member 'node1' joined, marking health alive2015/09/29 03:13:45 [INFO] agent: Synced service 'consul'

這里試驗一下8600(DNS) 接口,然后我們就用dig的方式可以交互和訪問了。

用Docker 容器啟動Consul集群

分別啟動三個server節點

剛才啟動單獨的服務節點,用bootstrap。現在啟動三個節點需要用bootstrap-expect 3 ,并且綁定到容器的同一個ip,這里綁定到server1上。

docker@boot2docker:~$ docker run -d –name server1 -h server1 progrium/consul -server -bootstrap-expect 3

docker@boot2docker:~JOINIP=”(docker inspect -f ‘{{ .NetworkSettings.IPAddress }}’ server1)”

docker@boot2docker:~dockerrun?d??nameserver2?hserver2progrium/consul?server?joinJOIN_IP

docker@boot2docker:~dockerrun?d??nameserver3?hserver3progrium/consul?server?joinJOIN_IP

然后用docker命令查看已經啟動的容器。關于docker 相關內容可以參考“Docker介紹 ”

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                                                              NAMES
87bd80f8132d        progrium/consul     "/bin/start -server -"   3 seconds ago        Up 2 seconds        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp   server3
a18d0597bf2d        progrium/consul     "/bin/start -server -"   18 seconds ago       Up 17 seconds       53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 8500/tcp   server2
448a550224fb        progrium/consul     "/bin/start -server -"   About a minute ago   Up About a minute   53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp   server1

啟動client節點

docker@boot2docker:~dockerrun?d?p8400:8400?p8500:8500?p8600:53/udp?hclient1progrium/consul?joinJOIN_IP

查看容器信息:

docker@boot2docker:~$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                                                                                        NAMES
0410ad7bb68c        progrium/consul     "/bin/start -join 172"   4 seconds ago       Up 3 seconds        53/tcp, 0.0.0.0:8400->8400/tcp, 8300-8302/tcp, 8301-8302/udp, 0.0.0.0:8500->8500/tcp, 0.0.0.0:8600->53/udp   focused_leakey
87bd80f8132d        progrium/consul     "/bin/start -server -"   3 minutes ago       Up 3 minutes        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp                                             server3
a18d0597bf2d        progrium/consul     "/bin/start -server -"   3 minutes ago       Up 3 minutes        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8500/tcp, 8301-8302/udp                                             server2
448a550224fb        progrium/consul     "/bin/start -server -"   4 minutes ago       Up 4 minutes        53/tcp, 53/udp, 8300-8302/tcp, 8400/tcp, 8301-8302/udp, 8500/tcp                                             server1

進入容器查看

我們可以進入容器來查看一下consul是如何管理agent節點,以及選舉server 的leader的。這個時候我們關掉Server節點,容器name是server1的 448a550224fb 容器,再觀察。
?? 關閉后server1信息:

==> Gracefully shutting down agent...2015/09/29 04:08:17 [INFO] consul: server starting leave2015/09/29 04:08:17 [INFO] raft: Removed peer 172.17.0.28:8300, stopping replication (Index: 18)2015/09/29 04:08:17 [INFO] raft: Removed peer 172.17.0.29:8300, stopping replication (Index: 18)2015/09/29 04:08:17 [INFO] raft: Removed ourself, transitioning to follower2015/09/29 04:08:17 [INFO] raft: Node at 172.17.0.27:8300 [Follower] entering Follower state2015/09/29 04:08:17 [INFO] serf: EventMemberLeave: server1.dc1 172.17.0.272015/09/29 04:08:17 [INFO] consul: cluster leadership lost2015/09/29 04:08:17 [INFO] raft: aborting pipeline replication to peer 172.17.0.28:83002015/09/29 04:08:17 [INFO] raft: aborting pipeline replication to peer 172.17.0.29:83002015/09/29 04:08:17 [INFO] consul: removing server server1.dc1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:18 [INFO] agent: requesting shutdown2015/09/29 04:08:18 [INFO] consul: shutting down server2015/09/29 04:08:18 [INFO] agent: shutdown complete

server2節點信息如下:

docker@boot2docker:~$ docker attach server22015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:20 [WARN] raft: Rejecting vote from 172.17.0.29:8300 since we have a leader: 172.17.0.27:83002015/09/29 04:08:20 [WARN] raft: Heartbeat timeout reached, starting election2015/09/29 04:08:20 [INFO] raft: Node at 172.17.0.28:8300 [Candidate] entering Candidate state2015/09/29 04:08:21 [INFO] raft: Node at 172.17.0.28:8300 [Follower] entering Follower state2015/09/29 04:08:21 [INFO] consul: New leader elected: server3

可以看到server1 節點下線,并且重新選舉leader server節點為server3,再看一下server3 信息如下:

docker@boot2docker:~$ docker attach server32015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:20 [WARN] raft: Heartbeat timeout reached, starting election2015/09/29 04:08:20 [INFO] raft: Node at 172.17.0.29:8300 [Candidate] entering Candidate state2015/09/29 04:08:20 [INFO] raft: Duplicate RequestVote for same term: 22015/09/29 04:08:21 [WARN] raft: Election timeout reached, restarting election2015/09/29 04:08:21 [INFO] raft: Node at 172.17.0.29:8300 [Candidate] entering Candidate state2015/09/29 04:08:21 [INFO] raft: Election won. Tally: 22015/09/29 04:08:21 [INFO] raft: Node at 172.17.0.29:8300 [Leader] entering Leader state2015/09/29 04:08:21 [INFO] consul: cluster leadership acquired2015/09/29 04:08:21 [INFO] consul: New leader elected: server32015/09/29 04:08:21 [INFO] raft: pipelining replication to peer 172.17.0.28:83002015/09/29 04:08:21 [INFO] consul: member 'server1' left, deregistering

client 節點信息如下:

docker@boot2docker:~$ docker attach focused_leakey2015/09/29 04:08:18 [INFO] serf: EventMemberLeave: server1 172.17.0.272015/09/29 04:08:18 [INFO] consul: removing server server1 (Addr: 172.17.0.27:8300) (DC: dc1)2015/09/29 04:08:21 [INFO] consul: New leader elected: server3

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/536090.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/536090.shtml
英文地址,請注明出處:http://en.pswp.cn/news/536090.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

swing皮膚包 substance

分享一下swing皮膚包substance 資源可到公眾號獲取

基于Android的聊天軟件,Socket即時通信,實現用戶在線聊天

基于Android的聊天軟件&#xff0c;Socket即時通信&#xff0c;單聊&#xff0c;聊天室&#xff0c;可自行擴展功能&#xff0c;完善細節。 【實例功能】 1.運行程序&#xff0c;登錄界面, 注冊賬號功能 2.進入主界面&#xff0c;有通訊錄, 個人信息。 3.點擊好友會話框&#…

用Docker搭建Elasticsearch集群

用Docker搭建Elasticsearch集群 對于用Docker搭建分布式Elasticsearhc集群的一個介紹&#xff0c;以及一些實施中遇到問題的總結 搜索服務簡述 結合業務的場景&#xff0c;在目前的商品體系需要構建搜索服務&#xff0c;主要是為了提供用戶更豐富的檢索場景以及高速&#xf…

Go實現簡單的RESTful_API

Go實現簡單的RESTful_API 何為RESTful API A RESTful API is an application program interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. A RESTful API – also referred to as a RESTful web service – is based on representational state t…

Docker使用Dockerfile構建簡單鏡像

Docker使用Dockerfile構建簡單鏡像 首先確保系統已經安裝docker 構建鏡像 安裝基礎鏡像 sudo docker pull ubuntu 查看鏡像是否已經拉取成功 REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu …

Weave Scope安裝

Weave Scope安裝 首先確保已經安裝docker 實時了解Docker容器狀態 查看容器基礎設施的概況&#xff0c;或者專注于一個特殊的微服務。從而輕松發現并糾正問題&#xff0c;確保你的容器化應用的穩定與性能。 內部細節與深度鏈接 查看容器的指標、標簽和元數據。 在一個可擴展…

MYSQL導入數據出現ERROR 1049 (42000): Unknown database 'n??;'

MYSQL導入數據出現ERROR 1049 (42000): Unknown database ‘n??;’ 背景 我需要將一個csv表中的數據導入數據庫創建好的表中&#xff0c;產生的問題如下&#xff1a; 原因尋找 因為我并沒有使用’n??;的數據庫&#xff0c;所以很好奇這個錯怎么來的&#xff0c;嘗試如下…

Win10忘記ubuntu子系統密碼

Win10忘記ubuntu子系統密碼 目前新版win10已經支持ubuntu子系統&#xff0c;如果忘記子系統密碼怎么辦&#xff1f; linux單用戶模式 在ubuntu中如果忘記密碼&#xff0c;可以在啟動的時候&#xff0c;在grub內更改用戶為root進入&#xff0c;這樣就可以使用最高權限的單用戶…

藍橋杯練習系統,入門訓練,Java版

藍橋杯練習系統&#xff0c;入門訓練&#xff0c;Java版序列求和圓的面積Fibonacci數列希望大家提建議我加以修改序列求和 import java.util.*; public class Main {public static void main(String[] args) {Scanner cinnew Scanner(System.in);long ncin.nextLong();System.…

SVG入門理解

SVG入門SVG 元素簡單的形狀rectcircleellipselinetextpath SVG 樣式分層和繪圖順序透明度 SVG入門 當我們用SVG生成和操作一些炫酷的效果時,D3是最佳選擇。使用div和其他原生HTML元素繪圖也是可以的&#xff0c;但是太笨重&#xff0c;而且會受到不同瀏覽器的限制&#xff0c…

【哈佛幸福課筆記】【1】

【哈佛幸福課筆記】【1】 ? ? 一個月的時間看完了哈佛幸福課&#xff0c;正如Tal所說課程的結束才是學習的開始。對于課程觀點的思考&#xff0c;對于個人習慣的培養&#xff0c;對于思維模式的轉變還需要花大量的時間去練習。這個系列的帖子將作為我個人的讀書筆記&#x…

Angular 6+ 之新版service

Angular 6+ 之新版service Angular 6已經發布了,Angular 6中有一些新功能,其中一個就是提供service的共享實例。 回首Angular 5- 下面是一段熟悉的代碼,可以為整個應用程序提供服務。我們將它添加到AppModule中的providers[]。 自定義服務類 // data.service.ts export c…

Angular CDK Layoout 檢測斷點

Angular CDK檢測斷點 Angular CDK有一個布局包,其服務可以輕松檢測窗口大小并與媒體查詢匹配。這使得你可以完全控制UI并適應不同的屏幕尺寸。 讓我們快速了解一下如何使用CDK的布局模塊。 Setup 首先,您需要確保在您的應用中安裝了Angular CDK: $ npm install @angular/c…

Angular Render2

Angular Render2 Renderer2類是Angular以service的形式提供的抽象,允許操作應用程序的元素而無需直接觸摸DOM。這是推薦的方法,因為它可以更容易地開發可以在沒有DOM訪問的環境中呈現的應用程序,例如在服務器上,web worker,或者原生移動上。 需要注釋的是,現在已棄用原始…

數據分析方法

數據分析方法 什么是數據分析 從數據到信息的這個過程&#xff0c;就是數據分析。數據本身并沒有什么價值&#xff0c;有價值的是我們從數據中提取出來的信息。 分類 分類分析的目標是&#xff1a;給一批人(或者物)分成幾個類別&#xff0c;或者預測他們屬于每個類別的概率…

RAID陣列基礎知識

RAID陣列基礎知識 獨立硬盤冗余陣列 &#xff08;RAID, Redundant Array of Independent Disks&#xff09;,舊稱廉價磁盤冗余陣列&#xff08;Redundant Array of Inexpensive Disks&#xff09;&#xff0c;簡稱磁盤陣列。 RAID的種類 這里我們只介紹比較常用的RAID類型&am…

timeshift備份你的Linux系統

timeshift備份你的Linux系統 安裝 打開終端&#xff08;ctrl alt T&#xff09;并逐個執行以下命令 sudo apt-add-repository -y ppa:teejee2008/ppa sudo apt-get update sudo apt-get install timeshift 創建 點擊Create按鈕 默認不能備份用戶下的文件&#xff0c;所以…

Go語言vscode環境配置

Go語言vscode環境配置 此教程在GO已經安裝成功的前提下。 安裝vscode擴展 在vscode擴展里面搜索go&#xff0c;然后下載擴展。 安裝go 插件 在$GOPATH目錄下創建bin,pkg,src切換到$GOPATH/bin目錄下&#xff0c;打開終端輸入以下命令&#xff0c;不需要翻墻&#xff1a; go…

Angular實現懸浮球組件

Angular實現懸浮球組件 在手機 App 上,我們經常會看到懸浮球的東東,用著可能很舒服,但是 web 網頁上卻很少見,今天我們就通過 Angular 來實現,當然使用其他框架也是可以的。 功能要求: 支持設置直徑支持點擊觸發信號支持設置鼠標按壓時間實現的過程中省略的部分天填坑過…

Docker+Nginx部署Angular國際化i18n

Docker+Nginx部署Angular國際化i18n 在Angular項目中添加default.conf文件 default.conf 為了支持局域網,增加一個域名,即本地的局域網ip地址。 server {listen 80;server_name localhost;server_name 192.168.2.172;location / {root /usr/share/nginx/html;lo…