百度边缘计算平台baetyl的开发记录(二)---openedge的配置文件介绍和详解

2022-08-02 00:00:00 消息 配置 实例 配置文件 默认值

https://blog.csdn.net/sullivan_jia/article/details/98956700

在上一篇文章中,我们大致的介绍了百度边缘计算平台的一个整体框架和基本的调用和使用流程。那本篇文章,主要进一步就baetyl的使用和配置方法,尤其是配置文件做进一步的介绍。

openedge的配置文件介绍和详解
想要run起一个openedge软件,主要是这几个步骤:

云端创建边缘核心(这一步,需要在百度的边缘计算平台进行注册,创建一个核心<这个核心,实际上就是创建一个云平台上的边缘计算实例,同时,在创建好该实例(这个实例的主要作用是与端侧的软件进行互通、互联,实际上就是篇文章中,架构图里面的cloud management suite这一个模块)后,会有baetyl的软件安装包可下载(需要注意的是,在创建时,核心的架构选择很关键,不同的硬件架构下的核心涉及到的不太一样,如果错误选择的话,往往会导致在安装部署后,无法启动openedge)>)
边缘设备安装容器环境(这一步相对易懂一些,说白就是要安装一个docker容器的环境。其实,根据上一篇文章的架构图,我们可以看到,baetyl的master节点,其restfulapi依赖于engine,而这个engine实际上就是docker engine,也就是对docker api的一些调用的使用;因此,安装openedge的一个基本点就是要有docker环境。顺便提一句,baetyl本身也是Go语言开源开发的,因此与docker的兼容性从语言层面上来讲,是完全没有障碍的)
边缘设备安装边缘核心软件包baetyl

在线安装
离线安装
启动 baetyl
通过守护服务启停 baetyl
验证baetyl是否安装成功
(这一步其实本身来讲也没什么难度,就是在步的基础上,通过创建的核心界面,进一步将端侧的软件安装在端侧设备上;当然,安装时,也分为了两种方式,一种就是在线,及端设备联网且具有相关环境后,通过执行脚本就可以完成端设备上的软件安装工作;另一种方式就是先下载下来软件包,然后本地配置好后进行启动openedge即可)

因此,通过上面的流程,我们可以发现,在openedge安装部署的整个流程上来讲,关键的可能就是安装这一步,而且尤其是离线安装,所以,我们重点讲解一下离线安装。而离线安装的关键,其实是在于openedge的配置文件,只要在前面1、2步使用得当,且配置了正确的openedge配置文件,openedge运行起来不是什么难事。

那么,我们下面进一步讲解一下openedge的配置文件。

官方的配置文件链接:https://cloud.baidu.com/doc/BIE/s/1jwvyhl0q,有兴趣的话,可以进入这个链接里面自习研究一番。

而想要run起来一个openedge,关键的配置文件有这么几个,主程序配置文件、应用配置文件、baetyl-hub配置文件、baetyl-function-manager配置文件。这几个配置文件在配置好后,实际上在本地就可以run起一个openedge了,如果想要这个openedge与私有云平台或百度的云平台有交互的话,可以在重点关注一下baetyl-agent配置文件。

闲话少续,首先来看主程序配置文件(这个配置文件主要是用来配置架构途中master模块的相关配置):

mode: 默认值:docker,服务运行模式。docker:容器模式(常用此模式);native:进程模式(不常用)
grace: 默认值:30s,服务优雅退出超时时间(就是出现问题后,主程序停止工作的时间)
server: 主程序API Server配置项
address: 默认值可读取环境变量:OPENEDGE_MASTER_API,主程序API Server地址
timeout: 默认值:30s,主程序API Server请求超时时间
logger: 日志配置项(建议认真设置,次运行时,往往容易翻车,日志路径很关键)
path: 默认为空,即不打印到文件;如果指定文件则输出到文件
level: 默认值:info,日志等级,支持debug、info、warn和error
format: 默认值:text,日志打印格式,支持text和json
age:
max: 默认值:15,日志文件保留的大天数
size:
max: 默认值:50,日志文件大小限制,单位MB
backup:
max: 默认值:15,日志文件保留的大数量
这个配置文件配置好后,其实,openedge就可以用了,只不过如果你的其他配置文件或者应用的配置有问题的话,openedge master就会在强制退出。

