什么是Redis Cluster?

1)Redis集群是一个可以在多个Redis节点之间进行数据共享的设施(installation)。
2)Redis集群不支持那些需要同时处理多个键的Redis命令,因为执行这些命令需要在多个Redis节点之间移动数据,并且在高负载的情况下,这些命令将降低Redis集群的性能,并导致不可预测的行为。
3)Redis集群通过分区(partition)来提供一定程度的可用性(availability):即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
4)Redis集群有将数据自动切分(split)到多个节点的能力。

Redis Cluster的特点

Redis Cluster如何存储数据?

hash槽
哈希算法

  • CRC16算法(redis-cluster槽位算法)
  • CRC32算法
## 存储一个key
set name test

crc16(name)=5092
16384 % 5092
1108    #//会把key值存在一个1108序列的哈希槽里面
get name

高性能:

  • 1.在多酚片节点中,将16384个槽位,均匀分布到多个分片节点中
  • 2.存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16384之间)
  • 3.根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上
  • 4.如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储

高可用:

  • 在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof功能,同时当主节点down,实现类似于sentinel的自动failover的功能。
  • image-20230906143110303

Redis Cluster客户端连接任意节点

image-20230906143132552

如图所示,当我们用客户端连接A分片时,如果按照数据的取模,我们想要访问的数据,不在A分片中,那么集群会自动将请求进行转发。

redis集群数据共享(设计理念)

Redis 集群使用数据分片(sharding)而非一致性哈希(consistency hashing)来实现: 一个 Redis 集群包含 16384 个哈希槽(hash slot), 数据库中的每个键都属于这 16384 个哈希槽的其中一个, 集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16 校验和 。

1.节点 A 负责处理 0 号至 5500 号哈希槽。
2.节点 B 负责处理 5501 号至 11000 号哈希槽。
3.节点 C 负责处理 11001 号至 16384 号哈希槽。

image-20230906142835452

Redis Cluster运行机制

所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽.节点的fail是通过集群中超过半数的master节点检测失效时才生效.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可
把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->key

RedisCluster集群复制

为了使得集群在一部分节点下线或者无法与集群的大多数(majority)节点进行通讯的情况下, 仍然可以正常运作, Redis 集群对节点使用了主从复制功能: 集群中的每个节点都有 1 个至 N 个复制品(replica), 其中一个复制品为主节点(master), 而其余的 N-1 个复制品为从节点(slave)。
在之前列举的节点 A 、B 、C 的例子中, 如果节点 B 下线了, 那么集群将无法正常运行, 因为集群找不到节点来处理 5501 号至 11000 号的哈希槽。
假如在创建集群的时候(或者至少在节点 B 下线之前), 我们为主节点 B 添加了从节点 B1 , 那么当主节点 B 下线的时候, 集群就会将 B1 设置为新的主节点, 并让它代替下线的主节点 B , 继续处理5501 号至 11000 号的哈希槽, 这样集群就不会因为主节点 B 的下线而无法正常运作了。不过如果节点 B 和 B1 都下线的话, Redis 集群还是会停止运作。
集群的复制特性重用了 SLAVEOF 命令的代码,所以集群节点的复制行为和 SLAVEOF 命令的复制行为完全相同。
总结:主节点和从节点,一定不要在同一台服务器上

Redis Cluster故障转移

1)在集群里面,节点会对其他节点进行下线检测
2)当一个主节点下线时,集群里面的其他主节点负责对下线主节点进行故障移。
3)换句话说,集群的节点集成了下线检测和故障转移等类似 Sentinel 的功能。
4)因为 Sentinel 是一个独立运行的监控程序,而集群的下线检测和故障转移等功能是集成在节点里面的,它们的运行模式非常地不同,所以尽管这两者的功能很相似,但集群的实现没有重用 Sentinel 的代码。

Redis Cluster中执行命令的两种情况

1)命令发送到了正确的节点:命令要处理的键所在的槽正好是由接收命令的节点负责,那么该节点执行命令,就像单机 Redis 服务器一样。

