当前位置:   article > 正文

一文读懂Etcd及其原理和应用场景_etcd 协议

etcd 协议

0. 前言

Etcd是一个开源的、高可用的、分布式的键值存储系统,可以用于存储关键的配置数据、服务发现、服务注册等。它使用Raft一致性算法来保证数据的一致性,并使用分布式锁机制来实现并发控制。Etcd支持HTTP API和gRPC API,提供了多种客户端库,可以方便地与各种编程语言进行集成。在云原生应用和微服务架构中,Etcd被广泛应用于服务发现、配置管理、分布式锁等场景。本文将介绍Etcd的原理、应用场景和使用方法,帮助读者更好地理解和应用Etcd。

1. ETCD的概念和设计

ETCD是一个分布式键值存储系统,类似于一个分层的键值对,其中键和值都是字符串类型。ETCD将所有数据都存储为键值对,支持将键值对组织成层次结构,目录是一种特殊的键,可以包含其他键值对或子目录。

ETCD的核心概念包括:

  • 键值对:ETCD中的数据都以键值对的形式进行存储,其中键和值都是字符串类型。
  • 目录:ETCD支持将键值对组织成层次结构,目录是一种特殊的键,可以包含其他键值对或子目录。
  • 事务:ETCD支持原子性的事务操作,可以一次性执行多个读写操作,保证数据的一致性。
  • 触发器:ETCD支持对键值对的修改进行监控,并在发生变化时触发相应的操作。

ETCD使用Raft算法来保证数据一致性和高可用性,Raft是一种分布式共识算法,可以保证多个节点之间的数据一致性。ETCD还使用gRPC协议进行通信,提供了高效的数据传输和处理能力。
在这里插入图片描述

2.ETCD的命令示例

以下是一些常用的ETCD命令的详细解释:

查看ETCD的版本信息

命令:

etcdctl version
  • 1

执行结果:

etcdctl version: 3.5.0
API version: 3.5
  • 1
  • 2

列出ETCD集群中的成员

命令:

etcdctl member list
  • 1

执行结果:

c7a5d5c9f3a7d6f4, started, etcd1, https://192.168.1.101:2380, https://192.168.1.101:2379, false
d9f0a9b8c7b6a5f4, started, etcd2, https://192.168.1.102:2380, https://192.168.1.102:2379, false
e8f9b8a7d6c5b4a3, started, etcd3, https://192.168.1.103:2380, https://192.168.1.103:2379, false
  • 1
  • 2
  • 3

检查ETCD集群的健康状态

命令:

etcdctl cluster-health
  • 1

执行结果:

member c7a5d5c9f3a7d6f4 is healthy: got healthy result from https://192.168.1.101:2379
member d9f0a9b8c7b6a5f4 is healthy: got healthy result from https://192.168.1.102:2379
member e8f9b8a7d6c5b4a3 is healthy: got healthy result from https://192.168.1.103:2379
cluster is healthy
  • 1
  • 2
  • 3
  • 4

获取指定key的值

命令:

etcdctl get key
  • 1

执行结果:

value
  • 1

设置指定key的值

命令:

etcdctl put key value
  • 1

执行结果:

OK
  • 1

删除指定key及其对应的值

命令:

etcdctl del key
  • 1

执行结果:

1
  • 1

监控指定key的变化

在这里插入图片描述

命令:

etcdctl watch key
  • 1

执行结果:

watching key for changes...
  • 1

将ETCD的数据备份到指定文件中

命令:

etcdctl backup file
  • 1

执行结果:

{"header":{"cluster_id":1234567890123456789,"member_id":1234567890123456789,"revision":1234567890,"raft_term":1234}}
{"key":"L3Zhci93d3cva...."}
  • 1
  • 2

注意:上述命令的结果中,$符号表示命令行提示符,不属于命令的一部分。

3. ETCD的使用场景

