2023.05.16 - [๐ŸŒ ์ธํ”„๋ผ/๋ชจ๋‹ˆํ„ฐ๋ง] - Prometheus + Grafana๋กœ Redis ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌ์ถ•ํ•˜๊ธฐ

 

์œ„์˜ ๊ณผ์ œ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ•œ ์ธ์Šคํ„ด์Šค์— ๊ฐ๊ฐ ๋‹ค๋ฅธ ๋ฒ„์ „์˜ Redis๋ฅผ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

Redis์˜ ๊ธฐ๋ณธ ํฌํŠธ๋Š” 6379์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ Redis์˜ ํฌํŠธ๊ฐ€ ๊ฒน์น˜์ง€ ์•Š๋„๋ก ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋ณ€๊ฒฝํ•ด ์„ค์น˜๋˜๋„๋ก ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์•„๋ž˜ ๊ณผ์ •๋Œ€๋กœ ์ง„ํ–‰ํ•ด์ค๋‹ˆ๋‹ค.

# Redis ์†Œ์Šค ์ฝ”๋“œ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์••์ถ• ํ•ด์ œ
$ wget http://download.redis.io/releases/redis-x.x.x.tar.gz
$ tar xzf redis-x.x.x.tar.gz
$ cd redis-x.x.x

# redis.conf ํŒŒ์ผ ์—ด๊ณ  ํฌํŠธ ๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
$ vi redis.conf
# port 6379 -> port 6378

# Redis ์„œ๋ฒ„ ์ปดํŒŒ์ผ ๋ฐ ์„ค์น˜
$ make
$ make install

# ๋ณ€๊ฒฝ๋œ ํฌํŠธ ๋ฒˆํ˜ธ๋กœ Redis ์„œ๋ฒ„ ์‹คํ–‰
$ src/redis-server redis.conf

 

 

Redis๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ Port๊ฐ€ 6378๋กœ ์ž˜ ๋ณ€๊ฒฝ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2023.01.25 - [๐ŸŒ ์ธํ”„๋ผ/NHN Cloud] - NHN Cloud ์ธ์Šคํ„ด์Šค์— Redis ์„ค์น˜ํ•˜๊ธฐ (1) - ์••์ถ•ํŒŒ์ผ ์ด์šฉ

2023.02.08 - [๐Ÿ’ป ํ”„๋กœ๊ทธ๋ž˜๋ฐ/Shell] - Redis ์„ค์น˜ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ (1) - binary ๋ฐฉ์‹

 

์œ„์˜ ํฌ์ŠคํŒ…์„ ์ด์šฉํ•ด์„œ Redis๋ฅผ ์„ค์น˜ํ–ˆ์„ ๋•Œ ์ดˆ๊ธฐ ์‹คํ–‰ ํ™”๋ฉด์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ๋ญ”๊ฐ€ ๊น”๋”ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋“ค์ด ๋– ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Warning: no config file specified, using the default config. In order to specify a config file use src/redis-server /path/to/redis.conf
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

 

๊ตฌ๊ธ€๋ง์„ ํ•˜๋ฉด ๊ธˆ๋ฐฉ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š”์ง€ ํ•œ๋ฒˆ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด๋ณด๋ฉด ์–ด๋–ค ๋‚ด์šฉ์ธ์ง€, ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ๋˜๋Š”์ง€ ์นœ์ ˆํ•˜๊ฒŒ ์ ํ˜€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•˜๋‚˜์”ฉ ์ง„ํ–‰ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!

 

์„ค์น˜ ํ™˜๊ฒฝ

  • NHN Cloud
  • CentOS 7.9
  • Redis 7.0.11

 

1. config ํŒŒ์ผ ์ง€์ •

  • ๋ฌธ์ œ
Warning: no config file specified, using the default config. In order to specify a config file use src/redis-server /path/to/redis.conf