下面是应用的配置:

version: 应用版本
services: 应用的服务列表(可以有多个,一个services就是一个应用,这里的应用就是一个可执行的秩序)
- name: [必须]服务名称,在服务列表中必须
image: [必须]服务入口。Docker容器模式下表示服务镜像;Naitve进程模式下表示服务运行包所在位置
replica: 默认为0,服务副本数,表示启动的服务实例数。通常服务只需启动一个。函数运行时服务一般设置为0,不由主程序启动,而是由函数管理服务来动态启动实例
mounts: 存储卷映射列表
- name: [必须]存储卷名称,对应存储卷列表中的一个
path: [必须]存储卷映射到容器中的路径
readonly: 默认值:false,存储卷是否只读
ports: Docker容器模式下暴露的端口,(主要用来暴露docker的端口)
- 0.0.0.0:1883:1883 # 如果不想暴露给宿主机外的设备访问,可以改成127.0.0.1:1883:1883
- 0.0.0.0:1884:1884/tcp
- 8080:8080/tcp
- 9884:8884
devices: Docker容器模式下的设备映射,例如:
- /dev/video0
- /dev/sda:/dev/xvdc:r
args: 服务实例启动参数,例如:
- '-c'
- 'conf/conf.yml'
env: 服务实例环境变量,例如:
version: v1
restart: 服务实例重启策略配置项
retry:
max: 默认为空,表示总是重试,服务重启大次数
policy: 默认值:always,重启策略。no:不重启;always:总是重启;on-failure:服务异常退出就重启
backoff:
min: 默认值:1s,重启小间隔时间
max: 默认值:5m,重启大间隔时间
factor: 默认值:2,重启间隔增大倍数
resources: Docker容器模式下的服务实例资源限制配置项
cpu:
cpus: 服务实例可用的CPU比例,例如:1.5,表示可以用1.5个CPU内核
setcpus: 服务实例可用的CPU内核,例如:0-2,表示可以使用第0到2个CPU内核;0,表示可以使用第0个CPU内核;1,表示可以使用第1个CPU内核
memory:
limit: 服务实例可用的内存,例如:500m,表示可以用500兆内存
swap: 服务实例可用的交换空间,例如:1g,表示可以用1G内存
pids:
limit: 服务实例可创建的进程数
volumes: 应用的存储卷列表
- name: [必须]存储卷名称,在存储卷列表中
path: [必须]存储卷在宿主机上的路径,相对于主程序的工作目录而言

通过这个配置文件,我们可以看到,实际上,一个应用就是一个容器,这个配置文件主要的就是用来对openedge中的涉及到的应用进行配置。进一步的可以理解为,如果run一个docker容器,因此,这个配置文件里的内容,主要就是用来规范或定义怎么run这个docker应用容器。所以,如果有自己开发需求时,可以借鉴这个来定义对于docker的管理。而目前新的application.yml实际上已经加入了对于docker资源的进一步限制和管理,这就使得在边缘端设备上有限的资源空间做出了进一步的规范要求,保证了边缘设备内容器的资源的合理利用。但需要注意的是,对于application.yml的非法修改,可能会导致容器资源对硬件设备资源的大量非法占用,有可能会导致硬件设备的崩溃,因此带配置个文件时,应当注意资源的管控。此外,我们也要注意一下replica这个选项,对于函数和function这样的应用,只需要表明为0即可(说明他们不需要长时间启动,而自己部署的一些长时间应用,可以通过修改此选项,来完成启动)

下面是baetyl-hub配置:

