Etcd 高可用分佈式鍵值數據庫

Etcd 高可用分佈式鍵值數據庫

1, Etcd簡介

etcd是CoreOS團隊於2016年6月發起的開源項目,他的目標是構建一個高可用的分佈式鍵值(key_value)數據庫。Etcd內部採用raft協議作爲一致性算法,Etcd是基於Go語言實現的。目前很火的kubernetes等項目都用到etcd組件作爲一個高可用分佈式鍵值存儲。

etcd作爲服務發現系統,有以下特點:

  • 簡單: 安裝配置簡單,而且提供了HTTP API進行交互,使用也很簡單
  • 安全: 支持SSL證書驗證
  • 快速: 根據官方提供的benchmark數據,單實例支持每秒2k+讀操作
  • 可靠: 採用Raft算法,實現分佈式系統數據的可用性和一致性

Etcd應用場景

etcd比較多的應用場景適用於服務發現,服務發現(Service Disvocery)要解決的是分佈式系統中最常見的問題之一,在同一個分佈式集羣中的進程或服務如何才能找到對方並建立連接。
服務發現: 就是要了解集羣中是否有進程在監聽UDP或TCP端口,並通過名字可以進行查找和鏈接。

解決服務發現的先決條件:

  • 一個強一致性、高可用的服務存儲目錄
    基於Ralf算法的etcd天生的就是這樣一個強一致性、高可用的服務存儲目錄
  • 一種註冊服務和健康服務健康狀況的機制。
    用戶可以在etcd中註冊服務,並且對註冊的服務配置key TTL,定時保持服務的心跳以達到監控健康狀態的效果。
  • 一種查找和連接服務的機制。
    通過在etcd指定的主題下注冊的服務業能在對應的主題下查找到。爲了確保連接,我們可以在每個服務機器上都部署一個proxy模式的etcd,這樣就可以確保訪問etcd集羣的服務都能夠互相連接。

-w642

2,單節點安裝etcd

etcd在生產環境中一般推薦集羣方式部署。
etcd目前默認使用2379端口提供HTTP API服務,2380端口和peer通信(這兩個端口已經被IANA官方預留給etcd);在之前的版本中可能會分別使用4001和7001,在使用的過程中需要注意這個區別。
我們直接yum安裝etcd即可

yum -y install etcd

啓動服務

systemctl start  etcd.service && systemctl enable etcd.service

查看服務狀態

[root@etcd-197 /]# systemctl status etcd
● etcd.service - Etcd Server
   Loaded: loaded (/usr/lib/systemd/system/etcd.service; disabled; vendor preset: disabled)
   Active: active (running) since 四 2019-08-29 15:27:16 CST; 9s ago
 Main PID: 24426 (etcd)
    Tasks: 13
   Memory: 12.7M
   CGroup: /system.slice/etcd.service
           └─24426 /usr/bin/etcd --name=default --data-dir=/var/lib/etcd/default.etcd --listen-client-urls=http://localhost:2379

