记一次 Garnet 的安装部署问题排查

2024-08-29 23:44

本文主要是介绍记一次 Garnet 的安装部署问题排查,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要以安装部署替代 Redis 的 Garnet 为例,介绍如何排查 Linux 系统中部署 .NET 独立应用程序时遇到的问题。通过检查文件权限、依赖库、SELinux 配置等方面,解决了应用程序无法正常运行的问题。

1. 背景

Garnet 是微软研究院的新开源项目,它是一个远程缓存存储,提供了一系列独特的优势。Garnet 采用了 Redis 的 RESP 协议作为起点,这使得开发者可以使用大多数编程语言中现成的Redis客户端,例如 .NET 中的 StackExchange.Redis,来使用 Garnet。相比于其他开源缓存存储,Garnet 在性能、延迟、可扩展性和持久性方面有显著的提升。

最近在将其作为 .NET 独立应用程序部署到 Linux 系统时,遇到了一些问题。在此记录整个排查过程,希望能为其他遇到类似问题的人提供一些帮助。

2. 环境描述

  • 操作系统:Anolis OS 8
  • 应用程序:Garnet(.NET 独立应用程序)
  • 部署方式:systemd 服务

这边 Garnet 直接通过源码生成的二进制文件进行部署,生成非框架依赖的独立应用程序,没有进行裁剪。

请添加图片描述

3. 问题描述

这里添加了执行权限,并开放了相关端口。

请添加图片描述

请添加图片描述

在控制台手动启动 Garnet 应用程序时,一切正常:

./GarnetServer

但是,通过 systemd 服务启动时,应用程序却无法正常运行,报错如下:

● garnet.service - Garnet ServerLoaded: loaded (/etc/systemd/system/garnet.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since Fri 2024-08-16 11:57:09 CST; 497ms agoProcess: 1331875 ExecStart=/root/app/garnet/GarnetServer (code=exited, status=203/EXEC)Main PID: 1331875 (code=exited, status=203/EXEC)

请添加图片描述

4. 排查过程

4.1 确认文件权限和路径

首先确认文件是否存在并具有执行权限:

ls -l /root/app/garnet/GarnetServer

输出显示文件存在并且权限正确:

-rwxr-xr-x. 1 root root 74325221 8月  16 11:29 /root/app/garnet/GarnetServer

4.2 检查依赖库

使用 ldd 命令检查依赖库是否存在:

ldd /root/app/garnet/GarnetServer

输出显示所有依赖库都存在:

linux-vdso.so.1 (0x00007ffcc8c44000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe048e00000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe048a00000)
libz.so.1 => /lib64/libz.so.1 (0x00007fe048600000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe048200000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe047e00000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe047a00000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fe047600000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe047200000)

请添加图片描述

4.3 检查 SELinux 配置

怀疑可能是 SELinux 的问题,检查文件的 SELinux 上下文:

ls -lZ /root/app/garnet/GarnetServer

输出显示文件的当前 SELinux 上下文:

-rwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /root/app/garnet/GarnetServer

将文件的 SELinux 类型更改为 bin_t,以允许其被执行:

sudo chcon -t bin_t /root/app/garnet/GarnetServer

再次检查文件的 SELinux 上下文,确认已更改:

ls -lZ /root/app/garnet/GarnetServer

输出显示类型已更改为 bin_t

-rwxr-xr-x. root root unconfined_u:object_r:bin_t:s0 /root/app/garnet/GarnetServer

4.4 更新 systemd 服务单元文件

确保 systemd 服务单元文件配置正确:

[Unit]
Description=Garnet Server
After=network.target[Service]
Type=simple
ExecStart=/root/app/garnet/GarnetServer
Restart=on-failure
User=root
WorkingDirectory=/root/app/garnet
StandardOutput=journal
StandardError=journal[Install]
WantedBy=multi-user.target

4.5 刷新并重启服务

刷新 systemd 配置并重启服务:

sudo systemctl daemon-reload
sudo systemctl restart garnet.service

请添加图片描述

此时服务已可以正常启动,通过 Tiny RDM 也可以正常连接查看了。

请添加图片描述

5. 结果

调整 SELinux 上下文后,Garnet 服务成功启动并运行正常。问题的根源在于 SELinux 的安全策略,默认情况下不允许执行非 bin_t 类型的文件。通过将文件类型更改为 bin_t,解决了 203/EXEC 错误。

6. 总结

在 Linux 系统中部署应用程序时,SELinux 的安全策略常常是导致问题的原因之一。通过正确设置文件的 SELinux 上下文,可以确保应用程序正常运行。如果你在部署过程中遇到类似问题,希望这篇文章能为你提供一些帮助。

这篇关于记一次 Garnet 的安装部署问题排查的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1119192

相关文章

SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题

《SpringBoot利用dynamic-datasource-spring-boot-starter解决多数据源问题》dynamic-datasource-spring-boot-starter是一... 目录概要整体架构构想操作步骤创建数据源切换数据源后续问题小结概要自己闲暇时间想实现一个多租户平台,

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

mybatis-plus分页无效问题解决

《mybatis-plus分页无效问题解决》本文主要介绍了mybatis-plus分页无效问题解决,原因是配置分页插件的版本问题,旧版本和新版本的MyBatis-Plus需要不同的分页配置,感兴趣的可... 昨天在做一www.chinasem.cn个新项目使用myBATis-plus分页一直失败,后来经过多方

Pycharm安装报错:Cannot detect a launch configuration解决办法

《Pycharm安装报错:Cannotdetectalaunchconfiguration解决办法》本文主要介绍了Pycharm安装报错:Cannotdetectalaunchconfigur... 本文主要介绍了Pycharm安装报错:Cannot detect a launch configuratio

pytorch+torchvision+python版本对应及环境安装

《pytorch+torchvision+python版本对应及环境安装》本文主要介绍了pytorch+torchvision+python版本对应及环境安装,安装过程中需要注意Numpy版本的降级,... 目录一、版本对应二、安装命令(pip)1. 版本2. 安装全过程3. 命令相关解释参考文章一、版本对

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

大数据spark3.5安装部署之local模式详解

《大数据spark3.5安装部署之local模式详解》本文介绍了如何在本地模式下安装和配置Spark,并展示了如何使用SparkShell进行基本的数据处理操作,同时,还介绍了如何通过Spark-su... 目录下载上传解压配置jdk解压配置环境变量启动查看交互操作命令行提交应用spark,一个数据处理框架

Flask解决指定端口无法生效问题

《Flask解决指定端口无法生效问题》文章讲述了在使用PyCharm开发Flask应用时,启动地址与手动指定的IP端口不一致的问题,通过修改PyCharm的运行配置,将Flask项目的运行模式从Fla... 目录android问题重现解决方案问题重现手动指定的IP端口是app.run(host='0.0.

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

mysql关联查询速度慢的问题及解决

《mysql关联查询速度慢的问题及解决》:本文主要介绍mysql关联查询速度慢的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql关联查询速度慢1. 记录原因1.1 在一次线上的服务中1.2 最终发现2. 解决方案3. 具体操作总结mysql