redis技术4-- Redis Cluster集群搭建和部署

一.集群介绍

1.集群简介

Redis Cluster 是 redis的分布式解决方案,在3.0版本正式推出
当遇到单机、内存、并发、流量等瓶颈时,可以采用Cluster架构方案达到负载均衡目的。
Redis Cluster之前的分布式方案有两种:
1)客户端分区方案,优点分区逻辑可控,缺点是需要自己处理数据路由,高可用和故障转移等。
2)代理方案,优点是简化客户端分布式逻辑和升级维护便利,缺点加重架构部署和性能消耗。
官方提供的 Redis Cluster集群方案,很好的解决了集群方面的问题

2.数据分布

分布式数据库首先要解决把整个数据库集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整体数据的一个子集,需要关注的是数据分片规则,Redis Cluster采用哈希分片规则。

在这里插入图片描述

二.手动搭建部署Redis Cluster(第一种搭建集群的方法)

1.目录规划

# redis安装目录
/opt/redis_cluster/redis_{
    
    PORT}/{
    
    conf,logs,pid}
# redis数据目录
/data/redis_cluster/redis_{
    
    PORT}/redis_{
    
    PORT}.rdb
# redis运维脚本
/root/scripts/redis_shell.sh

2.集群拓扑

不太合理的拓扑:
在这里插入图片描述
合理的拓扑:
在这里插入图片描述

3.手动搭建部署集群

3.1 思路:

1)部署一台服务器上的2个集群节点
2)发送完成后修改其他主机的IP地址

架构图:在这里插入图片描述
ip地址规划:

db01:10.0.0.51
db02:10.0.0.52
db03:10.0.0.53

3.2 环境准备

脚本内容:
使用这个脚本来管理redis集群上的所有节点
[root@db01 ~]# cat redis_shell.sh
#!/bin/bash

USAG(){
    
    
    echo "sh $0 {start|stop|restart|login|ps|tail} PORT"
}
if [ "$#" = 1 ]
then
    REDIS_PORT='6379'
elif
    [ "$#" = 2 -a -z "$(echo "$2"|sed 's#[0-9]##g')" ]
then
    REDIS_PORT="$2"
else
    USAG
    exit 0
fi

REDIS_IP=$(hostname -I|awk '{print $1}')
PATH_DIR=/opt/redis_cluster/redis_${REDIS_PORT}/
PATH_CONF=/opt/redis_cluster/redis_${REDIS_PORT}/conf/redis_${REDIS_PORT}.conf
PATH_LOG=/opt/redis_cluster/redis_${REDIS_PORT}/logs/redis_${REDIS_PORT}.log

CMD_START(){
    
    
    redis-server ${PATH_CONF}
}

CMD_SHUTDOWN(){
    
    
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT} shutdown
}

CMD_LOGIN(){
    
    
    redis-cli -c -h ${REDIS_IP} -p ${REDIS_PORT}
}

CMD_PS(){
    
    
    ps -ef|grep redis
}

CMD_TAIL(){
    
    
    tail -f ${PATH_LOG}
}

case $1 in
    start)
        CMD_START
        CMD_PS
        ;;
    stop)
        CMD_SHUTDOWN
        CMD_PS
        ;;
    restart)
        CMD_START
        CMD_SHUTDOWN
        CMD_PS
        ;;
    login)
        CMD_LOGIN
        ;;
    ps)
        CMD_PS
        ;;
    tail)
        CMD_TAIL
        ;;
    *)
        USAG
esac

3.3 实验配置

db01操作:
[root@db01 ~]#vim redis_shell.sh(脚本内容在上面,复制即可)
[root@db01 ~]# scp redis_shell.sh 10.0.0.52:/tmp
[root@db01 ~]# scp redis_shell.sh 10.0.0.53:/tmp
mkdir -p /opt/redis_cluster/redis_{
    
    6380,6381}/{
    
    conf,logs,pid}
