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

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

1, Etcd簡介

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

etcd做爲服務發現系統,有如下特色:linux

  • 簡單: 安裝配置簡單,並且提供了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便可json

yum -y install etcd

啓動服務安全

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

查看服務狀態bash

[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 查詢方式獲取其餘節點地址信息ide

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 |
+------------------+---------+-------+--------------------------+--------------------------+
相關文章
相關標籤/搜索