gitlab 16.x - ERR unknown command ‘HELLO‘

news/2024/10/18 18:20:52/

现象

gitlab部分操作报错500。通过Rails日志发现以下报错:

报错:

RedisClient::CommandError

ERR unknown command 'HELLO'

{"severity": "ERROR","time": "2024-04-22T02:50:16.906Z","correlation_id": "01HW1VC67EJEGKQ1A1CW9TMVPV","meta.caller_id": "UserSettings::PersonalAccessTokensController#create","meta.remote_ip": "10.1.11.11","meta.feature_category": "system_access","meta.user": "root","meta.user_id": 1,"meta.client_id": "user/1","exception.class": "RedisClient::CommandError","exception.message": "ERR unknown command 'HELLO'","exception.backtrace": ["lib/gitlab/instrumentation/redis_client_middleware.rb:26:in `block in call_pipelined'","lib/gitlab/instrumentation/redis_helper.rb:17:in `instrument_call'","lib/gitlab/instrumentation/redis_client_middleware.rb:25:in `call_pipelined'","lib/gitlab/patch/redis_client.rb:12:in `ensure_connected'","config/initializers/forbid_sidekiq_in_transactions.rb:82:in `block (2 levels) in \u003cmodule:NoEnqueueingFromTransactions\u003e'","app/services/notification_service.rb:95:in `access_token_created'","app/services/personal_access_tokens/create_service.rb:20:in `execute'","app/controllers/user_settings/personal_access_tokens_controller.rb:33:in `create'","app/controllers/application_controller.rb:468:in `set_current_admin'","lib/gitlab/session.rb:11:in `with_session'","app/controllers/application_controller.rb:459:in `set_session_storage'","lib/gitlab/i18n.rb:114:in `with_locale'","lib/gitlab/i18n.rb:120:in `with_user_locale'","app/controllers/application_controller.rb:450:in `set_locale'","app/controllers/application_controller.rb:443:in `set_current_context'","lib/gitlab/metrics/elasticsearch_rack_middleware.rb:16:in `call'","lib/gitlab/middleware/memory_report.rb:13:in `call'","lib/gitlab/middleware/speedscope.rb:13:in `call'","lib/gitlab/database/load_balancing/rack_middleware.rb:23:in `call'","lib/gitlab/middleware/rails_queue_duration.rb:33:in `call'","lib/gitlab/etag_caching/middleware.rb:21:in `call'","lib/gitlab/metrics/rack_middleware.rb:16:in `block in call'","lib/gitlab/metrics/web_transaction.rb:46:in `run'","lib/gitlab/metrics/rack_middleware.rb:16:in `call'","lib/gitlab/middleware/go.rb:20:in `call'","lib/gitlab/middleware/query_analyzer.rb:11:in `block in call'","lib/gitlab/database/query_analyzer.rb:40:in `within'","lib/gitlab/middleware/query_analyzer.rb:11:in `call'","lib/gitlab/middleware/multipart.rb:173:in `call'","lib/gitlab/middleware/read_only/controller.rb:50:in `call'","lib/gitlab/middleware/read_only.rb:18:in `call'","lib/gitlab/middleware/unauthenticated_session_expiry.rb:18:in `call'","lib/gitlab/middleware/same_site_cookies.rb:27:in `call'","lib/gitlab/middleware/path_traversal_check.rb:35:in `call'","lib/gitlab/middleware/handle_malformed_strings.rb:21:in `call'","lib/gitlab/middleware/basic_health_check.rb:25:in `call'","lib/gitlab/middleware/handle_ip_spoof_attack_error.rb:25:in `call'","lib/gitlab/middleware/request_context.rb:15:in `call'","lib/gitlab/middleware/webhook_recursion_detection.rb:15:in `call'","config/initializers/fix_local_cache_middleware.rb:11:in `call'","lib/gitlab/middleware/compressed_json.rb:44:in `call'","lib/gitlab/middleware/rack_multipart_tempfile_factory.rb:19:in `call'","lib/gitlab/middleware/sidekiq_web_static.rb:20:in `call'","lib/gitlab/metrics/requests_rack_middleware.rb:79:in `call'","lib/gitlab/middleware/release_env.rb:13:in `call'"],"user.username": "root","tags.program": "web","tags.locale": "en","tags.feature_category": "system_access","tags.correlation_id": "01HW1VC67EJEGKQ1A1CW9TMVPV","extra.storage": "queues"
}

