Redis集群

redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。

集群就是使用网络将若干台计算机联通起来,并提供统一的管理方式,使其对外呈现单机的服务效果

集群作用

  • 分散单台服务器的访问压力,实现负载均衡
  • 分散单台服务器的存储压力,实现可扩展性
  • 降低单台服务器宕机带来的业务灾难

Redis集群结构设计

数据存储设计

Redis集群预分好16384个槽,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个槽中。

key => CRC16(key) => 92083…9412 => %16384 => key应该保存的位置

集群内部通讯设计

  • 各个Redis存储空间保存各个存储空间中槽的编号数据(保证最多两次查找数据)

Cluster集群结构搭建

配置Cluster(redis.conf)

cluster-enabled yes #开启Cluster集群
cluster-config-file nodes-6379.conf #cluster配置文件名
cluster-node-timeout 10000 #节点服务响应超时时间,10秒无响应判定该节点下线或切换为从节点

redis配置文件整体内容

port 6384
daemonize no
#logfile "log_6384.log"
dir ./data
save 60 2
stop-writes-on-bgsave-error yes
# rdb
rdbcompression yes
rdbchecksum yes
dbfilename "dump-6384.rdb"

#aof 
appendonly yes
appendfsync always
appendfilename "appendonly-6384.aof"
bind 127.0.0.1

#集群
cluster-enabled yes
cluster-config-file nodes-6384.conf
cluster-node-timeout 10000

配置服务器(3主3从)

[root@localhost redis-config]# sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf
[root@localhost redis-config]# sed "s/6379/6381/g" redis-6379.conf > redis-6381.conf
[root@localhost redis-config]# sed "s/6379/6382/g" redis-6379.conf > redis-6382.conf
[root@localhost redis-config]# sed "s/6379/6383/g" redis-6379.conf > redis-6383.conf
[root@localhost redis-config]# sed "s/6379/6384/g" redis-6379.conf > redis-6384.conf
[root@localhost redis-config]# sed "s/6379/6385/g" redis-6379.conf > redis-6385.conf

启动Redis服务

redis-server redis-config/redis-6379.conf
redis-server redis-config/redis-6380.conf
redis-server redis-config/redis-6381.conf
redis-server redis-config/redis-6382.conf
redis-server redis-config/redis-6383.conf
redis-server redis-config/redis-6384.conf

启动Cluster

redis.3以下,需要安装ruby。任选一台机器安装ruby即可

# yum -y groupinstall "Development Tools"

# yum install -y gdbm-devel libdb4-devel libffi-devel libyaml libyaml-devel ncurses-devel openssl-devel readline-devel tcl-devel

# mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}

# wget http://cache.ruby-lang.org/pub/ruby/2.2/ruby-2.2.3.tar.gz -P ~/rpmbuild/SOURCES

# wget http://raw.githubusercontent.com/tjinjin/automate-ruby-rpm/master/ruby22x.spec -P ~/rpmbuild/SPECS

# rpmbuild -bb ~/rpmbuild/SPECS/ruby22x.spec

# rpm -ivh ~/rpmbuild/RPMS/x86_64/ruby-2.2.3-1.el7.x86_64.rpm

# gem install redis                 #目的是安装这个,用于配置集群
# cp /usr/local/redis/src/redis-trib.rb /usr/bin/

# redis-trib.rb create --replicas 1(从一) host(服务器地址):port(端口号)

redis.3以上,不需要安装ruby,直接创建集群即可

redis-cli --cluster create 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 
--cluster-replicas 1 # 1:主一从一,2:主一从二

主从自动分配先分配主服务,根据--cluster-replicas n 规则分配从服务

写入数据

[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> set name zhangsan
(error) MOVED 5798 127.0.0.1:6380

出现错误,原因6379的redis存储空间中没有5798号槽

[root@localhost bin]# redis-cli -p 6379 -c
127.0.0.1:6379> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1:6380
OK
127.0.0.1:6380> 

查看cluster-config-file

[root@localhost data]# cat nodes-6379.conf 
#主机标识 #服务器地址和端口 主从标识                  分配槽编号 0e1db5fad61023c7f7207149125effba769263ec
127.0.0.1:6381@16381 master - 0 1632633779000 3 connected 10923-16383 968b06c67a59dd3d858938e542bb915a1f883238 127.0.0.1:6383@16383 slave cba2c2226c2dc719110e30c03298f979528bf8bb 0 1632633778000 2 connected ef86d2bd93340bae5285945ae9a7fd45f17e8eeb 127.0.0.1:6379@16379 myself,master - 0 1632633778000 1 connected 0-5460 dd3593980e1315cb81213eb6e24d052a69dcaae6 127.0.0.1:6382@16382 slave ef86d2bd93340bae5285945ae9a7fd45f17e8eeb 0 1632633779000 1 connected 27988f069c06302feaaa0f4cae4a07e1f6380533 127.0.0.1:6384@16384 slave 0e1db5fad61023c7f7207149125effba769263ec 0 1632633780377 3 connected cba2c2226c2dc719110e30c03298f979528bf8bb 127.0.0.1:6380@16380 master - 0 1632633780000 2 connected 5461-10922 vars currentEpoch 6 lastVoteEpoch 0
原文地址:https://www.cnblogs.com/WarBlog/p/15337824.html