分散式架構學習-Consul集群配置

来源:https://www.cnblogs.com/briswhite/archive/2018/07/11/9293554.html
-Advertisement-
Play Games

簡介 之前公司用的是Consul進行服務發現以及服務管理,自己一直以來只是用一下,但是沒有具體的深入,覺得學習不可以這樣,所以稍微研究了一下。 網上有很多關於Consul的介紹和對比,我這裡也不獻醜了,大家搜索的時候可能會經常看到這麼一個表格,此表格採摘自:https://luyiisme.gith ...


簡介

之前公司用的是Consul進行服務發現以及服務管理,自己一直以來只是用一下,但是沒有具體的深入,覺得學習不可以這樣,所以稍微研究了一下。

網上有很多關於Consul的介紹和對比,我這裡也不獻醜了,大家搜索的時候可能會經常看到這麼一個表格,此表格採摘自:https://luyiisme.github.io/2017/04/22/spring-cloud-service-discovery-products/

FeatureConsulzookeeperetcdeuerka
服務健康檢查 服務狀態,記憶體,硬碟等 (弱)長連接,keepalive 連接心跳 可配支持
多數據中心 支持
kv存儲服務 支持 支持 支持
一致性 raft paxos raft
cap ca cp cp ap
使用介面(多語言能力) 支持http和dns 客戶端 http/grpc http(sidecar)
watch支持 全量/支持long polling 支持 支持 long polling 支持 long polling/大部分增量
自身監控 metrics metrics metrics
安全 acl /https acl https支持(弱)
spring cloud集成 已支持 已支持 已支持 已支持

下載並配置Consul