warning ๋ฉ”์‹œ์ง€ ๊ทธ๋Œ€๋กœ config ํŒŒ์ผ์ด ์„ธ๋ถ€์ ์œผ๋กœ ์ง€์ •๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ default config๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋ฉ”์‹œ์ง€์—์„œ ์•Œ๋ ค์ฃผ๋Š”๋Œ€๋กœ ์•„๋ž˜์ฒ˜๋Ÿผ config ํŒŒ์ผ์„ ์ง€์ •ํ•ด์„œ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

src/redis-server redis.conf

 

 

2. TCP backlog ์„ค์ •๊ฐ’ ์˜ค๋ฅ˜

  • ๋ฌธ์ œ
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.

๋ฆฌ๋ˆ…์Šค ์„ค์ •(/proc/sys/net/core/somaxconn)์€ 128๋กœ ๋˜์–ด ์žˆ๋Š”๋ฐ redis.conf์˜ TCP backlog๋Š” 511๋กœ ์„ค์ •๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ˆ…์Šค ์„ค์ • ๊ฐ’์„ ์ฆ๊ฐ€ํ•˜๋ผ๋Š” ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค.

 

  • backlog๋ž€? ๋ฌผ๋ฆฌ์  ๋„คํŠธ์›Œํฌ ํฌํŠธ์—์„œ ํŒจํ‚ท์„ ์Œ“์•„๋‘๋Š” ์ปค๋„์˜ ํ ํฌ๊ธฐ
  • TCP backlog๋ž€? Redis ์„œ๋ฒ„์˜ ์ดˆ๋‹น ํด๋ผ์ด์–ธํŠธ ์—ฐ๊ฒฐ ์ˆ˜
  • somaxconn์ด๋ž€? socket max connection์˜ ์•ฝ์ž๋กœ ๋„คํŠธ์›Œํฌ ์—ฐ๊ฒฐ ์ตœ๋Œ€ ์ˆ˜
  • somaxconn ๊ฐ’ ํ™•์ธํ•˜๊ธฐ
$ sysctl -a | grep somaxconn
net.core.somaxconn = 128

 

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

sysctl.conf ํŒŒ์ผ์˜ somaxconn ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

$ sudo vi /etc/sysctl.conf
net.core.somaxconn = 4096

 

์„ค์ •์ด ์˜๊ตฌ์ ์œผ๋กœ ์ ์šฉ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๊ฑฐ๋‚˜ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค.

$ sudo sysctl net.core.somaxconn=4096

 

 

3. Memory overcommit ๋ฏธ์„ค์ •

  • ๋ฌธ์ œ
WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.

Memory overcommit์ด ๋ฐ˜๋“œ์‹œ ์‹คํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ ํ˜€์žˆ์Šต๋‹ˆ๋‹ค. 

๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ €์žฅ์ด๋‚˜ ๋ณต์ œ๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๊ณ , ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

sysctl.conf ํŒŒ์ผ์˜ vm.overcommit_memory ๊ฐ’์„ 1๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

$ sudo vi /etc/sysctl.conf
vm.overcommit_memory = 1

 

์„ค์ •์ด ์˜๊ตฌ์ ์œผ๋กœ ์ ์šฉ๋˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ์žฌ๋ถ€ํŒ…ํ•˜๊ฑฐ๋‚˜ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ค๋‹ˆ๋‹ค.

$ sudo sysctl vm.overcommit_memory=1

 

 

 

๊ฒฐ๊ณผ

warning ๋ฉ”์‹œ์ง€ ์—†์ด ๊น”๋”ํ•˜๊ฒŒ ์‹คํ–‰๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

 

ACL

Access Control List์˜ ์ค„์ž„๋ง๋กœ redis 6๋ถ€ํ„ฐ ๋„์ž…๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

 

๋‹ค๋ฅธ RDBMS(MySQL, Oracle ๋“ฑ)์—๋Š” ์œ ์ €๋ณ„๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๋ฅผ ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ

redis์—๋Š” ์œ ์ €๋ผ๋Š” ๊ฐœ๋…์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

 

