mon_sh
mon.sh
redisGate Enterprise Server에서는 레디스 서버 모니터링을 위해서 mon.sh를 제공합니다.
ent-7.4.8 버전의 mon.sh와 이후 개선된 (ent-7.5.0 or ent-8.0.0) mon.sh를 소개합니다.
ent-7.4.8
1. Disk to Disk
• repl-diskless-sync no
• repl-diskless-load disabled
• 1번 서버 mon.sh: RDB 생성과 생성된 RDB 파일 전송(SEND)
• 2번 서버 mon.sh: 데이터 받기(RECV)와 받은 데이터 메모리로 올리기(LOAD)
• from, to 항목: 동기화 서버와 연결이 끊기면 '0'을 표시하고, 연결되면 '1'을 표시합니다.
ent-7.5.0, ent-8.0.0
이전 버전과 차이(개선)점
- 반복되는 date, role을 제거했고, ip:port는 header로 옮겼습니다. header에 서버 메모리와 스왑을 표시했습니다.
- 클라이언트로부터 받은 데이터량(input), 클라이언트로 내보낸 데이터량(oupput) 항목을 추가했고, from, to 항목은 동기화 서버 연결 여부(1/0)에서 동기화 서버와 주고 받는 데이터량(바이트)를 표시하는 것으로 변경했습니다.
- 이전 버전은 'Disk to Disk' 동기화 방식만 지원했지만, ent750부터는 'Memory to Memroy' 방식을 지원하고, 이 방식을 기본(default)로 합니다.
1. Disk to Disk
• repl-diskless-sync no
• repl-diskless-load disabled
• 1번 서버 mon.sh: RDB 생성과 생성된 RDB 파일 전송(SEND)
• 2번 서버 mon.sh: 데이터 받기(RECV)와 받은 데이터 메모리로 올리기(LOAD)
항목 설명
- Mem: 메모리 사용량을 나타낸다. top 명령의 내용과 같습니다.
- Swap: 스왑영역 사용량을 나타낸다. top 명령의 내용과 같습니다.
- IP:Port: 레디스 서버의 IP와 port를 나타냅니다. mon.sh 화면을 여러 개 띄웠을 때 'IP:Port'로 레디스 서버를 구분합니다.
- Pid: 레디스 서버의 'process id'. top 명령 또는 레디스 로그를 같이 볼 때 pid로 서버를 확인합니다.
- time: 시각(시:분:초) 표시
- keys: 키 개수
- cpu: 레디스 서버가 사용하는 CPU 사용률
- mem: 레디스 서버가 요청한 메모리 량
- rss(Resident Set Size): OS가 할당한 메모리 량
- mem과 rss의 메모리 사용량은 다를 수 있습니다.
Case1: 레디스 서버가 100바이트를 요청하면 OS는 1page(4KB)를 할당합니다. 이런 경우 rss가 큽니다.
Case2: 레디스 서버가 버퍼용으로 100MB를 요청하면 OS는 우선 10MB를 할당하고 나머지는 가상영역에 할당합니다. 이런 경우 mem이 급니다. - swap: 스왑 사용량. 레디스 서버가 스왑을 사용하는 경우.
Case1: 메모리가 모자랄 경우 스왑을 사용합니다. 이것은 Linux OS 'swappiness'와 관계있습니다.
Case2: Avail 메모리가 충분하더라도 레디스 서버의 키(데이터키) 중 오랜동안 사용(참조)하지 않는 키가 있으면 해당 데이터를 스왑영역으로 옮기고 메모리를 확보합니다. 사용 가능한(avail) 메모리가 충분한데도 레디스 서버가 스왑영역을 사용하는 이유입니다. - clients: 현재 레디스 서버에 접속해있는 클라이언트 수
- commands: 초당 명령 실행 수
- input: 클라이언트로부터 받은 명령(데이터 량): 바이트(B/K/M/G로 표시)
- output: 결과를 클라이언트로 보내는 데이터 량: 바이트(B/K/M/G로 표시)
- from: 동기화 서버로 부터 받은 데이터 량: 바이트(B/K/M/G로 표시)
- to: 동기화 서버로 보내는 데이터 량: 바이트(B/K/M/G로 표시)
- child: 자식 프로세스 실행 시 표시: RDB/AOF.
SEND/RECV/LOAD" 이것은 메인 프로세스가 실행한다. 원래는 이 항목이 자식 프로세스를 표시했는데, SEND/RECV/LOAD를 추가하면서 메인(부모) 프로세스의 작업도 표시하게 되었습니다.
동기화 전달 방식이 Memory(socket)일 경우 'SEND'는 RDB(child) + SEND(parent) 입니다. - cpu: 자식 프로세스 CPU 사용률
- rss: 자식 프로세스 메모리(rss) 사용량
• 1번 서버 RDB 파일 생성 중 process 상태
• 1번 서버 LOG
• 2번 서버 LOG
2. Memory to Disk
• repl-diskless-sync yes
• repl-diskless-load disabled
• 1번 서버 mon.sh: 메모리의 데이터를 바로 2번 서버로 전송(SEND)
• 2번 서버 mon.sh: 데이터 받기(RECV)와 받은 데이터 메모리로 올리기(LOAD)
• 1번 서버 RDB 파일 생성 중 process 상태
• 1번 서버 LOG
• 2번 서버 LOG
3. Memory to Memory: Socket
• repl-diskless-sync yes
• repl-diskless-load on-empty-db
• 1번 서버 mon.sh: 메모리의 데이터를 바로 2번 서버로 전송(SEND)
• 2번 서버 mon.sh: 데이터 받는 동시에 메모리에 적용(RECV)
• 1번 서버 RDB 파일 생성 중 process 상태
• 1번 서버 LOG
• 2번 서버 LOG
4. BGREWRITEAOF
• mon.sh
• AOF 파일 생성 중 process 상태
• LOG
5. BGSAVE
• mon.sh
• RDB 파일 생성 중 process 상태
• LOG
ent-7.4.8
데이터를 보내는 서버에서는 Diskless 동기화를 지원한다. (바로 전송 가능)
데이터를 받는 서버에서는 Diskless 동기화를 지원하지 않는다. (파일로 받아서 로드(적재))
1. Disk to Disk
• repl-diskless-sync no
• repl-diskless-load disabled
• 1번 서버 mon.sh: RDB 생성과 생성된 RDB 파일 전송(SEND)
실시간 동기화 시작: 마지막 줄에서 'from'이 '1'로 설정되었다(2번 서버 LOAD 완료 후).
• 2번 서버 mon.sh: 데이터 받기(RECV)와 받은 데이터 메모리로 올리기(LOAD)
• 1번 서버 RDB 파일 생성 중 process 상태
• 2번 서버 AOF 파일 생성 중 process 상태
• 1번 서버 LOG
• 2번 서버 LOG
2. Memory to Disk
• repl-diskless-sync yes
• repl-diskless-load disabled
• 1번 서버 mon.sh: 메모리의 데이터를 바로 2번 서버로 전송(표시는 RDB)
• 2번 서버 mon.sh: 데이터 받기(RECV)와 받은 데이터 메모리로 올리기(LOAD)
• 1번 서버 LOG
• 2번 서버 LOG
3. Memory to Memory
• repl-diskless-sync yes
• repl-diskless-load on-empty-db
• 1번 서버 mon.sh: 메모리의 데이터를 바로 2번 서버로 전송(표시는 RDB)
• 2번 서버 mon.sh: 데이터 받기(RECV)와 받은 데이터 메모리로 올리기(LOAD)
• 1번 서버 LOG
• 2번 서버 LOG
ent-7.4.8 -> ent-7.5.0 전체 데이터 동기화: 성공
◼️ 1번 서버(ent748:18504) -> 2번 서버(ent750:18505): 전체 데이터 동기화 테스트 -> 성공
◼️ 1번 서버(ent748:18504): 기본 설정으로 디스크를 사용한 동기화.
• repl-diskless-sync no
• repl-diskless-load disabled
◼️ 2번 서버(ent750:18505): 디스크를 사용하지 않는 동기화 설정(Memory(socket))
• repl-diskless-sync yes
• repl-diskless-load on-empty-db
◼️ 1번 서버(ent748:18504): mon.sh
◼️ 2번 서버(ent750:18505): mon.sh
• 1번 서버 LOG
• 2번 서버 LOG