listen: [必须]监听地址,例如:
- tcp://0.0.0.0:1883 # Native进程模式下,如果不想暴露给宿主机外的设备访问,可以改成tcp://127.0.0.1:1883
- ssl://0.0.0.0:1884
- ws://:8080/mqtt
- wss://:8884/mqtt
certificate: SSL/TLS证书认证配置项,如果启用ssl或wss必须配置
ca: Server的CA证书路径
key: Server的服务端私钥路径
cert: Server的服务端公钥路径
principals: 接入权限配置项,如果不配置则Client无法接入,支持账号密码和证书认证
- username: Client接入Hub用户名
password: Client接入Hub密码
permissions:
- action: 操作权限。pub:发布权限;sub:订阅权限
permit: 操作权限允许的主题列表,支持+和#匹配符
- username: Client接入Hub用户名,使用证书双向认证可不配置密码
permissions:
- action: 操作权限。pub:发布权限;sub:订阅权限
permit: 操作权限允许的主题列表,支持+和#匹配符
subscriptions: 主题路由配置项(主要是负责转发消息到目的地)
- source:
topic: 订阅的主题
qos: 订阅的QoS
target:
topic: 发布的主题
qos: 发布的QoS
message: 消息相关的配置项
length:
max: 默认值:32k;大值:268,435,455字节(约256MB),可允许传输的大消息长度
ingress: 消息接收配置项
qos0:
buffer:
size: 默认值:10000,可缓存到内存中的QoS为0的消息数,增大缓存可提高消息接收的性能,若设备掉电,则会直接丢弃QoS为0的消息
qos1:
buffer:
size: 默认值:100,等待持久化的QoS为1的消息缓存大小,增大缓存可提高消息接收的性能,但潜在的风险是Hub异常退出(比如设备掉电)会丢失缓存的消息,不回复确认(puback)。Hub正常退出会等待缓存的消息处理完,不会丢失数据。
batch:
max: 默认值:50,批量写QoS为1的消息到数据库(持久化)的大条数,消息持久化成功后会回复确认(ack)
cleanup:
retention: 默认值:48h,QoS为1的消息保存在数据库中的时间,超过该时间的消息会在清理时物理删除
interval: 默认值:1m,QoS为1的消息清理时间间隔
egress: 消息发送配置项
qos0:
buffer:
size: 默认值:10000,内存缓存中的待发送的QoS为0的消息数,若设备掉电会直接丢弃消息;缓存满后,新推送的消息直接丢弃
qos1:
buffer:
size: 默认值:100,QoS为1的消息发送后,未确认(ack)的消息缓存大小,缓存满后,不再读取新消息,一直等待缓存中的消息被确认。QoS为1的消息发送给客户端成功后等待客户端确认(puback),如果客户端在规定时间内没有回复确认,消息会一直重发,直到客户端回复确认或者session关闭
batch:
max: 默认值:50,批量从数据库读取消息的大条数
retry:
interval: 默认值:20s,消息重发时间间隔
offset: 消息序列号持久化相关配置
buffer:
size: 默认值:10000,被确认(ack)的消息的序列号的缓存队列大小。比如当前批量发送了QoS为1且序列号为1、2和3的三条消息给客户端,客户端确认了序列号1和3的消息,此时序列号1会入列并持久化,序列号3虽然已经确认,但是还是得等待序列号2被确认入列后才能入列。该设计可保证Hub异常重启后仍能从持久化的序列号恢复消息处理,保证消息不丢,但是会出现消息重发,也因此暂不支持QoS为2的消息
batch:
max: 默认值:100,批量写消息序列号到数据库的大条数
logger: 日志配置项
path: 默认为空,即不打印到文件;如果指定文件则输出到文件
level: 默认值:info,日志等级,支持debug、info、warn和error
format: 默认值:text,日志打印格式,支持text和json
age:
max: 默认值:15,日志文件保留的大天数
size:
max: 默认值:50,日志文件大小限制,单位MB
backup:
max: 默认值:15,日志文件保留的大数量
status: Hub状态配置项
logging:
enable: 默认值:false,是否打印Hub的状态信息
interval: 默认值:1m,状态信息打印时间间隔
storage: 数据库存储配置项
dir: 默认值:var/db/openedge/data,数据库存储目录
shutdown: Hub退出配置项
timeout: 默认值:10m,Hub退出超时时间
baetyl-hub,实际上是基于MQTT的在openedge架构图体系内的一个消息通信总线。外部与内部的消息,都可以通过这个模块来完成信息的交互。因此,这个模块在实际代码上,就是一个MQTT server。所以,从这角度理解这个配置文件的话,我们实际上就容易理解了许多:这个配置文件=MQTT配置+MQTT的docker配置。因此,在配置文件logger前面的部分,主要还是针对于MQTTserver进行了一些列的规范,有过mosquitto开发经验的朋友,很容易明白这些配置;同时,需要注意的是,在这里面,也对消息的路由转发做了一系列的规定,也就是subscription这个配置项,只有在这里面配置了路由转发规则,应用之间的转发才能进一步的建立。

