Redis集群

一、Redis集群

redis3.0之前提出的集群方案就是主从复制+哨兵机制。
redis3.0以后推出的redis cluster 集群方案,redis cluster集群保证了高可用、高性能、高可扩展性

二、Redis的集群策略

推特:twemproxy
豌豆荚:codis
官方:redis cluster--无中心化(在redis集群中没有主节点的概念,每个节点都存储了集群中所有节点的信息)

三、Redis-cluster架构图

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

 

Redis 集群中内置了 16384个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使
用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间
的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点

 

(1)节点失效判断:集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过
(cluster-node-timeout),认为该master节点挂掉.
(2)集群失效判断:什么时候整个集群不可用(cluster_state:fail)
如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态。也可以理解成集群的[0-
16383]slot映射不完全时进入fail状态。
如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态。

四、安装RedisCluster

规划 三台主服务器,三台从服务器

端口号分别为:7001~7006

第一步  创建7001实例

下载并解压

wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar -zxf redis-5.0.4.tar.gz

编译Redis源码

cd redis-5.0.4
make

安装Redis,需要通过PREFIX指定安装路径

make install PREFIX=/root/redis/server

复制redis.conf文件到安装redis安装bin目录下

cp /root/redis/redis-5.0.4/redis.conf  /root/redis/server/bin/

说明:

/root/redis/redis-5.0.4/redis.conf 是redis下载解压目录

/root/redis/server/是redis安装目录

创建7001实例

cd /root/redis/server
cp /root/redis/server/bin/  7001 -r

修改redis.conf配置文件

修改端口

# 将'daemonize'由'no'改为'yes'
daemonize yes
# 默认绑定的是回环地址,默认不能被其他机器访问
# bind 127.0.0.1
# 是否开启保护模式,由yes该为no
protected-mode no

打开Cluster-enable yes

第二步  复制7001,创建7002~7006实例,注意端口修改

[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7002 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7003 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7004 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7005 -r
[root@iz2zebb7s8ui8b5mmag51xz server]# cp 7001 7006 -r

[root@iz2zebb7s8ui8b5mmag51xz 7001]# vim redis.conf 

其它依次修改

第三步:启动所有的实例

[root@iz2zebb7s8ui8b5mmag51xz 7006]# ./redis-server redis.conf 
29407:C 14 May 2019 19:29:47.607 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29407:C 14 May 2019 19:29:47.607 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29407, just started
29407:C 14 May 2019 19:29:47.607 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7006]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7005
[root@iz2zebb7s8ui8b5mmag51xz 7005]# ./redis-server redis.conf 
29412:C 14 May 2019 19:29:54.446 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29412:C 14 May 2019 19:29:54.446 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29412, just started
29412:C 14 May 2019 19:29:54.446 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7005]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7004
[root@iz2zebb7s8ui8b5mmag51xz 7004]# ./redis-server redis.conf 
29417:C 14 May 2019 19:29:59.897 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29417:C 14 May 2019 19:29:59.897 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29417, just started
29417:C 14 May 2019 19:29:59.897 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7004]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7003
[root@iz2zebb7s8ui8b5mmag51xz 7003]# ./redis-server redis.conf 
29427:C 14 May 2019 19:30:06.009 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29427:C 14 May 2019 19:30:06.009 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29427, just started
29427:C 14 May 2019 19:30:06.009 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7003]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7002
[root@iz2zebb7s8ui8b5mmag51xz 7002]# ./redis-server redis.conf 
29432:C 14 May 2019 19:30:12.514 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29432:C 14 May 2019 19:30:12.514 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29432, just started
29432:C 14 May 2019 19:30:12.514 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7002]# cd ..
[root@iz2zebb7s8ui8b5mmag51xz server]# cd 7001
[root@iz2zebb7s8ui8b5mmag51xz 7001]# ./redis-server redis.conf 
29437:C 14 May 2019 19:30:18.562 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
29437:C 14 May 2019 19:30:18.562 # Redis version=5.0.4, bits=64, commit=00000000, modified=0, pid=29437, just started
29437:C 14 May 2019 19:30:18.562 # Configuration loaded
[root@iz2zebb7s8ui8b5mmag51xz 7001]# ps -ef |grep redis
root     29408     1  0 19:29 ?        00:00:00 ./redis-server *:7006 [cluster]
root     29413     1  0 19:29 ?        00:00:00 ./redis-server *:7005 [cluster]
root     29418     1  0 19:29 ?        00:00:00 ./redis-server *:7004 [cluster]
root     29428     1  0 19:30 ?        00:00:00 ./redis-server *:7003 [cluster]
root     29433     1  0 19:30 ?        00:00:00 ./redis-server *:7002 [cluster]
root     29438     1  0 19:30 ?        00:00:00 ./redis-server *:7001 [cluster]
root     29443 29320  0 19:30 pts/1    00:00:00 grep --color=auto redis
[root@iz2zebb7s8ui8b5mmag51xz 7001]#

