Metadata 服务
青云 AppCenter 的 metadata service 是在 etcd 基础之上进行了二次开发,主要增加了 self 属性,即每个节点只能从该服务获取到自身相关的信息,如本机 IP、server ID 等, 此项目已在 github 上开源。
元数据结构
每个应用集群在 metadata server 中存储元信息如下结构:
- /self
- /hosts/[role name]/[instance_id]*
- /ip [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]
- /memory [memory in MiB]
- /physical_machine [ID of the physical machine that hosts the instance]
- /role [role name]
- /pub_key [pub key string]
- /token [token string]
- /host
- /ip [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]
- /memory [memory in MiB]
- /physical_machine [ID of the physical machine that hosts the instance]
- /role [role name]
- /pub_key [pub key string]
- /token [token string]
- /cluster
- /app_id [application ID]
- /cluster_id [cluster ID]
- /global_uuid [global UUID]
- /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]
- /env/[parameter key]* [parameter value]
- /adding-hosts/[instance_id]*
- /ip [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]
- /memory [memory in MiB]
- /physical_machine [ID of the physical machine that hosts the instance]
- /role [role name]
- /pub_key [pub key string]
- /token [token string]
- /deleting-hosts/[instance_id]*
- /ip [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]
- /memory [memory in MiB]
- /physical_machine [ID of the physical machine that hosts the instance]
- /role [role name]
- /pub_key [pub key string]
- /token [token string]
- /links/[service name]* [cluster_id]
- /cmd
- /id [cmd ID]
- /cmd [cmd string]
- /timeout [timeout(second)]
- /[cluster ID]* 与 self 平级目录,每个 cluster ID 目录下内容结构与 self 相同,self 通过软链接指向自己的 cluster ID
注:黑体字为固定 key,括号内为变量,斜体字为可选项,黑色斜体字表示此项为可选项,但如果有此项则为固定 key,右上角带*表示该项有 sibling (兄弟)节点。 |
元数据结构中根节点 self 表示发送请求的那个节点,metadata server 接到请求后返回该节点的相关信息,具体信息如下:
hosts
hosts 分角色保存节点信息,如果没有角色,就直接保存在 hosts 之下。角色名称的定义来自 应用开发模版规范-完整版 里的定义。节点信息是一组以主机 ID (通常情况也是主机名,即以 i- 开头的字符串)为子目录组成,每个子目录下是此主机以 key-value 形式保存的详细信息。
- ip
节点私有 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。 - physical_machine
节点所在物理机标识符 - role
节点角色名称 - pub_key
节点 passphraseless ssh 公钥 - token
节点通过开发者自定义脚本在该主机里运行结果,详情参见应用开发模版规范-完整版。
例:通过 /self/hosts/i-abcd2xyz/ip 可获取发起请求的节点所在集群中主机 ID 为 i-abcd2xyz 的 IP 地址;或通过 /self/hosts/master/i-abcd2xyz/ip 可获取发起请求的节点所在集群中主机 ID 为 i-abcd2xyz 的 IP 地址,而此节点是一个 master 节点。
- ip
在制作镜像的时候由于 confd 会默认配置 prefix 为 /self,所以在镜像里获取信息时可以省略 /self,比如上例可以直接通过 /hosts/i-abcd2xyz/ip 来获取这个节点的 IP 地址。如果在创建应用版本配置包里定义 metadata_root_access 为 true,则 confd 会配置 prefix为 /,这个时候需要通过 /self/hosts/i-abcd2xyz/ip 来获取这个节点的 IP 地址。
host
- ip
本节点私有 IP 地址 - mac
本节点 mac 地址 - sid
本节点 server ID - gid
本节点 group ID - gsid
本节点 global server ID - node_id
本节点 node ID - instance_id
本节点主机 ID - cpu
本节点 CPU 核数 - memory
本节点内存大小 - physical_machine
本节点所在物理机标识符 - role
本节点角色名称 - pub_key
本节点 passphraseless ssh 公钥 - token
本节点通过开发者自定义脚本在本主机里运行结果
例:通过 /self/host/ip 可获取自身节点的 IP 地址
- ip
cluster
cluster 保存跟集群相关的元信息,包括- app_id
集群所属的应用 ID - cluster_id
集群 ID,用户在创建应用的时候青云调度系统自动生成的一个以 cl- 开头的唯一标识,如 cl-0u0a6u1j。 - global_uuid
集群全球唯一 ID,用户在进入部署应用页面时自动生成的全球唯一标识,这个 ID 可用于需要生成 licence 的应用使用。 - 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 的地址。
- app_id
env
env 保存用户可修改的应用参数,key 为参数名,value 为具体参数值。
例:Redis 节点可通过 /env/maxclients 获取用户配置的 maxclients 数值来更新 redis.confadding-hosts
adding-hosts 临时保存新加入的节点信息,当 scale out (添加节点)操作完成之后这个子目录下的信息会随之消失。主机信息参见 hosts。deleting-hosts
deleting-hosts 临时保存即将删除的节点信息,当 scale in (删除节点)操作完成之后这个子目录下的信息会随之消失。主机信息参见 hosts。links
外部服务依赖定义,有些应用依赖于另外一个服务才能正常工作,如 Kafka 依赖于 ZooKeeper,因此此处需指定被依赖集群的 ID,service name 可在应用开发模版-完整版中任意定义。cmd
cmd 表示本节点需要执行的命令。开发者不需要用到这类信息,这是青云调度系统转发并执行应用命令(开发者只需要在模版中定义命令即可,详情参见应用开发模版规范-完整版),如启动应用命令等。
查询
在创建好一个集群后,登陆到任意一个节点,在文件 /etc/confd/confd.toml 里找到 nodes 这一行(这个文件是青云调度系统在用户创建集群的时候自动生成的),这一行定义的是 metadata server 的 IP 地址,任取一个 IP,运行下面命令即可看到所有信息。注明:同一 VPC 里所有集群这个文件内容相同。
curl http://[IP]/self
或者直接访问
curl http://metadata/self