零、准备工作
目前我的树莓派上已经跑起了docker、mariadb、nacos、gitea,但是查看资源占用情况,内存占用1.1G,CPU负载更是几乎可以忽略。看来还可以继续压榨其剩余价值(我也有成为资本家的潜质呢~)
既然要搞微服务,那么就再整一个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格式。
格式化完成后使用root账户执行mount /dev/sdb1 /mnt
命令将U盘挂载到/mnt路径下,然后执行lsblk -f
或df -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,可以使用blkid
或lsblk -f
命令查看磁盘的LABEL和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
就可以删除了,系统盘瞬间瘦身。
参考链接:
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权限,效果如图:
为开机自动挂载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服务。。。。
参考链接:
一、部署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: B1▒t▒▒*▒-▒%▒▒: 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
系统重启后稍等一会儿验证服务状态,确认服务都正常后,使用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
命令查看容器运行状态。
参考链接:
今天的文章树莓派4B“胡搞计划”Ⅴ——elasticsearch+skywalking!!!分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/19112.html