mkdir –p /data/redis_cluster/redis_{
    
    6380,6381}

cat >/opt/redis_cluster/redis_6380/conf/redis_6380.conf<<EOF
bind 10.0.0.51
port 6380
daemonize yes
pidfile "/opt/redis_cluster/redis_6380/pid/redis_6380.pid"
logfile "/opt/redis_cluster/redis_6380/logs/redis_6380.log"
dbfilename "redis_6380.rdb"
dir "/data/redis_cluster/redis_6380/"
cluster-enabled yes
cluster-config-file nodes_6380.conf
cluster-node-timeout 15000
EOF

cd /opt/redis_cluster/
cp redis_6380/conf/redis_6380.conf redis_6381/conf/redis_6381.conf
sed -i 's#6380#6381#g' redis_6381/conf/redis_6381.conf 

rsync -avz /opt/redis_cluster/redis_638* db02:/opt/redis_cluster/
rsync -avz /opt/redis_cluster/redis_638* db03:/opt/redis_cluster/
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf
[root@db01 ~]# bash redis_shell.sh start 6380#也可以用脚本启动6380节点

db02操作:
[root@db02 ~]# cp /tmp/redis_shell.sh .
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#52#g"
mkdir –p /data/redis_cluster/redis_{
    
    6380,6381}
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf

db03操作:
[root@db03 ~]#  cp /tmp/redis_shell.sh .
find /opt/redis_cluster/redis_638* -type f -name "*.conf"|xargs sed -i "/bind/s#51#53#g"
mkdir –p /data/redis_cluster/redis_{
    
    6380,6381}
redis-server /opt/redis_cluster/redis_6380/conf/redis_6380.conf
redis-server /opt/redis_cluster/redis_6381/conf/redis_6381.conf

4.手动配置节点发现

1.当把所有节点都启动后查看进程会有cluster的字样
但是登录后执行CLUSTER NODES命令会发现只有每个节点自己的ID,目前集群内的节点还没有互相发现,所以搭建redis集群我们第一步要做的就是让集群内的节点互相发现.

2.在执行节点发现命令之前我们先查看一下集群的数据目录会发现有生成集群的配置文件,查看后发现只有自己的节点内容,等节点全部发现后会把所发现的节点ID写入这个文件。

3.集群模式的Redis除了原有的配置文件之外又加了一份集群配置文件.当集群内节点信息发生变化,如添加节点,节点下线,故障转移等.节点会自动保存集群状态到配置文件.
需要注意的是,Redis自动维护集群配置文件,不需要手动修改,防止节点重启时产生错乱. 
 
节点发现使用命令: CLUSTER MEET {
    
    IP} {
    
    PORT}
