包管理(百仓)

百仓

1 项目概述

1.1 背景介绍及目标

存储服务部署包(program)以及 Faas 函数

1.2 名词说明

1.3 Roadmap

2 需求分析

需求分析重点是需求

2.1 功能需求

  • 管理及存储 program 包(包含关联关系,默认配置,程序管理脚本等)

2.2 非功能需求

2.3 调研

2.3.1 helm

Helm 是 Kubernetes 的包管理器,类似于 Python 的 pip,centos 的 yum,主要用来管理 Charts。

Helm Chart 是用来封装 Kubernetes 原生应用程序的一系列 YAML 文件。可以在你部署应用的时候自定义应用程序的一些 Metadata,以便于应用程序的分发。对于应用发布者而言,可以通过 Helm 打包应用、管理应用依赖关系、管理应用版本并发布应用到软件仓库。

  • Helm:一个命令行下的客户端工具。主要用于 Kubernetes 应用程序 Chart 的创建、打包、发布以及创建和管理本地和远程的 Chart 仓库。

  • Chart:一个 Helm 包,采用 TAR 格式。其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含 Kubernetes 集群中的服务定义,类似 Homebrew 中的 formula、APT 的 dpkg 或者 Yum 的 rpm 文件。

  • Release:在 Kubernetes 集群上运行的 Chart 的一个实例。在同一个集群上,一个 Chart 可以安装很多次。每次安装都会创建一个新的 release。例如一个 MySQL Chart,如果想在服务器上运行两个数据库,就可以把这个 Chart 安装两次。每次安装都会生成自己的 Release,会有自己的 Release 名称。

  • Repository:用于发布和存储 Chart 的存储库。

chart到release的过程:

Chart---> Config ---> Release

2.3.2 OSP

Program                     // 程序包名称
    --meta.yaml             // 描述了关联关系、资源需求(端口)、bns端口、日志切分策略
    --config.yaml           // 配置描述,包括默认值、类型和描述信息
    +--hooks                // hook目录
       --install            // 服务安装部署hook
       --config-change      // 配置变更hook
       --start              // 起服务hook
       --stop               // 停服务hook
       --upgrade            // 服务升级hook
       --relation-change    // 关联变更hook
       --relation-join      // 加入关联hook
       --......             // 其他hook

meta.yaml

name: twemproxy
requires:
    - name: cache
      interface: memcache
    - name: gutter
      interface: memcache
    - name: mcq
      interface: redis

provides:
    - name: stats
      interface: ncstats

ports:
    - port
    - stats_port
    - supervisord_port

bns:
  ports:
    main: port
    stats: stats_port