下面是baetyl-function-manager配置

hub:
clientid: Client连接Hub的Client ID。cleansession为false则不允许为空
address: [必须]Client连接Hub的地址
username: [必须]Client连接Hub的用户名
password: 如果采用账号密码,必须填Client连接Hub的密码,否者不用填写
ca: 如果采用证书双向认证,必须填Client连接Hub的CA证书路径
key: 如果采用证书双向认证,必须填Client连接Hub的客户端私钥路径
cert: 如果采用证书双向认证,必须填Client连接Hub的客户端公钥路径
timeout: 默认值:30s,Client连接Hub的超时时间
interval: 默认值:1m,Client连接Hub的重连大间隔时间,从500微秒翻倍增加到大值
keepalive: 默认值:1m,Client连接Hub的保持连接时间
cleansession: 默认值:false,Client连接Hub的是否保持Session
validatesubs: 默认值:false,Client是否检查Hub订阅结果,如果是发现订阅失败报错退出
buffersize: 默认值:10,Client发送消息给Hub的内存队列大小,异常退出会导致消息丢失,恢复后QoS为1的消息依赖Hub重发
rules: 路由规则配置项
- clientid: Client连接Hub的Client ID
subscribe:
topic: [必须]Client向Hub订阅的消息主题
qos: 默认值:0,Client向Hub订阅的消息QoS
function:
name: [必须]处理消息的函数名
publish:
topic: [必须]计算结果发布到Hub的主题
qos: 默认值:0,计算结果发布Hub的QoS
retry:
max: 默认值:3,大重试次数
functions: 函数列表
- name: [必须]函数名称,列表内
service: [必须]提供函数实例的服务名称
instance: 实例配置项
min: 默认值:0,少实例数
max: 默认值:1,大实例数
idletime: 默认值:10m,实例大空闲时间
evicttime: 默认值:1m,实例检查周期,如果发现实例空闲超过就销毁
message:
length:
max: 默认值:4m, 函数实例允许接收和发送的大消息长度
backoff:
max: 默认值:1m,Client连接函数实例大重连间隔
timeout: 默认值:30s,Client连接函数实例超时时间
这个配置文件,实际上是对应用(函数)进行了管理和调用的一个模块进行配置。所以,其前面的配置,就是配置了hub,也就是说,这个模块在接收到hub的相关消息之后,把应用函数拉起来执行并返回阿行管结果。所以,在配置hub的同时,也配置了functions,来说明他管理了哪些function,这些function怎么管理。

那后,实际上就是一个function的配置,也就是说,如果想要通过openedgerun起来一个应用函数,就业需要对这个函数进行配置和管理。我们以简单的Python的配置为例。

server: 作为GRPC Server独立启动时配置;托管给baetyl-function-mnager无需配置
address: CRPC Server监听的地址,<host>:<port>
workers:
max: 默认CPU核数乘以5,线程池大容量
concurrent:
max: 默认不限制,大并发连接数
message:
length:
max: 默认值:4m, 函数实例允许接收和发送的大消息长度
ca: Server的CA证书路径
key: Server的服务端私钥路径
cert: Server的服务端公钥路径
functions: 函数列表
- name: [必须]函数名称,列表内
handler: [必须]函数包和处理函数名,比如:'sayhi.handler'
codedir: [必须]Python代码所在路径、
logger: 日志配置项
path: 默认为空,即不打印到文件;如果指定文件则输出到文件
level: 默认值:info,日志等级,支持debug、info、warn和error
format: 默认值:text,日志打印格式,支持text和json
age:
max: 默认值:15,日志文件保留的大天数
size:
max: 默认值:50,日志文件大小限制,单位MB
backup:
max: 默认值:15,日志文件保留的大数量

从上面的配置,我们可以看到,functions是主要的一个配置项,我们只需要配置到codedir后,在接收到调用之后,就可以执行这个函数代码来完成函数的执行。

以上就是,openedge的配置文件整体使用流程和情况。如果还想与云平台进行沟通,可以使用agent模块,在此就不在仔细介绍了,大家有兴趣,可以在文章前附的连接进官网自行查看。
————————————————
版权声明:本文为CSDN博主「嫌疑人X的解忧杂货店」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sullivan_jia/article/details/106328235

相关文章