树莓派4B“胡搞计划”Ⅴ——elasticsearch+skywalking!!!

树莓派4B“胡搞计划”Ⅴ——elasticsearch+skywalking!!!目前我的树莓派上已经跑起了docker、mariadb、nacos、gitea,但是查看资源占用情况,内存占用1.1G,CPU负载更是几乎可以忽略。看来还可以继续压榨其剩余价值。

零、准备工作

目前我的树莓派上已经跑起了docker、mariadb、nacos、gitea,但是查看资源占用情况,内存占用1.1G,CPU负载更是几乎可以忽略。看来还可以继续压榨其剩余价值(我也有成为资本家的潜质呢~

image.png

既然要搞微服务,那么就再整一个elasticsearch吧!我大约确实是疯了。

鉴于今后树莓派上的服务将越来越多,为了避免再发生上次那样的系统损坏导致数据丢失,需要提前做一些准备工作。

0. 定时备份

避免数据丢失的首要方法就是定时备份,目前需要备份的数据有mariadb数据库中的数据和gitea服务管理的版本仓库,备份周期可以直接简单暴力每天都备一份,保留三份,更优的方案是检测到数据变化后再增量备份,这种方案可以降低读写操作。而备份包最好可以直接上传到网络上,或者至少需要再加一块U盘挂载到系统中多点存放,否则再发生上次那样的U盘损坏事故还是会导致数据丢失,关于连接百度网盘上传文件,可以使用bypy工具,支持python3。

pip3 install bypy  # 安装bypy
bypy info  # 执行网盘认证操作,需要访问命令行展示的链接地址

百度网盘认证方式

备份目标、方案、备份周期都已确认就可以开始编写脚本,我选择使用python编写,涉及到~~探测文件变化、~~压缩打包、备份数据库、连接网盘等操作。整体代码一百多行就不放在这里了,感兴趣的话请移步码云

由于脚本中调用了docker服务,所以需要使用root权限执行,定时任务也需要先切到root用户再执行crontab -e将定时任务添加到root账号下,配置文件格式分 时 日 月 周 具体命令,建议使用绝对路径。

# m h dom mon dow command
0 1 * * 1,4 nohup /home/ubuntu/tools/python39/bin/python3 /mnt/workspace/backends/backuptask/backup.py &

以上配置代表每周一和周四的凌晨1点后台执行备份操作。具体可参考tool.lu/crontab

1. 自动挂载U盘

由于之前做系统的U盘只有32G,后续由于docker镜像、容器以及备份功能都大量占用磁盘空间,所以又购入一块64G的U盘并挂载到树莓派,主要目的是降低系统U盘的读写,将静态的文件都存放到新的U盘。

将新U盘插入到树莓派的USB3.0接口后树莓派仅有的2个USB3.0都已被占用,执行ls -l /dev/sd*查看U盘设备,再执行df -h命令查看设备挂载情况。

设备挂载情况

/dev路径下已经存在sda和sdb两个USB设备,sda1做为sda的分区挂载到了系统根目录,所以新的U盘设备是sdb,注意先不要将sdb挂载到系统,建议先执行mkfs.ext4 /dev/sdb1命令将U盘格式化成linux系统常用的ext4格式。

格式化U盘

格式化完成后使用root账户执行mount /dev/sdb1 /mnt命令将U盘挂载到/mnt路径下,然后执行lsblk -fdf -Th命令可以查看设备的文件系统类型。

成功格式化

此时新的U盘已经手动挂载到系统/mnt路径,但是重启系统后就会失效,为了避免每次都手动输入命令去挂载U盘,需要修改/etc/fstab文件,文件的格式如下:

LABEL=writable          /               ext4    defaults        0       1
LABEL=system-boot       /boot/firmware  vfat    defaults        0       1
设备标识 挂载点 文件系统类型 挂载选项 是否备份 是否检测
LABEL=writable / ext4 defaults 0 1
LABEL=system-boot /boot/firmware vfat defaults 0 1

设备标识唯一确认磁盘分区,可以使用LABEL,也可使用UUID,可以使用blkidlsblk -f命令查看磁盘的LABEL和UUID信息。

U盘的uuid信息

新的磁盘可能没有LABEL信息,可以直接使用UUID方式指定磁盘设备,只需按以上格式在/etc/fstab文件中添加一行:

UUID=80f62414-080b-4214-a63c-c080ae35f5d6    /mnt            ext4    defaults        0       1

如果想要使用LABEL方式,需要先使用e2label /dev/sdb1 labelname方式为分区指定一个LABEL,然后按以上格式在/etc/fstab文件中添加一行:

LABEL=labelname             /mnt            ext4    defaults        0       1

注意设备之间LABEL名称不可冲突。

2. 迁移docker路径

docker服务的默认数据路径在/var/lib/docker目录下,随着每次拉取和构建镜像,目录占用的空间也会越来越大,目前docker镜像和容器的运行环境占用的磁盘空间已达到四个多G,而我当初做系统的U盘总大小只有32G,所以需要提前把docker文件迁移到其他外挂的磁盘上,这时就可以使用上一步挂载的/dev/sdb1了。

从19.xx 版本以后,docker使用data-root来代替graph指定数据存储路径,参数配置保存在/etc/docker/daemon.json文件里,在文件中添加data-root配置使内容看起来如下:

{
    "registry-mirrors": [
            "https://registry.docker-cn.com",
            "https://docker.mirrors.ustc.edu.cn",
            "http://hub-mirror.c.163.com"
    ],
    "data-root": "/mnt/dockerlib"
}

以上配置表示设置数据存储路径为/mnt/dockerlib目录,然后需要复制以前的docker数据到该目录下并重启docker服务:

cp -rp /var/lib/docker /mnt/dockerlib  # 复制docker数据文件
systemctl daemon-reload  # 重新加载服务配置
systemctl restart docker  # 重启docker服务使配置生效

执行完毕后原路径/var/lib/docker就可以删除了,系统盘瞬间瘦身。

参考链接:

  zhuanlan.zhihu.com/p/95533274

  blog.csdn.net/a772304419/…

3.启用swap

树莓派的ubuntu系统默认未启用swap分区,当内存不足时将导致系统卡顿甚至死机,以下步骤仅限于树莓派平台下的ubuntu系统开启swap分区。

touch /var/swap  # 创建swap文件
dd if=/dev/zero of=/var/swap bs=1M count=2048  # 使用dd方式向文件写入空值,大小2G
chmod 0600 /var/swap  # 设置文件权限
mkswap /var/swap  # 格式化文件内容
swapon /var/swap  # 开启分区

执行以上步骤需要使用root权限,效果如图:

image.png

为开机自动挂载swap分区,和自动挂载U盘步骤一样需要编辑/etc/fstab文件,加入一行/var/swap /swap swap defaults 0 0,文件内容大致如下:

LABEL=writable          /               ext4    defaults        0       1
LABEL=system-boot       /boot/firmware  vfat    defaults        0       1
LABEL=mdata             /mnt            ext4    defaults        0       1
/var/swap               /swap           swap    defaults        0       0

保存文件后重启系统,重新登录后查看swap分区可见swap分区已保持启用状态,配置完成。

开启swap分区后,即使树莓派3B+上也可运行docker+nacos服务。。。。

参考链接:

  www.cnblogs.com/luzhan/p/95…

  blog.csdn.net/qq_22121229…

  关于swapon命令

一、部署elasticsearch

Elasticsearch是一个基于Lucene的一个分布式、高扩展、高实时的搜索与数据分析引擎。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布。目前官方最新版是7.16.2,支持docker部署,官方提供arm64架构下的可运行镜像。部署方式可依照官方文档:

docker pull elasticsearch:7.16.2
docker run -d --name elasticsearch --restart always -p 9200:9200 -p 9300:9300 \
    -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx512m" \
    elasticsearch:7.16.2  # 运行时使用Xms和Xmx限定分配堆的最小内存和最大内存

容器启动后资源占用情况,内存占用从1.1G升到1.9G。

负载情况

搏一搏,再部署个skywalking~~~单车变摩托~~

二、部署skywalking

Apache SkyWalking 是分布式系统的 APM(应用性能监控)工具,尤其是为微服务、云原生和基于容器(Docker、Kubernetes、Mesos)的架构而设计。本来是想参考官方的源码编译文档自行编译skywalking,结果就是一直失败,记录主要报错信息如下:

报错信息

[INFO] --- exec-maven-plugin:1.6.0:exec (default) @ receiver-proto ---
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 1: cannot open ▒▒: No such file
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 1:ELF: not found
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 2: ۝▒▒▒D▒: not found
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 1: ▒!▒: not found
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 1: : not found
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 1: Bi3$: not found
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 2: cannot open @: No such file
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 2: B1t▒▒*▒-▒%▒▒: not found
/root/downloads/skywalking/oap-server/server-receiver-plugin/receiver-proto/target/bin/flatc: 2: Syntax error: word unexpected (expecting ")")
[ERROR] Command execution failed.
org.apache.commons.exec.ExecuteException: Process exited with an error: 2 (Exit value: 2)
    at org.apache.commons.exec.DefaultExecutor.executeInternal (DefaultExecutor.java:404)
    at org.apache.commons.exec.DefaultExecutor.execute (DefaultExecutor.java:166)
    at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:804)
    at org.codehaus.mojo.exec.ExecMojo.executeCommandLine (ExecMojo.java:751)
    at org.codehaus.mojo.exec.ExecMojo.execute (ExecMojo.java:313)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo (DefaultBuildPluginManager.java:137)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:210)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:156)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute (MojoExecutor.java:148)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:117)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81)
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128)
    at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305)
    at org.apache.xterm-256colormaven.DefaultMaven.doExecute (DefaultMaven.java:192)
    at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105)
    at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956)
    at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288)
    at org.apache.maven.cli.MavenCli.main (MavenCli.java:192)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347)
    at sun.reflect.NativeMethodAccessorImpl.invoke0 (Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke (Method.java:498)
    at org.apache.maven.wrapper.BootstrapMainStarter.start (BootstrapMainStarter.java:39)
    at org.apache.maven.wrapper.WrapperExecutor.execute (WrapperExecutor.java:122)
    at org.apache.maven.wrapper.MavenWrapperMain.main (MavenWrapperMain.java:61)
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for apm 8.9.1:
[INFO]
[INFO] apm ................................................ SUCCESS [ 9.083 s]
.
.
.
[INFO] skywalking-management-receiver-plugin .............. SUCCESS [ 2.228 s]
[INFO] skywalking-jvm-receiver-plugin ..................... SUCCESS [ 2.454 s]
[INFO] receiver-proto ..................................... FAILURE [ 7.713 s]
[INFO] envoy-metrics-receiver-plugin ...................... SKIPPED
.
.
.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  06:14 min
[INFO] Finished at: 2021-12-30T06:27:10Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.6.0:exec (default) on project receiver-proto: Command execution failed.: Process exited with an error: 2 (Exit value: 2) -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
[ERROR]
[ERROR] After correcting the problems, you can resume the build with the command
[ERROR]   mvn <goals> -rf :receiver-proto

以上报错推测是与proto有关,但是安装protobuf和grpc-java后依然无效,后来踏破铁鞋无觅处,得来全不费功夫。。。蓦然回首才发现官方docker镜像从8.9.0版本开始已经支持arm64架构了,这波属实是“等等党的胜利”,于是部署skywalking就只需要拉取官方镜像并启动:

docker pull apache/skywalking-oap-server:8.9.1  # 后端服务镜像
docker pull apache/skywalking-ui:8.9.1  # 前端界面镜像
docker run --name skywalking --restart always -d -e TZ=Asia/Shanghai \
    -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=192.168.3.14:9200 \
    -p 12800:12800 -p 11800:11800 \
    apache/skywalking-oap-server:8.9.1  # 运行后端服务镜像,以elasticsearch为存储
docker run --name skywalking-webui --restart always -d \
    -e SW_OAP_ADDRESS=http://192.168.3.14:12800 -e TZ=Asia/Shanghai \
    -p 8088:8080 apache/skywalking-ui:8.9.1  # 运行前端镜像

容器启动后,内存占用达到3.1G,CPU负载依然不高。

容器启动

资源占用情况

skywalking服务后端监听12800端口,前端监听8080端口对外映射到8088,所以访问http://192.168.3.14:8088即可打开skywalking页面。

页面效果

三、系统资源限制

容器刚刚启动时,内存占用3.16G,晚上再看时是3.3G,第二天早上再看,树莓派系统已经挂掉了,所以,需要限制容器的内存占用,查询可知需要在启动容器时添加--memory参数,但是直接添加参数就会发现存在警告信息: WARNING: Your kernel does not support memory limit capabilities or the cgroup is not mounted. Limitation discarded.

警告信息

原因是树莓派当前系统默认不支持cgroup内存限制,需要手动开启,开启的方式是编辑/boot/firmware/cmdline.txt文件,在文件末尾添加cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1然后重启系统,cgroup_enable=cpuset用于启动cpu限制,cgroup_enable=memory cgroup_memory=1用于启用内存限制,swapaccount=1用于启动swap空间限制。

net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1

cmdline.txt

系统重启后稍等一会儿验证服务状态,确认服务都正常后,使用docker stats命令查看容器占用的资源情况。

容器资源占用情况

都是内存大户,内存总量3.7G,已用2.8G,资本家大发慈悲可以再多贴200M,就当买的是树莓派3B吧。。。为了避免内存进一步上涨,限定容器资源如下。

服务 内存占用 内存限制
nginx 10M 20M
mariadb 100M 150M
nacos 695M 750M
es 670M 700M
skywalking 640M 680M
skywalking-webui 309M 320M

停掉并删除之前的nacos、elasticsearch、skywalking等容器,重新执行docker run命令。

docker run -d --name work_nacos --restart=always -p 2288:8848 \
    -e "DB_HOST=192.168.3.14" -e "DB_PORT=3306" -e "DB_NAME=nacosdata" \
    -e "DB_USER=nacos" -e "DB_PASSWORD=***********" \
    --memory=750M nacos:2.0.3
docker run -d --name work_es --restart always -p 9200:9200 -p 9300:9300 \
    -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms256m -Xmx512m" \
    --memory=700M elasticsearch:7.16.2
docker run --name work_skw --restart always -d -e TZ=Asia/Shanghai \
    -e SW_STORAGE=elasticsearch -e SW_STORAGE_ES_CLUSTER_NODES=192.168.3.14:9200 \
    -e JAVA_OPTS="-Xms256m -Xmx512m" -p 12800:12800 -p 11800:11800 \
    --memory=680M apache/skywalking-oap-server:8.9.1  # 添加了JAVA_OPTS参数后,skywalking的内存占用猛降
docker run --name work_skwui --restart always -d \
    -e SW_OAP_ADDRESS=http://192.168.3.14:12800 -e TZ=Asia/Shanghai \
    --memory=320M -p 8088:8080 apache/skywalking-ui:8.9.1

以上命令启动skywalking容器时添加了JAVA_OPTS变量,从java工程内部限制内存使用,内存使用率大大降低,使用docker stats命令查看容器运行状态。

最终内存占用

参考链接:

  容器资源限制   Support_memory_limmit

今天的文章树莓派4B“胡搞计划”Ⅴ——elasticsearch+skywalking!!!分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/19112.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注