提示:在集群内任意一台机器执行此命令就可以
在db01操作:
[root@db01 ~]# sh redis_shell.sh login 6380
10.0.0.51:6380> CLUSTER MEET 10.0.0.51 6381
OK
10.0.0.51:6380> CLUSTER MEET 10.0.0.52 6380
OK
10.0.0.51:6380> CLUSTER MEET 10.0.0.53 6380
OK
10.0.0.51:6380> CLUSTER MEET 10.0.0.52 6381
OK
10.0.0.51:6380> CLUSTER MEET 10.0.0.53 6381
OK
10.0.0.51:6380> CLUSTER NODES
5bc9f9bb2c9e0e4a5dc9a4cb19a12988f748f5fd 10.0.0.52:6381 master - 0 1594535989453 3 connected
36cef6bb275159faccc5f75f997a66befb5dc4d6 10.0.0.53:6381 master - 0 1594535990458 4 connected
2f7d4e473052dd897252c6f5d42abc3af3e15fb1 10.0.0.53:6380 master - 0 1594535985419 2 connected 10923-16383
ae769cacff92f3ff070ffdb4fdc73e30b1519b6a 10.0.0.51:6380 myself,master - 0 0 0 connected 0-5461
04065efe0d767eafd046ef2c42a4b74a009a0156 10.0.0.52:6380 master - 0 1594535984412 1 connected 5462-10922
50edd7be9600a56322ffe6433e6c02c7c8051574 10.0.0.51:6381 master - 0 1594535988443 5 connected
10.0.0.51:6380>
节点都发现完毕后我们再次查看集群配置文件
[root@db01 ~]# cat /data/redis_cluster/redis_6380/nodes_6380.conf
[root@m01 ~]#  cat /data/redis_cluster/redis_6380/nodes_6380.conf
5bc9f9bb2c9e0e4a5dc9a4cb19a12988f748f5fd 10.0.0.52:6381 master - 0 1594535880473 3 connected
36cef6bb275159faccc5f75f997a66befb5dc4d6 10.0.0.53:6381 master - 0 1594535882491 4 connected
2f7d4e473052dd897252c6f5d42abc3af3e15fb1 10.0.0.53:6380 master - 0 1594535883500 2 connected 10923-16383
ae769cacff92f3ff070ffdb4fdc73e30b1519b6a 10.0.0.51:6380 myself,master - 0 0 0 connected 0-5461
04065efe0d767eafd046ef2c42a4b74a009a0156 10.0.0.52:6380 master - 0 1594535879466 1 connected 5462-10922
50edd7be9600a56322ffe6433e6c02c7c8051574 10.0.0.51:6381 master - 0 1594535881481 5 connected
vars currentEpoch 5 lastVoteEpoch 0
可以看到,发现到的节点的ID也被写入到了集群的配置文件里

5.Redis Cluster 通讯流程

在分布式存储中需要提供维护节点元数据信息的机制,所谓元数据是指:节点负责哪些数据,是否出现故障灯状态信息,redis 集群采用 Gossip(流言)协议,Gossip 协议工作原理就是节点彼此不断交换信息,一段时间后所有的节点都会知道集群完整信息,这种方式类似流言传播。
通信过程:
1)集群中的每一个节点都会单独开辟一个 Tcp 通道,用于节点之间彼此通信,通信端口在基础端口上加10000.
[root@db01 ~]# netstat -lntup|grep redis
tcp        0      0 10.0.0.51:16380         0.0.0.0:*               LISTEN      1531/redis-server 1
tcp        0      0 10.0.0.51:16381         0.0.0.0:*               LISTEN      1539/redis-server 1
tcp        0      0 10.0.0.51:6380          0.0.0.0:*               LISTEN      1531/redis-server 1
tcp        0      0 10.0.0.51:6381          0.0.0.0:*               LISTEN      1539/redis-server 1

2)每个节点在固定周期内通过特定规则选择结构节点发送 ping 消息
3)接收到 ping 消息的节点用 pong 消息作为响应。集群中每个节点通过一定规则挑选要通信的节点,每个节点可能知道全部节点,也可能仅知道部分节点,只要这些节点彼此可以正常通信,最终他们会打成一致的状态,当节点出现故障,新节点加入,主从角色变化等,它能够给不断的ping/pong消息,从而达到同步目的。
通讯消息类型:
Gossip
Gossip 协议职责就是信息交换,信息交换的载体就是节点间彼此发送Gossip 消息。
常见 Gossip 消息分为:ping、 pong、 meet、 fail 等
meet
meet 消息:用于通知新节点加入,消息发送者通知接受者加入到当前集群,meet 消息通信正常完成后,接收节点会加入到集群中并进行ping、 pong 消息交换
ping
ping 消息:集群内交换最频繁的消息,集群内每个节点每秒想多个其他节点发送 ping 消息,用于检测节点是否在线和交换彼此信息。
pong
Pong 消息:当接收到 ping,meet 消息时,作为相应消息回复给发送方确认消息正常通信,节点也可以向集群内广播自身的 pong 消息来通知整个集群对自身状态进行更新。
fail
fail 消息:当节点判定集群内另一个节点下线时,回向集群内广播一个fail 消息,其他节点收到 fail 消息之后把对应节点更新为下线状态。 