image-20230906143156102

2)命令发送到了错误的节点:接收到命令的节点并非处理键所在槽的节点,那么节点将向客户端返回一个转向(redirection)错误,告知客户端应该到哪个节点去执行这个命令,客户端会根据错误提示的信息,重新向正确的节点发送命令。

image-20230906143220242

Redis Cluster 安装部署

6个redis实例,一般会放到3台硬件服务器

注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失

redis高可用集群方式:
Sentinel
Redis-Cluster
Codis
Redis什么时候才会读取dump.rdb文件?
1)Redis启动时
2)从库跟主库建立连接时

老版本Redis安装部署Cluster需要安装Ruby环境才行 //这里使用的是7.2版本,所有无需安装,自带Cluetsr

[root@db01 ~]# yum install ruby rubygems -y
# 查看ruby源
[root@db01 ~]# gem source --list
*** CURRENT SOURCES ***
https://rubygems.org/
# 更换ruby源
[root@db01 ~]# gem sources -a https://mirrors.aliyun.com/rubygems/
[root@db01 ~]# gem sources --remove https://rubygems.org/
# 安装redis的ruby插件(redis-cluster)
[root@db01 ~]# gem install redis -v 3.3.3
Fetching: redis-3.3.3.gem (100%)
Successfully installed redis-3.3.3
Parsing documentation for redis-3.3.3
Installing ri documentation for redis-3.3.3
1 gem installed

环境准备:

主机 IP 端口 应用
db01 172.16.1.51 7000 7001 redis-server、redis-client
db02 172.16.1.52 7002 7003 redis-server、redis-client
db03 172.16.1.53 7004 7005 redis-server、redis-client

多实例创建

## db01创建多实例
[root@db01 ~]# mkdir -p /data/redis/{7000,7001}
[root@db01 ~]# vim /data/redis/7000/redis.conf
port 7000
daemonize yes
pidfile /data/redis/7000/redis.pid
loglevel notice
logfile /data/redis/7000/redis.log
dbfilename dump.rdb
dir /data/redis/7000
bind 172.16.1.51
protected-mode no
[root@db01 ~]# vim /data/redis/7001/redis.conf
port 7001
daemonize yes
pidfile /data/redis/7001/redis.pid
loglevel notice
logfile /data/redis/7001/redis.log
dbfilename dump.rdb
dir /data/redis/7001
bind 172.16.1.51
protected-mode no

## db02创建多实例
[root@db02 ~]# mkdir -p /data/redis/{7002,7003}
[root@db02 ~]# vim /data/redis/7002/redis.conf
port 7002
daemonize yes
pidfile /data/redis/7002/redis.pid
loglevel notice
logfile /data/redis/7002/redis.log
dbfilename dump.rdb
dir /data/redis/7002
bind 172.16.1.52
protected-mode no
[root@db02 ~]# vim /data/redis/7003/redis.conf
port 7003
daemonize yes
pidfile /data/redis/7003/redis.pid
loglevel notice
logfile /data/redis/7003/redis.log
dbfilename dump.rdb
dir /data/redis/7003
bind 172.16.1.52
protected-mode no

## db03创建多实例
[root@db03 ~]# mkdir -p /data/redis/{7004,7005}
[root@db03 ~]# vim /data/redis/7004/redis.conf
port 7004
daemonize yes
pidfile /data/redis/7004/redis.pid
loglevel notice
logfile /data/redis/7004/redis.log
dbfilename dump.rdb
dir /data/redis/7004
bind 172.16.1.53
protected-mode no
[root@db03 ~]# vim /data/redis/7005/redis.conf
port 7005
daemonize yes
pidfile /data/redis/7005/redis.pid
loglevel notice
logfile /data/redis/7005/redis.log
dbfilename dump.rdb
dir /data/redis/7005
bind 172.16.1.53
protected-mode no

修改redis配置并启动redis

