Skip to content

etcd 集群ID和成员ID的不同显示方式

1. 概述

这是一个序列总结文档。

1.1 VirtualBox虚拟机信息记录

学习etcd时,使用以下几个虚拟机:

序号虚拟机主机名IPCPU内存说明
1ansible-masteransible192.168.56.1202核4GAnsible控制节点
2ansible-node1etcd-node1192.168.56.1212核2GAnsible工作节点1
3ansible-node2etcd-node2192.168.56.1222核2GAnsible工作节点2
4ansible-node3etcd-node3192.168.56.1232核2GAnsible工作节点3

后面会编写使用ansible部署etcd集群的剧本。

操作系统说明:

sh
[root@etcd-node1 ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
[root@etcd-node1 ~]# hostname -I
192.168.56.121 10.0.3.15
[root@etcd-node1 ~]#

1.2 回顾历史

在第5节 etcd角色权限控制 中设置了一些快捷命令,如下所示:

sh
# ETCD相关快捷命令
alias etcdctl='etcdctl --endpoints=$ENDPOINTS --cacert=/etc/etcd/ssl/ca.crt --cert=/etc/etcd/ssl/client.crt --key=/etc/etcd/ssl/client.key'
alias rootetcdctl='etcdctl --user root --password securePassword'
# 查看etcd集群成员信息
alias ecm='etcdClusterMember'
alias etcdClusterMember='rootetcdctl --write-out=table member list'
# 查看etcd集群状态信息
alias ecs='etcdClusterStatus'
alias etcdClusterStatus='rootetcdctl --write-out=table endpoint status'
# 查看etcd集群健康状态
alias ech='etcdClusterHealth'
alias etcdClusterHealth='rootetcdctl --write-out=table endpoint health'

之前参考第7节 etcd配置文件, 通过etcd配置文件来配置相关参数,然后启动etcd服务。

在三个节点上面使用start_by_config.sh启动etcd服务。

sh
[root@etcd-node1 ~]# cd /srv/etcd/node
[root@etcd-node1 node]# ls
config     logs       openssl.conf       start_by_config.sh  start.sh
data.etcd  nohup.out  start_auto_ssl.sh  start_no_ssl.sh     stop.sh
[root@etcd-node1 node]# ./start_by_config.sh 
[root@etcd-node1 node]# nohup: appending output to ‘nohup.out’

[root@etcd-node1 node]#

启动后,查看etcd集群状态:

sh
[root@etcd-node1 ~]# ech
+-----------------------------+--------+------------+-------+
|          ENDPOINT           | HEALTH |    TOOK    | ERROR |
+-----------------------------+--------+------------+-------+
| https://192.168.56.121:2379 |   true | 1.226138ms |       |
| https://192.168.56.123:2379 |   true | 1.153493ms |       |
| https://192.168.56.122:2379 |   true |  753.212µs |       |
+-----------------------------+--------+------------+-------+
[root@etcd-node1 ~]# ecm
+------------------+---------+-------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  | NAME  |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+-------+-----------------------------+-----------------------------+------------+
| a7d7b09bf04ad21b | started | node3 | https://192.168.56.123:2380 | https://192.168.56.123:2379 |      false |
| d553b4da699c7263 | started | node2 | https://192.168.56.122:2380 | https://192.168.56.122:2379 |      false |
| e14cb1abc9daea5b | started | node1 | https://192.168.56.121:2380 | https://192.168.56.121:2379 |      false |
+------------------+---------+-------+-----------------------------+-----------------------------+------------+
[root@etcd-node1 ~]# ecs
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|          ENDPOINT           |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://192.168.56.121:2379 | e14cb1abc9daea5b |  3.5.18 |   25 kB |     false |      false |        23 |        974 |                974 |        |
| https://192.168.56.122:2379 | d553b4da699c7263 |  3.5.18 |   25 kB |      true |      false |        23 |        975 |                975 |        |
| https://192.168.56.123:2379 | a7d7b09bf04ad21b |  3.5.18 |   25 kB |     false |      false |        23 |        976 |                976 |        |
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
[root@etcd-node1 ~]#

可以知道三个节点的ID情况:

  • 节点1,e14cb1abc9daea5b
  • 节点2,d553b4da699c7263
  • 节点3,a7d7b09bf04ad21b

而通过etcd-workbench界面查看到的却是这样的:

  • 集群ID: 11928626832149063955
  • 节点1 ID: 16234546108147886683
  • 节点2 ID: 15371828803313365603
  • 节点3 ID: 12094329508124611099

Snipaste_2025-05-31_22-34-39.png

为什么会出现这样的差异呢?本篇总结就来说明这个事情。

2. etcdctl member list的不同输出格式

在 etcd-workbench 上显示的 etcd 节点 ID 与 Linux 命令行 (etcdctl) 显示的 ID 不一致,通常是由 ID 表示格式不同工具版本/配置差异 导致的。

我们查看一下etcdctl的帮助信息中关于write-out参数的说明:

sh
[root@etcd-node1 ~]# etcdctl --help|grep 'write-out'
  -w, --write-out="simple"                      set the output format (fields, json, protobuf, simple, table)
[root@etcd-node1 ~]#

可以看到write-out参数可以使用5种格式。

2.1 表格形式输出

执行命令rootetcdctl --write-out=table member list查看输出结果:

sh
[root@etcd-node1 ~]# rootetcdctl --write-out=table member list
+------------------+---------+-------+-----------------------------+-----------------------------+------------+
|        ID        | STATUS  | NAME  |         PEER ADDRS          |        CLIENT ADDRS         | IS LEARNER |
+------------------+---------+-------+-----------------------------+-----------------------------+------------+
| a7d7b09bf04ad21b | started | node3 | https://192.168.56.123:2380 | https://192.168.56.123:2379 |      false |
| d553b4da699c7263 | started | node2 | https://192.168.56.122:2380 | https://192.168.56.122:2379 |      false |
| e14cb1abc9daea5b | started | node1 | https://192.168.56.121:2380 | https://192.168.56.121:2379 |      false |
+------------------+---------+-------+-----------------------------+-----------------------------+------------+
[root@etcd-node1 ~]#

可以看到,此时输出像一个excel表格,对应的ID值,如e14cb1abc9daea5b等,是十六进制字符串

2.2 字段形式输出

执行命令rootetcdctl --write-out=fields member list查看输出结果:

sh
[root@etcd-node1 ~]# rootetcdctl --write-out=fields member list
"ClusterID" : 11928626832149063955
"MemberID" : 12094329508124611099
"Revision" : 0
"RaftTerm" : 30
"ID" : 12094329508124611099
"Name" : "node3"
"PeerURL" : "https://192.168.56.123:2380"
"ClientURL" : "https://192.168.56.123:2379"
"IsLearner" : false

"ID" : 15371828803313365603
"Name" : "node2"
"PeerURL" : "https://192.168.56.122:2380"
"ClientURL" : "https://192.168.56.122:2379"
"IsLearner" : false

"ID" : 16234546108147886683
"Name" : "node1"
"PeerURL" : "https://192.168.56.121:2380"
"ClientURL" : "https://192.168.56.121:2379"
"IsLearner" : false

[root@etcd-node1 ~]#

此时,输出的ID,如节点1的ID 16234546108147886683,是 64 位整数。

2.3 简单输出

执行命令rootetcdctl --write-out=simple member list查看输出结果:

sh
[root@etcd-node1 ~]# rootetcdctl --write-out=simple member list
a7d7b09bf04ad21b, started, node3, https://192.168.56.123:2380, https://192.168.56.123:2379, false
d553b4da699c7263, started, node2, https://192.168.56.122:2380, https://192.168.56.122:2379, false
e14cb1abc9daea5b, started, node1, https://192.168.56.121:2380, https://192.168.56.121:2379, false
[root@etcd-node1 ~]#

2.4 Protobuf 格式输出

执行命令rootetcdctl --write-out=protobuf member list查看输出结果:

sh
[root@etcd-node1 ~]# rootetcdctl --write-out=protobuf member list

 node3ttps://192.168.56.123:2380"ttps://192.168.56.123:2379node2ttps://192.168.56.122:2380"ttps://192.168.56.122:2379node1ttps://192.168.56.121:2380"ttps://192.168.56.121:2379[root@etcd-node1 ~]#

2.5 json格式输出

执行命令rootetcdctl --write-out=json member list查看输出结果:

sh
[root@etcd-node1 ~]# rootetcdctl --write-out=json member list
{"header":{"cluster_id":11928626832149063955,"member_id":16234546108147886683,"raft_term":30},"members":[{"ID":12094329508124611099,"name":"node3","peerURLs":["https://192.168.56.123:2380"],"clientURLs":["https://192.168.56.123:2379"]},{"ID":15371828803313365603,"name":"node2","peerURLs":["https://192.168.56.122:2380"],"clientURLs":["https://192.168.56.122:2379"]},{"ID":16234546108147886683,"name":"node1","peerURLs":["https://192.168.56.121:2380"],"clientURLs":["https://192.168.56.121:2379"]}]}
[root@etcd-node1 ~]#

Snipaste_2025-06-04_23-04-18.png

可以看到,几种格式的输出显示形式不一样!

Json 和 Protobuf 的对比

在当今的软件开发中,数据交换是必不可少的环节。Protobuf和JSON是两种广泛使用的数据交换格式,它们各自具有独特的优势和适用场景。下面将从多个方面对Protobuf和JSON进行对比分析。

1)性能

