etcd 集群ID和成员ID的不同显示方式
1. 概述
这是一个序列总结文档。
- 第1节 安装etcd 中,在CentOS7上面安装etcd。
- 第2节 单节点运行etcd 在单节点上面运行etcd。
- 第3节 三节点部署etcd集群 在三节点上面部署etcd集群,并为etcd配置了一些快捷命令。
- 第4节 etcd TLS集群部署 在三节点上面部署etcd集群,并开启TLS协议的加密通讯。
- 第5节 etcd角色权限控制 在三节点上面部署etcd TLS集群的基础上,开启角色控制。详细可参考 https://etcd.io/docs/v3.5/demo/ 。
- 第6节 etcd证书过期处理,在etcd证书过期后,etcd相关命令行都操作不了,讲解如何处理这个问题。
- 第7节 etcd配置文件, 通过etcd配置文件来配置相关参数,然后启动etcd服务。
- 第8节 etcd可视化工具, 介绍一款好用的etcd可视化工具etcd-workbench。
- 第9节 etcd的关键配置initial-cluster-state, 介绍
initial-cluster-state
设置成new
和existing
的区别。 - 第10节 集群ID和成员ID的不同显示方式, 介绍etcd集群ID和成员ID的不同显示方式,以及ID值如何在十六进制和十进制间进行转换。
1.1 VirtualBox虚拟机信息记录
学习etcd时,使用以下几个虚拟机:
序号 | 虚拟机 | 主机名 | IP | CPU | 内存 | 说明 |
---|---|---|---|---|---|---|
1 | ansible-master | ansible | 192.168.56.120 | 2核 | 4G | Ansible控制节点 |
2 | ansible-node1 | etcd-node1 | 192.168.56.121 | 2核 | 2G | Ansible工作节点1 |
3 | ansible-node2 | etcd-node2 | 192.168.56.122 | 2核 | 2G | Ansible工作节点2 |
4 | ansible-node3 | etcd-node3 | 192.168.56.123 | 2核 | 2G | Ansible工作节点3 |
后面会编写使用ansible部署etcd集群的剧本。
操作系统说明:
[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角色权限控制 中设置了一些快捷命令,如下所示:
# 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服务。
[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集群状态:
[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
为什么会出现这样的差异呢?本篇总结就来说明这个事情。
2. etcdctl member list的不同输出格式
在 etcd-workbench 上显示的 etcd 节点 ID 与 Linux 命令行 (etcdctl
) 显示的 ID 不一致,通常是由 ID 表示格式不同或 工具版本/配置差异 导致的。
我们查看一下etcdctl
的帮助信息中关于write-out
参数的说明:
[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
查看输出结果:
[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
查看输出结果:
[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
查看输出结果:
[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
查看输出结果:
[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
查看输出结果:
[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 ~]#
可以看到,几种格式的输出显示形式不一样!
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 为什么会有不同的输出格式
不同的输出格式的作用不一样!
- 这不是BUG:
table
和fields
输出的 ID 值本质相同,只是显示格式不同。 - 无需操作:不需要修改任何配置或修复数据。
- 使用场景:运维时用
table
格式快速查看,编程时用json
/fields
获取精确数值。
3. 十六进制数与十进制的转换
3.1 十进制转成十六进制数
[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 十六进制转成十进制数
[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程序转换
# 十六进制转成十进制数
[root@etcd-node1 ~]# python3 -c "print(int('e14cb1abc9daea5b', 16))"
16234546108147886683
# 十进制转成十六进制数
[root@etcd-node1 ~]# python3 -c "print(hex(16234546108147886683)[2:])"
e14cb1abc9daea5b
[root@etcd-node1 ~]#
参考: