redis集群搭建

本文详细介绍了Redis集群的三种模式:主从模式、哨兵模式和Cluster模式。在主从模式中,数据通过主节点同步到从节点,实现读写分离,但存在单点故障问题。哨兵模式通过监控和自动故障转移解决这一问题。Cluster模式则采用去中心化设计,支持在线自动扩容。文中提供了详细的部署步骤和测试验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis集群主要解决高并发场景下数据读写的性能问题,有着良好的容错和容灾机制。

常见的redis集群模式主要有以下三种:

1.主从模式(master-slave模式)

2.哨兵模式(sentinel模式)

3.cluster模式(cluster模式)

以下对这几种集群模式进行原理概述,搭建和配置。此次选择的redis的版本是v5.0.5的,因为只有一台服务器,所以通过启动不同的端口号来代替服务器集群。

 

主从模式(master-slave模式):

1.原理

创建多个redis节点,其中有一个master节点(主节点),其余的都为slave节点(从节点),master节点会一直把数据同步到slave从节点,数据保持主从同步,实现读写分离

2.特点

  1. 主节点master数据对数据进行读,写操作
  2. 从节点slave只能对数据进行读操作

     缺点:单点故障发生后以前雪崩,若主节点宕机后,,就无法进行数据写入了

3.部署步骤

1.下载redis-5.0.5.tar.gz压缩包,用tar -zxvf  redis-5.0.5.tar.gz命令对该包进行解压,在进入解压后的目录使用make命令进行编译

 

 

2.部署节点的为如下配置

节点配置端口
主节点(1个)6380
从节点(2个)6381,6382

3.进入redis-5.0.5目录下将redis.conf主配置文件复制三份出来,分别命名为redis6380.conf,redis6381.conf,redis6382.conf。

4.进入这个三个配置文件,分别将里面的port改为6380,6381,6382。受保护模式改为no,作为守护线程设置为yes。

