etcd快速入門

bytemode · · 118 次點擊 · · 開始瀏覽    
## 安裝 下載地址:https://github.com/etcd-io/etcd/releases 下載完成解壓后,目錄中有兩個二進制文件, etcd以及 etcdctl。其中 etcd就是運行etcd服務的二進制文件, etcdctl是官方提供的命令行etcd客戶端,使用 etcdctl可以在命令行中訪問etcd服務。 查看etcd版本 `./etcd --version` ## 運行 ### 單點啟動 查看啟動幫助 `./etcd -h` 啟動 `./etcd` ``` 2019-11-01 10:04:11.922204 I | embed: name = default 2019-11-01 10:04:11.922204 I | embed: data dir = default.etcd 2019-11-01 10:04:11.922204 I | embed: member dir = default.etcd\member 2019-11-01 10:04:11.922204 I | embed: heartbeat = 100ms 2019-11-01 10:04:11.922204 I | embed: election = 1000ms 2019-11-01 10:04:11.922204 I | embed: snapshot count = 100000 2019-11-01 10:04:11.923204 I | embed: advertise client URLs = http://localhost:2379 2019-11-01 10:04:11.923204 I | embed: initial advertise peer URLs = http://localhost:2380 2019-11-01 10:04:11.923204 I | embed: initial cluster = ``` etcd服務啟動后提供給外部客戶端通信的端口是2379,而etcd服務中成員間的通信端口是2380(Peer是對同一個 etcd 集群中另外一個 Member 的稱呼). `-name `節點名稱,默認是UUID `-data-dir` 保存日志和快照的目錄,默認為當前工作目錄 `-addr` 公布的ip地址和端口。默認為`127.0.0.1:2379 ` `-bind-addr` 用于客戶端連接的監聽地址,默認為-addr配置 `-peers` 集群成員逗號分隔的列表,例如 `127.0.0.1:2380,127.0.0.1:2381 ` `-peer-addr` 集群服務通訊的公布的IP地址,默認為 `127.0.0.1:2380`. `-peer-bind-addr` 集群服務通訊的監聽地址,默認為-peer-addr配置 `--snapshot-count`:指定有多少事務(transaction)被提交時,觸發截取快照保存到磁盤 `--heartbeat-interval`:leader 多久發送一次心跳到 followers。默認值是 100ms `--eletion-timeout`:重新投票的超時時間,如果 follow 在該時間間隔沒有收到心跳包,會觸發重新投票,默認為 1000 ms `--listen-peer-urls`:和同伴通信的地址,比如 `http://ip:2380`,如果有多個,使用逗號分隔。需要所有節點都能夠訪問,所以不要使用 localhost! `--listen-client-urls`:對外提供服務的地址:比如 `http://ip:2379,http://127.0.0.1:2379`,客戶端會連接到這里和 etcd 交互 `--advertise-client-urls`:對外公告的該節點客戶端監聽地址,這個值會告訴集群中其他節點 `--initial-advertise-peer-urls`:該節點同伴監聽地址,這個值會告訴集群中其他節點 `--initial-cluster`:集群中所有節點的信息,格式為 `node1=http://ip1:2380,node2=http://ip2:2380,…`。注意:這里的 node1 是節點的 --name 指定的名字;后面的 `ip1:2380` 是 `--initial-advertise-peer-urls` 指定的值 `--initial-cluster-state`:新建集群的時候,這個值為 new;假如已經存在的集群,這個值為 existing `--initial-cluster-token`:創建集群的 token,這個值每個集群保持唯一。 ### 集群啟動 在安裝和啟動 etcd 服務的時候,各個節點需要知道集群中其他節點的信息(一般是 ip 和 port 信息)。根據你是否可以提前知道每個節點的 ip,有幾種不同的啟動方案: 1. 靜態配置:在啟動 etcd server 的時候,通過 `--initial-cluster` 參數配置好所有的節點信息 2. 使用已有的 etcd cluster 來注冊和啟動,比如官方提供的 discovery.etcd.io 3. 使用 DNS 啟動 ## 基礎知識 每個 etcd cluster 都是有若干個 member 組成的,每個 member 是一個獨立運行的 etcd 實例,單臺機器上可以運行多個 member。 在正常運行的狀態下,集群中會有一個 leader,其余的 member 都是 followers。leader 向 followers 同步日志,保證數據在各個 member 都有副本。leader 還會定時向所有的 member 發送心跳報文,如果在規定的時間里 follower 沒有收到心跳,就會重新進行選舉。 客戶端所有的請求都會先發送給 leader,leader 向所有的 followers 同步日志,等收到超過半數的確認后就把該日志存儲到磁盤,并返回響應客戶端。 每個 etcd 服務有三大主要部分組成:raft 實現、WAL 日志存儲、數據的存儲和索引。WAL 會在本地磁盤(就是之前提到的 --data-dir)上存儲日志內容(wal file)和快照(snapshot)。 ## etcdctl命令 ### API版本設置 使用etcd v3 `export ETCDCTL_API=3` `set ETCDCTL_API=3` 查詢集群成員 `./etcdctl member list` 查詢節點狀態 ` ./etcdctl --endpoints localhost:2379 endpoint status --write-out="table"` ### 監聽一個key `./etcdctl watch /key/test` ### 增刪改查key ``` ./etcdctl put /key/test 11 OK ./etcdctl get /key/test /key/test 11 ./etcdctl put /key/test 22 OK ./etcdctl get /key/test ./etcdctl get /key/test /key/test 22 etcdctl del /key/test 1 #刪除所有/key 前綴的節點 etcdctl del /key --prefix ``` ### 租約 申請租約,從申請開始計算時間 ``` λ ./ettcdctl lease grant 30 lease 694d6e1b7f77f40b granted with TTL(30s) ``` 授權租約,節點的生命伴隨著租約到期將會被DELETE ``` λ ./etcdctl put --lease=694d6e1b7f77f40b /key/leasetest "leasetest" OK ``` 撤銷租約,撤銷租約和租約到期一樣,節點都會被刪除 ``` ./etcdctl lease revoke 4e5e5b853f5286cc lease 4e5e5b853f5286cc revoked ``` 租約續約,每當到期將會續約 ``` ./etcdctl lease keep-alive 4e5e5b853f52892b lease 694d6e1b7f77f40b keepalived with TTL(40) lease 694d6e1b7f77f40b keepalived with TTL(40) ``` ## 核心API ### KV:鍵值相關操作 對外提供的接口: ``` type KV interface { // 存放. Put(ctx context.Context, key, val string, opts ...OpOption) (*PutResponse, error) // 獲取. Get(ctx context.Context, key string, opts ...OpOption) (*GetResponse, error) // 刪除. Delete(ctx context.Context, key string, opts ...OpOption) (*DeleteResponse, error) // 壓縮rev指定版本之前的歷史數據. Compact(ctx context.Context, rev int64, opts ...CompactOption) (*CompactResponse, error) // 通用的操作執行命令,可用于操作集合的遍歷。Put/Get/Delete也是基于Do. Do(ctx context.Context, op Op) (OpResponse, error) // 創建一個事務,只支持If/Then/Else/Commit操作. Txn(ctx context.Context) Txn } ``` ### Watch:觀察者模式,監聽數據變化 對外提供的接口: ``` type Watcher interface { // 監視key的變化,返回變化的結果 Watch(ctx context.Context, key string, opts ...OpOption) WatchChan // 關閉所有監視器 Close() error } ``` ### Lease:租約相關操作 對外提供的接口: ``` type Lease interface { // 分配一個租約. Grant(ctx context.Context, ttl int64) (*LeaseGrantResponse, error) // 釋放一個租約. Revoke(ctx context.Context, id LeaseID) (*LeaseRevokeResponse, error) // 獲取剩余TTL時間. TimeToLive(ctx context.Context, id LeaseID, opts ...LeaseOption) (*LeaseTimeToLiveResponse, error) // 獲取所有租約. Leases(ctx context.Context) (*LeaseLeasesResponse, error) // 續約保持激活狀態. KeepAlive(ctx context.Context, id LeaseID) (<-chan *LeaseKeepAliveResponse, error) // 僅續約激活一次. KeepAliveOnce(ctx context.Context, id LeaseID) (*LeaseKeepAliveResponse, error) // 關閉續約激活的功能. Close() error } ``` ### Cluster:集群管理相關操作 對外提供的接口: ``` type Cluster interface { // 列出集群所有成員. MemberList(ctx context.Context) (*MemberListResponse, error) // 添加新成員到集群中. MemberAdd(ctx context.Context, peerAddrs []string) (*MemberAddResponse, error) // 移除一個集群中的成員. MemberRemove(ctx context.Context, id uint64) (*MemberRemoveResponse, error) // 更新一個集群成員的地址. MemberUpdate(ctx context.Context, id uint64, peerAddrs []string) (*MemberUpdateResponse, error) } ```

入群交流(和以上內容無關):Go中文網 QQ 交流群:729884609 或加微信入微信群:274768166 備注:入群;關注公眾號:Go語言中文網

118 次點擊  ?  1 贊  
加入收藏 微博
暫無回復
添加一條新回復 (您需要 登錄 后才能回復 沒有賬號 ?)
  • 請盡量讓自己的回復能夠對別人有幫助
  • 支持 Markdown 格式, **粗體**、~~刪除線~~、`單行代碼`
  • 支持 @ 本站用戶;支持表情(輸入 : 提示),見 Emoji cheat sheet
  • 圖片支持拖拽、截圖粘貼等方式上傳