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 链接到本应用,那么就可以通过此功能 (例: /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