Protobuf是一种高效的二进制序列化格式,它在数据传输和存储方面的性能优于JSON。由于Protobuf采用二进制编码,因此在相同数据量的情况下,序列化和反序列化的速度更快,且数据体积更小。相比之下,JSON是一种文本格式,其编码较为冗长,且解析速度相对较慢。因此,在处理大量数据或对性能要求较高的场景下,Protobuf更具优势。

2)可读性

JSON的优点在于其易于阅读和编写。JSON数据的结构清晰,语法简单,使得开发人员能够轻松地读写和理解数据。而Protobuf的二进制编码方式则较为复杂,不易于直接阅读。因此,在需要易于阅读和调试的场景下,JSON更为合适。

3)可扩展性

Protobuf具有更好的可扩展性。它支持自定义消息类型和字段标签,允许用户根据需要定义复杂的数据结构。此外,Protobuf还支持多种编程语言的实现,使得在不同语言间进行数据交换更加方便。相比之下,JSON虽然也可以表示复杂的数据结构,但其扩展性相对较差,且不支持自定义标签等高级功能。因此,在需要定义复杂数据结构或跨语言数据交换的场景下,Protobuf更具优势。

4)安全

Protobuf和JSON在安全性方面各有千秋。Protobuf采用加密传输的方式保证数据的安全性,而JSON则可以通过适当的加密算法对数据进行加密处理。另外,由于Protobuf采用二进制编码,相对于JSON的文本格式更难以被直接查看和修改,从而提高了数据的安全性。然而,在实际应用中,为了确保数据的安全性,无论使用Protobuf还是JSON都需要采取相应的安全措施,如加密传输、校验数据完整性等。因此,在安全性方面没有绝对的优劣之分。

