Redis 클러스터 구성 및 MOVED 오류

Redis 클러스터를 생성하는 이유

단일 노드가 실패
할 수 있으므로 많은 수의 동시 요청을 처리 할 때 중단 됩니다.
단일 노드가 다운되면 데이터가 쉽게 손실됩니다.

따라서 redis 클러스터를 생성하려면
여기에 사진 설명 삽입

Redis에는 세 가지 클러스터 모드가 있습니다.

마스터-슬레이브 모드

  • 마스터 데이터베이스는 읽기 및 쓰기 작업을 수행 할 수 있으며 읽기 및 쓰기 작업으로 인해 데이터가 변경되면 데이터가 슬레이브 데이터베이스에 자동으로 동기화됩니다.
  • 슬레이브 데이터베이스는 일반적으로 읽기 전용이며 마스터 데이터베이스에서 동기화 된 데이터를받습니다.
  • 마스터는 여러 개의 슬레이브를 가질 수 있지만 슬레이브는 하나의 마스터에만 대응할 수 있습니다.
  • 슬레이브는 전화를 끊고 다른 슬레이브와 마스터의 읽기 및 쓰기에 영향을주지 않으며 재시작 후 데이터는 마스터에서 동기화됩니다.
  • 마스터가 중단 된 후에는 슬레이브의 읽기에 영향을주지 않지만 redis는 더 이상 쓰기 서비스를 제공하지 않습니다. 마스터가 다시 시작된 후 redis는 외부 쓰기 서비스를 다시 제공합니다.
  • 마스터가 전화를 끊은 후 슬레이브 노드에서 마스터를 다시 선택하지 않습니다.

센티넬 모드

  • 센티넬 모드는 마스터-슬레이브 모드를 기반으로하며 Redis 노드가 하나만있는 경우 센티넬은 의미가 없습니다.
  • 마스터가 전화를 끊으면 sentinel은 슬레이브 중 하나를 마스터로 선택하고 구성 파일을 수정합니다. 다른 슬레이브의 구성 파일도 수정됩니다. 예를 들어 slaveof 속성은 새 마스터를 가리 킵니다.
  • 마스터가 다시 시작되면 더 이상 마스터가 아닌 슬레이브로 새 마스터의 동기화 데이터를 수신합니다.
    또한 중단 될 수있는 프로세스이기 때문에 센티넬도 여러 개를 시작하여 센티넬 클러스터를 형성합니다.
  • 여러 센티널이 구성되면 센티넬도 자동으로 모니터링됩니다.
  • 비밀번호가 마스터-슬레이브 모드로 구성되면 센티넬도 구성 정보를 구성 파일로 동기식으로 수정하므로 걱정할 필요가 없습니다.
    센티넬 또는 센티넬 클러스터는 여러 마스터-슬레이브 Redis를 관리 할 수 ​​있으며 여러 센티넬도 동일한 Redis를 모니터링 할 수 있습니다.
  • Sentinel은 Redis와 동일한 머신에 배포하지 않는 것이 가장 좋습니다. 그렇지 않으면 Redis 서버가 중지 된 후 sentinel도 중지됩니다.

클러스터 모드

  • 여러 redis 노드의 네트워크 상호 연결 및 데이터 공유
  • 모든 노드는 하나의 마스터와 하나의 슬레이브 (또는 하나의 마스터와 여러 슬레이브)로 서비스를 제공하지 않고 백업으로 만 사용됩니다.
  • redis가 각 노드에 키를 균등하게 배포해야하므로 동시에 여러 키 처리 (예 : MSET / MGET)를 지원하지 않습니다.
  • 동시성이 높은 동시에 키-값을 생성하면 성능이 저하되고 예측할 수없는 동작이 발생합니다.
  • 온라인 노드 추가 및 삭제 지원
  • 클라이언트는 읽기 및 쓰기를 위해 모든 마스터 노드에 연결할 수 있습니다.

클러스터 데이터 분할

  • 일관된 HASH를 도입하지 않고 해시 슬롯 (해시 슬롯) 개념 도입
  • 클러스터 당 16384 개의 해시 슬롯
  • CRC16에서 각 키를 확인한 후 해시 슬롯을 사용하여 슬롯을 결정합니다.
  • 클러스터의 각 노드는 해시 슬롯의 일부를 담당합니다.

가져와! 보여 주다! !