6.Redis Cluster手动分配槽位

虽然节点之间已经互相发现了,但是此时集群还是不可用的状态,因为并没有给节点分配槽位,而且必须是所有的槽位都分配完毕后整个集群才是可用的状态.
反之,也就是说只要有一个槽位没有分配,那么整个集群就是不可用的.

测试命令:
[root@db01 ~]# sh redis_shell.sh login 6380 
10.0.0.51:6380> set k1 v1
(error) CLUSTERDOWN Hash slot not served

10.0.0.51:6380> CLUSTER INFO
cluster_state:fail       #整个集群不可用
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_sent:1200
cluster_stats_messages_received:1200
10.0.0.51:6380>
虽然有6个节点,但是真正负责数据写入的只有3个节点,其他3个节点只是作为主节点的从节点,也就是说,只需要分配期中三个节点的槽位就可以了
分配槽位的方法:
分配槽位需要在每个主节点上来配置,此时有2种方法执行:
1.分别登录到每个主节点的客户端来执行命令
2.在其中一台机器上用redis客户端远程登录到其他机器的主节点上执行命令
在db01操作:
[root@db01 ~]# redis-cli -h db01 -p 6380 cluster addslots {0..5461}
OK
[root@db01 ~]# redis-cli -h db02 -p 6380 cluster addslots {5462..10922}
OK
[root@db01 ~]# redis-cli -h db03 -p 6380 cluster addslots {10923..16383}
OK
分配完所有槽位之后我们再查看一下集群的节点状态和集群状态
[root@db01 ~]#  sh redis_shell.sh login 6380
10.0.0.51:6380> CLUSTER INFO
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:4
cluster_stats_messages_sent:1706
cluster_stats_messages_received:1706
可以看到三个节点都分配了槽位,而且集群的状态是OK的

7.创建主从复制

在这里插入图片描述

采用在一台机器上使用redis客户端远程操作集群其他节点
注意:
1.需要执行命令的是每个服务器的从节点
2.注意主从的ID不要搞混了.
执行命令:
查看各个节点的id号:
[root@db01 ~]#  cat /data/redis_cluster/redis_6380/nodes_6380.conf
如上图所示,db01的6381节点同步db02节点的6380,其他依次类推:
[root@db01 ~]#  redis-cli -h db01 -p 6381 CLUSTER REPLICATE 04065efe0d767eafd046ef2c42a4b74a009a0156 #db02的6380的id号
OK
[root@db01 ~]#  redis-cli -h db02 -p 6381 CLUSTER REPLICATE 2f7d4e473052dd897252c6f5d42abc3af3e15fb1 #db03的6380的id号
OK
[root@db01 ~]#  redis-cli -h db03 -p 6381 CLUSTER REPLICATE ae769cacff92f3ff070ffdb4fdc73e30b1519b6a #db01的6380的id号
OK

8.测试集群

我们使用常规插入redis数据的方式往集群里写入数据看看会发生什么
 [root@db01 ~]# redis-cli -h db01 -p 6380 set k1 v1
(error) MOVED 12706 10.0.0.53:6380
结果提示error, 但是给出了集群另一个节点的地址
那么这条数据到底有没有写入呢? 我们登录这两个节点分别查看
[root@db01 ~]# redis-cli -h db03 -p 6380 get k1    
(nil)
结果没有,这是因为使用集群后由于数据被分片了,所以并不是说在哪台机器上写入数据就会在哪台机器的节点上写入,集群的数据写入和读取就涉及到了另外一个概念,ASK路由

9.ASK路由介绍

在集群模式下,Redis接受任何键相关命令时首先会计算键对应的槽,再根据槽找出所对应的节点
如果节点是自身,则处理键命令;
否则回复MOVED重定向错误,通知客户端请求正确的节点,这个过程称为Mover重定向.
[root@db01 ~]# redis-cli -h db01 -p 6380 -c       #-c可实现节点自动切换
db01:6380> set lba ss
-> Redirected to slot [16325] located at 10.0.0.53:6380
OK
10.0.0.53:6380>
 
