이 Medium 기사에 따르면, Unix 도메인 소켓을 통해 연결하는 것이 TCP 소켓을 사용하는 것보다 약 20% 빠르다고 합니다…
또한 Unix 도메인 소켓을 사용하면 웹 컨테이너와 데이터 컨테이너를 분리하지 않고도 여러 Standalone 컨테이너를 실행하기가 더 쉬워집니다… 그렇지 않으면 Redis가 127.0.0.1에서 리스닝하는 문제로 충돌이 발생할 것 같습니다…
현재 하나의 호스트에서 완전히 독립적인 Standalone 컨테이너 두 개를 설정하고 있습니다. 둘 다 아주 작은 사이트용이므로, Standalone 컨테이너로 유지하는 유연성을 선호합니다… 불행히도 Redis가 127.0.0.1에서 리스닝하는 것(그리고 아마도 Postgres도)이 충돌을 일으킬 것입니다…
Docker 내부에서 Discourse를 실행하는 경우에도 그렇게 작동할 거라고 생각했지만, 실제로 실행해 보니 부트스트래핑 과정에서 다음과 같은 내용을 확인했습니다:
INFO -- : > cd /var/www/discourse && git reset --hard
# oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
# Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=195, just started
# Configuration loaded
# Could not create server TCP listening socket *:6379: bind: Address already in use
Checking out files: 100% (27893/27893), done.
그리고 "다른 Redis 컨테이너로 인해 설치 실패"에 대한 이 스레드를 발견했지만, 실제로는 디스크 공간 부족이 문제였습니다… 몇 가지 항목을 정리한 후, 여러 개의 독립형 컨테이너를 함께 사용하는 데도 문제가 없이 잘 작동합니다.
근본적인 문제를 발견하시고, Redis가 "컨테이너 내부"에서 실행되며 컨테이너 외부에는 노출되지 않음(소켓 I/O 관점에서, 기본 설정 상태)을 이해하게 되셨다니 기쁩니다.
Unix 도메인 소켓과 Redis를 사용하는 것에 대해, 이는 훌륭한 아이디어라고 생각하며 아직 설정해 보지 않았고, Discourse에서 이를 설정하는 방법에 대한 문서도 읽어 본 적이 없습니다. 따라서 이 옵션을 계속 탐구해 주시길 권장합니다.
시간이 나면 이를 더 조사하여 스테이징 서버의 Discourse에서 Redis가 Unix 도메인 소켓을 사용하도록 설정해 보겠습니다. 그 사이에 이 문제를 해결하여 결과를 공유해 주시면 매우 감사하겠습니다. 이 흥미로운 Redis 주제에 대해 다른 많은 분들도 관심을 가지고 있을 것입니다.
참고로 환경 변수는 올바르게 전달되고 있습니다. UNIX 소켓에서 경청하지 않도록 Redis만 설정하고 나머지는 그대로 두었더니, unicorn은 정상적으로 시작되지만 sidekiq는 UNIX 소켓을 찾지 못해 실패합니다 :
Error in demon processes heartbeat check: No such file or directory - connect(2) for /shared/redis_data/redis.sock
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:116:in `initialize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:116:in `new'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:116:in `connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/ruby_connection.rb:51:in `initialize'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:759:in `new'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:759:in `block in connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client/middlewares.rb:12:in `connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:758:in `connect'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:745:in `raw_connection'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:705:in `ensure_connected'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/redis-client-0.24.0/lib/redis_client.rb:285:in `call'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/redis_client_adapter.rb:36:in `block (2 levels) in <module:CompatMethods>'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/api.rb:912:in `block in cleanup'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/config.rb:175:in `block in redis'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:110:in `block (2 levels) in with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:109:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:109:in `block in with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:106:in `handle_interrupt'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/connection_pool-2.5.3/lib/connection_pool.rb:106:in `with'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/config.rb:172:in `redis'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq.rb:74:in `redis'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/api.rb:912:in `cleanup'
/var/www/discourse/vendor/bundle/ruby/3.3.0/gems/sidekiq-7.3.9/lib/sidekiq/api.rb:903:in `initialize'
/var/www/discourse/lib/demon/sidekiq.rb:25:in `new'
/var/www/discourse/lib/demon/sidekiq.rb:25:in `heartbeat_check'
config/unicorn.conf.rb:131:in `block (2 levels) in reload'
오류 추적을 보면, global_setting.rb이 sidekiq의 경우 호스트와 포트를 적용하지 않는다는 것이 알 수 있습니다. unicorn에서는 적용하고 있는데 말이죠. 이는 REDIS_URL이 여전히 작동하지만, 다른 곳에서 연결 설정이 정의되지 않은 경우에만 작동한다는 사실과 일치합니다.