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

三.应用中使用