当前位置: 首页 > news >正文

ETCD 学习使用

1 ETCD请求从节点会直接写入么?

不会,会发给主节点执行

2 ETCD一个个节点启动,集群是如何建立的?

--initial-cluster-state=new 静态启动,一次性组建

--initial-cluster 提供节点列表 使用 new 模式时,必须一次性提供所有成员的完整信息

--initial-cluster-state=existing 动态发现,逐步扩展

这种方式允许你从一个节点开始,然后逐步添加新节点来扩展集群

一旦集群成功建立它会从本地磁盘加载已持久化的集群成员信息,然后主动去联系集群中的其他节点,重新加入。

对集群成员的增删改操作,都应该使用 etcdctl member 命令来完成,而不是直接修改启动参数。

3 ETCD的选举机制是怎么实现的?

节点会有三个状态:Leader、Follower、Candidate

当一个节点启动时,会先成为Candidate状态,然后会发起选举,选举成功后成为Leader状态,选举失败后成为Follower状态。

选举机制是基于Paxos算法实现的,选举成功后,Leader会向所有Follower发送心跳,如果Follower在一定时间内没有收到心跳,则认为Leader宕机,会发起选举。

当Leader宕机时,如果是三个节点中的另外两个节点同时发起选举,票数不能过半,选举失败,两个节点会等待一个随机的选举超时时间,然后再次发起选举。率先超时

的节点会通过选举成为新的Leader。

4 ETCD的集群的数据是怎么同步的?

当Leader节点收到写请求时,会先写入本地磁盘,然后会广播给所有Follower节点,Follower节点收到广播后,会写入本地磁盘,并返回成功。如果这时收到了混合响应,

一个成功,一个失败后,只要超过半数leader会认为成功并提交写入。同时会给返回失败的客户端发送更早的写入,持续地推动落后节点同步。

关键配置参数

--snapshot-count:触发快照的提交条目数量(默认 100,000)。

--max-snapshots:保留的最大快照文件数(默认 5),超过后会删除旧的快照。

--max-wals:保留的最大 WAL 文件数(默认 5)。

--wal:WAL 文件的存放目录。

--data-dir:数据目录,包含 WAL 和 snap 子目录。

5 ETCD的集群的成员是怎么管理的?

# 列出成员

docker exec -it etcd-node1 etcdctl member list

# 添加新成员

docker exec -it etcd-node1 etcdctl member add node4 --peer-urls="http://192.168.100.91:2360"

# 移除成员

docker exec -it etcd-node1 etcdctl member remove <member-id>


6 ETCD的集群命令测试

echo ""

echo "=== 检查集群健康状态 ==="

docker exec -it etcd-node1 etcdctl --endpoints=http://192.168.100.91:2379,http://192.168.100.91:2369,http://192.168.100.91:2389 endpoint health -w table

echo ""

echo "=== 集群状态 ==="

docker exec -it etcd-node1 etcdctl --endpoints=http://192.168.100.91:2379,http://192.168.100.91:2369,http://192.168.100.91:2389 endpoint status -w table

echo ""

echo "=== 测试数据写入同步 ==="

echo "在节点1写入数据..."

docker exec etcd-node1 etcdctl --endpoints=http://192.168.100.91:2369 put cluster_test "cluster_test"

echo "从节点2读取数据..."

docker exec etcd-node2 etcdctl --endpoints=http://192.168.100.91:2379 get cluster_test

echo "从节点3读取数据..."

docker exec etcd-node3 etcdctl --endpoints=http://192.168.110.190:2389 get cluster_test

echo ""

echo "=== 测试节点故障 ==="

echo "停止节点1..."

docker stop etcd-node1

echo "查看集群状态..."

docker exec -it etcd-node2 etcdctl --endpoints=http://192.168.100.91:2369,http://192.168.100.91:2379,http://192.168.100.91:2389 endpoint status -w table

docker exec -it etcd-node2 etcdctl --endpoints=http://192.168.100.91:2379 endpoint status -w table

docker exec -it etcd-node2 etcdctl --endpoints=http://192.168.100.91:2389 endpoint status -w table

echo "添加数据..."

docker exec etcd-node2 etcdctl --endpoints=http://192.168.100.91:2369,http://192.168.100.91:2379,http://192.168.100.91:2389 put stop1 "stop1"

echo "读取数据..."

