包管理(百仓)
百仓
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