Etcd的集群也采用了主-从模式,通过Raft协议保证一段时间内有一个节点为主节点,其他为从节点,一旦主节点发生故障,其他节点可以自动再重新选举新的主节点
准备工作
参数名 | 说明 |
---|---|
-name | 设置成员节点的别名,建议为每个成员节点配置可识别的命名 |
-advertise-client-urls | 广播到集群中本成员的监听客户端请求的地址 |
-initial-advertise-peer-urls | 广播到集群中本成员的Peer监听通信地址 |
-listen-client-urls | 客户端请求的监听地址列表 |
-listen-peer-urls | Peer消息的监听服务地址列表 |
-initial-cluster-token | 启动集群的时候指定集群口令,只有相同token的几点才能加入到同一集群 |
-initial-cluster | 所有集群节点的地址列表 |
-initial-cluster-state | 初始化集群状态,默认为new,也可以指定为exi-string表示要加入到一个已有集群 |
节点 | 地址 |
---|---|
node1 | 192.168.1.1 |
node2 | 192.168.1.2 |
node3 | 192.168.1.3 |
本人只有一台机器,因此需要需要自定义网络,然后创建容器指定对应的ip
创建自定义docker网络,docker默认的网络只能自动分配ip,无法手动分配
代码语言:javascript复制# docker network create --subnet=192.168.0.0/16 etcdnet
代码语言:javascript复制
代码语言:javascript复制查看网络
代码语言:javascript复制
代码语言:javascript复制$ docker network ls
NETWORK ID NAME DRIVER SCOPE
1cd042f40976 bridge bridge local
4052e9cd1bb0 docker-mac-network_default bridge local
d5451df0790a etcdnet(自定义) bridge local
07dad153dbca host host local
da018c990a38 none null local
第一步:拉取镜像
代码语言:javascript复制$docker pull quay.io/coreos/etcd:v3.0.4
第二步:创建第一个节点
代码语言:javascript复制docker run -d
-p 2479:2379
-p 2381:2380
--name node1
--network=etcdnet
--ip 192.168.1.1
quay.io/coreos/etcd:v3.0.4
etcd
-name node1
-advertise-client-urls http://192.168.1.1:2379
-initial-advertise-peer-urls http://192.168.1.1:2380
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380
-initial-cluster-token etcd-cluster
-initial-cluster "node1=http://192.168.1.1:2380,node2=http://192.168.1.2:2380,node3=http://192.168.1.3:2380"
-initial-cluster-state new
第三步:创建第二个节点
代码语言:javascript复制docker run -d
-p 2579:2379
-p 2382:2380
--name node2
--network=etcdnet
--ip 192.168.1.2
quay.io/coreos/etcd:v3.0.4
etcd
-name node2
-advertise-client-urls http://192.168.1.2:2379
-initial-advertise-peer-urls http://192.168.1.2:2380
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380
-initial-cluster-token etcd-cluster
-initial-cluster
"node1=http://192.168.1.1:2380,node2=http://192.168.1.2:2380,node3=http://192.168.1.3:2380"
-initial-cluster-state new
第四步:创建第三个节点
代码语言:javascript复制docker run -d
-p 2679:2379
-p 2383:2380
--name node3
--network=etcdnet
--ip 192.168.1.3
quay.io/coreos/etcd:v3.0.4
etcd
-name node3
-advertise-client-urls http://192.168.1.3:2379
-initial-advertise-peer-urls http://192.168.1.3:2380
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380
-initial-cluster-token etcd-cluster
-initial-cluster "node1=http://192.168.1.1:2380,node2=http://192.168.1.2:2380,node3=http://192.168.1.3:2380"
-initial-cluster-state new
第五步:验证
代码语言:javascript复制$ docker exec -it c28b95508cbf etcdctl member list
288692ffb8a93e70: name=node3 peerURLs=http://192.168.1.3:2380 clientURLs=http://192.168.1.3:2379 isLeader=false
57641140d8f810cc: name=node1 peerURLs=http://192.168.1.1:2380 clientURLs=http://192.168.1.1:2379 isLeader=true
8dc1136f77aa7382: name=node2 peerURLs=http://192.168.1.2:2380 clientURLs=http://192.168.1.2:2379 isLeader=false
代码语言:javascript复制
代码语言:javascript复制第六步:操作验证
代码语言:javascript复制$ docker exec -it c28b95508cbf sh
/ # etcdctl set testkey testvalue
testvalue
//另外一台容器获取
$ docker exec -it e3b36f9c0c5c sh
/ # etcdctl get testkey
testvalue