知道了ask路由后,我们使用-c选项批量插入一些数据
[root@db01 ~]# cat input_key.sh 
#!/bin/bash
for i in $(seq 1 1000)
do
    redis-cli -c -h db01 -p 6380 set k_${i} v_${i} && echo "set k_${i} is ok"
done
[root@db01 ~]#sh input_key.sh
[root@db01 ~]# sh redis_shell.sh login 6380
10.0.0.51:6380> keys *
写入后我们同样使用-c选项来读取刚才插入的键值,然后查看下redis会不会帮我们路由到正确的节点上
[root@db01 ~]# redis-cli -c -h db01 -p 6380 
db01:6380> get k_100
-> Redirected to slot [5541] located at 10.0.0.52:6380
"v_100"
10.0.0.52:6380> get k_1000
-> Redirected to slot [79] located at 10.0.0.51:6380
"v_1000"
10.0.0.51:6380>

10.模拟故障转移

在这里插入图片描述

这里我们就模拟故障,停掉期中一台主机的redis节点,然后查看一下集群的变化
[root@m01 ~]#  bash redis_shell.sh stop 6380#模拟db01的节点6380发生故障
[root@m01 ~]# bash redis_shell.sh login 6381
10.0.0.51:6381>  CLUSTER info
cluster_state:ok   #集群状态是ok
10.0.0.51:6381> CLUSTER NODES
36cef6bb275159faccc5f75f997a66befb5dc4d6 10.0.0.53:6381 master - 0 1594536416461 6 connected 0-5461   #db03的节点6381成为主节点
5bc9f9bb2c9e0e4a5dc9a4cb19a12988f748f5fd 10.0.0.52:6381 slave 2f7d4e473052dd897252c6f5d42abc3af3e15fb1 0 1594536418478 3 connected
50edd7be9600a56322ffe6433e6c02c7c8051574 10.0.0.51:6381 myself,slave 04065efe0d767eafd046ef2c42a4b74a009a0156 0 0 5 connected
2f7d4e473052dd897252c6f5d42abc3af3e15fb1 10.0.0.53:6380 master - 0 1594536417469 2 connected 10923-16383
ae769cacff92f3ff070ffdb4fdc73e30b1519b6a 10.0.0.51:6380 master,fail - 1594536376641 1594536372001 0 disconnected
04065efe0d767eafd046ef2c42a4b74a009a0156 10.0.0.52:6380 master - 0 1594536414440 1 connected 5462-10922

在这里插入图片描述

三.使用工具搭建部署Redis Cluster(第二种搭建集群的方法)

1.快速搭建集群

手动搭建集群便于理解集群创建的流程和细节,不过手动搭建集群需要很多步骤,当集群节点众多时,必然会加大搭建集群的复杂度和运维成本,因此官方提供了 redis-trib.rb的工具方便我们快速搭建集群。
redis-trib.rb是采用 Ruby 实现的 redis 集群管理工具,内部通过 Cluster相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用前要安装 ruby 依赖环境
安装命令:
在db01操作:
yum makecache fast -y
yum install rubygems -y
gem sources --remove https://rubygems.org/
gem sources -a http://mirrors.aliyun.com/rubygems/
gem update –system
gem install redis -v 3.3.5
1 gem installed   #说明安装成功

