Post

Windows에서 Redis 설치하기 with WSL

🥑 들어가며

회사에서 내가 맡고있는 업무에 Redis를 도입하려 한다. 로컬은 윈도우고 서버는 리눅스라서, postgresql을 사용하듯이 Redis도 테스트 서버에 설치하고 로컬에서 연결하여 사용하려 하였다. 그러나 연결이 되지 않는 것이다! 그래서 로컬에 깔아서 테스트하고 서버에 올리려 한다. 윈도우에선 공식적으로 Redis를 지원하지 않는다는 글을 읽었다. 따라서 Redis를 사용하려면 WSL을 이용해서 Redis를 설치해야 한다는 것! 그래서 윈도우에서 Redis 설치 방법을 기록하려 한다.


📌 WSL 설치하기

WSL은 Window Subsystem for Linux의 약자이다. 전부는 아니지만 리눅스의 기능을 일부 사용할 수 있다. WSL을 설치하기 전 Windows 기능 켜기 끄기의 상태를 먼저 올리려 한다. 혹시나 중요하게 작용할 수도 있으니까.

image

가상머신 플랫폼Linux용 Windows 하위 시스템이 체크되어 있다.

그리고 Windows PowerShell에 들어가 순서대로 쳐주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# wsl 설치(설치가 되고 나면 Unix의 username과 password를 설정하게 된다.)
$ wsl --install

# Redis 패키지의 GPG 키를 추가하여, Redis를 안전하게 설치할 수 있도록 시스템에 신뢰할 수 있는 패키지 키를 설정
$ curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg

# wsl을 설치하였으니 apt를 update 및 upgrade 해야한다.
$ sudo apt update
$ sudo apt upgrade

# build-essential, pkg-config 설치
# build-essential: 소스 코드를 빌드할 때 필요한 기본적인 패키지를 모아둔 것
# 설치 과정에서 yes를 요구하는 질의에 대해 전부 yes를 할 것이므로 -y 플래그를 넣는다.
$ sudo apt-get install build-essential pkg-config -y


📌 Redis 설치

WLS를 설치했으니 이제 Redis를 설치하면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# Redis 7.4.1 파일 다운로드
# Redis의 버전들은 https://download.redis.io/releases/에서 볼 수 있다.
$ wget https://download.redis.io/releases/redis-7.4.1.tar.gz

# tar.gz 파일 압축 해제 및 삭제
$ tar xvfz redis-*.tar.gz
$ rm redis-*.tar.gz

# 심볼릭 링크 생성
$ ln -s /home/ubuntu/app/redis* redis

# redis 파일로 이동
$ cd redis
-bash: cd: redis: No such file or directory

$ ll
total 28
drwxr-x--- 4 user user 4096 Oct  8 11:54 ./
drwxr-xr-x 3 root  root  4096 Oct  8 11:29 ../
-rw-r--r-- 1 user user  220 Oct  8 11:29 .bash_logout
-rw-r--r-- 1 user user 3771 Oct  8 11:29 .bashrc
drwx------ 2 user user 4096 Oct  8 11:29 .cache/
-rw-r--r-- 1 user user    0 Oct  8 11:29 .motd_shown
-rw-r--r-- 1 user user  807 Oct  8 11:29 .profile
-rw-r--r-- 1 user user    0 Oct  8 11:43 .sudo_as_admin_successful
lrwxrwxrwx 1 user user   23 Oct  8 11:54 redis -> '/home/ubuntu/app/redis*'
drwxr-xr-x 8 user user 4096 Oct  3 04:04 redis-7.4.1/

# 왜인진 모르겠으나 redis로 이동이 되지 않았다.
$ cd redis-7.4.1

# 관리자 권한으로 Makefile에 정의된 빌드 프로세스를 실행
$ sudo make

$ redis-server
6865:C 08 Oct 2024 12:00:39.621 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it 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.
6865:C 08 Oct 2024 12:00:39.621 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
6865:C 08 Oct 2024 12:00:39.621 * Redis version=7.4.1, bits=64, commit=00000000, modified=1, pid=6865, just started
6865:C 08 Oct 2024 12:00:39.621 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
6865:M 08 Oct 2024 12:00:39.622 * Increased maximum number of open files to 10032 (it was originally set to 1024).
6865:M 08 Oct 2024 12:00:39.622 * monotonic clock: POSIX clock_gettime
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis Community Edition
  .-`` .-```.  ```\/    _.,_ ''-._     7.4.1 (00000000/1) 64 bit
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 6865
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           https://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

