Metadata 服务
基本信息
AppCenter 的 metadata service 是在 etcd 基础之上进行了二次开发,主要增加了 self 属性,即每个节点只能从该服务获取到自身相关的信息,如本机 IP、server ID 等, 此项目已在 github 上开源。
元数据结构
每个应用集群在 metadata server 中存储元信息如下结构:
-
/self
-
/hosts/[role name]/[instance_id]*
-
/ip [IP address]
-
/eip [public IP address]
-
/mac [MAC address]
-
/sid [server ID]
-
/gid [group ID]
-
/gsid [global server ID]
-
/node_id [node ID]
-
/instance_id [instance ID]
-
/cpu [cpu]
-
/gpu [gpu]
-
/memory [memory in MiB]
-
/volume_size [volume size in GiB]
-
/instance_class [instance class]
-
/gpu_class [gpu class]
-
/volume_class [volume class]
-
/physical_machine [ID of the physical machine that hosts the instance]
-
/role [role name]
-
/pub_key [pub key string]
-
/token [token string]
-
/reserved_ips
-
/[reserved IP name such as vip]*
-
/value [reserved ip address]
-
-
-
-
/host
-
/ip [IP address]
-
/eip [public IP address]
-
/mac [MAC address]
-
/sid [server ID]
-
/gid [group ID]
-
/gsid [global server ID]
-
/node_id [node ID]
-
/instance_id [instance ID]
-
/cpu [cpu]
-
/gpu [gpu]
-
/memory [memory in MiB]
-
/volume_size [volume size in GiB]
-
/instance_class [instance class]
-
/gpu_class [gpu class]
-
/volume_class [volume class]
-
/physical_machine [ID of the physical machine that hosts the instance]
-
/role [role name]
-
/pub_key [pub key string]
-
/token [token string]
-
/reserved_ips
-
/[reserved IP name such as vip]*
-
/value [reserved ip address]
-
-
-
-
/cluster
-
/app_id [application ID]
-
/cluster_id [cluster ID]
-
/user_id [application ID]
-
/global_uuid [global UUID]
-
/cluster_tag [cluster tag ID]
-
/vxnet [VxNet ID]
-
/zone [Zone ID]
-
/endpoints
-
/[service name]*
-
/port [port or a reference to env parameter]
-
/protocol [protocol]
-
-
/reserved_ips
-
/[reserved IP name such as vip]*
-
/value [reserved ip address]
-
-
-
-
/api_server
-
/host [host of api server]
-
/port [port of api server]
-
/protocol [protocol of api server]
-
-
/resource_limits
-
/valid_volume_classes [comma-separated valid volume classes]
-
/valid_instance_classes [comma-separated valid instance classes]
-
-
/upgrade-audit
-
/from_app_version [App version]
-
/to_app_version [App version]
-
-
-
/env/[parameter key]* [parameter value]
-
/adding-hosts/[role name]/[instance_id]*
-
/ip [IP address]
-
/eip [public IP address]
-
/mac [MAC address]
-
/sid [server ID]
-
/gid [group ID]
-
/gsid [global server ID]
-
/node_id [node ID]
-
/instance_id [instance ID]
-
/cpu [cpu]
-
/gpu [gpu]
-
/memory [memory in MiB]
-
/volume_size [volume size in GiB]
-
/instance_class [instance class]
-
/gpu_class [gpu class]
-
/volume_class [volume class]
-
/physical_machine [ID of the physical machine that hosts the instance]
-
/role [role name]
-
/pub_key [pub key string]
-
/token [token string]
-
/reserved_ips
-
/[reserved IP name such as vip]*
-
/value [reserved ip address]
-
-
-
-
/deleting-hosts/[role name]/[instance_id]*
-
/ip [IP address]
-
/eip [public IP address]
-
/mac [MAC address]
-
/sid [server ID]
-
/gid [group ID]
-
/gsid [global server ID]
-
/node_id [node ID]
-
/instance_id [instance ID]
-
/cpu [cpu]
-
/gpu [gpu]
-
/memory [memory in MiB]
-
/volume_size [volume size in GiB]
-
/instance_class [instance class]
-
/gpu_class [gpu class]
-
/volume_class [volume class]
-
/physical_machine [ID of the physical machine that hosts the instance]
-
/role [role name]
-
/pub_key [pub key string]
-
/token [token string]
-
/reserved_ips
-
/[reserved IP name such as vip]*
-
/value [reserved ip address]
-
-
-
-
/links/[service name]* [cluster_id]
-
/cmd
-
/id [cmd ID]
-
/cmd [cmd string]
-
/timeout [timeout(second)]
-
-
/vertical-scaling-roles [role names]
-
-
/[cluster ID]*[与 self 平级目录,每个 cluster ID 目录下内容结构与 self 相同,self 通过软链接指向自己的 cluster ID]
说明 |
---|
黑体字为固定 key,括号内为变量,斜体字为可选项,黑色斜体字表示此项为可选项,但如果有此项则为固定 key,右上角带*表示该项有 sibling (兄弟)节点。 |
元数据结构中根节点 self 表示发送请求的那个节点,metadata server 接到请求后返回该节点的相关信息,具体信息如下:
参数 | 描述 |
---|---|
hosts |
hosts 分角色保存节点信息,如果没有角色,就直接保存在 hosts 之下。角色名称的定义来自 云应用开发模板规范 - 完整版里的定义。节点信息是一组以云服务器 ID (通常情况也是云服务器名,即以 i- 开头的字符串)为子目录组成,每个子目录下是此云服务器以 key-value 形式保存的详细信息。 |
ip |
节点私有 IP 地址 |
eip |
节点绑定的公网 IP 地址,默认为空 |
mac |
节点 mac 地址 |
sid |
节点 server ID,云平台调度系统自动为每个节点分配的从1开始的整数。 |
gid |
节点 group ID,云平台调度系统自动为每个组分配的从1开始的整数,每一个节点和它的 replica 组成一个 group,即它们的 gid 相同,这个是为分片式分布式系统(多主多从,每个主和它的从为同一个组)提供的特性。 |
gsid |
节点 global server ID,云平台调度系统自动为每个节点分配的全球唯一的9位随机整数 ID。 |
node_id |
节点 node ID,云平台调度系统自动为每个节点分配的节点 ID,是一个以 cln- 开头的唯一标识,此 ID 不会变更。 |
instance_id |
节点云服务器 ID,云平台调度系统自动为每个节点分配的云服务器 ID,是一个以i-开头的唯一标识,此 ID 是云服务器的 hostname,每次启动都会变更,如关闭集群然后启动集群,该节点 instance ID 可能会变更。 |
cpu |
节点 CPU 核数 |
memory |
节点内存大小, 单位 MiB。 |
volume_size |
节点数据盘大小, 单位 GiB。 |
gpu |
节点 GPU 显卡数 |
instance_class |
节点类型,其中 0 表示性能云服务器,1 表示超高性能云服务器。 |
gpu_class |
节点 gpu 显卡类型,其中 0 表示性能型 gpu。 |
volume_class |
数据盘类型,其中 0 表示性能盘,3 表示超高性能盘,2 表示容量盘。 |
physical_machine |
节点所在物理机标识符 |
role |
节点角色名称 |
pub_key |
节点 passphraseless ssh 公钥 |
token |
节点通过开发者自定义脚本在该云服务器里运行结果,详情参见云应用开发模板规范 - 完整版。 |
reserved_ips |
节点预留 ip 地址. 这个目录下开发者可以定义多个 reserved IP,比如 write_ip, read_ip 等等,名称开发者自行定义,value 对应的就是这个 reserved IP 的地址。 |
例:通过 /self/hosts/i-abcd2xyz/ip 可获取发起请求的节点所在集群中云服务器 ID 为 i-abcd2xyz 的 IP 地址;或通过 /self/hosts/master/i-abcd2xyz/ip 可获取发起请求的节点所在集群中云服务器 ID 为 i-abcd2xyz 的 IP 地址,而此节点是一个 master 节点。
说明 |
---|
在制作镜像的时候由于 confd 会默认配置 prefix 为 /self,所以在镜像里获取信息时可以省略 /self, 比如上例可以直接通过 /hosts/i-abcd2xyz/ip 来获取这个节点的 IP 地址。 如果在云应用开发模板规范 - 完整版 里定义 metadata_root_access 为 true,则 confd 会配置 prefix为 /, 这个时候需要通过 /self/hosts/i-abcd2xyz/ip 来获取这个节点的 IP 地址。 |
host
参数 | 描述 |
---|---|
ip |
本节点私有 IP 地址 |
eip |
节点绑定的公网 IP 地址,默认为空 |
mac |
本节点 mac 地址 |
sid |
本节点 server ID |
gid |
本节点 group ID |
gsid |
本节点 global server ID |
node_id |
本节点 node ID |
instance_id |
本节点云服务器 ID |
cpu |
本节点 CPU 核数 |
memory |
本节点内存大小 |
volume_size |
本节点数据盘大小。 |
gpu |
本节点节点 GPU 显卡数 |
instance_class |
本节点类型。 |
gpu_class |
本节点 gpu 显卡类型。 |
volume_class |
本节点数据盘类型。 |
physical_machine |
本节点所在物理机标识符 |
role |
本节点角色名称 |
pub_key |
本节点 passphraseless ssh 公钥 |
token |
本节点通过开发者自定义脚本在本云服务器里运行结果 |
reserved_ips |
本节点预留 ip 地址. 这个目录下开发者可以定义多个 reserved IP,比如 write_ip, read_ip 等等,名称开发者自行定义,value 对应的就是这个 reserved IP 的地址。 |
例:通过 /self/host/ip 可获取自身节点的 IP 地址
cluster
cluster 保存跟集群相关的元信息,包括
参数 | 描述 |
---|---|
app_id |
集群所属的应用 ID |
cluster_id |
集群 ID,用户在创建应用的时候云平台调度系统自动生成的一个以 cl- 开头的唯一标识,如 cl-0u0a6u1j。 |
user_id |
用户 ID,创建该集群的用户,如 usr-5DJhqhIN。 |
global_uuid |
集群全球唯一 ID,用户在进入部署应用页面时自动生成的全球唯一标识,这个 ID 可用于需要生成 licence 的应用使用。 |
cluster_tag |
集群以及通过 api 创建的资源所绑定的 tag_id |
vxnet |
集群所在网络 ID |
zone |
集群所在区域 ID |
endpoints |
应用供第三方使用的 endpoint 定义,service name 可在云应用开发模板规范 - 完整版中任意定义。如果一个第三方应用通过链接到本应用,那么就可以通过此功能 (例: /links/link_name/cluster/endpoints/client,假定开发者定义这个 endpoint 服务名为 client) 获取到本应用的 endpoint 信息。endpoint 下还可以定义 reserved_ips,这个目录下开发者可以定义多个 reserved IP,比如 write_ip, read_ip 等等,名称开发者自行定义,value 对应的就是这个 reserved IP 的地址。 |
api_server |
集群内部可通过内网访问的 api server 信息, 包括 host,port,protocol。 |
resource_limits |
当前 zone 下所支持的资源类型,valid_volume_classes:逗号分隔的磁盘类型;valid_instance_classes:逗号分隔的云服务器类型。 |
upgrade-audit |
升级操作时,临时保存升级版本信息,from_app_version:升级前版本 ID;to_app_version:升级后版本 ID。 |
env
env 保存用户可修改的应用参数,key 为参数名,value 为具体参数值。
例:Redis 节点可通过 /env/maxclients 获取用户配置的 maxclients 数值来更新 redis.conf
对于参数类型是 accesskey 的参数,在其原来目录下,云平台调度系统会添加 /access_key_id 和 /secret_access_key 两个子目录,分别存储 API 密钥ID 和私钥。
adding-hosts
adding-hosts 临时保存新加入的节点信息,当 scale out (添加节点)操作完成之后这个子目录下的信息会随之消失。云服务器信息参见hosts。
deleting-hosts
deleting-hosts 临时保存即将删除的节点信息,当 scale in (删除节点)操作完成之后这个子目录下的信息会随之消失。云服务器信息参见hosts。
links
外部服务依赖定义,有些应用依赖于另外一个服务才能正常工作,如 Kafka 依赖于 ZooKeeper,因此此处需指定被依赖集群的 ID,service name 可在云应用开发模板规范 - 完整版中任意定义。
cmd
cmd 表示本节点需要执行的命令。开发者不需要用到这类信息,这是云平台调度系统转发并执行应用命令,如启动应用命令等。
说明 |
---|
开发者只需要在模板中定义命令即可,详情参见云应用开发模板规范 - 完整版。 |
参数 | 描述 |
---|---|
vertical-scaling-roles |
表示当前正在进行纵向扩容的角色节点名称,目前的扩容策略是每次扩容一类角色节点,所以 vertical-scaling-roles 的值通常即为角色名称,如 master ; 如果扩容的角色节点设置了 replica ,则此项值为扩容角色和其replica 角色,以逗号隔开,如 master,master-replica 。扩容完成后,此项值会从 metadata 中移除。 |
测试
在创建好一个集群后,登录到任意一个节点,在文件 /etc/confd/confd.toml 里找到 nodes 这一行(这个文件是云平台调度系统在用户创建集群的时候自动生成的),这一行定义的是 metadata server 的 IP 地址,任取一个 IP,运行下面命令即可看到所有信息。注明:同一 VPC 里所有集群这个文件内容相同。
curl http://[IP]/self
或者直接访问
curl http://metadata/self