[root@db01 ~]# redis-server /data/redis/7000/redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
[root@db01 ~]# redis-server /data/redis/7001/redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
[root@db02 ~]# redis-server /data/redis/7002/redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
[root@db02 ~]# redis-server /data/redis/7003/redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
[root@db03 ~]# redis-server /data/redis/7005/redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
[root@db03 ~]# redis-server /data/redis/7004/redis.conf
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
## 检查端口
[root@db01 ~]# netstat -lntup|grep redis
[root@db01 redis]#  netstat -lntup|grep redis
tcp        0      0 172.16.1.51:17000       0.0.0.0:*               LISTEN      13237/redis-server  
tcp        0      0 172.16.1.51:17001       0.0.0.0:*               LISTEN      13238/redis-server  
tcp        0      0 172.16.1.51:7000        0.0.0.0:*               LISTEN      13237/redis-server  
tcp        0      0 172.16.1.51:7001        0.0.0.0:*               LISTEN      13238/redis-server  

创建cluster集群

# 前三个为主节点,后三个为从节点(老版本使用redis-trib.rb)
redis-trib.rb create --replicas 1 172.16.1.51:7000 172.16.1.51:7001 172.16.1.52:7002
172.16.1.52:7003 172.16.1.53:7004 172.16.1.53:7005
# 前三个为主节点,后三个为从节点(新版本使用redis-cli)
[root@db01 redis]# redis-cli --cluster create --cluster-replicas 1 172.16.1.51:7000 172.16.1.51:7001 172.16.1.52:7002 172.16.1.52:7003 172.16.1.53:7004 172.16.1.53:7005

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.16.1.52:7003 to 172.16.1.51:7000
Adding replica 172.16.1.53:7005 to 172.16.1.52:7002
Adding replica 172.16.1.51:7001 to 172.16.1.53:7004
M: 9a2886be39011b134dd356c81c7cdaf84ad06f94 172.16.1.51:7000
   slots:[0-5460] (5461 slots) master
S: 31483946746084eb0d1b669ed15bcda0775bc854 172.16.1.51:7001
   replicates 7b667e730fbecd2d2a09e73fb2d809023da4e5d0
M: cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 172.16.1.52:7002
   slots:[5461-10922] (5462 slots) master
S: 6a0397acb2c77fcd14e9f21969caf8c7fa7ec013 172.16.1.52:7003
   replicates 9a2886be39011b134dd356c81c7cdaf84ad06f94
M: 7b667e730fbecd2d2a09e73fb2d809023da4e5d0 172.16.1.53:7004
   slots:[10923-16383] (5461 slots) master
S: 84b567820bb20d642ef4a3c83acaa266f411afd9 172.16.1.53:7005
   replicates cf4ad448f534c0e85bfbeafb465f65fd45cadd6d
Can I set the above configuration? (type 'yes' to accept): yes
.........
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
## 查看master和slave的状态
[root@db01 redis]# redis-cli -h 172.16.1.51 -p 7000 cluster nodes |grep master
7b667e730fbecd2d2a09e73fb2d809023da4e5d0 172.16.1.53:7004@17004 master - 0 1693969422642 5 connected 10923-16383
cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 172.16.1.52:7002@17002 master - 0 1693969421634 3 connected 5461-10922
9a2886be39011b134dd356c81c7cdaf84ad06f94 172.16.1.51:7000@17000 myself,master - 0 1693969421000 1 connected 0-5460
[root@db01 redis]#  redis-cli -h 172.16.1.51 -p 7000 cluster nodes |grep slave
31483946746084eb0d1b669ed15bcda0775bc854 172.16.1.51:7001@17001 slave 7b667e730fbecd2d2a09e73fb2d809023da4e5d0 0 1693969432709 5 connected
6a0397acb2c77fcd14e9f21969caf8c7fa7ec013 172.16.1.52:7003@17003 slave 9a2886be39011b134dd356c81c7cdaf84ad06f94 0 1693969433214 1 connected
84b567820bb20d642ef4a3c83acaa266f411afd9 172.16.1.53:7005@17005 slave cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 0 1693969432000 3 connected