6865:M 08 Oct 2024 12:00:39.623 * Server initialized
6865:M 08 Oct 2024 12:00:39.623 * Ready to accept connections tcp
^C
6865:signal-handler (1728356443) Received SIGINT scheduling shutdown...
6865:M 08 Oct 2024 12:00:43.149 * User requested shutdown...
6865:M 08 Oct 2024 12:00:43.149 * Saving the final RDB snapshot before exiting.
6865:M 08 Oct 2024 12:00:43.163 * DB saved on disk
6865:M 08 Oct 2024 12:00:43.163 # Redis is now ready to exit, bye bye...


🚨 오류 해결

설치 위치가 usr/local/bin인데, redis-server를 입력해서 실행해보면 usr/bin에 파일이 없다는 엉뚱한 소리를 하는 오류가 생길 때가 있다. 이 경우 아래의 명령어를 작성해주면 된다.

1
2
3
4
5
6
7
# 홈 경로로 이동한 후 Redis 서버 실행 파일과 `redis-cli`를 시스템의 `/usr/bin` 디렉터리로 복사
$ cd ~
$ sudo cp ~/redis-7.4.1/src/redis-server /usr/bin
$ sudo cp ~/redis-7.4.1/src/redis-cli /usr/bin

# 서버 실행
$ redis-server


🍥 Redis 백그라운드 실행하기

Redis를 실행하기 위해 sudo systemctl start redis를 입력하였다.

1
2
3
$ sudo systemctl start redis
[sudo] password for user:
Failed to start redis.service: Unit redis.service not found.

Redis 설치를 끝낸 줄 알았는데 redis.service가 없다니! 새로 만들어주기로 결정하였다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# redis-server가 설치되어 있는지 확인
# 하지만 우리는 방금 redis-server를 입력해 서버가 실행되는 것을 확인했으니 생략해도 된다.
$ which redis-server
/usr/bin/redis-server

# redis-server와 redis-cli의 위치 찾기
$ whereis redis-server
redis-server: /usr/bin/redis-server
$ whereis redis-cli
redis-cli: /usr/bin/redis-cli

