etcd集群搭建
etcd是一种高度一致的分布式键值存储, 它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据. 它在网络分区期间优雅地处理领导者选举,并且可以容忍机器故障,即使在领导者节点中也是如此.今天我们简单了解下etcd集群的搭建.
etcd安装: https://www.cnblogs.com/wangtaobiu/p/16173610.html
配置参数
(*蓝色为本次测试用到的配置)
官网: https://doczhcn.gitbook.io/etcd/index/index-1/configuration
成员相关配置项
--name
-
-
-
- 节点名称
- default: "default"
- env variable: ETCD_NAME
- 这个值和--initial-cluster flag (e.g., default=http://localhost:2380)中的key值一一对应,如果在集群环境中,name必须是唯一的,建议用主机名称或者机器ID。
-
-
--data-dir
-
-
-
- 数据存储目录
- default: "${name}.etcd"
- env variable: ETCD_DATA_DIR
-
-
--wal-dir
-
-
-
- default: ""
- env variable: ETCD_WAL_DIR
- 存放预写式日志,最大的作用是记录了整个数据变化的全部历程。未设置,共用--data-dir文件所在目录。可以配置路径为专用磁盘,有助于避免日志记录和其他io操作之间的io竞争
-
-
--snapshot-count
-
-
-
- default: "100000"
- env variable: ETCD_SNAPSHOT_COUNT
- 数据快照触发数量,etcd处理指定的次数的事务提交后,生成数据快照
-
-
--heartbeat-interval
-
-
-
- default: "100"
- env variable: ETCD_HEARTBEAT_INTERVAL
- 客户端连接后的心跳间隔(毫秒)
-
-
--election-timeout
-
-
-
- default: "1000"
- env variable: ETCD_ELECTION_TIMEOUT
- 集群选举的超时时间
-
-
--listen-peer-urls
-
-
-
- default: "http://localhost:2380"
- env variable: ETCD_LISTEN_PEER_URLS
- example: "http://10.0.0.1:2380"
- invalid example: "http://example.com:2380" (domain name is invalid for binding)
- 本节点与其他节点进行数据交换(选举,数据同步)的监听地址,地址写法是 scheme://IP:port,可以多个并用逗号隔开,如果配置是http://0.0.0.0:2380,将不限制node访问地址
-
-
--listen-client-urls
-
-
-
- default: "http://localhost:2379"
- env variable: ETCD_LISTEN_CLIENT_URLS
- example: "http://10.0.0.1:2379"
- invalid example: "http://example.com:2379" (domain name is invalid for binding)
- 监听地址,地址写法是 scheme://IP:port,可以多个并用逗号隔开,如果配置是http://0.0.0.0:2379,将不限制node访问地址
-
-
--max-snapshots
-
-
-
- default: 5
- env variable: ETCD_MAX_SNAPSHOTS
- 要保留的快照文件的最大数量,0是无限制。Windows用户的默认值是无限制的,建议设置5以下的值。
-
-
--max-wals
-
-
-
- default: 5
- env variable: ETCD_MAX_WALS
- 要保留的wal文件的最大数量,0是无限制。Windows用户的默认值是无限制的,建议设置5以下的值。
-
-
--cors
-
-
-
- default: ""
- env variable: ETCD_CORS
- Comma-separated white list of origins for CORS (cross-origin resource sharing).
-
-
--quota-backend-bytes
-
-
-
- default: 0
- env variable: ETCD_QUOTA_BACKEND_BYTES
- 当后端大小超过给定的配额时发出报警
- 如果键空间的任何成员的后端数据库超过了空间配额, etcd 发起集群范围的警告,让集群进入维护模式,仅接收键的读取和删除。在键空间释放足够的空间之后,警告可以被解除,而集群将恢复正常运作。
- 详细信息: https://doc.zhnytech.com/etcd/documentation/op-guide/maintenance.html
- 详细信息: https://www.cnblogs.com/davygeek/p/8951999.html
-
-
--backend-batch-limit
-
-
-
- default: 0
- env variable: ETCD_BACKEND_BATCH_LIMIT
- 提交后端实物之前的最大操作
-
-
--backend-batch-interval
-
-
-
- default: 0
- env variable: ETCD_BACKEND_BATCH_INTERVAL
- 提交后端事物之前的最长时间
-
-
--max-txn-ops
-
-
-
- default: 128
- env variable: ETCD_MAX_TXN_OPS
- 事物中允许的最大操作数
-
-
--max-request-bytes
-
-
-
- default: 1572864
- env variable: ETCD_MAX_REQUEST_BYTES
- 服务器可以接受的客户端请求大小
-
-
--grpc-keepalive-min-time
-
-
-
- default: 5s
- env variable: ETCD_GRPC_KEEPALIVE_MIN_TIME
- 客户端在ping服务器之前最少要等待多久
-
-
--grpc-keepalive-interval
-
-
-
- default: 2h
- env variable: ETCD_GRPC_KEEPALIVE_INTERVAL
- 服务器ping客户端的频率,检查连接是否处于活动状态(0表示禁用)
-
-
--grpc-keepalive-timeout
-
-
-
- default: 20s
- env variable: ETCD_GRPC_KEEPALIVE_TIMEOUT
- 关闭非响应连接之前额外等待时间(0表示禁用)
-
-
集群配置
--initial-advertise-peer-urls
-
-
-
- default: "http://localhost:2380"
- env variable: ETCD_INITIAL_ADVERTISE_PEER_URLS
- example: "http://example.com:2380, http://10.0.0.1:2380"
- 通知其他节点与本节点进行数据交换(选举,同步)的地址,URL可以使用domain地址。
- 与--listener-peer-urls不同在于listener-peer-urls用于请求客户端的接入控制,initial-advertise-peer-urls是告知其他集群节点访问哪个URL,一般来说,initial-advertise-peer-urlsl将是istener-peer-urls的子集
-
-
--initial-cluster
-
-
-
- 用于引导初始集群配置,集群中所有节点的信息。
- default: "default=http://localhost:2380"
- env variable: ETCD_INITIAL_CLUSTER
- 此处default为节点的--name指定的名字;localhost:2380为--initial-advertise-peer-urls指定的值。
-
-
--initial-cluster-state
-
-
-
- 初始集群状态,设置new为初始静态或DNS引导期间出现的所有成员。如果将此选项设置为existing,则etcd将尝试加入现有群集。
- default: "new"
- env variable: ETCD_INITIAL_CLUSTER_STATE
-
-
--initial-cluster-token
-
-
-
- 集群唯一标识,相同标识的节点将视为在一个集群内
- default: "etcd-cluster"
- env variable: ETCD_INITIAL_CLUSTER_TOKEN
-
-
--advertise-client-urls
-
-
-
- 用于通知其他ETCD节点,客户端接入本节点的监听地址,一般来说advertise-client-urls是listen-client-urls子集,这些URL可以包含域名。
- default: "http://localhost:2379"
- env variable: ETCD_ADVERTISE_CLIENT_URLS
- example: "http://example.com:2379, http://10.0.0.1:2379"
- 注意,不能写http://localhost:237,这样就是通知其他节点,可以用localhost访问,将导致ectd的客户端用localhost访问本地,导致访问不通。还有一个更可怕情况,ectd布置了代理层,代理层将一直通过locahost访问自己的代理接口,导致无限循环。
-
-
--discovery
-
-
-
- 集群发现服务地址
- default: none
- env variable: ETCD_DISCOVERY_SRV
-
-
--discovery-srv
-
-
-
- 用于引导集群的DNS sry域
- default: ""
- env variable: ETCD_DISCOVERY_SRV
-
-
--discovery-srv-name
-
-
-
- 使用DNS引导时查询的DNS srv名称的后缀
- default: ""
- env variable: ETCD_DISCOVERY_SRV_NAME
-
-
--discovery-fallback
-
-
-
- 发现服务失败时的预期行为(“退出”或“代理”)。“proxy”仅支持v2 API
- default: "proxy"
- env variable: ETCD_DISCOVERY_FALLBACK
-
-
--discovery-proxy
-
-
-
- 用于流量到发现服务的HTTP代理
- default: ""
- env variable: ETCD_DISCOVERY_PROXY
-
-
--strict-reconfig-check
-
-
-
- 拒绝可能导致仲裁丢失的重新配置请求。
- default: true
- env variable: ETCD_STRICT_RECONFIG_CHECK
-
-
--auto-compaction-retention
-
-
-
- 在一个小时内为mvcc键值存储的自动压实保留。0表示禁用自动压缩
- default: 0
- env variable: ETCD_AUTO_COMPACTION_RETENTION
-
-
--auto-compaction-mode
-
-
-
- 说明--auto-compaction-retention配置的基于时间保留的三种模式:periodic, revision. periodic
- default: periodic
- env variable: ETCD_AUTO_COMPACTION_MODE
-
-
--enable-v2
-
-
-
- 接受etcd V2客户端请求
- default: true
- env variable: ETCD_ENABLE_V2
-
-
日志配置
--logger
-
-
-
- 为结构化日志记录指定'zap'或'capnslog'。
- default: capnslog
- env variable: ETCD_LOGGER
-
-
--log-outputs
-
-
-
- 指定'stdout'或'stderr'以跳过日志记录,即使在systemd或逗号分隔的输出目标列表下运行也是如此。
- default: default
- env variable: ETCD_LOG_OUTPUTS
- 在zap日志程序迁移期间,默认使用v3.4的“stderr”配置
-
-
--debug
-
-
-
- 将所有子包的默认日志级别设置为DEBUG。
- default: false (INFO for all packages)
- env variable: ETCD_DEBUG
-
-
--log-package-levels
-
-
-
- 将单个etcd子包设置为特定的日志级别。一个例子是etcdserver=WARNING,security=DEBUG
- default: "" (INFO for all packages)
- env variable: ETCD_LOG_PACKAGE_LEVELS
-
-
其他配置
--version
-
-
-
- Print the version and exit.
- default: false
-
-
--config-file
-
-
-
- 从文件中加载服务器配置。注意如果提供了配置文件,其他命令行参数和环境变量将被忽略
- default: ""
- example: sample configuration file
- env variable: ETCD_CONFIG_FILE
-
-
集群搭建
配置文件(绿色需根据自身情况修改):
cat << EOF > /lib/systemd/system/etcd.service
[Unit]
Description=etcd service
Documentation=https://github.com/coreos/etcd
[Service]
User=root
Type=notify
ExecStart=/usr/bin/etcd \\
--name etcd-3 \\
--data-dir /data \\
--initial-advertise-peer-urls http://192.168.79.137:2380 \\
--listen-peer-urls http://192.168.79.137:2380 \\
--listen-client-urls http://192.168.79.137:2379,http://127.0.0.1:2379 \\
--advertise-client-urls http://192.168.79.137:2379 \\
--initial-cluster-token etcd-cluster \\
--initial-cluster etcd-1=http://192.168.79.134:2380,etcd-2=http://192.168.79.136:2380,etcd-3=http://192.168.79.137:2380 \\
--initial-cluster-state new \\
--heartbeat-interval 1000 \\
--election-timeout 5000Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
这样配置完成后etcd就注册到了系统中,执行下边操作即可启动etcd节点,多个节点执行同样的操作,集群搭建成功:
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
效果展示:
服务器:
-
-
- etcd-1: 192.168.79.134:2379
- etcd-2: 192.168.79.136:2379
- etcd-3: 192.168.79.137:2379
-
集群查看:
etcdctl endpoint status --cluster -w table
+----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | http://192.168.79.137:2379 | 95a497aa790a6957 | 3.5.1 | 20 kB | false | false | 2 | 10 | 10 | | | http://192.168.79.134:2379 | b7380bffd1c1af24 | 3.5.1 | 20 kB | true | false | 2 | 10 | 10 | | | http://192.168.79.136:2379 | c6a5db1cd31cb4ab | 3.5.1 | 20 kB | false | false | 2 | 10 | 10 | | +----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+