验证数据存储和读取

连接集群需要使用-c连接

## 错误连接方式
[root@db01 ~]# redis-cli -h 172.16.1.52 -p 7002
172.16.1.52:7002> set name test
OK
172.16.1.52:7002> get name
"test"
172.16.1.52:7002> quit
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 7000
172.16.1.51:7000> get name
(error) MOVED 5798 172.16.1.52:7002
## 正确连接方式
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 7000 -c
172.16.1.51:7000> set age 18
OK
172.16.1.51:7000> set name1 test
-> Redirected to slot [12933] located at 172.16.1.53:7004
OK
172.16.1.53:7004> get name
-> Redirected to slot [5798] located at 172.16.1.52:7002
"test"
172.16.1.52:7002> get age
-> Redirected to slot [741] located at 172.16.1.51:7000
"18"
172.16.1.51:7000>

添加节点

添加主节点

# 先将新节点加入集群(老版本)
[root@db01 ~]# redis-trib.rb add-node 172.16.1.52:7006 172.16.1.51:7000

## 先将新节点加入集群
[root@db01 ~]# redis-cli --cluster add-node 172.16.1.52:7006 172.16.1.51:7000
## 查看集群状态(记住ID)
[root@db01 ~]# redis-cli -h 172.16.1.51 -p 7000 cluster nodes
31483946746084eb0d1b669ed15bcda0775bc854 172.16.1.51:7001@17001 slave 7b667e730fbecd2d2a09e73fb2d809023da4e5d0 0 1693985831554 5 connected
cc6f94c987cd7e5b8ded09bb5dd9716cf8f92178 172.16.1.52:7006@17006 master - 0 1693985832000 8 connected
7b667e730fbecd2d2a09e73fb2d809023da4e5d0 172.16.1.53:7004@17004 master - 0 1693985833571 5 connected 10923-16383
6a0397acb2c77fcd14e9f21969caf8c7fa7ec013 172.16.1.52:7003@17003 slave 9a2886be39011b134dd356c81c7cdaf84ad06f94 0 1693985832563 1 connected
84b567820bb20d642ef4a3c83acaa266f411afd9 172.16.1.53:7005@17005 master - 0 1693985833269 7 connected 5461-10922
cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 172.16.1.52:7002@17002 slave 84b567820bb20d642ef4a3c83acaa266f411afd9 0 1693985832564 7 connected
9a2886be39011b134dd356c81c7cdaf84ad06f94 172.16.1.51:7000@17000 myself,master - 0 1693985832000 1 connected 0-5460
## 重新分片(分配槽位 老版本)
[root@db01 ~]# redis-trib.rb reshard 127.0.0.1:7000
## 重新分片(新版本)
[root@db01 ~]# redis-cli --cluster reshard 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: 9a2886be39011b134dd356c81c7cdaf84ad06f94 172.16.1.51:7000
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 31483946746084eb0d1b669ed15bcda0775bc854 172.16.1.51:7001
   slots: (0 slots) slave
   replicates 7b667e730fbecd2d2a09e73fb2d809023da4e5d0
M: cc6f94c987cd7e5b8ded09bb5dd9716cf8f92178 172.16.1.52:7006
   slots: (0 slots) master
M: 7b667e730fbecd2d2a09e73fb2d809023da4e5d0 172.16.1.53:7004
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 6a0397acb2c77fcd14e9f21969caf8c7fa7ec013 172.16.1.52:7003
   slots: (0 slots) slave
   replicates 9a2886be39011b134dd356c81c7cdaf84ad06f94
