码迷,mamicode.com
首页 > 其他好文 > 详细

redis集群配置和节点管理

时间:2019-04-07 20:27:42      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:rdb   之间   remove   time   failover   ali   check   ems   取数据   

生产环境中的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太麻烦,所以写了一个脚本

[root@redis 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:done
Do 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

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

 

redis集群配置和节点管理

标签:rdb   之间   remove   time   failover   ali   check   ems   取数据   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!