美文网首页Etcd
etcd 官方示例

etcd 官方示例

作者: 鼠工 | 来源:发表于2019-07-31 10:49 被阅读0次

    原文地址:https://etcd.io/docs/v3.3.12/demo/

    启动集群(Set up a cluster)

    在每个etcd节点上,指定集群成员:

    TOKEN=token-01
    CLUSTER_STATE=new
    NAME_1=machine-1
    NAME_2=machine-2
    NAME_3=machine-3
    HOST_1=10.240.0.17
    HOST_2=10.240.0.18
    HOST_3=10.240.0.19
    CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
    

    在每个etcd节点上进行如下操作:

    # For machine 1
    THIS_NAME=${NAME_1}
    THIS_IP=${HOST_1}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
        --initial-cluster ${CLUSTER} \
        --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    
    # For machine 2
    THIS_NAME=${NAME_2}
    THIS_IP=${HOST_2}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
        --initial-cluster ${CLUSTER} \
        --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    
    # For machine 3
    THIS_NAME=${NAME_3}
    THIS_IP=${HOST_3}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
        --initial-cluster ${CLUSTER} \
        --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    

    或使用我们的公共发现服务:

    curl https://discovery.etcd.io/new?size=3
    https://discovery.etcd.io/a81b5818e67a6ea83e9d4daea5ecbc92
    
    # grab this token
    TOKEN=token-01
    CLUSTER_STATE=new
    NAME_1=machine-1
    NAME_2=machine-2
    NAME_3=machine-3
    HOST_1=10.240.0.17
    HOST_2=10.240.0.18
    HOST_3=10.240.0.19
    DISCOVERY=https://discovery.etcd.io/a81b5818e67a6ea83e9d4daea5ecbc92
    
    THIS_NAME=${NAME_1}
    THIS_IP=${HOST_1}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
        --discovery ${DISCOVERY} \
        --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    
    THIS_NAME=${NAME_2}
    THIS_IP=${HOST_2}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
        --discovery ${DISCOVERY} \
        --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    
    THIS_NAME=${NAME_3}
    THIS_IP=${HOST_3}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
        --discovery ${DISCOVERY} \
        --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
    

    现在etcd准备好了!使用etcdctl连接到etcd:

    export ETCDCTL_API=3
    HOST_1=10.240.0.17
    HOST_2=10.240.0.18
    HOST_3=10.240.0.19
    ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
    
    etcdctl --endpoints=$ENDPOINTS member list
    

    访问etcd(Access etcd)

    put 写操作:

    etcdctl --endpoints=$ENDPOINTS put foo "Hello World!"
    

    get 读操作:

    etcdctl --endpoints=$ENDPOINTS get foo
    etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo
    

    前缀查找(Get by prefix)

    etcdctl --endpoints=$ENDPOINTS put web1 value1
    etcdctl --endpoints=$ENDPOINTS put web2 value2
    etcdctl --endpoints=$ENDPOINTS put web3 value3
    
    etcdctl --endpoints=$ENDPOINTS get web --prefix
    

    删除操作(Delete)

    etcdctl --endpoints=$ENDPOINTS put key myvalue
    etcdctl --endpoints=$ENDPOINTS del key
    
    etcdctl --endpoints=$ENDPOINTS put k1 value1
    etcdctl --endpoints=$ENDPOINTS put k2 value2
    etcdctl --endpoints=$ENDPOINTS del k --prefix
    

    事务(Transactional write)

    etcd中事务是原子执行的,只支持if … then … else …这种表达,类似三元表达式:

    etcdctl --endpoints=$ENDPOINTS put user1 bad
    etcdctl --endpoints=$ENDPOINTS txn --interactive
    
    compares:
    value("user1") = "bad"      
    
    success requests (get, put, delete):
    del user1  
    
    failure requests (get, put, delete):
    put user1 good
    

    监听(Watch)

    watch to get notified of future changes:

    etcdctl --endpoints=$ENDPOINTS watch stock1
    etcdctl --endpoints=$ENDPOINTS put stock1 1000
    
    etcdctl --endpoints=$ENDPOINTS watch stock --prefix
    etcdctl --endpoints=$ENDPOINTS put stock1 10
    etcdctl --endpoints=$ENDPOINTS put stock2 20
    

    租约(Lease)

    lease to write with TTL:

    etcdctl --endpoints=$ENDPOINTS lease grant 300
    # lease 2be7547fbc6a5afa granted with TTL(300s)
    
    etcdctl --endpoints=$ENDPOINTS put sample value --lease=2be7547fbc6a5afa
    etcdctl --endpoints=$ENDPOINTS get sample
    
    etcdctl --endpoints=$ENDPOINTS lease keep-alive 2be7547fbc6a5afa
    etcdctl --endpoints=$ENDPOINTS lease revoke 2be7547fbc6a5afa
    # or after 300 seconds
    etcdctl --endpoints=$ENDPOINTS get sample
    

    分布式锁(Distributed locks)

    lock for distributed lock:

    etcdctl --endpoints=$ENDPOINTS lock mutex1
    
    # another client with the same name blocks
    etcdctl --endpoints=$ENDPOINTS lock mutex1
    

    选举(Elections)

    elect for leader election:

    etcdctl --endpoints=$ENDPOINTS elect one p1
    
    # another client with the same name blocks
    etcdctl --endpoints=$ENDPOINTS elect one p2
    

    集群状态监控(Cluster status)

    健康状态检查

    etcdctl --write-out=table --endpoints=$ENDPOINTS endpoint status
    
    +------------------+------------------+---------+---------+-----------+-----------+------------+
    |     ENDPOINT     |        ID        | VERSION | DB SIZE | IS LEADER | RAFT TERM | RAFT INDEX |
    +------------------+------------------+---------+---------+-----------+-----------+------------+
    | 10.240.0.17:2379 | 4917a7ab173fabe7 | 3.0.0   | 45 kB   | true      |         4 |      16726 |
    | 10.240.0.18:2379 | 59796ba9cd1bcd72 | 3.0.0   | 45 kB   | false     |         4 |      16726 |
    | 10.240.0.19:2379 | 94df724b66343e6c | 3.0.0   | 45 kB   | false     |         4 |      16726 |
    +------------------+------------------+---------+---------+-----------+-----------+------------+
    
    etcdctl --endpoints=$ENDPOINTS endpoint health
    
    10.240.0.17:2379 is healthy: successfully committed proposal: took = 3.345431ms
    10.240.0.19:2379 is healthy: successfully committed proposal: took = 3.767967ms
    10.240.0.18:2379 is healthy: successfully committed proposal: took = 4.025451ms
    

    快照(Snapshot)

    snapshot 用于保存etcd数据库的快照:

    etcdctl --endpoints=$ENDPOINTS snapshot save my.db
    
    Snapshot saved at my.db
    
    etcdctl --write-out=table --endpoints=$ENDPOINTS snapshot status my.db
    
    +---------+----------+------------+------------+
    |  HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
    +---------+----------+------------+------------+
    | c55e8b8 |        9 |         13 | 25 kB      |
    +---------+----------+------------+------------+
    

    (迁移)Migrate

    migrate 用于将v2迁移到v3:

    # write key in etcd version 2 store
    export ETCDCTL_API=2
    etcdctl --endpoints=http://$ENDPOINT set foo bar
    
    # read key in etcd v2
    etcdctl --endpoints=$ENDPOINTS --output="json" get foo
    
    # stop etcd node to migrate, one by one
    
    # migrate v2 data
    export ETCDCTL_API=3
    etcdctl --endpoints=$ENDPOINT migrate --data-dir="default.etcd" --wal-dir="default.etcd/member/wal"
    
    # restart etcd node after migrate, one by one
    
    # confirm that the key got migrated
    etcdctl --endpoints=$ENDPOINTS get /foo
    

    集群成员管理(Member)

    member 用于添加,删除,更新成员:

    # For each machine
    TOKEN=my-etcd-token-1
    CLUSTER_STATE=new
    NAME_1=etcd-node-1
    NAME_2=etcd-node-2
    NAME_3=etcd-node-3
    HOST_1=10.240.0.13
    HOST_2=10.240.0.14
    HOST_3=10.240.0.15
    CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
    
    # For node 1
    THIS_NAME=${NAME_1}
    THIS_IP=${HOST_1}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 \
        --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 \
        --listen-client-urls http://${THIS_IP}:2379 \
        --initial-cluster ${CLUSTER} \
        --initial-cluster-state ${CLUSTER_STATE} \
        --initial-cluster-token ${TOKEN}
    
    # For node 2
    THIS_NAME=${NAME_2}
    THIS_IP=${HOST_2}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 \
        --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 \
        --listen-client-urls http://${THIS_IP}:2379 \
        --initial-cluster ${CLUSTER} \
        --initial-cluster-state ${CLUSTER_STATE} \
        --initial-cluster-token ${TOKEN}
    
    # For node 3
    THIS_NAME=${NAME_3}
    THIS_IP=${HOST_3}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 \
        --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 \
        --listen-client-urls http://${THIS_IP}:2379 \
        --initial-cluster ${CLUSTER} \
        --initial-cluster-state ${CLUSTER_STATE} \
        --initial-cluster-token ${TOKEN}
    

    然后使用命令 member removemember add替换成员:

    # get member ID
    export ETCDCTL_API=3
    HOST_1=10.240.0.13
    HOST_2=10.240.0.14
    HOST_3=10.240.0.15
    etcdctl --endpoints=${HOST_1}:2379,${HOST_2}:2379,${HOST_3}:2379 member list
    
    # remove the member
    MEMBER_ID=278c654c9a6dfd3b
    etcdctl --endpoints=${HOST_1}:2379,${HOST_2}:2379,${HOST_3}:2379 \
        member remove ${MEMBER_ID}
    
    # add a new member (node 4)
    export ETCDCTL_API=3
    NAME_1=etcd-node-1
    NAME_2=etcd-node-2
    NAME_4=etcd-node-4
    HOST_1=10.240.0.13
    HOST_2=10.240.0.14
    HOST_4=10.240.0.16 # new member
    etcdctl --endpoints=${HOST_1}:2379,${HOST_2}:2379 \
        member add ${NAME_4} \
        --peer-urls=http://${HOST_4}:2380
    

    接下来启动新成员,使用--initial-cluster-state标志:

    # [WARNING] If the new member starts from the same disk space,
    # make sure to remove the data directory of the old member
    # [警告] 如果新成员和旧成员使用同一个磁盘空间,需要先清除旧成员的历史数据
    #
    # restart with 'existing' flag
    TOKEN=my-etcd-token-1
    CLUSTER_STATE=existing
    NAME_1=etcd-node-1
    NAME_2=etcd-node-2
    NAME_4=etcd-node-4
    HOST_1=10.240.0.13
    HOST_2=10.240.0.14
    HOST_4=10.240.0.16 # new member
    CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_4}=http://${HOST_4}:2380
    
    THIS_NAME=${NAME_4}
    THIS_IP=${HOST_4}
    etcd --data-dir=data.etcd --name ${THIS_NAME} \
        --initial-advertise-peer-urls http://${THIS_IP}:2380 \
        --listen-peer-urls http://${THIS_IP}:2380 \
        --advertise-client-urls http://${THIS_IP}:2379 \
        --listen-client-urls http://${THIS_IP}:2379 \
        --initial-cluster ${CLUSTER} \
        --initial-cluster-state ${CLUSTER_STATE} \
        --initial-cluster-token ${TOKEN}
    

    权限(Auth)

    auth,user,role for authentication:

    export ETCDCTL_API=3
    ENDPOINTS=localhost:2379
    
    etcdctl --endpoints=${ENDPOINTS} role add root
    etcdctl --endpoints=${ENDPOINTS} role grant-permission root readwrite foo
    etcdctl --endpoints=${ENDPOINTS} role get root
    
    etcdctl --endpoints=${ENDPOINTS} user add root
    etcdctl --endpoints=${ENDPOINTS} user grant-role root root
    etcdctl --endpoints=${ENDPOINTS} user get root
    
    etcdctl --endpoints=${ENDPOINTS} auth enable
    # now all client requests go through auth
    
    etcdctl --endpoints=${ENDPOINTS} --user=root:123 put foo bar
    etcdctl --endpoints=${ENDPOINTS} get foo
    etcdctl --endpoints=${ENDPOINTS} --user=root:123 get foo
    etcdctl --endpoints=${ENDPOINTS} --user=root:123 get foo1
    

    相关文章

      网友评论

        本文标题:etcd 官方示例

        本文链接:https://www.haomeiwen.com/subject/gozarctx.html