生产环境中的redis绝大多数是以集群形态运行的,这篇博文简要介绍分布式集群的原理、优势,然后描述配置过程。
redis集群的原理
redis集群的原理简要介绍如下
- redis中有槽位的概念,可以这样理解,redis的数据存储在16384个槽位中,分布式集群就是将这些槽位均匀分布到多个分片节点(不同的redis实例)中。
- 写入数据时:将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间),找到相对应的分片节点的主节点,存储到相应槽位上。
- 读取数据时:只需要连接到集群中的任意一个节点,如果目标数据不在这个节点,分片集群会将客户端连接切换至真正存储节点进行数据存储。
- 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-10-13 13:09:52