etcd集群配置与使用
一.etcd原理
1.etcd介绍
etcd是使用Go语言开发的一个开源的、高可用的分布式key-value存储系统,可以用于配置共享和服务的注册和发现。
类似项目有zookeeper和consul。
etcd具有以下特点:
- 完全复制:集群中的每个节点都可以使用完整的存档
- 高可用性:Etcd可用于避免硬件的单点故障或网络问题
- 一致性:每次读取都会返回跨多主机的最新写入
- 简单:包括一个定义良好、面向用户的API(gRPC)
- 安全:实现了带有可选的客户端证书身份验证的自动化TLS
- 快速:每秒10000次写入的基准速度
- 可靠:使用Raft算法实现了强一致、高可用的服务存储目录
etcd 作为一个高可用键值存储系统,天生就是为集群化而设计的。由于 Raft 算法在做决策时需要多数节点的投票,所以 etcd 一般部署集群推荐奇数个节点,推荐的数量为 3、5 或者 7 个节点构成一个集群
2.应用场景
-
服务发现
服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接
-
配置中心
将一些配置信息放到 etcd 上进行集中管理。
这类场景的使用方式通常是这样:应用在启动的时候主动从 etcd 获取一次配置信息,同时,在 etcd 节点上注册一个 Watcher 并等待,以后每次配置有更新的时候,etcd 都会实时通知订阅者,以此达到获取最新配置信息的目的。
-
分布式锁
因为 etcd 使用 Raft 算法保持了数据的强一致性,某次操作存储到集群中的值必然是全局一致的,所以很容易实现分布式锁。锁服务有两种使用方式,一是保持独占,二是控制时序
二.etcd集群部署
1.主机规划
主机名称 |
角色 |
数量 |
主机内网IP规划 |
主机外网IP |
主机配置 |
基础软件 |
系统 |
node1 |
主节点 |
1 |
10.0.8.116 |
xxx |
8C 8G |
wget &&yum install -y etcd |
centos 7.9 3.10.0 |
node2 |
从节点 |
1 |
10.0.8.159 |
xxx |
8C 8G |
wget &&yum install -y etcd |
centos 7.9 3.10.0 |
node3 |
从节点 |
1 |
10.0.8.122 |
xxx |
8C 8G |
wget &&yum install -y etcd |
centos 7.9 3.10.0 |
PS:这里要注意 etcd并不是很吃硬件,如果业务量不是很大的话给2C 4G就够了,如果业务量比较大的话4G 8G-16G或更大的硬件配置,自己灵活掌握。安装的时候需要注意7.2版本坑比较多,跟etcd的版本存在兼容性的问题,自己安装的过程中容易翻车
2.设置3台主机的hostname
1
2
3
4
5
6
7
8
9
10
|
#分别在三个节点执行
hostnamectl set-hostname node01
hostnamectl set-hostname node02
hostnamectl set-hostname node03
#设置三个节点的host
[root@node3 /etc/etcd]# vim /etc/hosts
10.0.8.116 node1
10.0.8.159 node2
10.0.8.122 node3
|
3.安装etcd
etcd集群三种方式 静态集群 动态集群 DNS集群,我们这里搭建的是静态集群
● Static适用于有固定IP的主机节点
● etcd Discovery适用于DHCP环境
● DNS Discovery依赖DNS SRV记录
1
2
|
#三台机器上都需要安装
yum install -y etcd
|
4.查看安装的etcd的版本号
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#查看etcd版本
[root@node1 /var/lib/etcd/default.etcd/member]# etcd --version
etcd Version: 3.3.11
Git SHA: 2cf9e51
Go Version: go1.10.3
Go OS/Arch: linux/amd64
#查看etcdctl版本
#v2接口
etcdctl --version
etcdctl -v
#v3接口
etcdctl version
|
###5.修改配置文件
5.1修改 /lib/systemd/system/etcd.service
三个节点都需要修改,重点在usre=root
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[root@master lib]# more /lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
User=root
# set GOMAXPROCS to number of processors
ExecStart=/usr/bin/etcd \
--name=${ETCD_NAME} \
--data-dir=${ETCD_DATA_DIR} \
--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS} \
--listen-peer-urls=${ETCD_LISTEN_PEER_URLS} \
--advertise-client-urls=${ETCD_ADVERTISE_CLIENT_URLS} \
--initial-cluster-token=${ETCD_INITIAL_CLUSTER_TOKEN} \
--initial-advertise-peer-urls=${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
--initial-cluster-state=${ETCD_INITIAL_CLUSTER_STATE} \
--initial-cluster=${ETCD_INITIAL_CLUSTER}
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
|
5.2修改/etc/etcd/etcd.conf
三个节点都需要修改,修改成各自ip
1
2
3
4
5
6
7
8
9
10
11
12
|
#[Member]
ETCD_DATA_DIR="/var/lib/etcd/default.etcd" #etcd数据保存目录
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380" #集群内部通信使用的URL
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #供外部客户端使用的url
ETCD_NAME="node1" #etcd实例名称
#[Clustering]
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.0.8.116:2380" #广播给集群内其他成员访问的URL
ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379,http://10.0.8.166:2379" #广播给外部客户端使用的url
ETCD_INITIAL_CLUSTER="node1=http://10.0.8.116:2380,node2=http://10.0.8.159:2380,node3=http://10.0.8.122:2380" #初始集群成员列表
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster" #集群的名称
ETCD_INITIAL_CLUSTER_STATE="new" #初始集群状态,new为新建集群
|
6.启动服务
先启动两个从节点,然后启动主节点
1
2
3
4
5
|
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
systemctl status etcd
netstat -tunlp|grep etcd
|
如果启动失败
1.检查配置文件
2.rm -rf /var/lib/etcd/*
7.配置防火墙开放端口
1
2
3
|
firewall-cmd --zone=public --add-port=2379/tcp --permanent
firewall-cmd --zone=public --add-port=2380/tcp --permanent
firewall-cmd --reload && firewall-cmd --list-ports
|
8.集群维护
1
2
3
4
|
#查看集群列表
etcdctl member list
#查看集群健康状态
etcdctl cluster-health
|
9.etcd api分为2和3版本
1
2
3
4
5
6
|
#设置为3版本
vim /etc/profile
【内容】
export ETCDCTL_API=3
source /etc/profile
|
10.etcd操作数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#v2接口
etcdctl set key value
etcdctl get key
etcdctl update key value
etcdctl rm key
etcdctl ls
etcdctl help
#v3接口
etcdctl put key value
etcdctl get key
etcdctl del key
etcdctl get / --prefix --keys-only
etcdctl help
tips:
key存在的方式和zookeeper类似,为 /路径/key
设置完之后,其他集群也可以查询到该值
如果dir和key不存在,该命令会创建对应的项
|
11.测试集群是否成功
1
2
3
4
5
6
7
8
9
10
11
|
#node1
etcdctl put /infinity/nodeinfo liang
etcdctl put /ceph/mdsinfo 132312
#node2
etcdctl get /infinity/nodeinfo
etcdctl get /ceph/mdsinfo
etcdctl put /ceph/mdsinfo 11111
#node3
etcdctl get /infinity/nodeinfo
etcdctl get /ceph/mdsinfo
etcdctl get / --prefix --keys-only
|
三.应用中使用