클러스터 모드를 사용하고 있습니다.

  1. 센티넬 모드는 기본적으로 일반 프로덕션의 요구 사항을 충족 할 수 있으며 가용성이 높습니다. 그러나 한 서버에 저장할 수없는 데이터 양이 너무 많으면 마스터-슬레이브 모드 또는 센티넬 모드가 수요를 충족 할 수 없습니다. 이때 저장된 데이터는 여러 Redis 인스턴스에 조각화되어 저장되어야합니다. 클러스터 모드의 출현은 단일 Redis의 제한된 용량 문제를 해결하는 것이며 Redis 데이터는 특정 규칙에 따라 여러 시스템에 배포됩니다.
  2. 클러스터는 센티넬과 마스터-슬레이브 모드의 조합이라고 할 수 있습니다. 마스터-슬레이브 및 마스터 재 선택 기능은 클러스터를 통해 구현할 수 있으므로 2 개의 복사본과 3 개의 샤드를 구성 할 경우 6 개의 Redis 인스턴스가 필요합니다. Redis 데이터는 특정 규칙에 따라 클러스터의 다른 머신에 할당되기 때문에 데이터 양이 너무 많으면 확장을 위해 새 머신을 추가 할 수 있습니다.
  3. 클러스터를 사용하려면 redis 구성 파일에서 클러스터 활성화 구성을 열면됩니다. 각 클러스터를 정상적으로 실행하려면 최소한 세 개의 기본 데이터베이스가 필요하며 노드를 추가하는 것이 매우 편리합니다.

실험 매개 변수

여섯 개 서버의 IP는
20.0.0.11
20.0.0.12
20.0.0.21
20.0.0.22
20.0.0.23
20.0.0.24

실험 구성

6 개의 호스트 모두 redis를 설치해야합니다.

[root@localhost ~]# yum -y install gcc gcc-c++ make
[root@localhost ~]# mkdir /bao
[root@localhost ~]# cd /bao
[root@localhost bao]# rz -E
rz waiting to receive.
[root@localhost bao]# tar zxvf redis-5.0.7.tar.gz 
[root@localhost bao]# cd redis-5.0.7/
[root@localhost redis-5.0.7]# make
[root@localhost redis-5.0.7]# make install PREFIX=/usr/local/redis
[root@localhost redis-5.0.7]# cd utils/
[root@localhost utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost utils]# ln -s /usr/local/redis/bin/* /usr/local/bin

구성 파일 수정

[root@localhost utils]# vim /etc/redis/6379.conf
70 #bind 127.0.0.1	##注释掉监听地址
89 protected-mode no	##关闭保护模式
93 port 6379	##端口还是6379
137 daemonize yes	##独立启动进程
700 appendonly yes	##开启aof持久化
833 cluster-enabled yes	##开启群集功能,取消注释
841 cluster-config-file nodes-6379.conf	##群集文件名称,取消注释
847 cluster-node-timeout 15000	##群集超时时间设置,取消注释
[root@localhost utils]# vim /etc/redis/6379.conf 
[root@localhost utils]# cd /var/lib/redis/6379/
[root@localhost 6379]# service redis_6379 restart
Stopping ...
Redis stopped
Starting Redis server...
[root@localhost 6379]# ls
appendonly.aof  dump.rdb  nodes-6379.conf

주 서버에 rvm 및 RUBY 설치

[root@localhost 6379]# gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3	##密钥文件导入
[root@localhost 6379]# cd /bao/
[root@localhost bao]# rz -E
rz waiting to receive.
[root@localhost bao]# ls
redis-5.0.7  redis-5.0.7.tar.gz  rvm-installer.sh
[root@localhost bao]# chmod +x rvm-installer.sh 
[root@localhost bao]# ./rvm-installer.sh		##这个下的太慢了,我直接拿的下好的
[root@localhost bao]# ./rvm-installer.sh
[root@localhost bao]# source /etc/profile.d/rvm.sh
[root@localhost bao]# rvm list known		##列出可安装版本
# MRI Rubies
[ruby-]1.8.6[-p420]
[ruby-]1.8.7[-head] # security released on head
[ruby-]1.9.1[-p431]
[ruby-]1.9.2[-p330]
[ruby-]1.9.3[-p551]
[ruby-]2.0.0[-p648]
[ruby-]2.1[.10]
[ruby-]2.2[.10]
[ruby-]2.3[.8]
[ruby-]2.4[.10]
[ruby-]2.5[.8]
[ruby-]2.6[.6]
[ruby-]2.7[.1]
ruby-head

# for forks use: rvm install ruby-head-<name> --url https://github.com/github/ruby.git --branch 2.2

# JRuby
jruby-1.6[.8]
jruby-1.7[.27]
jruby-9.1[.17.0]
jruby[-9.2.13.0]
jruby-head