5.这一步要配置主从关系,因为端口6380是我们的主节点,端口6381和6382是我们的从节点。主从模式在配置的时候,主节点不需要进行特殊配置,从节点需要挂在主节点上面。分别(vi/vim)进入redis6381.conf,redis6382.conf,找到replicaof <masterip> <masterport>节点,在下面添加 replicaof 主节点ip 主节点端口(replicaof 127.0.0.1 6380,两个从节点的配置文件都要进行修改,然后保存退出。

6.至此主动模式的配置就完成了,分别用启动脚本+配置文件的方式进行redis启动,命令如下(如解压路径个配置文件路径和本文不一致需要对命令中的路径进行微调):

./redis-5.0.5/src/redis-server redis6380.conf
./redis-5.0.5/src/redis-server redis6381.conf
./redis-5.0.5/src/redis-server redis6382.conf

7.查看相关端口是否已经启动 

命令查看,端口已启动,服务在保持运行

4.测试

1.测试是使用redis-5.0.5/src/下客户端脚本redis-cli,命令./redis-cli -p port

先连接主节点服务6380端口,命令 ./redis-cli -p 6380,然后进行数据的写,读操作,都是可以的

2.然后我们随便连接一个从节点,来取这个hello的值,看能不能取到

我们可以看到这个hello的value值是可以取到的,说明了主节点的数据已经同步到从节点了。但是我们再6381服务进行数据的写操作时,报错信息是只能进行只读操作,不能进行数据的写操作

 

哨兵模式(sentinel模式)

1.原理

哨兵模式就是因为会产生单点故障的原因,哨兵模式就是在之前的主从模式上进行了改进。

因为每个从节点备份了相同的数据,若主节点宕机的话,哨兵服务就会通过投票选举出新的主节点来进行数据的读写操作,这就是哨兵模式的作用。

说明:哨兵服务也是用的是redis自带的服务,只是通过相关哨兵服务的相关配置,来对之前的主从服务进行管理

2.特点

基于主从复制结构,加入了sentinel监控。避免了主节点的单点故障,引起缓存系统雪崩。

Sentinel系统用于管理多个redis服务器,主要负责三个任务:

  1. 监控:sentinel会不断检查你的主从服务器运作是否正常
  2. 提醒:当被监控的某个redis服务出现问题时,sentinel可以通过api服务向其他服务发出通知(配置文件里面可以配置通知脚本的路径,可以执行此脚本)
  3. 失败迁移:当主节点不能正常工作时,它会进行选举投票(半数原则), 选举,将其中一个服务器升级为新的主服务器

3.构成

前提:已经存在一个正在运行的主从模式。

另外,配置多个sentinel实例,监控同一个master节点,一般的话sentinel会进行选举,所以一般的话sentinel配置奇数个,符合选举机制

4.部署步骤

1.在redis-5.0.5同级创建文件夹(自定义)sentinels,将redis-5.0.5/src下的sentinel.conf哨兵的配置文件复制三份(多份)到sentinels文件夹下,分别命名为sentinel16380.conf,sentinel16381.conf,sentinel16382.conf

2.分别进入sentinel16380.conf,sentinel16381.conf,sentinel16382.conf配置文件,分别将端口(port)改为16380,16381,16382,受保护模式改为no,作为守护线程设置为yes。

3.接着上一步骤,找到sentinel monitor <master-name> <ip> <redis-port> <quorum>这个节点进行配置

这里的配置主要是以下意思:               

<master-name> 主节点的服务名称

<ip><redis-port> 主节点的地址(从节点地址不用配置,哨兵会根据redis的主从配置找到)

<quorum> 是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效

4.配置主节点挂掉后到哨兵宣布主节点挂掉进行重新投票的时间(类似于主节点挂掉后的心跳检测时间),这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒(默认即可,可不做修改)

5.启动每个redis服务(之前启动过的话就不用操作该步骤)

6.启动哨兵服务。分别打开三个窗口分别启动,便于观察日志,启动命令如下:

./redis-5.0.5/src/redis-sentinel sentinels/sentinel16380.conf
./redis-5.0.5/src/redis-sentinel sentinels/sentinel16381.conf
./redis-5.0.5/src/redis-sentinel sentinels/sentinel16382.conf

8.启动后的状态:

5.测试

1.连接主从节点,测试一下,主节点能读能写,从节点只能读不能写,和之前一样

2.关闭主节点服务,杀掉6380端口,查看现象,会看到一轮投票过程,选举出新的节点

从上面可以看到,选举出新的主节点为6381端口的服务

3.进入6381所在的节点,进行数据读写,发现之前是从节点的节点,被选举为主节点后也能进行数据的写操作,选举完成

说明:1.之前6380的主节点再次启动后,只能成为从节点挂在6381上,该节点只能进行读操作(除非再次被选举成主节点)

           2.在sentinel进行过选举流程之后,sentinel配置文件里面关于主节点的ip和端口也发生了修改

cluster模式

1.原理

redis中内置了16384个哈希插槽,在往redis里面存放键值对时,会根据哈希算法对key进行hash计算,算个一个位置然后,将数据存放在相应的位置(应该和hashmap存放数据的原理一致)。采用一主一备的方式实现了集群的高可用

2.特点

1.去中心化,不需要代理层,如nginx

2.在线自动扩容

3.里面所有redis服务的节点彼此互联(采用ping-pong的心跳机制)

3.构成

redis服务即可(该版本不需要其它中间件,如:ruby),修改主配置文件redis.conf即可

4.部署步骤

1.redis-5.0.5下分别创建6个文件夹 mkdir 7001 7002 7003 7004 7005 7006 。

2.复制redis.conf主配置文件,修改如下内容,然后将文件命名为redis7001.conf,然后将文件复制到7001文件夹。

1. daemonize yes  
2. port 7001 #分别对每个机器的端口号进行设置  
3. dir /usr/local/redis/master-slave/cluster/7001 #指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据
4. cluster-enabled yes     #启动集群模式 
5. cluster-config-file nodes-7001.conf #集群节点信息文件,这里 7001 和端口对应上  
6. cluster-node-timeout 5000   
7. # bind 127.0.0.1 #去掉bind绑定访问ip信息
8. protected-mode  no  #关闭保护模式  
9. appendonly yes  #如果要设置密码需要增加如下配置: 
10. requirepass 123456  #设置redis访问密码
11. masterauth 123456   #设置集群节点间访问密码,跟上面一样

3.重复上述第2个步骤5次,修改配置,7001--7006端口全部复制修改。

4.启动各个redis节点,命令如下

./redis-5.0.5/src/redis-server cluster/7001/redis7001.conf
./redis-5.0.5/src/redis-server cluster/7002/redis7002.conf
./redis-5.0.5/src/redis-server cluster/7003/redis7003.conf
./redis-5.0.5/src/redis-server cluster/7004/redis7004.conf
./redis-5.0.5/src/redis-server cluster/7005/redis7005.conf
./redis-5.0.5/src/redis-server cluster/7006/redis7006.conf

5.用 redis-cli 创建整个 Redis 集群,主节点+从节点,命令如下,-a 后面输入的是密码

./redis-5.0.5/src/redis-cli -a 123456 --cluster create --cluster-replicas 1 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 127.0.0.1:7006

执行后如下:

会生成一个主节点和备份节点的结构,M代表主节点,S代表备份节点,还询问你是否同意这样的搭配,填写yes即可

之后显示16384个插槽都覆盖到了,并且每个主节点插槽的覆盖范围也显示了,就是slots后面的集合,这样就可以了

5.测试

1.采用redis-cli进行连接测试,连接其中一个主节点,命令如下,-a后面是密码,-c表示的是集群模式

./redis-cli -a123456 -c -p 7002

2.会发现在存入数据的时候,端口在发生变化,验证完成

3.两个命令

cluster info  查看集群信息
cluster nodes 查看节点信息

 

本人也是第一次搭建redis集群,文档的撰写的时间上也相对仓促,肯定还有许多遗漏和不足的地方,深度还比较欠缺,欢迎大家给提意见,共同进步,感谢!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值