이 문서에는 Redis 클러스터 개념에 대한 기본 지식은 물론 개인이 Redis 클러스터를 구축할 때 직면하는 문제와 해결 방법이 매우 자세하게 요약되어 있습니다. 도움이 필요한 친구들이 참고할 수 있습니다.
Redis 클러스터는 어셈블리를 제공합니다. 여러 Redis 노드 간에 데이터를 공유합니다.
Redis 클러스터는 여러 키를 처리하는 명령을 지원하지 않습니다.
Redis 클러스터는 파티셔닝을 통해 일정 수준의 가용성을 제공합니다. 노드가 다운되거나 사용할 수 없는 경우에도 명령은 계속 처리될 수 있습니다.
Redis 클러스터 데이터 샤딩
Redis 클러스터에서는 일관성 해싱(Consistency Hashing) 대신 데이터 샤딩이 사용됩니다. Redis 클러스터는 16384개의 해시 슬롯(해시 슬롯)을 포함하며, 데이터베이스의 각 키는 이 해시 중 하나에 존재합니다. 슬롯은 CRC16 검증 후 모듈로 16384를 취하여 결정됩니다.
지금 클러스터에 3개의 노드가 있다고 가정하면
①노드 A에는 해시 슬롯 0부터 5500이 포함됩니다.
②노드 B에는 해시 슬롯 5501~11000이 포함됩니다.
③노드 C에는 해시 슬롯 11001~16384가 포함되어 있습니다.
그런 다음 노드를 추가하려면 ABC부터 D까지 세 개의 노드에서 슬롯의 일부를 가져옵니다. 노드를 제거하면 제거된 노드의 분리 슬롯이 나머지 슬롯으로 이동됩니다.
Redis 마스터-슬레이브 복제 모델
Redis 클러스터의 고가용성을 달성하기 위해. Redis는 마스터-슬레이브 복제 모델을 제공합니다. 각 노드에는 N-1개의 복제본이 있습니다.
클러스터를 생성할 때 각 노드에 슬레이브 노드를 추가한다면 이때 마스터 노드 중 하나가 끊기면 해당 슬레이브 노드가 새로운 마스터 노드로 사용되어 계속해서 서브를 제공하게 됩니다. 하지만 마스터 노드와 슬레이브 노드가 모두 끊어지면 더 이상 사용할 수 없습니다.
Redis 클러스터 구성
Redis 클러스터는 클러스터 모드의 여러 클라우드 새 Redis 인스턴스로 구성됩니다. 인스턴스의 클러스터 모드는 구성을 통해 활성화되어야 합니다.
다음은 최소 옵션이 포함된 클러스터 구성 파일의 예입니다.
port 7000 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes pidfile /var/run/redis_xxxx.pid dir /usr/local/redis-cluster/xxxx
port는 노드의 포트 번호를 지정합니다.
cluster-enabled yes 옵션은 인스턴스의 클러스터 모드를 활성화하는 데 사용됩니다.
cluster-config-file node .conf는 노드를 저장하는 구성 파일의 경로를 설정합니다. 이 파일은 클러스터가 시작될 때 생성되므로 수정할 필요가 없습니다.
cluster-node-timeout 5000: 메소드 실패에 대한 대기 시간을 설정합니다. 즉, 5초 이내에 노드에 액세스할 수 없으면 해당 노드는 사용할 수 없는 것으로 간주됩니다.
appendonly yes: 지속성을 활성화하는 데 사용됩니다
pidfile /var/run/redis_xxxx.pid는 pid 파일의 위치를 설정합니다. 여기서 xxxx는 포트 번호입니다.
dir /usr/local/redis-cluster/xxxx는 작업 디렉터리, 여기서 xxxx는 포트 번호입니다.
현재 디렉토리에 있는 파일은 다음과 같습니다
[root@localhost 10:49 /usr/local/redis-cluster]# ll 7000 7001 7002 7003 7004 7005 7000: 总用量 7080 -rw-r--r--. 1 root root 57787 9月 10 10:44 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 09:50 redis-server 7001: 总用量 7080 -rw-r--r--. 1 root root 57787 9月 10 10:46 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7002: 总用量 7080 -rw-r--r--. 1 root root 57787 9月 10 10:46 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7003: 总用量 7080 -rw-r--r--. 1 root root 57787 9月 10 10:47 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7004: 总用量 7080 -rw-r--r--. 1 root root 57787 9月 10 10:48 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7005: 总用量 7080 -rw-r--r--. 1 root root 57787 9月 10 10:48 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server [root@localhost 10:49 /usr/local/redis-cluster]#
아래 6개 노드를 시작하세요
[root@localhost 10:51 /usr/local/redis-cluster]# ./7000/redis-server ./7000/redis.conf 3547:C 10 Sep 10:51:58.519 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3547:C 10 Sep 10:51:58.519 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3547, just started 3547:C 10 Sep 10:51:58.519 # Configuration loaded [root@localhost 10:51 /usr/local/redis-cluster]# ./7001/redis-server ./7001/redis.conf 3552:C 10 Sep 10:52:05.549 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3552:C 10 Sep 10:52:05.550 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3552, just started 3552:C 10 Sep 10:52:05.550 # Configuration loaded [root@localhost 10:52 /usr/local/redis-cluster]# ./7002/redis-server ./7002/redis.conf 3557:C 10 Sep 10:52:13.098 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3557:C 10 Sep 10:52:13.098 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3557, just started 3557:C 10 Sep 10:52:13.098 # Configuration loaded [root@localhost 10:52 /usr/local/redis-cluster]# ./7003/redis-server ./7003/redis.conf 3563:C 10 Sep 10:52:18.986 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3563:C 10 Sep 10:52:18.986 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3563, just started 3563:C 10 Sep 10:52:18.986 # Configuration loaded [root@localhost 10:52 /usr/local/redis-cluster]# ./7004/redis-server ./7004/redis.conf 3568:C 10 Sep 10:52:23.709 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3568:C 10 Sep 10:52:23.710 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3568, just started 3568:C 10 Sep 10:52:23.710 # Configuration loaded [root@localhost 10:52 /usr/local/redis-cluster]# ./7005/redis-server ./7005/redis.conf 3573:C 10 Sep 10:52:27.146 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 3573:C 10 Sep 10:52:27.147 # Redis version=4.0.1, bits=32, commit=00000000, modified=0, pid=3573, just started 3573:C 10 Sep 10:52:27.147 # Configuration loaded [root@localhost 10:52 /usr/local/redis-cluster]#
시작 후 프로세스 보기:
[root@localhost 10:52 /usr/local/redis-cluster]# ps aux|grep redis root 3548 0.2 0.2 41964 2288 ? Ssl 10:51 0:00 ./7000/redis-server 127.0.0.1:7000 [cluster] root 3553 0.1 0.2 41964 2288 ? Ssl 10:52 0:00 ./7001/redis-server 127.0.0.1:7001 [cluster] root 3558 0.2 0.2 41964 2288 ? Ssl 10:52 0:00 ./7002/redis-server 127.0.0.1:7002 [cluster] root 3564 0.1 0.2 41964 2292 ? Ssl 10:52 0:00 ./7003/redis-server 127.0.0.1:7003 [cluster] root 3569 0.2 0.2 41964 2292 ? Ssl 10:52 0:00 ./7004/redis-server 127.0.0.1:7004 [cluster] root 3574 0.1 0.2 41964 2288 ? Ssl 10:52 0:00 ./7005/redis-server 127.0.0.1:7005 [cluster] root 3580 0.0 0.0 6048 784 pts/2 S+ 10:52 0:00 grep redis [root@localhost 10:52 /usr/local/redis-cluster]#
파일 디렉토리 다시 보기:
[root@localhost 11:01 /usr/local/redis-cluster]# ll 7000 7001 7002 7003 7004 7005 7000: 总用量 7084 -rw-r--r--. 1 root root 0 9月 10 10:51 appendonly.aof -rw-r--r--. 1 root root 114 9月 10 10:51 nodes-7000.conf -rw-r--r--. 1 root root 57787 9月 10 10:44 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 09:50 redis-server 7001: 总用量 7084 -rw-r--r--. 1 root root 0 9月 10 10:52 appendonly.aof -rw-r--r--. 1 root root 114 9月 10 10:52 nodes-7001.conf -rw-r--r--. 1 root root 57787 9月 10 10:46 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7002: 总用量 7084 -rw-r--r--. 1 root root 0 9月 10 10:52 appendonly.aof -rw-r--r--. 1 root root 114 9月 10 10:52 nodes-7002.conf -rw-r--r--. 1 root root 57787 9月 10 10:46 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7003: 总用量 7084 -rw-r--r--. 1 root root 0 9月 10 10:52 appendonly.aof -rw-r--r--. 1 root root 114 9月 10 10:52 nodes-7003.conf -rw-r--r--. 1 root root 57787 9月 10 10:47 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7004: 总用量 7084 -rw-r--r--. 1 root root 0 9月 10 10:52 appendonly.aof -rw-r--r--. 1 root root 114 9月 10 10:52 nodes-7004.conf -rw-r--r--. 1 root root 57787 9月 10 10:48 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server 7005: 总用量 7084 -rw-r--r--. 1 root root 0 9月 10 10:52 appendonly.aof -rw-r--r--. 1 root root 114 9月 10 10:52 nodes-7005.conf -rw-r--r--. 1 root root 57787 9月 10 10:48 redis.conf -rwxr-xr-x. 1 root root 7185872 9月 10 10:04 redis-server [root@localhost 11:01 /usr/local/redis-cluster]#
aof 파일과 node 파일이 생성되고, 저장 시 덤프 파일이 생성되는 것을 볼 수 있습니다.
pid를 살펴보면
[root@localhost 11:03 /usr/local/redis-cluster]# ll /var/run/redis* -rw-r--r--. 1 root root 5 9月 10 10:51 /var/run/redis_7000.pid -rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7001.pid -rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7002.pid -rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7003.pid -rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7004.pid -rw-r--r--. 1 root root 5 9月 10 10:52 /var/run/redis_7005.pid [root@localhost 11:03 /usr/local/redis-cluster]#
다음으로 redis-trib 도구와 이 6개의 노드를 사용하여 클러스터를 생성해야 합니다.
redis-trib는 redis 소스 코드의 src 디렉토리에 있습니다.
redis-cluster 디렉터리에 복사본을 복사합니다.
[root@localhost 11:03 /usr/local/redis-cluster]# ll ../redis/src/redis-trib* -rwxrwxr-x. 1 root root 60843 7月 24 22:58 ../redis/src/redis-trib.rb [root@localhost 11:04 /usr/local/redis-cluster]# cp ../redis/src/redis-trib.rb ./ [root@localhost 11:05 /usr/local/redis-cluster]# ll 总用量 84 drwxr-xr-x. 2 root root 4096 9月 10 10:51 7000 drwxr-xr-x. 2 root root 4096 9月 10 10:52 7001 drwxr-xr-x. 2 root root 4096 9月 10 10:52 7002 drwxr-xr-x. 2 root root 4096 9月 10 10:52 7003 drwxr-xr-x. 2 root root 4096 9月 10 10:52 7004 drwxr-xr-x. 2 root root 4096 9月 10 10:52 7005 -rwxr-xr-x. 1 root root 60843 9月 10 11:05 redis-trib.rb [root@localhost 11:05 /usr/local/redis-cluster]#
클러스터 시작 시작:
[root@localhost 11:13 /usr/local/redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 /usr/bin/env: ruby: 没有那个文件或目录 [root@localhost 11:15 /usr/local/redis-cluster]#
다음은 실패한 설치 버전이며 나중에 성공한 버전도 있습니다.
Ruby 프로그램이므로 Ruby를 설치해야 합니다.
yum -y install ruby
yum -y install ruby
继续启动集群:
[root@localhost 11:21 /usr/local/redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 ./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError) from ./redis-trib.rb:24 [root@localhost 11:22 /usr/local/redis-cluster]#
还是报错了,说需要rubygems,我们继续安装:
yum -y install rubygems
继续启动集群:
[root@localhost 11:24 /usr/local/redis-cluster]# ./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError) from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require' from ./redis-trib.rb:25 [root@localhost 11:24 /usr/local/redis-cluster]#
依然还是报错了...,我们需要安装更高版本的ruby。
所以,我决定,先卸载掉1.8的ruby。
yum -y remove ruby
wget https://cache.ruby-lang.org/pub/ruby/2.4/ruby-2.4.1.tar.gz tar xzvf ruby-2.4.1.tar.gz cd ruby-2.4.1 ./configure make make install오류가 계속 보고됩니다. , rubygems가 필요하다고 말하면서 계속 설치하겠습니다. 설치:
yum -y install rubygems
계속해서 클러스터 시작:
[root@localhost 12:47 ~]# ruby -v ruby 2.4.1p111 (2017-03-22 revision 58053) [i686-linux] [root@localhost 12:47 ~]#여전히 오류를 보고합니다..., 우리는 필요합니다 더 높은 버전의 Ruby를 설치하세요.
그래서 먼저 Ruby 1.8을 제거하기로 결정했습니다.
yum -y ruby 제거
그런 다음 다시 설치하고
[root@localhost 13:01 /usr/local/redis-cluster]# gem install redis ERROR: Loading command: install (LoadError) cannot load such file -- zlib ERROR: While executing gem ... (NoMethodError) undefined method `invoke_with_build_args' for nil:NilClass그런 다음 Ruby 버전을 확인하세요.
[root@localhost 19:45 ~]# curl -L get.rvm.io | bash -s stable % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 24090 100 24090 0 0 11517 0 0:00:02 0:00:02 --:--:-- 48276 Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc gpg: 于 2017年09月11日 星期一 05时59分21秒 JST 创建的签名,使用 RSA,钥匙号 BF04FF17 gpg: 无法检查签名:No public key Warning, RVM 1.26.0 introduces signed releases and automated check of signatures when GPG software found. Assuming you trust Michal Papis import the mpapis public key (downloading the signatures). GPG signature verification failed for '/usr/local/rvm/archives/rvm-1.29.3.tgz' - 'https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc'! Try to install GPG v2 and then fetch the public key: gpg2 --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 or if it fails: command curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - the key can be compared with: https://rvm.io/mpapis.asc https://keybase.io/mpapis NOTE: GPG version 2.1.17 have a bug which cause failures during fetching keys from remote server. Please downgrade or upgrade to newer version (if available) or use the second method described above. [root@localhost 19:45 ~]#
마지막으로 redis-trib를 실행하려면 다음이 필요합니다. redis gem을 설치하세요.
[root@localhost 19:45 ~]# curl -sSL https://rvm.io/mpapis.asc | gpg2 --import - gpg: 钥匙环‘/root/.gnupg/secring.gpg'已建立 gpg: /root/.gnupg/trustdb.gpg:建立了信任度数据库 gpg: 密钥 D39DC0E3:公钥“Michal Papis (RVM signing) <mpapis@gmail.com>”已导入 gpg: 合计被处理的数量:1 gpg: 已导入:1 (RSA: 1) gpg: 没有找到任何绝对信任的密钥 [root@localhost 19:45 ~]# curl -L get.rvm.io | bash -s stable % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 24090 100 24090 0 0 3763 0 0:00:06 0:00:06 --:--:-- 3763 Downloading https://github.com/rvm/rvm/archive/1.29.3.tar.gz Downloading https://github.com/rvm/rvm/releases/download/1.29.3/1.29.3.tar.gz.asc gpg: 于 2017年09月11日 星期一 05时59分21秒 JST 创建的签名,使用 RSA,钥匙号 BF04FF17 gpg: 完好的签名,来自于“Michal Papis (RVM signing) <mpapis@gmail.com>” gpg: 亦即“Michal Papis <michal.papis@toptal.com>” gpg: 亦即“[jpeg image of size 5015]” gpg: 警告:这把密钥未经受信任的签名认证! gpg: 没有证据表明这个签名属于它所声称的持有者。 主钥指纹: 409B 6B17 96C2 7546 2A17 0311 3804 BB82 D39D C0E3 子钥指纹: 62C9 E5F4 DA30 0D94 AC36 166B E206 C29F BF04 FF17 GPG verified '/usr/local/rvm/archives/rvm-1.29.3.tgz' Creating group 'rvm' Installing RVM to /usr/local/rvm/ Installation of RVM in /usr/local/rvm/ is almost complete: * First you need to add all users that will be using rvm to 'rvm' group, and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`. * To start using RVM you need to run `source /etc/profile.d/rvm.sh` in all your open shell windows, in rare cases you need to reopen all shell windows. [root@localhost 19:46 ~]계속해서 클러스터를 오픈합니다. 오류는 여전히 보고되고, 몇 번의 우여곡절 끝에도 여전히 해결되지 않습니다가장 좋은 방법은 다음과 같습니다.
성공한 버전
[root@localhost 19:46 ~]# find / -name rvm.sh /etc/profile.d/rvm.sh [root@localhost 19:49 ~]# source /etc/profile.d/rvm.sh🎜 실패한 것으로 확인되어 프롬프트를 따랐습니다. 🎜🎜🎜🎜
[root@localhost 19:59 ~]# gem install redis Fetching: redis-4.0.0.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.🎜 rvm이 성공적으로 설치되었음을 확인했습니다. 구성을 즉시 적용하려면 source 명령을 사용하여 rvm 구성 파일을 가져와야 합니다. 🎜🎜먼저 구성 파일의 경로를 확인한 후 가져오세요. 🎜🎜🎜🎜
[root@localhost 19:46 ~]# find / -name rvm.sh /etc/profile.d/rvm.sh [root@localhost 19:49 ~]# source /etc/profile.d/rvm.sh
接下来就可以安装高版本的ruby了,建议安装2.2.3版本,不然的话,等下gen install redis的时候,可能会报下面的错误:
[root@localhost 19:59 ~]# gem install redis Fetching: redis-4.0.0.gem (100%) ERROR: Error installing redis: redis requires Ruby version >= 2.2.2.
废话少说,接下来安装2.2.3版本的ruby
[root@localhost 20:16 ~]# rvm install 2.3.3 Searching for binary rubies, this might take some time. No binary rubies available for: centos/6/i386/ruby-2.3.3. Continuing with compilation. Please read 'rvm help mount' to get more information on binary rubies. Checking requirements for centos. Requirements installation successful. Installing Ruby from source to: /usr/local/rvm/rubies/ruby-2.3.3, this may take a while depending on your cpu(s)... ruby-2.3.3 - #downloading ruby-2.3.3, this may take a while depending on your connection... % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 13.7M 100 13.7M 0 0 1285k 0 0:00:10 0:00:10 --:--:-- 1394k ruby-2.3.3 - #extracting ruby-2.3.3 to /usr/local/rvm/src/ruby-2.3.3.... ruby-2.3.3 - #applying patch /usr/local/rvm/patches/ruby/ruby_2_3_gcc7.patch. ruby-2.3.3 - #applying patch /usr/local/rvm/patches/ruby/2.3.3/random_c_using_NR_prefix.patch. ruby-2.3.3 - #configuring.......................................................... ruby-2.3.3 - #post-configuration.. ruby-2.3.3 - #compiling....................................................................................- ruby-2.3.3 - #installing........................... ruby-2.3.3 - #making binaries executable.. ruby-2.3.3 - #downloading rubygems-2.6.13 ruby-2.3.3 - #extracting rubygems-2.6.13..... ruby-2.3.3 - #removing old rubygems......... ruby-2.3.3 - #installing rubygems-2.6.13.......................... ruby-2.3.3 - #gemset created /usr/local/rvm/gems/ruby-2.3.3@global ruby-2.3.3 - #importing gemset /usr/local/rvm/gemsets/global.gems..........................................| ruby-2.3.3 - #generating global wrappers........ ruby-2.3.3 - #gemset created /usr/local/rvm/gems/ruby-2.3.3 ruby-2.3.3 - #importing gemsetfile /usr/local/rvm/gemsets/default.gems evaluated to empty gem list ruby-2.3.3 - #generating default wrappers........ ruby-2.3.3 - #adjusting #shebangs for (gem irb erb ri rdoc testrb rake). Install of ruby-2.3.3 - #complete Please be aware that you just installed a ruby that requires 2 patches just to be compiled on an up to date linux system. This may have known and unaccounted for security vulnerabilities. Please consider upgrading to ruby-2.4.1 which will have all of the latest security patches. Ruby was built without documentation, to build it run: rvm docs generate-ri [root@localhost 20:27 ~]# ruby -v ruby 2.3.3p222 (2016-11-21 revision 56859) [i686-linux] [root@localhost 20:28 ~]# gem -v 2.6.13 [root@localhost 20:28 ~]#
可以看到,不进ruby安装好了2.3.3版本,还把rubygems也安装好了。
如果要删除掉某个版本的ruby可以用这个命令:rvm remove 1.9.3
。
我们继续安装:
[root@localhost 20:28 ~]# gem install redis Fetching: redis-4.0.0.gem (100%) Successfully installed redis-4.0.0 Parsing documentation for redis-4.0.0 Installing ri documentation for redis-4.0.0 Done installing documentation for redis after 3 seconds 1 gem installed [root@localhost 20:33 ~]#
看到这里,折腾了两个晚上终于弄好了。接下来就是使用我们的redis-trib开启集群了。
为了方便,我把redis-trib.rb这个文件复制了一份到/usr/local/bin这个目录下,因为这个目录在PATH下面,里面的命令可以直接执行。
再次确认下六个redis节点的运行是ok的。
[root@localhost 20:35 /usr/local/redis-cluster]# ps aux|grep redis root 2486 0.1 0.2 46060 2304 ? Ssl 18:30 0:12 ./7000/redis-server 127.0.0.1:7000 [cluster] root 2491 0.1 0.2 46060 2308 ? Ssl 18:30 0:13 ./7001/redis-server 127.0.0.1:7001 [cluster] root 2496 0.1 0.2 46060 2308 ? Ssl 18:30 0:13 ./7002/redis-server 127.0.0.1:7002 [cluster] root 2501 0.1 0.2 46060 2304 ? Ssl 18:30 0:13 ./7003/redis-server 127.0.0.1:7003 [cluster] root 2506 0.1 0.2 46060 2308 ? Ssl 18:30 0:14 ./7004/redis-server 127.0.0.1:7004 [cluster] root 2511 0.1 0.2 46060 2304 ? Ssl 18:30 0:12 ./7005/redis-server 127.0.0.1:7005 [cluster] root 31426 0.0 0.0 6048 784 pts/2 S+ 20:35 0:00 grep redis [root@localhost 20:35 /usr/local/redis-cluster]#
[root@localhost 20:35 /usr/local/redis-cluster]# redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 Adding replica 127.0.0.1:7003 to 127.0.0.1:7000 Adding replica 127.0.0.1:7004 to 127.0.0.1:7001 Adding replica 127.0.0.1:7005 to 127.0.0.1:7002 M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000 slots:0-5460 (5461 slots) master M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001 slots:5461-10922 (5462 slots) master M: 6de604de12b4b4a3be46766bb95ccf4618dc0d75 127.0.0.1:7002 slots:10923-16383 (5461 slots) master S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003 replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004 replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99 S: a4a09d80a4bb6c82345c376c59e5ae49e1d49701 127.0.0.1:7005 replicates 6de604de12b4b4a3be46766bb95ccf4618dc0d75 Can I set the above configuration? (type 'yes' to accept): yes >>> Nodes configuration updated >>> Assign a different config epoch to each node >>> Sending CLUSTER MEET messages to join the cluster Waiting for the cluster to join... >>> Performing Cluster Check (using node 127.0.0.1:7000) M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003 slots: (0 slots) slave replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 M: 6de604de12b4b4a3be46766bb95ccf4618dc0d75 127.0.0.1:7002 slots:10923-16383 (5461 slots) master 1 additional replica(s) M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004 slots: (0 slots) slave replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99 S: a4a09d80a4bb6c82345c376c59e5ae49e1d49701 127.0.0.1:7005 slots: (0 slots) slave replicates 6de604de12b4b4a3be46766bb95ccf4618dc0d75 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@localhost 20:37 /usr/local/redis-cluster]#
在创建的过程中,redis会给出一份预想的配置给我们看,确定没问题就输入yes并回车。系统就给我们创建了三个主,三个从的集群结构。
可以看到All 16384 slots covered。
redis-cli
redis-cli默认情况下连接的是本地的6379端口的redis服务器。
现在有六个端口,所以需要指定参数。
redis-cli -h xxx -p xxx -a xxx
-h:指定服务器
-p:指定端口号
-a:指定密码
-c:开启集群模式
[root@localhost 20:53 /usr/local/redis-cluster]# redis-cli -c -p 7000 127.0.0.1:7000> set name zhangsan -> Redirected to slot [5798] located at 127.0.0.1:7001 OK 127.0.0.1:7001> exit [root@localhost 20:53 /usr/local/redis-cluster]# redis-cli -c -p 7002 127.0.0.1:7002> get name -> Redirected to slot [5798] located at 127.0.0.1:7001 "zhangsan" 127.0.0.1:7001>
可以看到,已经可以共享数据了。
但是,如果我们把某一个主节点杀掉呢?
[root@localhost 19:52 /usr/local/redis-cluster]# redis-cli -p 7002 debug segfault Error: Server closed the connection [root@localhost 19:53 /usr/local/redis-cluster]# redis-trib.rb check 127.0.0.1:7000 >>> Performing Cluster Check (using node 127.0.0.1:7000) M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004 slots: (0 slots) slave replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99 M: a4a09d80a4bb6c82345c376c59e5ae49e1d49701 127.0.0.1:7005 slots:10923-16383 (5461 slots) master 0 additional replica(s) S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003 slots: (0 slots) slave replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. [root@localhost 19:54 /usr/local/redis-cluster]#
可以看到7005端口的节点已经变成主节点了。那如果继续把7005节点也宕掉呢?
[root@localhost 19:58 /usr/local/redis-cluster]# redis-cli -p 7005 debug segfault Error: Server closed the connection [root@localhost 19:58 /usr/local/redis-cluster]# redis-trib.rb check 127.0.0.1:7000 [ERR] Sorry, can't connect to node 127.0.0.1:7005 >>> Performing Cluster Check (using node 127.0.0.1:7000) M: 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 127.0.0.1:7000 slots:0-5460 (5461 slots) master 1 additional replica(s) M: 9bf2ee5d32fc350ec411d3eaad18f82492796e99 127.0.0.1:7001 slots:5461-10922 (5462 slots) master 1 additional replica(s) S: 3ff95d180ec47fc58c9c5f73e2f54354128bfe7e 127.0.0.1:7004 slots: (0 slots) slave replicates 9bf2ee5d32fc350ec411d3eaad18f82492796e99 S: f1bdbd841e37825169426486d6502e2cd99b76fe 127.0.0.1:7003 slots: (0 slots) slave replicates 6d996f9e34f40b02afe06aa9d3c8f18a41875cb2 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [ERR] Not all 16384 slots are covered by nodes. [root@localhost 19:58 /usr/local/redis-cluster]#
可以看到集群已经出现问题了。
追记:
在搭建多机多点集群的时候,遇到以下问题:
1、一直在等待...
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.......................
解决办法:确认端口是否开放。如果没有开发,可以修改/etc/sysconfig/iptables文件,开放端口(复制一行前面开放端口的来修改),然后service iptables restart重启防火墙。
极端的可以service iptables stop来关闭防火墙
2、槽被利用
/usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis/client.rb:119:in `call': ERR Slot 5461 is already busy (Redis::CommandError) from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:2742:in `block in method_missing' from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:45:in `block in synchronize' from /usr/local/rvm/rubies/ruby-2.3.3/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize' from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:45:in `synchronize' from /usr/local/rvm/gems/ruby-2.3.3/gems/redis-4.0.0/lib/redis.rb:2741:in `method_missing' from /usr/local/bin/redis-trib.rb:212:in `flush_node_config' from /usr/local/bin/redis-trib.rb:776:in `block in flush_nodes_config' from /usr/local/bin/redis-trib.rb:775:in `each' from /usr/local/bin/redis-trib.rb:775:in `flush_nodes_config' from /usr/local/bin/redis-trib.rb:1296:in `create_cluster_cmd' from /usr/local/bin/redis-trib.rb:1700:in `<main>'
解决办法:删除掉在redis.conf的dir目录下的几个文件redis.conf文件除外。
如果还是有相同的问题,可以考虑对所有节点执行下面两个命令。
redis-cli -p 端口号-h 主机物理地址 FLUSHALL
redis-cli -p 端口号-h 主机物理地址 CLUSTER RESET SOFT
위 내용은 Redis 클러스터 구축 전체 기록의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!