ACL์€ ์œ ์ €๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ปค๋งจ๋“œ์™€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค ์ธก๋ฉด์—์„œ ํŠน์ • ์—ฐ๊ฒฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

# 1
ACL SETUSER alice on >p1pp0 ~cached:* +get

# 2
AUTH alice p1pp0
  • #1 : alice ๋ผ๋Š” user๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
    • ์ด๋ฆ„ 
    • ํŒจ์Šค์›Œ๋“œ : p1pp0
    • ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ‚ค ํŒจํ„ด : cached ๋กœ ์‹œ์ž‘ํ•˜๋Š” key๋“ค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. (allkeys : ๋ชจ๋“  ํ‚ค์— ์ ‘๊ทผ ๊ฐ€๋Šฅ)
    • ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ปค๋งจ๋“œ : ์ ‘๊ทผํ•  ๋•Œ๋Š” get ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. (allcommands : ๋ชจ๋“  ๋ช…๋ น์–ด ์‚ฌ์šฉ ๊ฐ€๋Šฅ)
  • #2 : alice ๊ณ„์ •์œผ๋กœ redis๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ๋งŒ ์„ค์ •ํ•œ๋‹ค๋Š” ๊ฒƒ์€ "default" user๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

ACL feature๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ user๋ฅผ ์ƒ์„ฑํ•˜๊ณ , user๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” key์™€ command๋ฅผ ์ง€์ •ํ•ด๋†“๋Š”๋‹ค๋ฉด, redis๋ฅผ ์กฐ๊ธˆ ๋” ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

์‚ฌ์šฉ์ž ๋“ฑ๋ก

> ACL SETUSER user on/off >password keys commands
  • user: user-id๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • on/off: ์‚ฌ์šฉ ์—ฌ๋ถ€๋ฅผ ์ •ํ•œ๋‹ค. on์ด๋ฉด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๊ณ , off์ด๋ฉด ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.
    • Off๋Š” ์‚ฌ์šฉ์ž๋Š” ๋“ฑ๋กํ•˜์ง€๋งŒ ์ผ๋‹จ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ๊ฒฝ์šฐ ๋˜๋Š” ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉํ•œ๋‹ค.
    • ์ด ๊ฒฝ์šฐ ์ƒˆ๋กœ ๋กœ๊ทธ์ธ(auth)์€ ํ•  ์ˆ˜ ์—†์ง€๋งŒ, ์ด๋ฏธ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์‚ฌ์šฉ์„ ๋ง‰์ง€๋Š” ๋ชปํ•œ๋‹ค.
  • >password: '>' ๊ตฌ๋ถ„์ž ๋‹ค์Œ์— ์ง€์ •ํ•œ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํŒจ์Šค์›Œ๋“œ ์—†์ด ์‚ฌ์šฉํ•˜๋ ค๋ฉด nopass๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๋กœ๊ทธ์ธ ์‹œ ์–ด๋–ค ๋ฌธ์ž์—ด์ด๋“  ์ž…๋ ฅํ•ด๋„ ๋œ๋‹ค.
    • ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ง€์ •ํ–ˆ์„ ๊ฒฝ์šฐ: auth user password ๋กœ ๋กœ๊ทธ์ธ
  • keys:
    • ๋ชจ๋“  ํ‚ค : allkeys ๋˜๋Š” ~*
    • ํŠน์ • ํŒจํ„ด : ์˜ˆ) ~user*, ~key* ์ด๋ ‡๊ฒŒ ์ง€์ •ํ•˜๋ฉด user ๋˜๋Š” key๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ‚ค์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ‚ค X : Resetkeys
    • ํ‚ค ํŒจํ„ด์„ ์ง€์ •ํ•˜๋ฉด ๋งค ๋ช…๋ น๋งˆ๋‹ค ๋น„๊ตํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค. ์„ฑ๋Šฅ์ด ์šฐ์„ ์ผ ๊ฒฝ์šฐ ์‚ฌ์šฉ์— ์ฃผ์˜
  • commands:
    • ๋ชจ๋“  ๋ช…๋ น : allcommands ๋˜๋Š” +@all
    • ๋ช…๋ น X : Nocommands ๋˜๋Š” -@all
    • ๋ช…๋ น์€ ๊ทธ๋ฃน ๋˜๋Š” ๋ช…๋ น์œผ๋กœ ์ถ”๊ฐ€ ๋˜๋Š” ๋บ„ ์ˆ˜ ์žˆ๋‹ค.
      • ๋ช…๋ น ๊ทธ๋ฃน : +@group/-@group, ๋ช…๋ น : +command/-command

 