我们可以停掉所有的节点,然后清空数据,恢复成一个全新的集群
所有机子操作:
pkill redis
rm -rf /data/redis_cluster/redis_6380/*
rm -rf /data/redis_cluster/redis_6381/*
全部清空之后启动所有的节点,
所有机子操作:
bash redis_shell.sh start 6380
bash redis_shell.sh start 6381

db01执行创建集群命令:
cd /opt/redis_cluster/redis/src/
./redis-trib.rb create --replicas 1 10.0.0.51:6380 10.0.0.52:6380 10.0.0.53:6380 10.0.0.51:6381 10.0.0.52:6381 10.0.0.53:6381

执行这步时,当我们查看主从关系时会发生该软件有一个bug在这里插入图片描述
即其关系变为在这里插入图片描述
此时不满足高可用集群的条件,因为db03一旦出现故障,整个集群就不可用了,因此需要修改主从关系。修改为:
在这里插入图片描述

扫描二维码关注公众号,回复: 13114409 查看本文章
在db02:
[root@db02 ~]# bash redis_shell.sh login 6381
10.0.0.52:6381> CLUSTER REPLICATE f515cf142ab3ab42ca19eece286f4d8540cb8491#db03的节点6380的id号
OK
在db03操作:
[root@db03 ~]# bash redis_shell.sh login 6381
10.0.0.53:6381> CLUSTER REPLICATE f5ab331e0d07ba93ad4d0e2a9427029c6297f255#db01的节点6380的id号
OK

验证:

检查集群完整性
./redis-trib.rb check 10.0.0.51:6380
验证集群是否负载平均:
./redis-trib.rb rebalance 10.0.0.51:6380
>>> Performing Cluster Check (using node 10.0.0.51:6380)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.0% threshold.
//误差在2%之间,证明集群已经负载平均

2.工具扩容节点

Redis集群的扩容操作可分为以下几个步骤
1)准备新节点
2)加入集群
3)迁移槽和数据

在db01操作:
创建2个新节点:
mkdir -p /opt/redis_cluster/redis_{
    
    6390,6391}/{
    
    conf,logs,pid}
mkdir -p /data/redis_cluster/redis_{
    
    6390,6391}
cd /opt/redis_cluster/
cp redis_6380/conf/redis_6380.conf redis_6390/conf/redis_6390.conf
cp redis_6380/conf/redis_6380.conf redis_6391/conf/redis_6391.conf
sed -i 's#6380#6390#g' redis_6390/conf/redis_6390.conf
sed -i 's#6380#6391#g' redis_6391/conf/redis_6391.conf
启动节点
cd
bash redis_shell.sh start 6390
bash redis_shell.sh start 6391
发现节点
redis-cli -c -h db01 -p 6380 cluster meet 10.0.0.51 6390
redis-cli -c -h db01 -p 6380 cluster meet 10.0.0.51 6391
在db01上使用工具扩容
cd /opt/redis_cluster/redis/src/
./redis-trib.rb add-node 10.0.0.51:6390 10.0.0.51:6380
./redis-trib.rb add-node 10.0.0.51:6391 10.0.0.51:6380
./redis-trib.rb reshard 10.0.0.51:6380
打印出进群每个节点信息后,reshard命令需要确认迁移的槽数量,这里我们输入4096个:
How many slots do you want to move (from 1 to 16384)? 4096
输入6390的节点ID作为目标节点,也就是要扩容的节点,目标节点只能指定一个
What is the receiving node ID? xxxxxxxxx
之后输入源节点的ID,这里分别输入每个主节点的6380的ID最后输入done,或者直接输入all
Source node #1:all
yes
迁移完成后命令会自动退出,这时候我们查看一下集群的状态
./redis-trib.rb rebalance 10.0.0.51:6380

还需要解决主从复制的问题:
在这里插入图片描述
变为
在这里插入图片描述

3.工具收缩节点

流程说明
1).首先需要确定下线节点是否有负责的槽,
如果是,需要把槽迁移到其他节点,保证节点下线后整个集群槽节点映射的完整性.
2).当下线节点不再负责槽或者本身是从节点时,
就可以通知集群内其他节点忘记下线节点,当所有的节点忘记该节点后可以正常关闭.
这里我们准备将刚才新添加的节点下线,也就是6390和6391
收缩和扩容迁移的方向相反,6390变为源节点,其他节点变为目标节点,源节点把自己负责的4096个槽均匀的迁移到其他节点上,.
由于redis-trib..rb reshard命令只能有一个目标节点,因此需要执行3次reshard命令,分别迁移1365,1365,1366个槽.
在db01操作:
cd /opt/redis_cluster/redis/src/
./redis-trib.rb reshard 10.0.0.51:6380
How many slots do you want to move (from 1 to 16384)? 1365
输入6380的id(10.0.0.51的id)
输入6390的id
done
yes

./redis-trib.rb reshard 10.0.0.51:6380
How many slots do you want to move (from 1 to 16384)? 1365
输入6380的id(10.0.0.52的id)
输入6390的id
done
yes

./redis-trib.rb reshard 10.0.0.51:6380
How many slots do you want to move (from 1 to 16384)? 1366(最后一次查看可以看一下6390还有多少槽位,填入即可)
输入6380的id(10.0.0.53的id)
输入6390的id
done
yes

4.忘记节点

由于我们的集群是做了高可用的,所以当主节点下线的时候从节点也会顶上,所以最好我们先下线从节点,然后在下线主节点
cd /opt/redis_cluster/redis/src/
./redis-trib.rb del-node 10.0.0.51:6391 ID
./redis-trib.rb del-node 10.0.0.51:6390 ID

四.Redis集群常用命令

集群(cluster)
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。 
节点(node)
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。 
槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。 
键 (key)
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。

五.Redis运维工具

1.数据导入导出工具

需求背景
刚切换到redis集群的时候肯定会面临数据导入的问题,所以这里推荐使用redis-migrate-tool工具来导入单节点数据到集群里
官方地址:
http://www.oschina.net/p/redis-migrate-tool
安装工具
在db01操作:
yum install libtool bzip2 -y
cd /opt/redis_cluster/
git clone https://github.com/vipshop/redis-migrate-tool.git
cd redis-migrate-tool/
autoreconf -fvi
./configure
make && make install 
创建配置文件
[root@db01 ~]# cat >redis_6379_to_6380.conf<<EOF    
[source]
type: single
servers:
- 10.0.0.51:6379
 
[target]
type: redis cluster
servers:
- 10.0.0.51:6380 
 
[common]
listen: 0.0.0.0:8888
source_safe: true
EOF
cd 
bash redis_shell.sh start 6379
生成测试数据
[root@db01 ~]# for i in $(seq 1 1000);do redis-cli -c -h db01 -p 6379 set lbz_${i} v_${i} && echo "set k_${i} is ok";done
[root@db01 ~]#bash redis_shell.sh login 6379
10.0.0.51:6379>keys *  #单节点已经插入数据

执行导入命令,将单节点数据导入集群
[root@db01 ~]# redis-migrate-tool -c redis_6379_to_6380.conf      #-c指定配置文件
数据校验
[root@db01 ~]# redis-migrate-tool -c redis_6379_to_6380.conf -C redis_check

在db02操作:
查看:
[root@db02 ~]# bash redis_shell.sh login 6380
10.0.0.52:6380> keys *  (集群里已经导进单节点的数据)

3.分析键值大小

需求背景
redis的内存使用太大键值太多,不知道哪些键值占用的容量比较大,而且在线分析会影响性能.
安装工具
yum install python-pip gcc python-devel 
yum   -y   install   python-pip
pip install rdbtools
git clone https://github.com/sripathikrishnan/redis-rdb-tools
cd redis-rdb-tools
python setup.py install
使用方法
cd /data/redis_cluster/redis_6380/
rdb -c memory redis_6380.rdb -f redis_6380.rdb.csv
分析rdb并导出
awk -F ',' '{print $4,$2,$3,$1}' redis_6380.rdb.csv |sort  > 6380.txt

猜你喜欢

转载自blog.csdn.net/xiaoleinb/article/details/113886901
今日推荐