M: 84b567820bb20d642ef4a3c83acaa266f411afd9 172.16.1.53:7005
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 172.16.1.52:7002
   slots: (0 slots) slave
   replicates 84b567820bb20d642ef4a3c83acaa266f411afd9
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096    #你想要转移多少slot(槽位)到新节点
What is the receiving node ID? cc6f94c987cd7e5b8ded09bb5dd9716cf8f92178  #那个节点接受这些哈希槽位7007
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all    #从那些节点分配

#是否确认分片计划
Do you want to proceed with the proposed reshard plan (yes/no)? yes

##再次查看集群状态
[root@db01 redis]# redis-cli -h 172.16.1.51 -p 7000 cluster nodes
31483946746084eb0d1b669ed15bcda0775bc854 172.16.1.51:7001@17001 slave 7b667e730fbecd2d2a09e73fb2d809023da4e5d0 0 1693987452000 5 connected
cc6f94c987cd7e5b8ded09bb5dd9716cf8f92178 172.16.1.52:7006@17006 master - 0 1693987451000 10 connected 0-1364 5461-6826 10923-12287
7b667e730fbecd2d2a09e73fb2d809023da4e5d0 172.16.1.53:7004@17004 master - 0 1693987452557 5 connected 12288-16383
6a0397acb2c77fcd14e9f21969caf8c7fa7ec013 172.16.1.52:7003@17003 slave 9a2886be39011b134dd356c81c7cdaf84ad06f94 0 1693987451222 1 connected
84b567820bb20d642ef4a3c83acaa266f411afd9 172.16.1.53:7005@17005 master - 0 1693987451000 7 connected 6827-10922
cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 172.16.1.52:7002@17002 slave 84b567820bb20d642ef4a3c83acaa266f411afd9 0 1693987451950 7 connected
9a2886be39011b134dd356c81c7cdaf84ad06f94 172.16.1.51:7000@17000 myself,master - 0 1693987451000 1 connected 1365-5460
#可以看出 7006已成功分配槽位

添加从节点

## 添加从节点 (老版本)
[root@db01 ~]# redis-trib.rb add-node --slave --master-id
f4e3ce12a9aa1fe741634e74b88bb8b70b414f51 172.16.1.52:7007 172.16.1.51:7000
## 添加从节点 (新版本)   //主节点id+主节点IP端口  需要加入的从节点
[root@db01 ~]# redis-cli --cluster add-node --cluster-slave --cluster-master-id
712bfb947bd382144eff49907852c1feb24f34b5 172.16.1.53:7006 172.16.1.52:7007

删除节点

重新分配hash槽位

[root@db01 redis]# redis-cli --cluster reshard 172.16.1.51:7000
>>> Performing Cluster Check (using node 172.16.1.51:7000)
M: 9a2886be39011b134dd356c81c7cdaf84ad06f94 172.16.1.51:7000
   slots:[1365-5460] (4096 slots) master
   1 additional replica(s)
S: 177f339a09ad27ad8a1895de50ff4de74688ef41 172.16.1.53:7007
   slots: (0 slots) slave
   replicates 177f339a09ad27ad8a1895de50ff4de74688ef41
S: 31483946746084eb0d1b669ed15bcda0775bc854 172.16.1.51:7001
   slots: (0 slots) slave
   replicates 7b667e730fbecd2d2a09e73fb2d809023da4e5d0
M:  cc6f94c987cd7e5b8ded09bb5dd9716cf8f92178 172.16.1.52:7006
   slots:[0-1364],[5461-6826],[10923-12287] (4096 slots) master
   1 additional replica(s)
M: 7b667e730fbecd2d2a09e73fb2d809023da4e5d0 172.16.1.53:7004
   slots:[12288-16383] (4096 slots) master
   1 additional replica(s)
S: 6a0397acb2c77fcd14e9f21969caf8c7fa7ec013 172.16.1.52:7003
   slots: (0 slots) slave
   replicates 9a2886be39011b134dd356c81c7cdaf84ad06f94
M: 84b567820bb20d642ef4a3c83acaa266f411afd9 172.16.1.53:7005
   slots:[6827-10922] (4096 slots) master
   1 additional replica(s)