我這裡是直接使用的虛擬機進行配置Consul,系統是CentOS 7,Consul的安裝和配置其實網上也是有一堆教程,這裡簡單的介紹一下,Consul的下載地址(https://www.consul.io/downloads.html),根據需要選擇不同的包:

下載Consul的ZIP包以及使用unzip進行解壓,這裡簡單貼幾個命令:

$ wget https://releases.hashicorp.com/consul/1.2.0/consul_1.2.0_linux_amd64.zip
$ yum install unzip
$ unzip consul_0.7.2_linux_amd64.zip
$ mv consul /usr/local/bin/consul

到此,就可以在控制臺中輸入consul,然後看到有如下列印結果,即代表正常:

開始配置,consul預設有如下幾種Mode:

  1. dev ,快捷配置,一般用於調試模式
  2. server,伺服器
  3. client,客戶端

學習Consul的時候,會有很多教程可能為了快速的入門,所以在配置Consul的時候,直接使用了dev模式,我個人覺得使用這個模式沒什麼意思,因為使用這個dev效果就跟單機模式是一樣的,我們這裡是學習分散式架構的,所以不採用。

剩下的還有server模式以及client模式,server模式好理解,在我們搭建的集群中,都是使用此模式。可是client模式主要是用來做什麼呢?先看一眼下麵的圖片:

(圖片摘自:https://andyyoung01.github.io/2016/09/27/%E4%BD%BF%E7%94%A8Consul%E8%BF%9B%E8%A1%8C%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/)

上面的圖片大致的意思就是有一個server集群,然後如果我們的服務想要加入server集群,就必須要通過client來進行rpc調用。(這個是我的理解,大家可以進行補充)

大致理解了這麼一個結構之後,我們開始進行集群的配置,我這裡通過虛擬機進行模擬,有如下幾台機器:

  1. 192.168.125.118     server1(集群伺服器)
  2. 192.168.125.121    server2(集群伺服器)
  3. 192.168.125.120    server3(集群伺服器)
  4. 192.168.125.119    client(客戶端)

三個做集群伺服器,還有一個是客戶端,集群伺服器是由一個CentOS的虛擬機以及其兩個拷貝組成,客戶端我是在我的筆記本上裝了一個Ubuntu的操作系統來實現的。

大致結構瞭解了之後,我們開始進行配置:

集群伺服器的配置分別為:

$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118
$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server2 -client=0.0.0.0 -bind=192.168.125.121 
$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server3 -client=0.0.0.0 -bind=192.168.125.120

簡單說一下幾個配置:

  • agent                      Consul的核心命令,主要作用有維護成員信息、運行狀態檢測、聲明服務以及處理請求等
  • -server                    就是代表server模式
  • -ui                           代表開啟web 控制台
  • -bootstrap-expect        代表想要創建的集群數目,官方建議3或者5
  • -data-dir                       數據存儲目錄
  • -node                           代表當前node的名稱
  • -client                          應該是一個客戶端服務註冊的地址,可以和當前server的一致也可以是其他主機地址,系統預設是127.0.0.1
  • -bind                            集群通訊地址

上述命令執行完成之後,開始將這些分散的伺服器組成集群,命令如下,分別在192.168.125.121和192.168.125.120機器上執行:

$ consul join 168.168.125.118

這裡我執行了這個命令之後,得到報錯信息,信息大致如下:

Failed to join 192.168.125.118:dial tcp 192.168.125.118:8301:connect:no route to host(這裡大致文字描述一下,方便搜索)

 查詢了一下,之所以出現這個情況是因為CentOS的防火牆,將8301埠加入防火牆就好了,命令大致如下:

$ firewall-cmd --zone=public --add-port=8301/tcp --permanent
$ firewall-cmd --reload    /*必須添加,否則重啟之後會失效*/

再次執行加入集群命令,出現以下問題:

consul: Failed to confirm peer status for server2: rpc error getting client: failed to get conn: dial tcp 192.168.125.120:0->192.168.125.121:8300: connect: no route to host. Retrying in 1s...

產生這個的原因和上面的一致,加入集群需要和8300埠進行通訊,所以再次將8300埠加入防火牆,這裡再說一下,再把8500埠也加入防火牆,因為這個埠是web控制台使用的。

再次執行加入集群命令,再次報錯,因為是虛擬機,而且我是克隆的,後面發現在執行這些命令之後,會有如下提示:

* Failed to join 192.168.125.118: Member 'server1' has conflicting node ID 'b76ff298-accd-05ff-8c64-5d79d866dfa9' with this agent's ID

通過查詢,網上給出的兩個解決辦法分別如下:

一是在啟動agent的時候加入-disable-host-node-id參數,禁止生成node-id。類似這樣:

$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118 -disable-host-node-id

二是可以用-node-id生成一個新的node-id,類似這樣:

$ consul agent -server -ui -bootstrap-expect=3 -data-dir=/tmp/consul -node=server1 -client=0.0.0.0 -bind=192.168.125.118 -node-id=$(uuidgen | awk '{print tolower($0)}')

上面兩種方法我都試過,但是都不好使,應該是因為這個node-id已經存在於數據存儲目錄(即/tmp/consul),名字就叫node-id,使用vi或者vim打開之後可以看到一個guid格式的信息,這裡保存的就是node ID的信息,無奈,我只能刪除這個文件,然後重新啟動命令,得到正常的反饋信息。

至此伺服器集群搭建以及配置完成,打開WEB界面如下:

 

後續再繼續client的配置以及編寫一個net core的web api並加入consul集群,以及使用fabio進行負載均衡測試,未完待續~~~

 參考鏈接:

https://blog.csdn.net/chenchong08/article/details/77885989(consul分散式集群搭建&簡單功能測試&故障恢復)

http://www.cnblogs.com/xishuai/p/macos-ubuntu-install-consul.html(Mac OS、Ubuntu 安裝及使用 Consul)

http://www.10tiao.com/html/357/201705/2247485185/1.html(Consul集群部署)

https://havee.me/linux/2015-01/using-firewalls-on-centos-7.html(CentOS 7 下使用 Firewall)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我通常上網使用兩個瀏覽器,safari用於一般上網;Chrome安裝SwitchyOmega插件,在不同的代理中切換,來保證某些網站的上網速度。 但是這種方式到了手機上就有點懵,幾乎所有的iPhone瀏覽器都不支持代理的自動切換和設置,所以只能選一個相對相容性比較好的網路方式一直用下去。很不爽利。。 ...
  • 一、對象 1.字面量創建對象 2.數據描述和存取描述設置 3.get和set 4.數據描述和存取描述檢查 二、prototype 1.prototype釋義 2.prototype與__proto__ 3.prototype之共用性 4.prototype之繼承性 三、類 1.類的封裝 1.混合的構 ...
  • 技術交流群:821039247 安裝node config模塊 在config文件夾下麵創建 文件,這是環境配置的預設的文件,如果沒有別的配置,則為預設這裡配置。如果要設置自己的環境配置文件,可以直接新建 ,如dev環境 即可,然後在 裡面配置相關啟動設置,載入對應環境文件即可。 在 裡面編輯如下內 ...
  • 因為是新入門antd-pro這個的小白,所以在mock數據和伺服器數據切換這裡搞了將近2天才弄好,配置如下,供各位初學者參考,如有錯誤的地方,請大神指出~叩謝!! 下麵開始乾貨: 1、.roadhogrc.mock.js這個文件沒有任何修改。 2、.webpackrc.js 文件中添加proxy,如 ...
  • 微信展示列表效果藉助於 wx:for 簡單寫一個列表(wxml文件中): 對應的數據源(js文件中): 寫一個點擊監聽: 效果: 以上、可以實現列表的item點擊效果,但是無法到點擊的item對應的數據源數據 解決方法: 給有點擊事件的組件添加一個 data-any 屬性 any可以是任意數據類型。 ...
  • transition從效果上看是一種平滑過渡的動畫,本質上是線上性時間內將屬性從開始值過渡到結束值。例如獲得焦點,點擊滑鼠等動作導致CSS屬性值的變化是瞬間完成的,感覺有點生硬。用transition可以指定在某時間段內將屬性值平滑過渡,增強用戶體驗。 4個子屬性 transition-proper ...
  • 閱讀目錄 架構的定義 架構是做什麼? 做架構的最佳實踐 什麼是好架構 如何成為架構師 結語 又有2周時間沒冒泡了,最近實在沒有大塊的時間來寫文章,就當找個理由。。。 也因為碎片化的時間多了,所以開始刷某乎了,關註了架構相關的板塊,也順手回答了一些問題。發現有很多同道中人正在經歷著我前兩年經歷的階段, ...
  • 關於Repository模式,直接百度查就可以了,其來源是《企業應用架構模式》。我們新建一個Infrastructure文件夾,這裡就是基礎設施部分,EF Core的上下文類以及Repository層都放在這裡面。新建一個IReposotory的介面,其內容就是封裝了基本的CRUD: public ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...