redis集群配置和节点管理

生产环境中的redis绝大多数是以集群形态运行的,这篇博文简要介绍分布式集群的原理、优势,然后描述配置过程。

redis集群的原理

redis集群的原理简要介绍如下

  1. redis中有槽位的概念,可以这样理解,redis的数据存储在16384个槽位中,分布式集群就是将这些槽位均匀分布到多个分片节点(不同的redis实例)中。
  2. 写入数据时:将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间),找到相对应的分片节点的主节点,存储到相应槽位上。
  3. 读取数据时:只需要连接到集群中的任意一个节点,如果目标数据不在这个节点,分片集群会将客户端连接切换至真正存储节点进行数据存储。
  4. redis的高可用:在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,集群会实现类似于sentinel的自动failover的功能。

redis集群的搭建过程

这里用6个实际来搭建集群,分为三组,每组包含一个主节点和一个从节点。搭建过程如下

安装集群插件

yum install ruby rubygems -y
##使用国内源,移除原生源
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources  --remove https://rubygems.org/
##安装redis集群插件
gem install redis -v 3.3.3

准备6个节点

准备6个节点,端口号分别为6391---6396,一个个vim太麻烦,所以写了一个脚本

[[email protected] scripts]# cat create_redis_conf.sh
#!/bin/bash
port=$1
if [ ! -d /data/redis/$port ];then
        mkdir /data/redis/$port
fi
cat >/data/redis/${port}/redis.conf <<-EOF
port ${port}
daemonize yes
pidfile /data/redis/${port}/redis.pid
loglevel notice
logfile "/data/redis/${port}/redis.log"
dbfilename dump.rdb
dir /data/redis/${port}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
EOF

看看生成的配置文件内容吧

cat /data/redis/6391/redis.conf
port 6391
daemonize yes
pidfile /data/redis/6391/redis.pid
loglevel notice
logfile "/data/redis/6391/redis.log"
dbfilename dump.rdb
dir /data/redis/6391
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

然后用脚本生成6个节点的配置文件

sh create_redis_conf.sh  6391
sh create_redis_conf.sh  6392
sh create_redis_conf.sh  6393
sh create_redis_conf.sh  6394
sh create_redis_conf.sh  6395
sh create_redis_conf.sh  6396

启动节点并验证

##启动节点
redis-server /data/redis/6391/redis.conf
redis-server /data/redis/6392/redis.conf
redis-server /data/redis/6393/redis.conf
redis-server /data/redis/6394/redis.conf
redis-server /data/redis/6395/redis.conf
redis-server /data/redis/6396/redis.conf

##验证,可以看到cluster关键字
ps -ef|grep redis
root      46075      1  0 18:17 ?        00:00:00 redis-server *:6391 [cluster]
root      46079      1  0 18:17 ?        00:00:00 redis-server *:6392 [cluster]
root      46083      1  0 18:17 ?        00:00:00 redis-server *:6393 [cluster]
root      46087      1  0 18:17 ?        00:00:00 redis-server *:6394 [cluster]
root      46091      1  0 18:17 ?        00:00:00 redis-server *:6395 [cluster]
root      46095      1  0 18:17 ?        00:00:00 redis-server *:6396 [cluster]

还可以连接到主节点后,写入数据,从本身节点或相应的从节点读取,来验证各个节点的可用性。

将节点加入集群管理

redis-trib.rb create --replicas 1 127.0.0.1:6391 127.0.0.1:6392 127.0.0.1:6393 127.0.0.1:6394 127.0.0.1:6395 127.0.0.1:6396
##--replicas 1表示为每个主节点配置一个从节点
##执行语句后,会有互动性操作,根据提示,键入yes,然后enter确认即可

查看集群状态

这里有几条命令,作用如下表,每条命令中只需要指定集群中任意一个节点就行

命令 作用说明
redis-cli -p 6391 cluster nodes | grep master 查看集群主节点状态
redis-cli -p 6391 cluster nodes | grep slave 查看集群从节点状态
redis-trib.rb check 127.0.0.1:6391 打印集群中所有节点的id、槽位和主从信息
redis-trib.rb info 127.0.0.1:6391 打印集群中所有主节点的基本信息,包含key数量、槽位信息和从节点数量

模拟主节点掉线

6391掉线后,6394切换为主节点;6391重启后,作为6394的从节点继续运行。

redis集群的节点管理

添加节点

这里以添加一主一从两个节点为例,其中添加主节点涉及到重新分配槽位的操作,意思就是将集群所有的槽位重新分配。

  • 添加主节点
###准备两个新的节点
sh create_redis_conf.sh 6397
sh create_redis_conf.sh 6398
redis-server /data/redis/6397/redis.conf
redis-server /data/redis/6398/redis.conf

###添加主节点
redis-trib.rb check 127.0.0.1:6397

###查看主节点状态,这时新加的节点槽位数为0
redis-cli -p 6391 cluster nodes|grep master
67adb78e575232aebaf2c645d45a50e43d8a1df9 127.0.0.1:6397 master - 0 1554636369693 0 connected
db83ce3e3f67714eb1db7285cc293acac1421834 127.0.0.1:6394 master - 0 1554636370196 7 connected 0-5460
771488ef6f90180b7bcb1968329d6847055ad926 127.0.0.1:6392 master - 0 1554636369693 2 connected 5461-10922
eb3965cc6ea8b0ff8f134a545fcefe5c102fa2d6 127.0.0.1:6393 master - 0 1554636371204 3 connected 10923-16383