# Rubinius
rbx-1[.4.3]
rbx-2.3[.0]
rbx-2.4[.1]
rbx-2[.5.8]
rbx-3[.107]
rbx-4[.20]
rbx-5[.0]
rbx-head

# TruffleRuby
truffleruby[-20.2.0]

# Opal
opal

# Minimalistic ruby implementation - ISO 30170:2012
mruby-1.0.0
mruby-1.1.0
mruby-1.2.0
mruby-1.3.0
mruby-1[.4.1]
mruby-2.0.1
mruby-2[.1.1]
mruby[-head]

# Ruby Enterprise Edition
ree-1.8.6
ree[-1.8.7][-2012.02]

# Topaz
topaz

# MagLev
maglev-1.0.0
maglev-1.1[RC1]
maglev[-1.2Alpha4]
maglev-head

# Mac OS X Snow Leopard Or Newer
macruby-0.10
macruby-0.11
macruby[-0.12]
macruby-nightly
macruby-head

# IronRuby
ironruby[-1.1.3]
ironruby-head

[root@localhost bao]# rvm install 2.4.1		##安装 2.4.1版本
[root@localhost bao]# ruby -v	##查看版本信息
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
[root@localhost bao]#  gem install redis	##再次安装 redis

마스터 서버에서 클러스터를 구성합니다.
여기에서 마스터 및 슬레이브 노드를 볼 수 있습니다.

[root@localhost network-scripts]# redis-cli --cluster create 20.0.0.11:6379 20.0.0.12:6379 20.0.0.21:6379 20.0.0.22:6379 20.0.0.23:6379 20.0.0.24:6379 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 20.0.0.23:6379 to 20.0.0.11:6379
Adding replica 20.0.0.24:6379 to 20.0.0.12:6379
Adding replica 20.0.0.22:6379 to 20.0.0.21:6379
M: 32dfc6ddc0b9b11a5761468cd56be4bc4d932eff 20.0.0.11:6379
   slots:[0-5460] (5461 slots) master
M: da81b568b82ec8d2e65967a4c3ed6550aa59b42d 20.0.0.12:6379
   slots:[5461-10922] (5462 slots) master
M: 32dfc6ddc0b9b11a5761468cd56be4bc4d932eff 20.0.0.21:6379
   slots:[10923-16383] (5461 slots) master
S: 32dfc6ddc0b9b11a5761468cd56be4bc4d932eff 20.0.0.22:6379
   replicates 32dfc6ddc0b9b11a5761468cd56be4bc4d932eff
S: da81b568b82ec8d2e65967a4c3ed6550aa59b42d 20.0.0.23:6379
   replicates 32dfc6ddc0b9b11a5761468cd56be4bc4d932eff
S: da81b568b82ec8d2e65967a4c3ed6550aa59b42d 20.0.0.24:6379
   replicates da81b568b82ec8d2e65967a4c3ed6550aa59b42d
Can I set the above configuration? (type 'yes' to accept): yes		##手敲yes

실험적 검증

확인 시작

[root@localhost network-scripts]# redis-cli -h 20.0.0.11 -p 6379 -c
20.0.0.11:6379> set gundam EXIA
OK
20.0.0.11:6379> keys *
1) "gundam"


[root@localhost network-scripts]# redis-cli -h 20.0.0.23 -p 6379 -c	##另一台机器,验证“主从”
20.0.0.23:6379> keys *
1) "gundam"
20.0.0.23:6379> get gundam
"EXIA"

자동 삭제 확인

[root@localhost network-scripts]# redis-cli -h 20.0.0.11 -p 6379 -c
20.0.0.11:6379> EXPIRE gundam 5		##五秒后删除这个键
(integer) 1
##五秒后
20.0.0.11:6379> keys *
(empty list or set)

##另一台机器
20.0.0.23:6379> keys *	##另一台机器也没了
(empty list or set)

오류 이동

키를 만들 때이 오류가 발생하면 종료하고 입력 할 때 -c 옵션을 추가합니다. -c는 클러스터 모드를 시작 함을 의미합니다
(오류) MOVED 5798 127.0.0.1:7001

redis-cli -h 20.0.0.12 -p 6379 -c

참고 : 마스터가 다운되면 해당 슬레이브가 둘 중 마스터가되어 서비스가 정상적으로 사용됩니다. 해당 마스터와 슬레이브가 다운되면 클러스터가 사라집니다.

추천

출처blog.csdn.net/Ora_G/article/details/108490235