ETCD作为一个分布式键值存储系统,不仅可以存储和管理数据,还可以帮助开发人员实现各种分布式应用场景,包括服务发现、配置管理、分布式锁和选举算法等。这些功能可以大大简化分布式系统的开发和维护工作,提高系统的可用性和稳定性。

  1. 服务发现
    ETCD可以帮助开发人员轻松发现各种服务,并提供相应的负载均衡策略,以确保服务的高可用性和稳定性。通过将服务注册到ETCD中,其他服务或客户端可以通过查询ETCD获取服务的地址和端口信息,以便进行调用。此外,ETCD还支持基于服务标签的服务发现,可以根据不同的标签对服务进行分类和过滤,以便更好地管理和使用服务。
    在这里插入图片描述

  2. 配置管理
    ETCD可以帮助开发人员集中管理和维护各种配置信息,包括数据库连接信息、服务端口等。通过将配置信息存储在ETCD中,可以实现统一的配置管理和版本控制,以便更好地维护和更新配置信息。此外,ETCD还支持配置变更通知功能,可以在配置信息发生变更时自动通知相关服务或客户端,以便及时更新配置信息。
    在这里插入图片描述

  3. 分布式锁
    ETCD可以帮助开发人员实现分布式锁,以确保多个节点之间的数据一致性和互斥性。通过使用ETCD提供的分布式锁机制,可以在分布式环境中实现数据的原子性操作,避免多个节点之间的竞争和冲突。此外,ETCD还支持租约机制,可以设置锁的过期时间和自动续约等功能,以便更好地管理和使用分布式锁。
    在这里插入图片描述

  4. 选举算法
    ETCD可以帮助开发人员实现分布式选举算法,以确保各个节点之间的数据一致性。通过使用ETCD提供的选举算法,可以在分布式环境中实现主从节点的切换和数据同步,以便更好地管理和维护分布式系统。此外,ETCD还支持基于租约的选举机制,可以在节点失效或网络分区发生时自动进行主从切换,以保证数据的可用性和一致性。

4. ETCD的优缺点

ETCD作为一个分布式键值存储系统,具有许多优点和缺点。在使用ETCD时需要考虑实际需求和限制,以便更好地利用其优势和避免其缺点。

优点缺点
高可用性:ETCD使用Raft算法来保证数据的一致性和高可用性。对于小规模应用来说,ETCD可能会带来额外的复杂性和开销。
分布式事务:ETCD支持原子性的事务操作,可以一次性执行多个读写操作,保证数据的一致性。ETCD需要部署在集群中的多个节点上,如果节点之间的网络连接不稳定,可能会影响数据的一致性和可用性。
快速响应:ETCD使用gRPC协议进行通信,提供了高效的数据传输和处理能力。ETCD的存储能力和性能受到硬件和网络环境的限制。在处理大量数据或高并发请求时,可能需要增加节点数量或升级硬件设备。
简单易用:ETCD提供了简单易用的命令行工具和API,可以方便地管理和维护数据。

5. 配置文件示例

ETCD的配置项很多

# etcd 配置文件示例

# 集群名称
name = "etcd-cluster"

# 监听客户端请求的地址,可以指定多个地址
listen-client-urls = "http://0.0.0.0:2379,http://0.0.0.0:4001"

# 监听同伴节点请求的地址,可以指定多个地址
listen-peer-urls = "http://0.0.0.0:2380,http://0.0.0.0:7001"

# 数据目录
data-dir = "/var/lib/etcd"

# 初始集群节点配置,可以指定多个节点
initial-cluster = "etcd-1=http://10.0.0.1:2380,etcd-2=http://10.0.0.2:2380,etcd-3=http://10.0.0.3:2380"

# 初始集群状态
initial-cluster-state = "new"

# 自动压缩模式
auto-compaction-mode = "periodic"

# 自动压缩的保留时间
auto-compaction-retention = "1h"

# 自动压缩的大小
auto-compaction-size = "100MB"

# 启用TLS证书认证
client-transport-security = {
  cert-file = "/path/to/client/cert.pem",
  key-file = "/path/to/client/key.pem",
  trusted-ca-file = "/path/to/ca.pem",
  client-cert-auth = true,
}

# 启用同伴节点TLS证书认证
peer-transport-security = {
  cert-file = "/path/to/peer/cert.pem",
  key-file = "/path/to/peer/key.pem",
  trusted-ca-file = "/path/to/ca.pem",
  client-cert-auth = true,
}

# 是否启用TLS客户端身份验证
client-cert-auth = true

# 证书和密钥文件路径
cert-file = "/path/to/server/cert.pem"
key-file = "/path/to/server/key.pem"

# 证书颁发机构CA证书路径
trusted-ca-file = "/path/to/ca.pem"

# 证书吊销列表路径
crl-file = "/path/to/crl.pem"

# 客户端证书过期时间
client-cert-allowed-cn = ["example.com", "example.org"]
client-cert-max-epoch = 100
client-cert-min-epoch = 10

# 启用安全客户端端口
client-security = {
  ca-file = "/path/to/ca.pem",
  cert-file = "/path/to/client/cert.pem",
  key-file = "/path/to/client/key.pem",
  client-cert-auth = true,
}

# 启用安全同伴节点端口
peer-security = {
  ca-file = "/path/to/ca.pem",
  cert-file = "/path/to/peer/cert.pem",
  key-file = "/path/to/peer/key.pem",
  client-cert-auth = true,
}