์‚ฌ์šฉ์ž ์กฐํšŒ

ACL GETUSER user

 

์‚ฌ์šฉ์ž ์‚ญ์ œ

ACL DELUSER user

 

๋ณธ์ธ ํ™•์ธ

ACL WHOAMI

 

์‚ฌ์šฉ์ž ๋ฆฌ์ŠคํŠธ ์กฐํšŒ

ACL USERS

 

์‚ฌ์šฉ์ž ์ •๋ณด ๋ฆฌ์ŠคํŠธ ์กฐํšŒ

ACL LIST

 

์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ

ACL SAVE

 

์‚ฌ์šฉ์ž ์ •๋ณด ๋กœ๋“œ

ACL LOAD

 

๋ช…๋ น ๊ทธ๋ฃน ์กฐํšŒ

127.0.0.1:6379> ACL CAT
1) "keyspace"
2) "read"
3) "write"
4) "set"
5) "sortedset"
6) "list"
7) "hash"
8) "string"
9) "bitmap"
10) "hyperloglog"
11) "geo"
12) "stream"
13) "pubsub"
14) "admin"
15) "fast"
16) "slow"
17) "blocking"
18) "dangerous"
19) "connection"
20) "transaction"
21) "scripting"
  • keyspace: del, expire, flushdb, keys, ttl, scan ๋“ฑ
  • read: get, lrange, smembers, zrange, hget, xrange ๋“ฑ
  • write: set, lpush, sadd, zadd, hset, xadd ๋“ฑ
  • set: sadd, scard, srem, spop ๋“ฑ
  • sortedset: zadd, zcard, srem, zpopmin ๋“ฑ
  • list: lpush, llen, lrem, lpop ๋“ฑ
  • hash: hset, hlen, ldel, hget ๋“ฑ
  • string: set, get, incr ๋“ฑ
  • bitmap: setbit, bitop, getbit ๋“ฑ
  • hyperloglog: pfadd, pfmerge, pfcount, pfselftest
  • geo: geoadd, geodist, georadius ๋“ฑ
  • stream: xadd, xlen, xrange, xdel ๋“ฑ
  • pubsub: publish, subscribe, pubsub ๋“ฑ
  • admin: bgsave, config, debug, shutdown ๋“ฑ
    Admin ๋ช…๋ น์€ dangerous ๊ทธ๋ฃน์— ํฌํ•จ๋œ๋‹ค.
  • fast: get, lpush, hget ๋“ฑ
  • slow: lrem, mset, save ๋“ฑ
  • blocking: blpop, brpop, brpoplpush, bzpopmin, bzpopmax, xread, xreadgroup
  • dangerous: flushdb, keys, shutdown, info, client ๋“ฑ
  • connection: hello, client, auth, echo, ping, command
  • transaction: watch, multi, unwatch, discard, exec
  • scripting: evalsha, eval, script

๊ฐ ๋ช…๋ น์ด ์–ด๋Š ๊ทธ๋ฃน์— ์†ํ•˜๋Š”์ง€๋Š” "command info ๋ช…๋ น"์„ ์‚ฌ์šฉํ•ด์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, SET ๋ช…๋ น์€ write, string, slow์ด๊ณ , GET ๋ช…๋ น์€ read, string, fast์ด๋‹ค.

 