# redis.service 생성
# 나는 vi를 사용해서 작성하였다. nano를 사용한다면 nano를 써도 된다.
$ sudo vi /etc/systemd/system/redis.service
sudo mv ~/jiran/redis-7.4.1/* /etc/redis/


🥨 Service 파일 작성

redis.service 파일을 아래와 같이 작성한다. ExecStartExecStop에 들어갈 경로는 아까 whereis 커맨드를 입력해서 찾은 경로를 입력해줘야 한다. 나는 /usr/bin로 떠서 저렇게 입력해줬다. 만약 /usr/local/bin으로 뜬다면 /usr/local/bin으로 작성하면 된다. /etc/redis/redis.conf 또한 본인의 ‘redis.conf’ 경로를 입력해주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/bin/redis-cli shutdown
User=redis
Group=redis
Restart=always

[Install]
WantedBy=multi-user.target

전부 작성을 끝냈다. 이제 실행해보자.

1
2
3
4
5
6
7
8
9
10
# 서비스 리로드
$ sudo systemctl daemon-reload

# 백그라운드로 Redis 실행
$ sudo systemctl start redis

# 제대로 실행되었는지 확인하기 위해 ping 보내기
# 백그라운드에 떠있다면 PONG이 와야한다.
$ redis-cli ping
PONG


🚨 오류 해결

나는 PONG이 오지 않았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ redis-cli ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused

# redis status 확인
$ sudo systemctl status redis
× redis.service - Redis In-Memory Data Store
     Loaded: loaded (/etc/systemd/system/redis.service; disabled; preset: enabled)
     Active: failed (Result: exit-code) since Tue 2024-10-08 15:47:18 KST; 2min 40s ago
   Duration: 4ms
    Process: 7326 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=217/USER)
   Main PID: 7326 (code=exited, status=217/USER)

Oct 08 15:47:18 computerName systemd[1]: redis.service: Scheduled restart job, restart counter is at 5.
Oct 08 15:47:18 computerName systemd[1]: redis.service: Start request repeated too quickly.
Oct 08 15:47:18 computerName systemd[1]: redis.service: Failed with result 'exit-code'.
Oct 08 15:47:18 computerName systemd[1]: Failed to start redis.service - Redis In-Memory Data Store.

status=217/USER 오류로 보아 사용자 관련 문제로 인해 발생한 것 같다. user를 지정해주지 않았는데 redis.service 파일에 작성해놨기 때문이다. 해결 방법은 간단하다. 주석치면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Redis In-Memory Data Store
After=network.target

[Service]
ExecStart=/usr/bin/redis-server /etc/redis/redis.conf
ExecStop=/usr/bin/redis-cli shutdown
# User=redis
# Group=redis
Restart=always

[Install]
WantedBy=multi-user.target


🚨 오류 해결 2

만약 아래와 같은 오류가 떴다면 redis.serviceredis.conf 경로가 제대로 되어있는지 확인해보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ redis-cli ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused

$ sudo systemctl status redis
× redis.service - Redis In-Memory Data Store
     Loaded: loaded (/etc/systemd/system/redis.service; disabled; preset: enabled)
     Active: failed (Result: exit-code) since Tue 2024-10-08 15:54:25 KST; 12s ago
   Duration: 19ms
    Process: 7490 ExecStart=/usr/bin/redis-server /etc/redis/redis.conf (code=exited, status=1/FAILURE)
   Main PID: 7490 (code=exited, status=1/FAILURE)

Oct 08 15:54:25 computerName systemd[1]: redis.service: Scheduled restart job, restart counter is at 5.
Oct 08 15:54:25 computerName systemd[1]: redis.service: Start request repeated too quickly.
Oct 08 15:54:25 computerName systemd[1]: redis.service: Failed with result 'exit-code'.
Oct 08 15:54:25 computerName systemd[1]: Failed to start redis.service - Redis In-Memory Data Store.

이 오류는 간단하다. redis.conf의 경로만 알맞게 바꿔주면 된다.


+) redis 폴더 내의 모든 파일과 서브폴더 옮기기

이건 하지 않아도 된다. 나는 찝찝해서 옮겨놓았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
$ cd ~/redis-7.4.1

# redis-7.4.1에 있는 폴더 리스트 출력
$ ll
total 316
drwxr-xr-x  8 user user   4096 Oct  8 14:50 ./
drwxr-x---  4 user user   4096 Oct  8 15:49 ../
drwxr-xr-x  2 user user   4096 Oct  3 04:04 .codespell/
-rw-r--r--  1 user user    405 Oct  3 04:04 .gitattributes
drwxr-xr-x  4 user user   4096 Oct  3 04:04 .github/
-rw-r--r--  1 user user    559 Oct  3 04:04 .gitignore
-rw-r--r--  1 user user  10420 Oct  3 04:04 00-RELEASENOTES
-rw-r--r--  1 user user     51 Oct  3 04:04 BUGS
-rw-r--r--  1 user user   5023 Oct  3 04:04 CODE_OF_CONDUCT.md
-rw-r--r--  1 user user   7178 Oct  3 04:04 CONTRIBUTING.md
-rw-r--r--  1 user user     11 Oct  3 04:04 INSTALL
-rw-r--r--  1 user user  37493 Oct  3 04:04 LICENSE.txt
-rw-r--r--  1 user user   6888 Oct  3 04:04 MANIFESTO
-rw-r--r--  1 user user    151 Oct  3 04:04 Makefile
-rw-r--r--  1 user user  23845 Oct  3 04:04 README.md
-rw-r--r--  1 user user   1805 Oct  3 04:04 REDISCONTRIBUTIONS.txt
-rw-r--r--  1 user user   1480 Oct  3 04:04 SECURITY.md
-rw-r--r--  1 user user   3628 Oct  3 04:04 TLS.md
drwxr-xr-x  8 user user   4096 Oct  8 11:55 deps/
-rw-r--r--  1 user user    343 Oct  8 14:50 dump.rdb
-rw-r--r--  1 user user 108981 Oct  3 04:04 redis.conf
-rwxr-xr-x  1 user user    279 Oct  3 04:04 runtest*
-rwxr-xr-x  1 user user    283 Oct  3 04:04 runtest-cluster*
-rwxr-xr-x  1 user user   1804 Oct  3 04:04 runtest-moduleapi*
-rwxr-xr-x  1 user user    285 Oct  3 04:04 runtest-sentinel*
-rw-r--r--  1 user user  14700 Oct  3 04:04 sentinel.conf
drwxr-xr-x  4 user user  12288 Oct  8 11:56 src/
drwxr-xr-x 11 user user   4096 Oct  3 04:04 tests/
drwxr-xr-x  9 user user   4096 Oct  3 04:04 utils/

# 폴더 내 모든 파일과 서브폴더를 /etc/redis로 옮긴다.
$ sudo mv ~/redis-7.4.1/{.,}* /etc/redis/

# 이렇게 뜨면 성공이다.
$ ll
total 8
drwxr-xr-x 2 user user 4096 Oct  8 16:06 ./
drwxr-x--- 4 user user 4096 Oct  8 16:03 ../
This post is licensed under CC BY 4.0 by the author.