1. etcd 高可用静态部署
在生产环境或对高可用有要求的环境下,需要使用 etcd 的高可用部署方式进行部署,etcd 的 raft 协议保障各个节点数据的一致性。
1.1. 核心配置
etcd 静态部署的核心配置就是 initial-cluster
参数,该参数在节点启动时就明确指定了该集群由哪些节点组成。
etcd 集群成员之前通讯使用和客户端不同的 peer 端口。
例如,如果 client 端口是 32379 时,可以将 peer 端口配置为 32380。
环境变量的配置参数
ETCD_INITIAL_CLUSTER="etcd01=http://10.100.0.13:32380,etcd02=http://10.100.0.14:32380,etcd03=http://10.100.0.15:32380"
或者,等价的启动参数配置
--initial-cluster="etcd01=http://10.100.0.13:32380,etcd02=http://10.100.0.14:32380,etcd03=http://10.100.0.15:32380"
以 --initial-cluster
开头的命令行参数将在 etcd 随后的运行中被忽略。可以在初始化启动进程之后随意的删除环境变量或者命令行标记。如果配置需要稍后修改(例如,添加成员到集群或者从集群中移除成员),查看运行时配置。
1.2. systemd 配置
我们以3个节点的高可用静态方式部署 etcd,3个节点的IP地址分别是 10.100.0.13
、10.100.0.14
和 10.100.0.15
。
由于每个节点的 IP 地址差异,每个节点上配置不完全相同;主要的差异就是当前节点的 IP 地址和命名。
例如在 10.100.0.13
上,etcd 的名称是 etcd01
,IP地址是 10.100.0.13
,那么其 /etc/etcd/etcd.conf
的配置内容如下:
10.100.0.13
节点配置
ETCD_NAME="etcd01"
ETCD_DATA_DIR="/data/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://10.100.0.13:32380"
ETCD_LISTEN_CLIENT_URLS="http://10.100.0.13:32379,http://127.0.0.1:32379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.100.0.13:32380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.100.0.13:32379"
ETCD_INITIAL_CLUSTER="etcd01=http://10.100.0.13:32380,etcd02=http://10.100.0.14:32380,etcd03=http://10.100.0.15:32380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
10.100.0.14
节点配置
ETCD_NAME="etcd02"
ETCD_DATA_DIR="/data/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://10.100.0.14:32380"
ETCD_LISTEN_CLIENT_URLS="http://10.100.0.14:32379,http://127.0.0.1:32379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.100.0.14:32380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.100.0.14:32379"
ETCD_INITIAL_CLUSTER="etcd01=http://10.100.0.13:32380,etcd02=http://10.100.0.14:32380,etcd03=http://10.100.0.15:32380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
10.100.0.15
节点配置
ETCD_NAME="etcd03"
ETCD_DATA_DIR="/data/etcd/default.etcd"
ETCD_LISTEN_PEER_URLS="http://10.100.0.15:32380"
ETCD_LISTEN_CLIENT_URLS="http://10.100.0.15:32379,http://127.0.0.1:32379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.100.0.15:32380"
ETCD_ADVERTISE_CLIENT_URLS="http://10.100.0.15:32379"
ETCD_INITIAL_CLUSTER="etcd01=http://10.100.0.13:32380,etcd02=http://10.100.0.14:32380,etcd03=http://10.100.0.15:32380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
然后分别启动各个节点的 etcd 服务
1.3. 查看集群状态
etcdctl --endpoints http://10.100.0.13:32379 endpoint status --cluster -w table
+--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| http://10.100.0.13:32379 | a724bcfdc0f9fe8a | 3.4.14 | 22 MB | true | false | 4 | 9013 | 9013 | |
| http://10.100.0.14:32379 | a724bcfdc0f9fe8a | 3.4.14 | 22 MB | false | false | 4 | 9013 | 9013 | |
| http://10.100.0.15:32379 | a724bcfdc0f9fe8a | 3.4.14 | 22 MB | false | false | 4 | 9013 | 9013 | |
+--------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
正常的集群没有 ERROR 异常,而且有一个节点的 IS LEADER
的值为 true
1.4. 读写数据
写入数据
$ etcdctl --endpoints http://10.100.0.13:32379 put ha-key ha-values
OK
读取数据
etcdctl --endpoints http://10.100.0.13:32379 get ha-key
ha-key
ha-values