ํŒจ์Šค์›Œ๋“œ ์ƒ์„ฑ

ACL GENPASS [<bits>]
  • ๋””ํดํŠธ๋กœ 64๋ฐ”์ดํŠธ ๋ฌธ์ž์—ด๋กœ ํŒจ์Šค์›Œ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  • ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ SHA-256์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

ACL(Auth) ๋กœ๊ทธ

ACL LOG [<count> | RESET]

โœ… ๊ณต์‹๋ฌธ์„œ

https://redis.io/topics/acl

 

๋ชฉ์ฐจ

 

 

 

 

 

 

์ฐธ๊ณ 

http://redisgate.kr/redis/server/acl.php

https://sungbin.dev/post/Redis%20%ED%95%B4%ED%82%B9%EB%8B%B9%ED%95%9C%20%EC%9D%B4%EC%95%BC%EA%B8%B0

Pub/Sub - ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค

Pub/Sub์€ Publish/Subscribe์˜ ์ค„์ž„๋ง์ž…๋‹ˆ๋‹ค.

 

๋‹จ์–ด ์ž์ฒด์— ๊ตฌ๋…/๊ฒŒ์‹œ๋ผ๋Š” ๋œป์ด ์žˆ๋“ฏ์ด Redis์—์„œ Pub/Sub ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ฑ„๋„์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ์œผ๋กœ์จ ์„œ๋กœ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ตฌ์กฐ

ํด๋ผ์ด์–ธํŠธ๋Š” ํ•˜๋‚˜์˜ Topic์„ "Sub"ํ•˜๊ณ ,

ํ•ด๋‹น ํ† ํ”ฝ์„ "Sub"ํ•œ ๋‹ค๋ฅธ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น Topic์—์„œ "Pub"๋˜๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

MSDN blog

Topic์ด๋ผ๋Š” ๋งค๊ฐœ์ฒด๋ฅผ ํ†ตํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ

์ˆ˜์‹ ์ž์™€ ๋ฐœ์‹ ์ž๊ฐ€ ์„œ๋กœ๋ฅผ ์•Œ์ง€ ๋ชปํ•˜๋”๋ผ๋„ ๋ฉ”์‹œ์ง€๋ฅผ ์†ก์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํŠน์ง•

๋ฉ”์‹œ์ง€๋Š” Redis์— ์ €์žฅ๋˜์ง€ ์•Š๊ณ  ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „์†ก๋œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋ฉด ์ด๋ฅผ ๋ฐ”๋กœ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ

์ด๋ฅผ ํ†ตํ•ด Redis ์ง€์› ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง• ๋ฐ ์•Œ๋ฆผ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ pub/sub๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ์‚ฌ์šฉ์ž์—์„œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ๊ฐ ๋Œ€ํ™”์— ๋Œ€ํ•œ ์ฑ„๋„์ด ์žˆ๊ณ 
  2. ๋Œ€ํ™”์— ์ฐธ์—ฌํ•˜๋Š” ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์ฑ„๋„์„ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•ด๋‹น ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ 
  4. ํ•ด๋‹น ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ‘Ž ๋”ฐ๋ผ์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ €์žฅํ•˜์—ฌ ๊ด€๋ฆฌํ•ด์•ผ ๋˜๋Š” ๊ฒฝ์šฐ, Redis์˜ Pub/Sub์€ ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘ ์˜ˆ๋ฅผ ๋“ค์–ด PUSH ๋ฉ”์‹œ์ง€์ฒ˜๋Ÿผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋กœ๊ทธ์ธ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๋ช…๋ น์–ด