排查

日志报错是Redis执行HELLO命令报错,这个命令适用于指定RESP版本。

  1. Gitlab官方文档要求16.0以上版本,需要使用Redis 6.x or 7.x
  2. Redis 6.x 开始支持RESP3
  3. 连接到Redis,执行Hello 2成功;执行Hello 3报错:ERR unknown command 'HELLO'

结合以上3点,怀疑Gitlab 16.x版本之前使用RESP2,之后使用RESP3。

进入Redis,执行monitor,复现问题查看操作:

再次看到与HELLO 3命令相关。

结论&后续处理

结论(踩坑)

  1. 部分公有云Redis 6.x版本,不支持RESP3协议。
  2. Gitlab官方虽然明确说明16.x要使用Redis 6.x or 7.x,但是没有阐述原因。我想其中一个原因就是新的ruby代码对于RESP3协议的依赖。如果官网明确说明,并且附上前置检查步骤会更好。

后续处理

  1. 可以自己部署6.x版本redis高可用节点。
  2. 可以选择支持RESP3协议的公有云Redis实例使用。

http://www.ppmy.cn/news/1443214.html

相关文章

力扣经典150题第四十八题:合并区间

目录 题目描述和要求示例解释解题思路算法实现复杂度分析测试和验证总结和拓展参考资料 题目描述和要求 给定一个数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi]。合并所有重叠的区间,并返回一个不重叠的区间数组&a…

数据分析-----方法论

什么是数据分析方法 数据分析方法:将零散的想法和经验整理成有条理的、系统的思路,从而快速地解决问题。 案例: 用户活跃度下降 想法: APP出现问题?去年也下降了吗?是所有的人群都在下降吗&#xff1f…

CentOS 删除文件提示 Operation not permitted 的解决方法

1、阿里云服务器提示存在挖矿行为,路径在 /etc/zzh,我们做下删除动作,发现不能删除 [rootMSH etc]# rm -f zzh# 提示 rm: cannot remove ‘zzh’: Operation not permitted2、解决方法: (1)、查看文件权限 [rootMSH etc]# lsat…

am62x Ti官方资源一览

文章目录 1 Ti-Am62x Resource Explorer使用一 官方介绍二 资料查询1 AM62x芯片文档2 SK-AM62X参考板3 SD卡镜像4开发SDK5 Linux开发6 问题提问1 Ti-Am62x Resource Explorer使用 一 官方介绍 打开主页,最左侧显示如下,当前分为7大类 Arm@-based microcontrollers Arm系列微…

【python技术】使用akshare抓取东方财富所有概念板块,并把指定板块概念的成分股保存excel 简单示例

最近有个想法,分析A股某个概念成分股情况进行分析,第一反应是把对应概念板块的成分股爬取下来。说干就干 下面是简单示例 import akshare as ak import pandas as pddef fetch_and_save_concept_stocks(name):# 获取指定股票概念的成分股,并…

Qt Creator导入第三方so库和jar包——Qt For Android

前言 之前了解了在Android Studio下导入so库和jar包,现在实现如何在Qt上导入so库和jar包。 实现 下面是我安卓开发(需调用安卓接口的代码)的目录(图1),此目录结构和原生态环境(Android Studi…

web安全---xss漏洞/beef-xss基本使用

what xss漏洞----跨站脚本攻击(Cross Site Scripting),攻击者在网页中注入恶意脚本代码,使受害者在浏览器中运行该脚本,从而达到攻击目的。 分类 反射型---最常见,最广泛 用户将带有恶意代码的url打开&a…

C#发票查验开发示例、发票识别开发文档

或许有人会问,发票查验与发票识别接口是什么?简单来说,它只是集成在财务系统或APP等应用中的一个功能模块。只需上传发票图片,发票识别接口即可快速提取发票代码、号码、日期、金额、校验码等关键信息,发票查验接口实时…