centos搭建etcd集群

April 1, 2023

这篇文章主要介绍了如何在CentOS系统上搭建etcd集群。首先,文章详细解释了etcd的特点和相关概念。然后,文章通过实例详细介绍了如何在三个节点上安装etcd,包括初始化节点和新增节点。最后,文章还介绍了如何移除节点。文章的内容详细且实用,对于需要在CentOS系统上搭建etcd集群的读者来说非常有帮助。

etcd基于Raft一致性算法实现了数据的高可用和强一致性,可以支持数千台机器的集群。通过将数据存储在内存中并异步持久化到磁盘上,Etcd在性能和数据可靠性之间取得了很好的平衡。

etcd被广泛用于Kubernetes中的服务发现和配置管理,例如存储Pod的状态、控制器的配置等。

一、etcd的特点

  1. 分布式:Etcd采用分布式的架构,支持多台机器构成的集群。在集群中,每个节点都可以读写数据,同时也会复制数据到其他节点,以保证数据的可靠性和一致性。
  2. 高可用性:Etcd采用Raft一致性算法来实现数据的高可用性和强一致性。在集群中,如果某个节点出现故障,其他节点会自动接管该节点的工作,保证数据的可用性和服务的连续性。
  3. 强一致性:Etcd保证了数据的强一致性,即任何时候,任何一个节点读取到的数据都是最新的。在写入数据时,Etcd会保证所有节点都成功写入数据后才返回成功结果,以保证数据的一致性。
  4. 高性能:Etcd采用了内存存储和异步持久化的方式,以保证读写操作的高性能。同时,Etcd还提供了一套简单易用的HTTP API,使得开发人员可以方便地进行数据读写和监控。
  5. 简单易用:Etcd提供了一套简单易用的API,使得开发人员可以方便地进行数据读写和监控。同时,Etcd还提供了命令行工具和图形化管理界面,以方便用户进行集群的管理和维护。
  6. 安全性:Etcd支持TLS加密和身份认证,以保证数据的安全性。同时,Etcd还提供了访问控制机制,可以控制不同用户和应用程序对数据的访问权限。

二、概念术语

  • Member: 一个etcd实例。它管理着一个Node,并且可以为客户端请求提供服务。

  • Peer: 对同一个etcd集群中另外一个Member的称呼。

  • Client: 向etcd集群发送HTTP请求的客户端。

  • WAL: 预写式日志,etcd用于持久化存储的日志格式。

  • Leader: Raft算法中通过竞选而产生的处理所有数据提交的节点。

  • Follower: 竞选失败的节点作为Raft中的从属节点,为算法提供强一致性保证。

  • Candidate: 当Follower超过一定时间接收不到Leader的心跳时转变为Candidate开始竞选。

  • Term: 某个节点成为Leader到下一次竞选时间,称为一个Term。

三、集群安装部署

etcd版本为3.5.4, 本示例使用的二进制安装。

etcd name IP地址 节点说明 etcd版本
etcd-node-1 172.16.63.131 初始化节点 3.5.4
etcd-node-2 172.16.63.132 初始化节点 3.5.4
etcd-node-3 172.16.63.133 新增节点 3.5.4

3.1 集群安装

3个节点安装etcd

ETCD_VERSION='3.5.4'
wget https://github.com/etcd-io/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
tar -xvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz && \
  cd etcd-v${ETCD_VERSION}-linux-amd64 && \
  sudo cp -a etcd etcdctl /usr/bin/

3.2 参数说明

etcd可以指定config配置文件启动服务, 也可以参数形式启动, 其他参数具体说明略。

[root@localhost iarno]# etcd --help
Usage:
  ......
  
  etcd --config-file # config配置文件地址 json文件
    Path to the server configuration file. Note that if a configuration file is provided, other command line flags and environment variables will be ignored.
   
   ......省略

Member: # 本节点etcd信息
  --name 'default'  # 名称
    Human-readable name for this member.
  --data-dir '${name}.etcd' # 数据存放路径
    Path to the data directory.
  --listen-peer-urls 'http://localhost:2380' # 该节点接受其他节点连接的地址, 可理解为本机会启动一个2380端口服务
    List of URLs to listen on for peer traffic.
  --listen-client-urls 'http://localhost:2379' # etcd客户端地址, 可理解为本机会启动一个2379端口服务
    List of URLs to listen on for client traffic.

   ......省略