第四步:创建Redis集群

./redis-cli --cluster create 39.97.176.160:7001 39.97.176.160:7002 39.97.176.160:7003 39.97.176.160:7004 39.97.176.160:7005 39.97.176.160:7006 --cluster-replicas 1

[root@iz2zebb7s8ui8b5mmag51xz 7001]# ./redis-cli --cluster create 39.97.176.160:7001 39.97.176.160:7002 39.97.176.160:7003 39.97.176.160:7004 39.97.176.160:7005 39.97.176.160:7006 --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 39.97.176.160:7005 to 39.97.176.160:7001
Adding replica 39.97.176.160:7006 to 39.97.176.160:7002
Adding replica 39.97.176.160:7004 to 39.97.176.160:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: e20b682825823693c10fa2e1c87b85b92f560de6 39.97.176.160:7001
   slots:[0-5460] (5461 slots) master
M: 87f8def93d6538fca2997d65d07d1c4b50d95097 39.97.176.160:7002
   slots:[5461-10922] (5462 slots) master
M: c45a571e45ab4df36afb3a0af065d9314515d790 39.97.176.160:7003
   slots:[10923-16383] (5461 slots) master
S: 761d2853987f173b86a9d0520c6e71602fd96431 39.97.176.160:7004
   replicates 87f8def93d6538fca2997d65d07d1c4b50d95097
S: 3453b40499555406ac2790360116e250e2c61256 39.97.176.160:7005
   replicates c45a571e45ab4df36afb3a0af065d9314515d790
S: dcf036c9b1588ed708d87caec905a5e090376154 39.97.176.160:7006
   replicates e20b682825823693c10fa2e1c87b85b92f560de6
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 39.97.176.160:7001)
M: e20b682825823693c10fa2e1c87b85b92f560de6 39.97.176.160:7001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: 87f8def93d6538fca2997d65d07d1c4b50d95097 39.97.176.160:7002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 3453b40499555406ac2790360116e250e2c61256 39.97.176.160:7005
   slots: (0 slots) slave
   replicates c45a571e45ab4df36afb3a0af065d9314515d790
S: 761d2853987f173b86a9d0520c6e71602fd96431 39.97.176.160:7004
   slots: (0 slots) slave
   replicates 87f8def93d6538fca2997d65d07d1c4b50d95097
M: c45a571e45ab4df36afb3a0af065d9314515d790 39.97.176.160:7003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: dcf036c9b1588ed708d87caec905a5e090376154 39.97.176.160:7006
   slots: (0 slots) slave
   replicates e20b682825823693c10fa2e1c87b85b92f560de6
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
[root@iz2zebb7s8ui8b5mmag51xz 7001]# 

五、客户端连接集群

./redis-cli -p 7001 -c

[root@iz2zebb7s8ui8b5mmag51xz 7001]# ./redis-cli -p 7001 -c
127.0.0.1:7001> set s1 111
-> Redirected to slot [15224] located at 39.97.176.160:7003
OK
39.97.176.160:7003> set s2 222
-> Redirected to slot [2843] located at 39.97.176.160:7001
OK
39.97.176.160:7001> 