docker exec etcd-node2 etcdctl --endpoints=http://192.168.100.91:2379 get stop1

docker exec etcd-node2 etcdctl --endpoints=http://192.168.100.91:2389 get stop1

echo "恢复节点1..."

docker start etcd-node1

echo "节点1读取数据,查看同步..."

docker exec etcd-node1 etcdctl --endpoints=http://192.168.100.91:2369 get stop1

echo ""

echo "=== 测试节点故障超过一半 ==="

echo "停止节点2 和 3..."

docker stop etcd-node2

docker stop etcd-node3

echo "查看集群状态..."

docker exec -it etcd-node1 etcdctl --endpoints=http://192.168.100.91:2369,http://192.168.100.91:2379,http://192.168.100.91:2389 endpoint status -w table

echo "添加数据..."

docker exec etcd-node1 etcdctl --endpoints=http://192.168.100.91:2369 put stop23 "etcd" // 尝试写入,不可写

echo "恢复节点2..."

docker start etcd-node2

echo "添加数据..."

docker exec etcd-node1 etcdctl --endpoints=http://192.168.100.91:2379 put stop23 "etcd" // 尝试写入,可写

echo "恢复节点3..."

docker start etcd-node3

echo "从节点1读取数据..."

docker exec etcd-node1 etcdctl --endpoints=http://192.168.100.91:2389 get stop23

7 GOLANG实例代码

配置重试策略

cli, err := clientv3.New(clientv3.Config{

Endpoints: []string{

"http://192.168.100.91:2369",

"http://192.168.100.91:2379",

"http://192.168.100.91:2389",

},

DialTimeout: 5 * time.Second,

// 重试配置

Retry: clientv3.RetryConfig{

Enable: true,

// 遇到网络错误时重试

OnNetworkErrors: true,

// 重试次数

MaxAttempts: 3,

// 退避策略

BackoffWaitTime: 100 * time.Millisecond,

},

})

手动检查端点健康状态

func checkEndpointsHealth(cli *clientv3.Client) {

for _, endpoint := range cli.Endpoints() {

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)

_, err := cli.Status(ctx, endpoint)

cancel()

if err != nil {

fmt.Printf("端点不可用: %s, 错误: %v\n", endpoint, err)

} else {

fmt.Printf("端点健康: %s\n", endpoint)

}

}

}

http://www.dtcms.com/a/536538.html

相关文章:

  • 新能源汽车故障诊断与排除虚拟实训软件——赋能职业教育新工具
  • 自用提示词02 || Prompt Engineering || RAG数据切分 || 作用:通过LLM将文档切分成chunks
  • 网站开发实战作业答案成功网站案例有哪些
  • 对电子商务网站建设与管理的理解我想做个网站推广怎么做
  • 青少年机器人技术(六级)等级考试试卷-实操题(2025年9月)
  • Spring Boot核心知识点全解析
  • 如何在Qt QML中定义枚举浅谈
  • 6 mysql源码中的查询逻辑
  • 网站a记录的是做cname网页设计欣赏分析
  • Optuna 黑科技自动化超参数优化框架详解
  • 江西省第二届职业技能大赛网络安全赛题 应急响应
  • 网站制作哪家好又便宜东莞建设企业网站
  • 提高命令行运行效率-正则 表达式
  • wordpress自适应建站汽车网有哪些网站大全
  • 爱站网是干嘛的怎么做废品收购网站
  • 如何从 GitHub 大仓库中只下载指定目录
  • LeetCode 22. 括号生成
  • IHR 2025 | 移远通信携Robrain AI解决方案亮相,开启机器人全感官交互新纪元
  • 淘宝客做网站自动更新写wordpress插件吗
  • 金融--------
  • 视频号AI口播:中老年赛道发力
  • 「LegionSpace Hackathon」 通付盾第六届黑客松即将开启
  • STM32外设面试速通:UART、I2C、SPI、DMA、RAM/FLASH与ADC/DAC
  • “芯”动力,净无止境:华芯微特的吸尘器控制方案详解
  • FFmpeg 基本数据结构 AVIOContext分析
  • SAP SD系统开票审批功能分享
  • 有口碑的常州网站优化wordpress发邮件慢
  • 注册中心(discovery)和配置中心(config)
  • Abaqus部件间Cohesive单元建立的共面识别技术
  • 建设网站有哪些步骤金螳螂装饰公司