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]
      • /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]
    • /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 的应用使用。
    • 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。目前仅在 sdn2.0 的 zone 内有此信息: pek3a/pek3b/sh1a/sh1b/gd2a
  • env
    env 保存用户可修改的应用参数,key 为参数名,value 为具体参数值。
    例:Redis 节点可通过 /env/maxclients 获取用户配置的 maxclients 数值来更新 redis.conf

  • 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 表示当前正在进行纵向扩容的角色节点名称,目前的扩容策略是每次扩容一类角色节点,所以 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

results matching ""

    No results matching ""