S: cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 172.16.1.52:7002
   slots: (0 slots) slave
   replicates 84b567820bb20d642ef4a3c83acaa266f411afd9
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4096  #//需要取消得到槽位
What is the receiving node ID? 177f339a09ad27ad8a1895de50ff4de74688ef41  #分配给谁  //7007
Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: cc6f94c987cd7e5b8ded09bb5dd9716cf8f92178    #从谁分配  //7006
Source node #2: done

#是否确认分片计划
Do you want to proceed with the proposed reshard plan (yes/no)? yes

## 查看集群状态
[root@db01 redis]# redis-cli -h 172.16.1.51 -p 7000 cluster nodes
cc6f94c987cd7e5b8ded09bb5dd9716cf8f92178 172.16.1.52:7006@17006 slave 177f339a09ad27ad8a1895de50ff4de74688ef41 0 1693987836194 10 connected
31483946746084eb0d1b669ed15bcda0775bc854 172.16.1.51:7001@17001 slave 7b667e730fbecd2d2a09e73fb2d809023da4e5d0 0 1693987836000 5 connected
177f339a09ad27ad8a1895de50ff4de74688ef41 172.16.1.53:7007@17007 master - 0 1693987837506 10 connected 0-1364 5461-6826 10923-12287
7b667e730fbecd2d2a09e73fb2d809023da4e5d0 172.16.1.53:7004@17004 master - 0 1693987836599 5 connected 12288-16383
6a0397acb2c77fcd14e9f21969caf8c7fa7ec013 172.16.1.52:7003@17003 slave 9a2886be39011b134dd356c81c7cdaf84ad06f94 0 1693987837204 1 connected
84b567820bb20d642ef4a3c83acaa266f411afd9 172.16.1.53:7005@17005 master - 0 1693987837000 7 connected 6827-10922
cf4ad448f534c0e85bfbeafb465f65fd45cadd6d 172.16.1.52:7002@17002 slave 84b567820bb20d642ef4a3c83acaa266f411afd9 0 1693987836000 7 connected
9a2886be39011b134dd356c81c7cdaf84ad06f94 172.16.1.51:7000@17000 myself,master - 0 1693987836000 1 connected 1365-5460

#可以看出7006在分配给7007槽位后,就降位slave了,而7007则上升为maser

删除节点

#语法: redis-cli --cluster del-node 节点IP+port  节点ID
## 老版本
[root@db01 ~]# redis-trib.rb del-node 172.16.1.52:7006 f4e3ce12a9aa1fe741634e74b88bb8b70b414f51
## 新版本
[root@db01 ~]# redis-cli --cluster del-node 172.16.1.51:7000 0639792eb849bfcc8ddb3f6ce6d846daa5f50ce6
[root@db01 ~]# redis-cli --cluster del-node 172.16.1.51:7001 ca5ffc7ba0a90c7bf56e9ceeaae32f4b22b91848
[root@db01 ~]# redis-cli -h 172.16.1.53 -p 7004 cluster nodes
5c8837c392fefa4dbef4a9c2ea9edeacb31e0103 172.16.1.53:7006@17006 slave
712bfb947bd382144eff49907852c1feb24f34b5 0 1693972963000 7 connected
64aa48c332a844f5dd3940f70c40832a6fa01889 172.16.1.52:7002@17002 master - 0
1693972962000 3 connected 6827-10922
be621924a34aa55dff5d2a5a0a7210bf13d414b9 172.16.1.52:7003@17003 slave
712bfb947bd382144eff49907852c1feb24f34b5 0 1693972962819 7 connected
7dd3c82bcfc1a309360564c44219e019785be94e 172.16.1.53:7005@17005 slave
64aa48c332a844f5dd3940f70c40832a6fa01889 0 1693972963232 3 connected
757f2d00b1eda50d4213f332f8bfdcc9a120734a 172.16.1.53:7004@17004 myself,master - 0
1693972963000 5 connected 12288-16383
712bfb947bd382144eff49907852c1feb24f34b5 172.16.1.53:7007@17007 master - 0
1693972963861 7 connected 0-6826 10923-12287