Commands Syntax Description
subscribe channel [channel...] ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜์—ฌ, ๋ฉ”์‹œ์ง€๋ฅผ ์ˆ˜์‹ ๋ฐ›์Œ (๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ ๊ตฌ๋… ๊ฐ€๋Šฅ)
publish channel message ๋ฉ”์‹œ์ง€ ์ง€์ •ํ•œ ์ฑ„๋„๋กœ ์†ก์‹ 
pubsub subcommand [argument [argument ...]] ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ์ฑ„๋„์ด๋‚˜ ํŒจํ„ด์„ ์กฐํšŒ
psubscribe pattern [pattern ...] ์ฑ„๋„ ์ด๋ฆ„์„ ํŒจํ„ด์œผ๋กœ ๋“ฑ๋ก
unsubscribe [channel [channel ...]] subscribe๋กœ ๋“ฑ๋กํ•œ ์ฑ„๋„ ๊ตฌ๋… ํ•ด์ œ
punsubscribe [pattern [pattern ..]] psubscribe๋กœ ๋“ฑ๋กํ•œ ํŒจํ„ด ์ฑ„๋„ ๊ตฌ๋… ํ•ด์ œ

 

subscribe ๋ช…๋ น์–ด

ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ช…์‹œํ•œ ์ฑ„๋„์„ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฑ„๋„์„ ๋™์‹œ์— ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ๊ฐ’ : ๊ตฌ๋…ํ•œ ์ฑ„๋„๋ช…, integer๊ฐ’ ๋ฐ˜ํ™˜

> subscribe <์ฑ„๋„๋ช…>

> subscribe <์ฑ„๋„๋ช…1> <์ฑ„๋„๋ช…2> ... # ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ฑ„๋„์„ ๋“ฑ๋กํ•˜๋ฉด, ๊ฐ๊ฐ์˜ ์ฑ„๋„๋กœ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐœํ–‰๋˜๋ฉด ๋ชจ๋‘ ์ˆ˜์‹ ํ•œ๋‹ค.

โœ”๏ธ redis์—์„œ channel์„ ์ƒ์„ฑํ•˜๋Š” ๋ช…๋ น์–ด๋Š” ์—†๊ณ , subscribe๋กœ ์ฑ„๋„์„ ์ƒ์„ฑํ•˜๊ณ  ๊ตฌ๋…ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

publish ๋ช…๋ น์–ด

์ด์ œ ch1์„ ๊ตฌ๋…ํ•˜๋Š” subscriber๊ฐ€ ์ƒ๊ฒผ์œผ๋ฏ€๋กœ,

publisher client์—์„œ publish ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ•˜๋ฉด

subscriber client์—์„œ ํ•ด๋‹น ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

> publish <์ฑ„๋„> <๋‚ด์šฉ>
(integer) 2 # ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐœํ–‰ํ–ˆ๊ณ , 2๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ์Œ

publisher
subscriber

 

pubsub ๋ช…๋ น์–ด

administrator๊ฐ€ ํšจ์œจ์ ์œผ๋กœ subscriber๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

  • channels : ํ™œ์„ฑํ™” ๋œ ์ฑ„๋„
  • numsub : ํŠน์ • ์ฑ„๋„์„ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” subscriber์˜ ๊ฐœ์ˆ˜ ํ™•์ธ
    • pattern subscription์œผ๋กœ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” subscriber๋Š” count์— ํฌํ•จ๋˜์ง€ ์•Š์Œ
  • numpat : pattern subscription์˜ subscriber ๊ฐœ์ˆ˜ ํ™•์ธ
    • ํŠน์ • ์ฑ„๋„์˜ subscriber๊ฐ€ ์•„๋‹Œ, ์ „์ฒด subscriber ๊ฐœ์ˆ˜ return
# ํ™œ์„ฑํ™”๋œ ์ฑ„๋„์ด ์—†์„ ๋•Œ
> pubsub channels
(empty array)

# ์•„๋ž˜์˜ SUBSCRIBE ๋ช…๋ น์–ด๋กœ ์ฑ„๋„์„ ํ•œ ๊ฐœ ํ™œ์„ฑํ™” ์‹œ์ผฐ์„ ๋•Œ
> pubsub channels
1) "c1"