###重新分配槽位,先计算一下,所有节点均匀分配的话,每个节点槽位数应该是4096
###重新分配槽位的操作需要交互式配置,根据提示操作即可,这里贴出需要人工输入的部分,标红的就是需要输入的内容
redis-trib.rb reshard 127.0.0.1:6391
How many slots do you want to move (from 1 to 16384)? 4096                  ### 移动槽位的数量
What is the receiving node ID? 67adb78e575232aebaf2c645d45a50e43d8a1df9     ### 接受槽位的master节点id
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                                                          ### 从哪些节点移出槽位,all表示从之前所有的节点平均移出槽位到目标节点
Do you want to proceed with the proposed reshard plan (yes/no)? yes         ### 确认槽位移动
  • 添加从节点
redis-trib.rb add-node --slave --master-id 67adb78e575232aebaf2c645d45a50e43d8a1df9 127.0.0.1:6398 127.0.0.1:6391
  • 验证集群状态
    按照前文描述的方法验证集群的节点状态。

删除节点

这里以删除上面添加的两个节点为例,删除节点也需要重新分配槽位,可以将目标节点的槽位分配给某一个节点,然后删除主从两个节点即可。

重新分配目标节点的槽位:

redis-trib.rb reshard 127.0.0.1:6391
How many slots do you want to move (from 1 to 16384)? 4096
What is the receiving node ID? 771488ef6f90180b7bcb1968329d6847055ad926
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:67adb78e575232aebaf2c645d45a50e43d8a1df9
Source node #2:doneDo you want to proceed with the proposed reshard plan (yes/no)? yes

删除主从节点

redis-trib.rb del-node 127.0.0.1:6397 67adb78e575232aebaf2c645d45a50e43d8a1df9
redis-trib.rb del-node 127.0.0.1:6398 dfe712916c932fe54b5ca1f3d223aedc98c8ad2e

删除后按照前文的方法,验证集群状态

原文地址:https://www.cnblogs.com/Go-Spurs-Go/p/10666810.html

时间: 2024-08-04 00:58:02

redis集群配置和节点管理的相关文章

redis 集群配置实战

最近研究Redis-cluster,正好搭建了一个环境,遇到了很多坑,系统的总结下,等到redis3 release出来后,换掉memCache 集群. 一:关于redis cluster 1:redis cluster的现状 reids-cluster计划在redis3.0中推出,可以看作者antirez的声明:http://antirez.com/news/49 (ps:跳票了好久,今年貌似加快速度了),目前的最新版本是redis3 beta2(2.9.51). 作者的目标:Redis Cl

java操作redis集群配置[可配置密码]和工具类

java操作redis集群配置[可配置密码]和工具类 <dependency>   <groupId>redis.clients</groupId>   <artifactId>jedis</artifactId>   <version>2.9.0</version>   </dependency>   <dependency>   <groupId>org.apache.commons

最简redis集群配置

redis集群 配置 master: 1,关闭RDB 注释掉 save 2,  tcp-keepaviable 连接超时 slave: 1,关闭RDB 注释掉 save 2,  tcp-keepaviable 连接超时 3, slaveof ip port

Redis 集群环境添加节点失败问题

最近在给公司网管系统Redis集群环境添加节点时候遇到一个问题,提示新增的Node不为空: [[email protected] src]# ./redis-trib.rb add-node --slave --master-id4f6424e47a2275d2b7696bfbf8588e8c4c3a5b95 172.168.63.202:7001172.168.63.202:7000 ...... [OK] All nodes agree about slotsconfiguration. >

redis集群配置与管理

Redis在3.0版本以后开始支持集群,经过中间几个版本的不断更新优化,最新的版本集群功能已经非常完善.本文简单介绍一下Redis集群搭建的过程和配置方法,redis版本是5.0.4,操作系统是中标麒麟(和Centos内核基本一致). 1.Redis集群原理 Redis 集群是一个提供在多个Redis间节点间共享数据的程序集,集群节点共同构建了一个去中心化的网络,集群中的每个节点拥有平等的身份,节点各自保存各自的数据和集群状态.节点之间采用Gossip协议进行通信,保证了节点状态的信息同步. R

redis集群配置

客户端分片 程序端实现 代理proxy,访问proxy,proxy指定redis保存位置. Twemproxy Redis cluster ,会造成一部分数据丢失,无中心化1.将数据自动切分(split)到多个节点的能力2.当集群中的一部分节点失效或者无法进行通信时,仍然可以继续处理命令请求的能力. codis redis集群解决方案.豌豆荚开源 redis cluster 集群配置 cd /data/mkdir `seq 7001 7008` redis.conf 添加,端口需要变化'''po

Redis 集群配置

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点.集群的每个节点负责一部分hash槽. 这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态. 使用哈希槽的好处就在于可以方

Redis集群配置教程

这里建议大家安装4.0.9版本的 1.打开Centos虚拟机,登陆. 2.通过WinSCP把Redis集群tar包上传到虚拟机里的目录里,我的目录是 /usr/local 这里我已经上传过了并解压了,这里只需要上传即可. 3.打开SecureCRT客户端,进行命令编辑,通过putty或直接通过虚拟机也可以 接下来 先找到tar包所在的路径 通过 tar -zxvf redis-4.0.9.tar.gz 解压tar包 这时会出现一连串代码运作的过程 这时 输入ls查看当前文件 通过rm-rf删除t

Redis集群之修改节点IP

因为一些原因,以前IP没法用了,所有节点都down掉了,所以项目忽然报错: 服务器现在修改Redis节点的IP地址 注意,虽然是修改,但实质上是重建集群,所以需要你删除之前每个节点的一些文件,才能用新的IP重建集群: 在删除之前,要先暂停所有节点: 查看Redis进程: ps -ef|grep redis 然后杀死进程: kill -9 xxx 好了,可以开始删除相关文件了: 需要删除的文件 : Redis每个节点相应的 持久化文件和节点信息文件: 进入每一个节点,有dump.rdb持久化文件和