Redis API

Python连接Redis

# 安装
[root@db01 ~]# yum install -y python36-devel
## 安装python调用redis的库文件
[root@db01 ~]# pip3 install redis
#redis设置key
[root@db01 redis]# redis-cli -h 172.16.1.53 -p 7007
172.16.1.53:7007> keys *
(empty array)
172.16.1.53:7007> set name test-aaa
OK

#使用Python连接redis
#连接Python终端
[root@db01 ~]# python3
Python 3.6.4 (default, Apr 8 2019, 17:12:35)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
#导入redis模块
>>> import redis
#设置redis连接变量
>>> r = redis.StrictRedis(host='172.16.1.53', port=7007, db=0,password='')
#获取刚才创建的key
>>> r.get('name')
b'test-aaa'
#创建一个key
>>> r.set('age', '18')
True
#退出Python终端
>>> quit()
#连接redis
[root@db01 ~]# redis-cli -h 172.16.1.53 -p 7007
#查看是否有刚才创建的key
127.0.0.1:6379> KEYS *
#查看age的值
127.0.0.1:6379> get age
"18"

Python连接Redis Sentinel API

一般在企业中,Redis是不会使用单台,大部分企业都是以集群的形式存在的,所以我们需要知道,
Python如何连接Redis集群的API,当然我们讲的集群,有Sentinel和Redis Cluster。

#启动Redis多实例
[root@db01 ~]# redis-server /data/6380/redis.conf
[root@db01 ~]# redis-server /data/6381/redis.conf
[root@db01 ~]# redis-server /data/6382/redis.conf
#启动Redis Sentinel
[root@db01 ~]# redis-sentinel /data/26380/sentinel.conf &
#连接python终端
[root@db01 ~]# python3
Python 3.6.4 (default, Apr 8 2019, 17:12:35)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
#导入Redis Sentinel模块
>>> from redis.sentinel import Sentinel
#设置连接信息变量
>>> sentinel = Sentinel([('localhost', 26380)], socket_timeout=0.1)
#获取主库,从库信息
>>> sentinel.discover_master('mymaster')
>>> sentinel.discover_slaves('mymaster')
#配置读写分离,写节点
>>> master = sentinel.master_for('mymaster', socket_timeout=0.1,password="zls")
#配置读写分离,读节点
>>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1,password="zls")
#读写分离测试key
>>> master.set('zls', 'handsome')
>>> slave.get('zls')
'handsome'

Python连接Redis Cluster集群

Redis Cluster的连接并操作(python2.7.2以上版本才支持redis cluster,我们选择的是3.6.4)
https://github.com/Grokzen/redis-py-cluster

#安装Python连接Redis Cluster驱动
[root@db01 ~]# pip3 install redis-py-cluster
#启动Redis Cluster集群
[root@db01 ~]# redis-server /data/7000/redis.conf
[root@db01 ~]# redis-server /data/7001/redis.conf
[root@db01 ~]# redis-server /data/7002/redis.conf
[root@db01 ~]# redis-server /data/7003/redis.conf
[root@db01 ~]# redis-server /data/7004/redis.conf
[root@db01 ~]# redis-server /data/7005/redis.conf
#连接Python终端
[root@db01 ~]# python3
Python 3.6.4 (default, Apr 8 2019, 17:12:35)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux
Type "help", "copyright", "credits" or "license" for more information.
#导入Redis Cluster模块
>>> from rediscluster import RedisCluster
#设置登录redis集群变量
>>> startup_nodes = [{"host": "172.16.1.53", "port": "7007"}]
#设置连接变量
>>> rc = RedisCluster(startup_nodes=startup_nodes, decode_responses=True)
#测试设置key
>>> rc.set("foo", "bar")
True
#查询key
>>> rc.get("foo")
bar
0