# ์ฑ„๋„์„ ๊ตฌ๋…์ค‘์ธ ํด๋ผ์ด์–ธํŠธ ์ˆ˜ ํ™•์ธ
> pubsub numsub ch1
1) "ch1"
2) (integer) 1

# ํŒจํ„ดํ˜•์œผ๋กœ ๋“ฑ๋ก๋œ ํด๋ผ์ด์–ธํŠธ ์ˆ˜ ํ™•์ธ
> pubsub numpat
(integer) 0

 

psubscribe ๋ช…๋ น์–ด

์ˆ˜์‹ ํ•  ์ฑ„๋„ ์ด๋ฆ„์˜ ํŒจํ„ด์„ ๋“ฑ๋กํ•˜๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

 

ํŒจํ„ด์€ ์•„๋ž˜์™€ ๊ฐ™์€ glob-style์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

  • '?' : ํ•œ ๊ธ€์ž ๋Œ€์น˜
  • '*' : ๊ณต๋ฐฑ์ด๋‚˜ ์—ฌ๋Ÿฌ ๊ธ€์ž ๋Œ€์น˜
# ํŒจํ„ด์„ ๋“ฑ๋กํ•˜์—ฌ ์ˆ˜์‹ ์‹œ์ž‘
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1

# ํŒจํ„ด ์ฑ„๋„์„ ๋“ฑ๋ก๋œ ์ฑ„๋„์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š์Œ
127.0.0.1:6379> pubsub channels
1) "c1"

# ํŒจํ„ด ์กฐํšŒ : 1๊ฐœ ํ™•์ธ
127.0.0.1:6379> pubsub numpat
(integer) 1

# ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜๋˜ ์ฑ„๋„ ch2๋กœ ๋ฉ”์‹œ์ง€ ๋ณด๋ƒ„
> publish ch2 "test 2"
(integer) 1

# ํŒจํ„ด์œผ๋กœ ๊ตฌ๋… ์‹ ์ฒญํ•œ ์ฑ„๋„์— ๋ฉ”์‹œ์ง€๊ฐ€ ์ถ”๊ฐ€๋จ
> psubscribe c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1
1) "pmessage"
2) "c*"
3) "c2"
4) "test 2"

 

unsubscribe / punsubscribe ๋ช…๋ น์–ด

  • ๊ธฐ๋ณธ : redis-cli์—์„œ ctrl+c๋กœ ๊ตฌ๋… ์ข…๋ฃŒ
  • ๋ณ„๋„ ํด๋ผ์ด์–ธํŠธ : unsubscribe ๋ช…๋ น์–ด๋กœ ์ˆ˜์‹  ์ค‘๋‹จ
  • ํŒจํ„ด ์ฑ„๋„ : punsubscribe ๋ช…๋ น์–ด๋กœ ์ˆ˜์‹  ์ค‘๋‹จ
  • ์ฑ„๋„๋ช… ์ž…๋ ฅํ•˜์ง€ ์•Š์œผ๋ฉด : ํ•ด๋‹น ํด๋ผ์ด์–ธํŠธ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ์ฑ„๋„ ์‚ญ์ œ
> unsubscribe ch1*
1) "unsubscribe"
2) "ch*"
3) (integer) 1

> punsubscribe ch1*
1) "punsubscribe"
2) "ch*"
3) (integer) 1

 

 

 

 

์ฐธ๊ณ 

https://inpa.tistory.com/entry/REDIS-%F0%9F%93%9A-PUBSUB-%EA%B8%B0%EB%8A%A5-%EC%86%8C%EA%B0%9C-%EC%B1%84%ED%8C%85-%EA%B5%AC%EB%8F%85-%EC%95%8C%EB%A6%BC

https://velog.io/@tilsong/Redis%EC%9D%98-%EC%A3%BC%EC%9A%94-%EA%B8%B0%EB%8A%A5-2-PubSub

ํ™œ์šฉ ์˜ˆ์ œ