8月 29 15:27:16 etcd-197 etcd[24426]: 8e9e05c52164694d received MsgVoteResp from 8e9e05c52164694d at term 2
8月 29 15:27:16 etcd-197 etcd[24426]: 8e9e05c52164694d became leader at term 2
8月 29 15:27:16 etcd-197 etcd[24426]: raft.node: 8e9e05c52164694d elected leader 8e9e05c52164694d at term 2
8月 29 15:27:16 etcd-197 etcd[24426]: published {Name:default ClientURLs:[http://localhost:2379]} to cluster cdf818194e3a8c32
8月 29 15:27:16 etcd-197 etcd[24426]: ready to serve client requests
8月 29 15:27:16 etcd-197 etcd[24426]: setting up the initial cluster version to 3.3
8月 29 15:27:16 etcd-197 systemd[1]: Started Etcd Server.
8月 29 15:27:16 etcd-197 etcd[24426]: set the initial cluster version to 3.3
8月 29 15:27:16 etcd-197 etcd[24426]: enabled capabilities for version 3.3
8月 29 15:27:16 etcd-197 etcd[24426]: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!

3, 安裝Etcd集羣

Etcd 是 CoreOS 推出的高可用的鍵值存儲系統,主要用於k8s集羣的服務發現等,而本身 Etcd 也支持集羣模式部署,從而實現自身高可用;
Etcd 構建自身高可用集羣主要有三種形式:

靜態發現: 預先已知 Etcd 集羣中有哪些節點,在啓動時直接指定好 Etcd 的各個 node 節點地址
Etcd 動態發現: 通過已有的 Etcd 集羣作爲數據交互點,然後在擴展新的集羣時實現通過已有集羣進行服務發現的機制
DNS 動態發現: 通過 DNS 查詢方式獲取其他節點地址信息

3.1, 靜態發現搭建Etcd集羣

3.1.1, 環境準備

在下面3臺機器安裝Etcd集羣,(注意,Etcd集羣節點必須爲奇數)

節點/主機名 IP地址
Etcd1 172.16.1.193
Etcd2 172.16.1.195
Etcd3 172.16.1.198

3.1.2 安裝Etcd

CentOS 官方提供了 Etcd 的rpm,可通過 yum 直接安裝,目前 yum 上最新版本爲 3.3.11,比較合適;官方最新版本更新到了 3.3.12,鑑於穩定因素,這裏使用 3.3.11 搭建

# yum -y install etcd
# etcd --version
etcd Version: 3.3.11
Git SHA: 2cf9e51
Go Version: go1.10.3
Go OS/Arch: linux/amd64

3.1.3 修改配置文件

默認的配置文件

[root@Etcd2 /]# cat /etc/etcd/etcd.conf
#[Member]
#ETCD_CORS=""
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
#ETCD_WAL_DIR=""
#ETCD_LISTEN_PEER_URLS="http://localhost:2380"
ETCD_LISTEN_CLIENT_URLS="http://localhost:2379"
#ETCD_MAX_SNAPSHOTS="5"
#ETCD_MAX_WALS="5"
ETCD_NAME="default"
#ETCD_SNAPSHOT_COUNT="100000"
#ETCD_HEARTBEAT_INTERVAL="100"
#ETCD_ELECTION_TIMEOUT="1000"
#ETCD_QUOTA_BACKEND_BYTES="0"
#ETCD_MAX_REQUEST_BYTES="1572864"
#ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
#ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
#ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
#
#[Clustering]
#ETCD_INITIAL_ADVERTISE_PEER_URLS="http://localhost:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://localhost:2379"
#ETCD_DISCOVERY=""
#ETCD_DISCOVERY_FALLBACK="proxy"
#ETCD_DISCOVERY_PROXY=""
#ETCD_DISCOVERY_SRV=""
#ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
#ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
#ETCD_INITIAL_CLUSTER_STATE="new"
#ETCD_STRICT_RECONFIG_CHECK="true"

#
#[Proxy]
#ETCD_PROXY="off"
#ETCD_PROXY_FAILURE_WAIT="5000"
#ETCD_PROXY_REFRESH_INTERVAL="30000"
#ETCD_PROXY_DIAL_TIMEOUT="1000"
#ETCD_PROXY_WRITE_TIMEOUT="5000"
#ETCD_PROXY_READ_TIMEOUT="0"
#
#[Security]
#ETCD_CERT_FILE=""
#ETCD_KEY_FILE=""
#ETCD_CLIENT_CERT_AUTH="false"
#ETCD_TRUSTED_CA_FILE=""
#ETCD_AUTO_TLS="false"
#ETCD_PEER_CERT_FILE=""
#ETCD_PEER_KEY_FILE=""
#ETCD_PEER_CLIENT_CERT_AUTH="false"
#ETCD_PEER_TRUSTED_CA_FILE=""
#ETCD_PEER_AUTO_TLS="false"
#
#[Logging]
#ETCD_DEBUG="false"
#ETCD_LOG_PACKAGE_LEVELS=""
#ETCD_LOG_OUTPUT="default"
#
#[Unsafe]
#ETCD_FORCE_NEW_CLUSTER="false"
#
#[Version]
#ETCD_VERSION="false"
#ETCD_AUTO_COMPACTION_RETENTION="0"
#
#[Profiling]
#ETCD_ENABLE_PPROF="false"
#ETCD_METRICS="basic"
#
#[Auth]
#ETCD_AUTH_TOKEN="simple"

修改後的配置文件,另外兩臺對照更改

[root@Etcd1 /]# grep -v "^#" /etc/etcd/etcd.conf
#數據存放的目錄
ETCD_DATA_DIR="/var/lib/etcd/etcd1"
#監聽的URL,用於與其他節點通訊
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
#對外提供服務的地址,客戶端會連接到這裏和Etcd進行交互
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
#節點的名稱
ETCD_NAME="etcd1"
#改節點的member(同伴)監聽的地址,這個值會告訴集羣中其他節點
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.16.1.193:2380"
#對外公告的該節點客戶端監聽地址,這個值會告訴集羣中其他節點
ETCD_ADVERTISE_CLIENT_URLS="http://172.16.1.193:2379"
#集羣中所有節點的信息,這裏的 etcd1 是節點的 --name 指定的名字;後面的172.16.1.93:2380 是 --initial-advertise-peer-urls 指定的值
ETCD_INITIAL_CLUSTER="etcd1=http://172.16.1.193:2380,etcd2=http://172.16.1.195:2380,etcd3=http://172.16.1.198:2380"
# 創建集羣的 token,這個值每個集羣保持唯一。這樣的話,如果你要重新創建集羣,即使配置和之前一樣,也會再次生成新的集羣和節點 uuid;否則會導致多個集羣之間的衝突,造成未知的錯誤
ETCD_INITIAL_CLUSTER_TOKEN="zsf-etcd-cluster"
#新建集羣的時候,這個值爲 new ;假如已經存在的集羣,這個值爲 existing
ETCD_INITIAL_CLUSTER_STATE="new"

3.1.4 啓動etcd集羣,並查看其狀態

啓動etcd集羣

systemctl start etcd.service

集羣啓動完成之後我們在任意節點執行etcdctl member list 可列出所有集羣節點信息,

[root@Etcd1 /]# etcdctl member list
729a9a39e059871b: name=etcd2 peerURLs=http://172.16.1.195:2380 clientURLs=http://172.16.1.195:2379 isLeader=false
ce1ac55777b620f9: name=etcd1 peerURLs=http://172.16.1.193:2380 clientURLs=http://172.16.1.193:2379 isLeader=true
e62232af7400cdbe: name=etcd3 peerURLs=http://172.16.1.198:2380 clientURLs=http://172.16.1.198:2379 isLeader=false

使用etcdctl cluster-health檢查集羣健康狀態

[root@Etcd1 /]# etcdctl cluster-health
member 729a9a39e059871b is healthy: got healthy result from http://172.16.1.195:2379
member ce1ac55777b620f9 is healthy: got healthy result from http://172.16.1.193:2379
member e62232af7400cdbe is healthy: got healthy result from http://172.16.1.198:2379

4,etcdctl V3版本使用

etcdctl是一個命令行客戶端,它能提供一些簡潔的命令,供用戶直接跟etcd服務打交道,而無需基於 HTTP API方式。可以方便我們在對服務進行測試或者手動修改數據庫內容。建議剛剛接觸etcd時通過etdctl來熟悉相關操作。這些操作跟HTTP API基本上是對應的。

4.1 設置環境變量

etcd項目二進制發行包中已經包含了etcdctl工具,etcdctl支持的命令大體上分爲數據庫操作和非數據庫操作兩類。
因爲我們這邊使用的是etcd 3.3.11版本,etcdctl默認操作的事etcd 2.X 版本,2和3版本有些命令不一樣,所以我們要添加個環境變量,來使其默認操作etcd 3.X版本

export ETCDCTL_API=3

或者在`/etc/profile`文件中添加環境變量
vi /etc/profile
...
ETCDCTL_API=3
...
source /etc/profile

4.2 查看當前etcdctl的版本信息

[root@etcd-197 ~]# etcdctl version
etcdctl version: 3.3.11
API version: 3.3

4.3 ectd常用命令

4.3.1 增

//增
[root@etcd-197 ~]# etcdctl put zsf 'hello world!'
OK

4.3.2 查

[root@etcd-197 ~]# etcdctl get zsf
zsf
hello world!

指定爲json格式查找

[root@etcd-197 ~]# etcdctl get --write-out="json" zsf
{"header":{"cluster_id":14841639068965178418,"member_id":10276657743932975437,"revision":6,"raft_term":3},"kvs":[{"key":"enNm","create_revision":6,"mod_revision":6,"version":1,"value":"aGVsbG8gd29ybGQh"}],"count":1}

基於相同前綴查找

[root@etcd-197 ~]# etcdctl put zsf1 'one'
OK
[root@etcd-197 ~]# etcdctl put zsf2 'two'
OK
[root@etcd-197 ~]# etcdctl get zsf --prefix
zsf
hello world!
zsf1
one
zsf2
two

4.3.3 改

[root@etcd-197 ~]# etcdctl put zsf "test"
OK
[root@etcd-197 ~]# etcdctl get zsf
zsf
test

4.3.4 刪

[root@etcd-197 ~]# etcdctl del zsf1
1
[root@etcd-197 ~]# etcdctl get zsf1
[root@etcd-197 ~]#

4.3.5 查看集羣狀態

[root@etcd-197 ~]# etcdctl --write-out=table  endpoint status
+----------------+------------------+---------+---------+-----------+-----------+------------+
|    ENDPOINT    |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
+----------------+------------------+---------+---------+-----------+-----------+------------+
| 127.0.0.1:2379 | 8e9e05c52164694d |  3.3.11 |   20 kB |      true |         3 |         17 |
+----------------+------------------+---------+---------+-----------+-----------+------------+

4.4 集羣操作

member add          Adds a member into the cluster
member remove       Removes a member from the cluster
member update       Updates a member in the cluster
member list         Lists all members in the cluster

列出集羣成員:

[root@Etcd1 ~]# etcdctl member list -w table
+------------------+---------+-------+--------------------------+--------------------------+
|        ID        | STATUS  | NAME  |        PEER ADDRS        |       CLIENT ADDRS       |
+------------------+---------+-------+--------------------------+--------------------------+
| 729a9a39e059871b | started | etcd2 | http://172.16.1.195:2380 | http://172.16.1.195:2379 |
| ce1ac55777b620f9 | started | etcd1 | http://172.16.1.193:2380 | http://172.16.1.193:2379 |
| e62232af7400cdbe | started | etcd3 | http://172.16.1.198:2380 | http://172.16.1.198:2379 |
+------------------+---------+-------+--------------------------+--------------------------+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章