# 集群内部通信安全策略
peer-client-cert-auth = true
peer-trusted-ca-file = "/path/to/ca.pem"
peer-cert-file = "/path/to/etcd-peer.pem"
peer-key-file = "/path/to/etcd-peer-key.pem"
peer-cert-allowed-cn = ["etcd-1", "etcd-2", "etcd-3"]
peer-cert-max-epoch = 100
peer-cert-min-epoch = 10

# 启用TLS客户端身份验证
client-cert-auth = true

# 集群内部通信安全策略(v3.4.0+)
peer-cert-allowed-san = ["etcd-1", "etcd-2", "etcd-3"]

# 集群内部通信安全策略(v3.5.0+)
peer-cert-allowed-dns-names = ["etcd-1", "etcd-2", "etcd-3"]

# 集群内部通信安全策略(v3.6.0+)
peer-cert-allowed-email-addresses = ["etcd-1@example.com", "etcd-2@example.com", "etcd-3@example.com"]

# TLSv1.0协议启用状态
tls-min-version = "TLSv1.0"

# TLSv1.2协议启用状态
tls-max-version = "TLSv1.2"

# HTTP/2协议启用状态
http2 = true

# HTTP/2流最大并发数
http2-max-concurrent-streams = 1000

# HTTP/2流最大队列大小
http2-max-requests = 1000

# HTTP/2连接最大并发数
http2-max-sessions = 1000

# 代理协议启用状态
proxy-protocol = true

# 健康检查端口
healthcheck-port = 2381

# 健康检查时的超时时间
healthcheck-timeout = "5s"

# 健康检查时的间隔时间
healthcheck-interval = "10s"

# 健康检查时的容忍失败次数
healthcheck-fails = 3

# 是否启用raft协议
enable-v2 = true

# 是否启用v3版本API
enable-v3 = true

# 是否启用v3版本自动同步
auto-sync = true

# 是否启用v3版本自动压缩
auto-compaction-retention = "1h"
auto-compaction-size = "100MB"

# 是否开启v3版本后台压缩
backend-batch-limit = 1000
backend-batch-interval = "5s"

# 是否启用v3版本的限流措施
quota-backend-bytes = "10GB"

# 是否启用v3版本的统计信息
enable-v3-stats = true

# 是否启用v3版本的流量控制
enable-v3-flow-control = true

# 是否启用v3版本的预写日志
wal-dir = "/var/lib/etcd/wal"
wal-enable-sync = true
wal-flush-interval = "5s"

# 是否启用v3版本的备份和恢复
backup-dir = "/var/lib/etcd/backup"

# 是否启用v3版本的故障转移
enable-v3-failover = true

# 是否启用v3版本的自动选举
auto-election = true

# 是否启用v3版本的快照
snapshot-count = 10000
snapshot-interval = "30m"

# 是否启用v3版本的预选
pre-vote = true

# 是否启用v3版本的后选
post-vote = true

# 是否启用v3版本的存储
storage-backend = "v3io"

# 是否启用v3版本的存储区域
storage-region = "us-west-2"

# 是否启用v3版本的存储桶
storage-bucket = "etcd-backup"

# 是否启用v3版本的存储密钥
storage-access-key = "XXXXXXXXXXXXXXXXXXXX"

# 是否启用v3版本的存储密码
storage-secret-key = "XXXXXXXXXXXXXXXXXXXX"

# 是否启用v3版本的存储加密
storage-encryption = true

# 是否启用v3版本的存储压缩
storage-compression = true

# 是否启用v3版本的存储版本控制
storage-versioning = true

# 是否启用v3版本的存储访问控制
storage-acl = "private"

# 是否启用v3版本的存储缓存
storage-cache = "memcached"

# 是否启用v3版本的存储缓存地址
storage-cache-addresses = ["127.0.0.1:11211"]

# 是否启用v3版本的存储缓存超时时间
storage-cache-timeout = "5s"

# 是否启用v3版本的存储缓存大小
storage-cache-size = "100MB"

# 是否启用v3版本的存储缓存压缩
storage-cache-compression = true

# 是否启用v3版本的存储缓存最大值
storage-cache-max-value-size = "1MB"

# 是否启用v3版本的存储缓存清理间隔
storage-cache-eviction-interval = "10s"

# 是否启用v3版本的存储缓存清理最大值
storage-cache-eviction-max-items = 1000

# 是否启用v3版本的存储缓存清理策略
storage-cache-eviction-policy = "LRU"