logrotate:
    /home/work/log/: 4
    /home/work/odp/log/: 3
    /home/work/odp/log/*/: 4
    control_cmd: cd /home/work/odp/webserver/ && sh loadnginx.sh reload

Program 的 meta.yaml 文件描述了 Program 的元信息。

  • name 表示 program 的名字,Program 提交到平台时的 program name 需要与 meta.yaml 文件中的 name 保持一致(否则无法提交 program)。

  • requires 和 provides 描述的是关联关系的接口和名称,requires 和 provides 都不是必写的(如果没有相关关联关系则不用填写)

    • program 之间的 require 与 provide 相对应,拥有相同 interface 的 require 和 provide 可以建立关联。

    • requires 和 provides 中的 name 字段用于区分同一个 program 中多个不同的关联关系,会与具体的 hooks 名称对应。

  • ports 部分表示 Program 需要用到的端口名称,平台在创建 container 时会为每个端口名分配端口,通过 osp agent 工具 unit-get 可以跟进端口名获取端口(用于配置替换,在配置部分会详述)。

  • logrotate 部分表示 logrotate 的日志配置部分,每一行配置需要切分日志的绝对路径和日志保留天数(指定单个文件或者路径都是支持的)。control_cmd 表示切分日志之后执行的后置命令,对于 mv 走日志文件不释放文件句柄的程序,如 nginx,需要配置后置命令重新加载程序,释放文件句柄。日志每小时切一次,osp、omp、的日志默认保留 6 天。

  • bns: 平台会为每个 service 创建 bns 节点,program 中的 bns 信息就是包括需要注册到 bns 节点上的信息。

    • 例如在 bns:ports 里填写了 main 端口是 port,stats 端口是 stats_port,那么在创建 bns 节点时将每个 unit 的 port 端口作为 bns 的 main 端口,stats_port 端口作为 bns 的 stats 端口。

config.yaml

options:
  verbosity:
      default: 5
      description: "set logging level (default: 5, min: 0, max: 11)"
      type: int

 mbuf:
    default: 16384  
    description: "set size of mbuf chunk in bytes (default: 16384 bytes)"
    type: int

timeout:
    default: 50
    description: "set timeout in msec that we wait for to establish a connection for receive a response"
    type: int

server_retry_timeout:
    default: 2000
    description: "set timeout value in msec to wait for before retrying on a temporarily ejected server"
    type: int

server_failure_limit:
    default: 3
    description: "set the number of consecutive failures on a server that would lead to it being temporarily ejected"
    type: int

平台支持服务的配置管理更新功能,Program 中的 config.yaml 描述了服务可以更改的配置项,包括配置项的名称描述类型默认值。可够修改的配置项是service 粒度的(即配置项的值修改对于 service 下的所有 unit 都生效),service 创建时获取到配置项的默认值。

hooks

通过环境变量传递给 hook

部署新实例:
----------------------> status(none)
(1) 创建 container
    创建 container 失败时,status 为 none
----------------------> status(allocated)
(2) 拉取 program, 拉取 program 失败时,unit 状态为 allocated
----------------------> status(deployed)
(3) 执行 hook
    1> env-install
    2> install
    3> config-changed
    4> start
----------------------> status(installed)
(4) 通知上下游
    auth changed
    relation change, 通知上下游组件
----------------------> status(ready)
(5) 执行 检查
----------------------> status(running)


状态机:
+-------------------add-----------------------+  +-recover-+
|                                             V  V         |
none—>allocated—>deployed—>installed—>ready->running---->dead---->removed
                                                |        ^ |          ^
                                                +--kill--+ +--delete--+

创建 unit 时 hook 的执行顺序是 env-install->install->config-changed->start

数据模型

+-------------+---------------+------+-----+---------+----------------+
| Field       | Type          | Null | Key | Default | Extra          |
+-------------+---------------+------+-----+---------+----------------+
| id          | int(11)       | NO   | PRI | NULL    | auto_increment |
| program     | varchar(64)   | NO   | MUL | NULL    |                |
| name        | varchar(64)   | NO   |     | NULL    |                |
| owner       | varchar(64)   | NO   |     | NULL    |                |
| categories  | varchar(64)   | NO   |     | NULL    |                |
| summary     | varchar(512)  | NO   |     | NULL    |                |
| description | varchar(512)  | NO   |     | NULL    |                |
| peers       | varchar(2048) | NO   |     | NULL    |                |
| provides    | varchar(2048) | NO   |     | NULL    |                |
| requires    | varchar(2048) | NO   |     | NULL    |                |
| ports       | varchar(1024) | YES  |     | NULL    |                |
| extra       | varchar(1024) | YES  |     | NULL    |                |
| version     | varchar(32)   | NO   |     | NULL    |                |
| create_time | int(11)       | NO   |     | NULL    |                |
| update_time | int(11)       | YES  |     | NULL    |                |
+-------------+---------------+------+-----+---------+----------------+
*************************** 1113. row ***************************
         id: 1137
    program: twemproxy
       name: twemproxy
      owner:
 categories:
    summary:
description:
      peers: []
   provides: [{"name":"stats","interface":"ncstats"}]
   requires: [{"name":"cache","interface":"memcache"},{"name":"cachedb","interface":"memcache"},{"name":"gutter","interface":"memcache"},{"name":"gutterdb","interface":"memcache"},{"name":"mcq","interface":"redis"}]
      ports: ["port","stats_port","supervisord_port"]
      extra: {"bns":{"ports":{"main":"port","stats":"stats_port"}},"module":{"type":"fileserver","src":"\/home\/work\/nfs_client\/mnt\/online\/program\/twemproxy\/2.0.0.22\/twemproxy.tar.gz"},"scm_modules":[],"commit_log":""}
    version: 2.0.0.22
create_time: 1571324344
update_time: 0
*************************** 1114. row ***************************
         id: 1138
    program: twemcache
       name: twemcache
      owner:
 categories:
    summary:
description:
      peers: []
   provides: [{"name":"cache","interface":"memcache"}]
   requires: []
      ports: ["port","supervisord_port"]
      extra: {"bns":{"ports":{"main":"port"}},"module":{"type":"fileserver","src":"\/home\/work\/nfs_client\/mnt\/online\/program\/twemcache\/1.0.8.17\/twemcache.tar.gz"},"scm_modules":[],"commit_log":""}
    version: 1.0.8.17
create_time: 1571325623
update_time: 0
*************************** 1115. row ***************************
         id: 1139
    program: redis
       name: redis
      owner:
 categories:
    summary:
description:
      peers: []
   provides: [{"name":"db","interface":"redis"}]
   requires: []
      ports: ["port","supervisord_port"]
      extra: {"bns":{"ports":{"main":"port"}},"module":{"type":"fileserver","src":"\/home\/work\/nfs_client\/mnt\/online\/program\/redis\/1.1.5.27\/redis.tar.gz"},"scm_modules":[],"commit_log":""}
    version: 1.1.5.27
create_time: 1571327508
update_time: 0
*************************** 1116. row ***************************
         id: 1140
    program: neworker
       name: neworker
      owner:
 categories:
    summary:
description:
      peers: []
   provides: [{"name":"stats","interface":"http"}]
   requires: [{"name":"upstream","interface":"redis"},{"name":"downstream","interface":"memcache"}]
      ports: ["stats_port","supervisord_port"]
      extra: {"bns":{"ports":{"main":"stats_port"}},"module":{"type":"fileserver","src":"\/home\/work\/nfs_client\/mnt\/online\/program\/neworker\/4.0.0.6\/neworker.tar.gz"},"scm_modules":[],"commit_log":""}
    version: 4.0.0.6
create_time: 1571328999
update_time: 0
*************************** 1117. row ***************************
         id: 1141
    program: neworker
       name: neworker
      owner:
 categories:
    summary:
description:
      peers: []
   provides: [{"name":"stats","interface":"http"}]
   requires: [{"name":"upstream","interface":"redis"},{"name":"downstream","interface":"memcache"}]
      ports: ["stats_port","supervisord_port"]
      extra: {"bns":{"ports":{"main":"stats_port"}},"module":{"type":"fileserver","src":"\/home\/work\/nfs_client\/mnt\/online\/program\/neworker\/4.0.0.7\/neworker.tar.gz"},"scm_modules":[],"commit_log":""}
    version: 4.0.0.7
create_time: 1571329268
update_time: 0

2.3.3 Redis 平台

agent 中集成了 install-redis、install-twemproxy 命令,仅用于安装时使用

2.3.4 SCS 平台

deploy 和 upgrade 放在一个接口里,根据参数区分是 deploy 还是 upgrade,逻辑相对比较重

3 总体设计

3.1 系统架构


                     user
                       |                                    |
                       | program                            | service/unit
                       |                                    |
   +-------------------|-----------------+         +yiqiu---V----------+
   | +baicang----------V---------------+ |         |                   |
   | |                                 | <---------+ group/service/unit|
   | +-------+-------------------+-----+ |         +-------------------+
   |         |                   |       |
   |         |                   |       |
   | +wuxing-V------+   +storage-V-----+ |
   | |              |   | s3/fs        | |
   | +--------------+   +--------------+ |
   +-------------------------------------+

3.1.1 创建 program, 生成配置模板

--program 	    program name
--src 		    ftp address or output path
--version 	    program version
--commit-log 	program commit log
  • 1> 存储 program

  • 2> 存储 program 配置

3.1.2 关联 program, 生成初始配置

创建 service 时关联 program

--service 	        service name, a service is a set of units
--program               program which build on the service
--version	        program version
--pool  		machine pool. [common]
--resource-type 	service deploy resource type [default]
--disk-type 	        service deploy disk type [home/ssd/disk/hdfs/etc]

3.1.3 使用 program, 拉取配置

创建 unit 时根据 service 配置的 program 进行部署

3.1.4 变更配置

变更 service 配置,service 通知 unit 进行拉取最新配置

3.2 模块简介

架构图中如果有很多模块,需要对各个模块的功能进行简要介绍;

3.3 设计与折衷

设计与折衷是总体设计中最重要的部分;

3.4 潜在风险

4 详细设计

详细设计重点在“详细”

4.1 模块 xx

(有了数据库+接口+流程,别的同学拿到详设文档,基本也能够搞定了)

4.1.1 交互流程

简要的交互可用文字说明,复杂的交互建议使用流程图,交互图或其他图形进行说明

4.1.2 数据库设计

4.1.3 接口形式

Last updated