Counting

Strings

  • ๋‹จ์ˆœ ์ฆ๊ฐ ์—ฐ์‚ฐ
  • INCR / INCRBY / INCRBYFLOAT / HINCRBY / HINCRBYFLOAT / ZINCRBY

Bits

  • ๋ฐ์ดํ„ฐ ์ €์žฅ๊ณต๊ฐ„ ์ ˆ์•ฝ
  • ์ •์ˆ˜๋กœ ๋œ ๋ฐ์ดํ„ฐ๋งŒ ์นด์šดํŒ… ๊ฐ€๋Šฅ
    • userid ๊ฐ’์ด 0 ์ด์ƒ์˜ ์ •์ˆ˜๊ฐ’์ผ ๋•Œ๋งŒ ์นด์šดํŒ…์ด ๊ฐ€๋Šฅ
    • ์‹œํ€€์…œํ•œ ๊ฐ’์ด ์—†์„ ๋•Œ์—๋Š” ์‚ฌ์šฉ ๋ถˆ๊ฐ€
  • SETBIT / BITCOUNT

HyperLogLogs

  • ๋Œ€๋Ÿ‰์˜ ์œ ๋‹ˆํฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์นด์šดํŒ…ํ•  ๋•Œ ์ ์ ˆ
  • set๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ ์ €์žฅ๋˜๋Š” ์šฉ๋Ÿ‰์ด ๋งค์šฐ ์ž‘์Œ
  • ์›น์‚ฌ์ดํŠธ์— ๋ฐฉ๋ฌธํ•œ ์œ ๋‹ˆํฌํ•œ IP ์ˆ˜ / ํ•˜๋ฃจ ์ข…์ผ ํฌ๋กค๋งํ•œ URL ์ˆ˜ / ๊ฒ€์ƒ‰์—”์ง„์—์„œ ๊ฒ€์ƒ‰๋œ ์œ ๋‹ˆํฌํ•œ ๋‹จ์–ด ์ˆ˜
  • PFADD / PFCOUNT / PFMERGE

Messaging

Lists

  • ์ž์ฒด์ ์œผ๋กœ blocking ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์„œ Event Queue๋กœ ์‚ฌ์šฉ โ†’ ๋ถˆํ•„์š”ํ•œ polling์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Œ
  • ํ‚ค๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ ์ €์žฅ ๊ฐ€๋Šฅ - LPUSHX / RPUSHX

Streams

  • ๋กœ๊ทธ ์ €์žฅ
  • append-only
  • ์‹œ๊ฐ„ ๋ฒ”์œ„ ๊ฒ€์ƒ‰ / ์‹ ๊ทœ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ ์ˆ˜์‹  / ์†Œ๋น„์ž๋ณ„ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ (์†Œ๋น„์ž ๊ทธ๋ฃน) - kafka์—์„œ ์ฐจ์šฉ
  • ๋ฉ”์‹œ์ง• ๋ธŒ๋กœ์ปค ์—ญํ• 
  • XADD : hash์ฒ˜๋Ÿผ key-value ์Œ์œผ๋กœ ์ €์žฅ

 

์žฅ์•  ํฌ์ธํŠธ

Redis๋Š” Single Thread ๋ผ๋Š” ์ ์„ ์žŠ์ง€ ๋ง์ž!

  • keys * โ†’ scan์œผ๋กœ ๋Œ€์ฒด
  • ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์ปค๋งจ๋“œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž
  • hash, sorted set ์“ธ ๋•Œ ํ•˜๋‚˜์˜ ํ‚ค์— 100๋งŒ๊ฐœ ์ดํ•˜๋กœ๋งŒ ๋‹ด์ž
  • Flush All : ํ‚ค ๋‹ค ๋‚ ๋ ค๋ฒ„๋ฆฌ๊ธฐ โ†’ ์ด๊ฑฐ ํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ๊ฑฐ ๋ชปํ•จ

+ Recent posts