Clustering: # 集群
  --initial-advertise-peer-urls 'http://localhost:2380' # 指定该节点在集群中作为Peer节点时,用于广播宣传自己的URL地址
    List of this member's peer URLs to advertise to the rest of the cluster.
  --initial-cluster 'default=http://localhost:2380' # 用于指定Etcd集群的成员。每个成员由一个<name>=<url>的键值对表示,其中<name>是成员的名称,<url>是成员的Peer URL地址。
    Initial cluster configuration for bootstrapping.
  --initial-cluster-state 'new' # 初始集群状态, existing后期新加节点需要
    Initial cluster state ('new' or 'existing').
  --initial-cluster-token 'etcd-cluster' # 集群初始token
    Initial cluster token for the etcd cluster during bootstrap.
    Specifying this can protect you from unintended cross-cluster interaction when running multiple clusters.
  --advertise-client-urls 'http://localhost:2379' # 用于指定Etcd集群的客户端接入地址
    List of this member's client URLs to advertise to the public.
    The client URLs advertised should be accessible to machines that talk to etcd cluster. etcd client libraries parse these URLs to connect to the cluster.

	 ......省略

3.3 服务启动

如果启动参数listen-client-urls未加127.0.0.1:2379, 之后执行etcdctl命令查看集群相关信息必须携带 --endpoints=${HOST_1}:2379,${HOST_2}:2379 参数, 否则命令会报错。

etcd-node-1

TOKEN=my-etcd-token-1
CLUSTER_STATE=new
NAME_1=etcd-node-1
NAME_2=etcd-node-2
HOST_1=172.16.63.131
HOST_2=172.16.63.132
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}
nohup 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://127.0.0.1:2379,http://${THIS_IP}:2379 \
	--listen-client-urls http://127.0.0.1:2379,http://${THIS_IP}:2379 \
	--initial-cluster ${CLUSTER} \
	--initial-cluster-state ${CLUSTER_STATE} \
	--initial-cluster-token ${TOKEN}&

etcd-node-2

TOKEN=my-etcd-token-1
CLUSTER_STATE=new
NAME_1=etcd-node-1
NAME_2=etcd-node-2
HOST_1=172.16.63.131
HOST_2=172.16.63.132
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380

# For node 2
THIS_NAME=${NAME_2}
THIS_IP=${HOST_2}
nohup 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://127.0.0.1:2379,http://${THIS_IP}:2379 \
	--listen-client-urls http://127.0.0.1:2379,http://${THIS_IP}:2379 \
	--initial-cluster ${CLUSTER} \
	--initial-cluster-state ${CLUSTER_STATE} \
	--initial-cluster-token ${TOKEN}&

3.4 查看member信息

started说明节点状态正常。

[root@localhost etcd-v3.5.4-linux-amd64]# etcdctl member list -w table
+------------------+---------+-------------+---------------------------+-------------------------------------------------+------------+
|        ID        | STATUS  |    NAME     |        PEER ADDRS         |                  CLIENT ADDRS                   | IS LEARNER |
+------------------+---------+-------------+---------------------------+-------------------------------------------------+------------+
| 2da4f3ecb804e704 | started | etcd-node-2 | http://172.16.63.132:2380 | http://127.0.0.1:2379,http://172.16.63.132:2379 |      false |
| 8f3d892540699071 | started | etcd-node-1 | http://172.16.63.131:2380 | http://127.0.0.1:2379,http://172.16.63.131:2379 |      false |
+------------------+---------+-------------+---------------------------+-------------------------------------------------+------------+

3.5 简单写入数据测试

注: etcd版本不兼容, 此版本使用put写入数据。

# etcd-node-1
[root@localhost etcd-v3.5.4-linux-amd64]# etcdctl put greeting "Hello, etcd"
OK

# etcd-node-2
[root@localhost etcd-v3.5.4-linux-amd64]# etcdctl get greeting
greeting
Hello, etcd

3.6 新增节点

# 在 etcd-node-1 或 etcd-node-2 节点上执行此命令

NAME_1=etcd-node-1
NAME_2=etcd-node-2
NAME_3=etcd-node-3
HOST_1=172.16.63.131
HOST_2=172.16.63.132
HOST_3=172.16.63.133 # new member
etcdctl --endpoints=${HOST_1}:2379,${HOST_2}:2379 \
	member add ${NAME_4} \
	--peer-urls=http://${HOST_3}:2380

3.7 新节点启动服务

注意,CLUSTER_STATE 为 existing

etcd-node-3

TOKEN=my-etcd-token-1
CLUSTER_STATE=existing
NAME_1=etcd-node-1
NAME_2=etcd-node-2
NAME_3=etcd-node-3
HOST_1=172.16.63.131
HOST_2=172.16.63.132
HOST_3=172.16.63.133
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380

THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
nohup 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://127.0.0.1:2379,http://${THIS_IP}:2379 \
	--listen-client-urls http://127.0.0.1:2379,http://${THIS_IP}:2379 \
	--initial-cluster ${CLUSTER} \
	--initial-cluster-state ${CLUSTER_STATE} \
	--initial-cluster-token ${TOKEN}&

3.8 移除节点

etcdctl member remove ${MEMBER_ID}

四、参考

https://etcd.io/docs/v3.5/tutorials/how-to-deal-with-membership/

https://juejin.cn/post/6844904031186321416

LinuxAPISIX

IARNO

服务端开发

centos搭建apisix网关

gin Bind 参数绑定