1.概念
etcd 是由GO语言编写的分布式的、可靠的键值存储系统,主要用于分布式系统中关键数据的存储和服务发现。
2.核心概念
节点(Node)
每个运行 etcd 的实例被称为一个节点。一个或多个节点可以组成一个集群。
集群(Cluster)
由多个节点组成的集合,这些节点共同工作以提供一致的数据存储服务。通过 Raft 共识算法确保集群中各节点间数据的一致性。
键值对(Key-Value Pair)
etcd 存储的基本单位是键值对,其中键和值都是字节数组。键用于唯一标识存储的数据项,而值则包含实际的数据内容。
3.etcd
集群准备
节点 | IP地址 | 操作系统版本 | etcd版本 |
---|---|---|---|
etcd-node1 | 192.168.100.5 | Ubuntu 24.04.2 LTS | v3.6.4 |
etcd-node2 | 192.168.100.6 | Ubuntu 24.04.2 LTS | v3.6.4 |
etcd-node3 | 192.168.100.7 | Ubuntu 24.04.2 LTS | v3.6.4 |
3.1 配置IP地址
配置etcd-node1节点IP
sudo cat /etc/netplan/ens32-cloud-init.yaml
network:version: 2ethernets:ens32:dhcp4: falseaddresses:- "192.168.100.5/24"routes:- to: defaultvia: 192.168.100.254nameservers:addresses:- 114.114.114.114
sudo netplan apply
配置etcd-node2节点IP
sudo cat /etc/netplan/ens32-cloud-init.yaml
network:version: 2ethernets:ens32:dhcp4: falseaddresses:- "192.168.100.6/24"routes:- to: defaultvia: 192.168.100.254nameservers:addresses:- 114.114.114.114
sudo netplan apply
配置etcd-node3节点IP
sudo cat /etc/netplan/ens32-cloud-init.yaml
network:version: 2ethernets:ens32:dhcp4: falseaddresses:- "192.168.100.7/24"routes:- to: defaultvia: 192.168.100.254nameservers:addresses:- 114.114.114.114
sudo netplan apply
3.2 配置主机名
配置etcd-node1节点主机名
sudo hostnamectl set-hostname etcd-node1
配置etcd-node2节点主机名
sudo hostnamectl set-hostname etcd-node2
配置etcd-node3节点主机名
sudo hostnamectl set-hostname etcd-node3
3.3 配置主机名与IP解析
3个节点均需要执行
sudo cat >> /etc/hosts <<EOF
192.168.100.5 etcd-node1
192.168.100.6 etcd-node2
192.168.100.7 etcd-node3
EOF
3.4 关闭防火墙
3个节点均需要执行
sudo ufw stop
sudo ufw status
3.5 时钟同步
3个节点均需要执行
sudo apt install chrony
sudo sed -i '/pool.*ubuntu\.pool\.ntp\.org/s/^/# /' /etc/chrony/chrony.conf
sudo sed -i 's/^pool ntp\.ubuntu\.com.*$/server ntp.aliyun.com iburst/' /etc/chrony/chrony.conf
sudo systemctl restart chrony
sudo chronyc sources
3.6 关闭SWAP
分区
3个节点均需要执行
sudo swapoff -a
sudo sed -i '/\/swap\.img.*swap/s/^/# /' /etc/fstab
3.7 配置节点互信
3个节点均需要执行
sudo ssh-keygen
sudo cp /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
在etcd-node1节点上执行
sudo for i in 5 6 7
> do
> scp -r /root/.ssh 192.168.100.$i:/root/
> done
4.etcd
集群部署
4.1 下载etcd
3个节点均需要执行
sudo wget https://github.com/etcd-io/etcd/releases/download/v3.6.4/etcd-v3.6.4-linux-amd64.tar.gz
4.2解压etcd
3个节点均需要执行
sudo tar xzvf etcd-v3.6.4-linux-amd64.tar.gz -C /usr/local
sudo ln -s /usr/local/etcd-v3.6.4-linux-amd64/ /usr/local/etcd
4.3复制解压文件至系统标准可执行文件路径中
3个节点均需要执行
sudo cp /usr/local/etcd/etcd* /usr/local/bin/
4.4创建etcd
用户
3个节点均需要执行
sudo useradd -r -s /bin/false etcd
4.5创建数据目录
3个节点均需要执行
sudo mkdir -p /var/lib/etcd
sudo chown -R etcd:etcd /var/lib/etcd /usr/local/etcd
4.6 创建etcd
配置文件
配置etcd-node1节点配置文件
sudo cat > /usr/local/etcd/etcd.conf <<EOF
name: etcd-node1
data-dir: /var/lib/etcd
listen-client-urls: http://192.168.100.5,http://127.0.0.1:2379
listen-peer-urls: http://192.168.100.5:2380
initial-advertise-peer-urls: http://192.168.100.5:2380
advertise-client-urls: http://192.168.100.5:2379
initial-cluster: "etcd-node1=http://192.168.100.5:2380,etcd-node2=http://192.168.100.6:2380,etcd-node3=http://192.168.100.7:2380"
initial-cluster-token: "etcd-cluster"
initial-cluster-state: new
EOF
配置etcd-node2节点配置文件
sudo cat > /usr/local/etcd/etcd.conf <<EOF
name: etcd-node2
data-dir: /var/lib/etcd
listen-client-urls: http://192.168.100.6,http://127.0.0.1:2379
listen-peer-urls: http://192.168.100.6:2380
initial-advertise-peer-urls: http://192.168.100.6:2380
advertise-client-urls: http://192.168.100.6:2379
initial-cluster: "etcd-node1=http://192.168.100.5:2380,etcd-node2=http://192.168.100.6:2380,etcd-node3=http://192.168.100.7:2380"
initial-cluster-token: "etcd-cluster"
initial-cluster-state: new
EOF
配置etcd-node3节点配置文件
sudo cat > /usr/local/etcd/etcd.conf <<EOF
name: etcd-node3
data-dir: /var/lib/etcd
listen-client-urls: http://192.168.100.7,http://127.0.0.1:2379
listen-peer-urls: http://192.168.100.7:2380
initial-advertise-peer-urls: http://192.168.100.7:2380
advertise-client-urls: http://192.168.100.7:2379
initial-cluster: "etcd-node1=http://192.168.100.5:2380,etcd-node2=http://192.168.100.6:2380,etcd-node3=http://192.168.100.7:2380"
initial-cluster-token: "etcd-cluster"
initial-cluster-state: new
EOF
相关参数说明
参数 | 说明 |
---|---|
name | 当前etcd节点名称 |
data-dir | 数据存储目录 |
listen-client-urls | 当前节点通过该地址监听客户端发送的信息 |
listen-peer-urls | 当前节点通过该地址监听集群其他节点发送的信息 |
initial-advertise-peer-urls | 集群的其他节点通过该地址与当前节点通信 |
advertise-client-urls | 客户端通过该地址与当前节点通信 |
initial-cluster | 当前集群的所有节点信息,当前节点根据此信息与其他节点取得联系 |
initial-cluster-token | 用于区分不同的集群,同一集群的所有节点配置相同的值 |
initial-cluster-state | 本次是否为新建集群,取值为 new 或者 existing |
4.7创建 systemd 服务
3个节点均需要执行
sudo cat > /usr/lib/systemd/system/etcd.service <<EOF
[Unit]
Description=Etcd Server
After=network.target[Service]
User=etcd
Type=notify
ExecStart=/usr/local/etcd/etcd --config-file /usr/local/etcd/etcd.conf
Restart=on-failure
RestartSec=10s
LimitNOFILE=65535[Install]
WantedBy=multi-user.target
EOF
4.8 启动etcd
3个节点均需要执行
sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd
sudo systemctl status etcd
4.9查看集群成员
任意节点执行
sudo etcdctl member list
4.10 查看集群健康状态
任意节点执行
sudo etcdctl endpoint health --cluster
4.11查看集群状态
任意节点执行
sudo etcdctl endpoint status --cluster -w table