六.安装出现的问题

redis集群创建的时候,一直卡在Waiting for the cluster to join ....上、一直没有反应

问题:

机器没有开放redis集群总线端口。

解决方法:

开放redis集群总线端口。

集群总线端口是redis客户端连接的端口+10000。

如:redis客户端端口是7001。

则:集群总线端口就是17001。

注意、所以redis集群机器都要放开对应的redis客户端端口和集群总线端口
 

### Redis 集群的搭建与配置 #### 一、Redis 集群简介 Redis 是一种高性能的键值存储系统,支持多种数据结构操作。通过集群模式可以实现分布式存储和高可用性。Redis 集群允许多个 Redis 实例协同工作,提供更高的吞吐量和更强的数据持久化能力。 --- #### 二、环境准备 在开始之前,需确认以下条件已满足: - 所有服务器的操作系统版本一致(如 CentOS 7 或 Windows),并安装了相同版本的 Redis 软件。 - 已关闭防火墙或开放必要的端口(默认 Redis 使用 6379 及其衍生端口)。 - 每台服务器上至少有两个 Redis 实例运行,分别作为主节点和从节点[^1]。 --- #### 三、具体步骤 ##### 1. 下载并解压 Redis 文件 下载指定版本的 Redis 压缩包(如 Redis 6.2.5 或更高版本),将其解压到目标路径下。例如,在 Linux 中执行以下命令: ```bash wget http://download.redis.io/releases/redis-6.2.5.tar.gz tar -zxvf redis-6.2.5.tar.gz cd redis-6.2.5 make ``` ##### 2. 创建多个实例目录 为每个 Redis 实例创建独立的工作目录,并复制 `redis.conf` 至对应文件夹中。例如: ```bash mkdir -p /service/redis/{6379,6380} cp redis.conf /service/redis/6379/ cp redis.conf /service/redis/6380/ ``` ##### 3. 修改配置文件 编辑每个实例下的 `redis.conf` 文件,设置不同的监听端口号和其他必要参数。以下是关键配置项: - 设置绑定 IP 地址:`bind 0.0.0.0` - 关闭保护模式:`protected-mode no` - 开启集群功能:`cluster-enabled yes` - 指定集群配置文件位置:`cluster-config-file nodes-{port}.conf` - 设定日志级别:`loglevel notice` ##### 4. 启动 Redis 实例 依次启动各个 Redis 实例。例如: ```bash redis-server /service/redis/6379/redis.conf redis-server /service/redis/6380/redis.conf ``` 如果是在多台物理机上部署,则需要远程登录每台机器重复上述过程[^2]。 ##### 5. 构建集群拓扑 利用 `redis-cli` 的集群管理工具完成初始化操作。假设当前存在六个节点分布在三台主机上,则可输入如下指令构建集群关系: ```bash redis-cli --cluster create \ 192.168.x.y:6379 192.168.x.z:6379 ... \ --replicas 1 ``` 其中 `--replicas` 参数表示每个主节点分配几个副本[^4]。 ##### 6. 验证集群状态 最后可以通过以下方式验证集群是否正常运作: ```bash redis-cli -c -h {任意IP} -p {任一口号} CLUSTER INFO CLUSTER NODES PING SET key value GET key ``` --- #### 四、注意事项 - 如果使用 Docker 容器来部署 Redis 集群,请确保容器间网络互通良好。 - 对于 Windows 平台上的开发测试场景,可通过批处理脚本来简化服务启动流程[^3]。 --- #### 五、示例代码片段 下面展示了一个简单的 Python 程序用于连接至 Redis 集群并向其中写入一条记录: ```python import redis r = redis.StrictRedisCluster(startup_nodes=[{"host": "127.0.0.1", "port": "6379"}], decode_responses=True) r.set(&#39;foo&#39;, &#39;bar&#39;) print(r.get(&#39;foo&#39;)) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2014Team

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值