5)流行度与生态系统

JSON在互联网领域的应用非常广泛,已经成为RESTful API的标准数据格式之一。许多常用的编程语言和框架都支持JSON的处理和解析,这使得JSON在开发社区中拥有庞大的生态系统。而Protobuf虽然也得到了许多公司和项目的采用,但其流行度和生态系统相对较小。因此,在选择数据交换格式时,需要考虑项目需求和开发团队的技能背景。

综上所述,Protobuf和JSON各有千秋,需要根据实际需求选择合适的数据交换格式。在处理大量数据或对性能要求较高的场景下,Protobuf更具优势;而在需要易于阅读和调试的场景下,JSON更为合适。另外,如果项目需要定义复杂的数据结构或跨语言数据交换,应优先考虑使用Protobuf;如果项目主要应用于互联网领域,则JSON可能更适合。在选择数据交换格式时,还需要综合考虑安全性、流行度以及生态系统等方面的因素。

2.6 为什么会有不同的输出格式

不同的输出格式的作用不一样!

  • 这不是BUGtablefields 输出的 ID 值本质相同,只是显示格式不同。
  • 无需操作:不需要修改任何配置或修复数据。
  • 使用场景:运维时用 table 格式快速查看,编程时用json/fields 获取精确数值。

3. 十六进制数与十进制的转换

3.1 十进制转成十六进制数

sh
[root@etcd-node1 ~]# printf "%x\n" 16234546108147886683
e14cb1abc9daea5b
[root@etcd-node1 ~]# printf "%x\n" 15371828803313365603
d553b4da699c7263
[root@etcd-node1 ~]# printf "%x\n" 12094329508124611099
a7d7b09bf04ad21b
[root@etcd-node1 ~]#

3.2 十六进制转成十进制数

sh
[root@etcd-node1 ~]# printf "%llu\n" 0xe14cb1abc9daea5b
16234546108147886683
[root@etcd-node1 ~]# printf "%llu\n" 0xd553b4da699c7263
15371828803313365603
[root@etcd-node1 ~]# printf "%llu\n" 0xa7d7b09bf04ad21b
12094329508124611099
[root@etcd-node1 ~]#
  • %llu 明确指定处理 64 位无符号整数。
  • 0x 前缀:告诉 printf 后面的字符串是十六进制数。

3.3 python程序转换

sh
# 十六进制转成十进制数
[root@etcd-node1 ~]# python3 -c "print(int('e14cb1abc9daea5b', 16))"
16234546108147886683

# 十进制转成十六进制数
[root@etcd-node1 ~]# python3 -c "print(hex(16234546108147886683)[2:])"
e14cb1abc9daea5b
[root@etcd-node1 ~]#

参考:

本首页参考 https://notes.fe-mm.com/ 配置而成