# 是否启用v3版本的存储缓存清理大小
storage-cache-eviction-size = "100MB"

 
  • 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
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
  • 174
  • 175
  • 176
  • 177
  • 178
  • 179
  • 180
  • 181
  • 182
  • 183
  • 184
  • 185
  • 186
  • 187
  • 188
  • 189
  • 190
  • 191
  • 192
  • 193
  • 194
  • 195
  • 196
  • 197
  • 198
  • 199
  • 200
  • 201
  • 202
  • 203
  • 204
  • 205
  • 206
  • 207
  • 208
  • 209
  • 210
  • 211
  • 212
  • 213
  • 214
  • 215
  • 216
  • 217
  • 218
  • 219
  • 220
  • 221
  • 222
  • 223
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • 235
  • 236
  • 237
  • 238
  • 239
  • 240
  • 241

6. Etcd对比Redis核心有点

  • 支持ACID事务,可以保证数据的一致性和完整性。
  • 支持服务发现、配置管理、分布式锁、选举算法等分布式应用场景。
  • 支持TLS加密和访问控制,可以保证数据的安全性和隐私性。
  • 支持多种API和语言,例如gRPC、RESTful API、Go、Java等。
  • 支持水平扩展和垂直扩展,可以根据实际需求灵活扩展。

其他维度对比

维度ETCDRedis
数据模型键值存储键值存储
数据类型支持字符串、列表、集合、字典等数据类型支持字符串、列表、集合、有序集合等数据类型
数据一致性采用Raft算法保证数据的一致性和高可用性,可应用于分布式场景采用主从同步和哨兵机制保证数据的一致性和高可用性,可应用于缓存场景
数据持久化支持持久化和快照机制,可以将数据保存到磁盘中,数据可靠性高支持持久化和快照机制,可以将数据保存到磁盘中,数据可靠性高
分布式支持支持集群模式,可以部署在多个节点上,支持数据分片和复制等特性支持主从复制和哨兵机制,可以部署在多个节点上,支持数据分片和复制等特性
性能支持高并发和大规模数据处理,适合于分布式场景支持高并发和大规模数据处理,适合于缓存场景
功能支持服务发现、配置管理、分布式锁、选举算法等分布式应用场景支持缓存、消息队列、计数器、发布/订阅等缓存应用场景
API和语言支持支持多种API和语言,例如gRPC、RESTful API、Go、Java等支持多种API和语言,例如Redis协议、Java、Python等
数据库支持支持嵌入式数据库和外部数据库,例如SQLite、MySQL等不支持外部数据库,但支持AOF和RDB持久化机制
事务支持ACID事务,可以保证数据的一致性和完整性不支持ACID事务,但支持MULTI/EXEC、WATCH等机制
安全支持TLS加密和访问控制,可以保证数据的安全性和隐私性支持密码认证和网络隔离等机制,可以保证数据的安全性和隐私性
可扩展性支持水平扩展和垂直扩展,可以根据实际需求灵活扩展支持水平扩展和垂直扩展,可以根据实际需求灵活扩展
社区活跃度开源社区活跃度高,更新迭代频繁,支持多种开源项目和组件开源社区活跃度高,更新迭代频繁,支持多种开源项目和组件

6. Spring boot 集成etcd实例

6.1. 添加Maven依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-etcd</artifactId>
    <version>3.0.3</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

6.2. 配置Etcd连接信息

在application.properties文件中添加Etcd连接信息:

spring.cloud.etcd.enabled=true
spring.cloud.etcd.uris=http://localhost:2379
  • 1
  • 2

6.3. 注入EtcdClient

在需要使用Etcd的地方,注入EtcdClient:

import org.springframework.cloud.etcd.config.EtcdClient;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Autowired
    private EtcdClient etcdClient;

    public void doSomething() {
        // 使用etcdClient进行操作
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

6.4. 使用Etcd进行配置管理

在Etcd中创建一个key-value对:

$ etcdctl put /config/myapp/foo bar
  • 1

在Spring Boot中使用该key:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;

@Component
@RefreshScope
public class MyComponent {

    @Value("${foo}")
    private String foo;

    public void doSomething() {
        // 使用foo进行操作
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

6.5. 启用配置刷新

如果需要在Etcd中更新配置后自动刷新Spring Boot中的配置,需要在application.properties文件中添加以下配置:

spring.cloud.etcd.config.refresh.enabled=true
spring.cloud.etcd.config.refresh.interval=5
  • 1
  • 2

其中,refresh.interval配置项指定了配置刷新的时间间隔(单位为秒)。

7.参考资料

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/568562
推荐阅读
相关标签
  

闽ICP备14008679号