Redis 6.0安装及集群化部署

2,008 阅读6分钟

一:redis安装

1.1 预先准备安装程序

yum -y install gcc tcl
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
echo "source /opt/rh/devtoolset-9/enable" >> /etc/profile

1.2 下载redis,可以去官网[redis.io/]下载tar包,也可以…

wget https://download.redis.io/releases/redis-6.0.0.tar.gz

1.3 解压redis安装包,并进入安装目录,初始化redis

tar -zxvf redis-6.0.0.tar.gz
cd redis-6.0.0/
make MALLOC=libc
make test & make install

二:redis集群化部署

2.1 集群化部署基本介绍、适用场景介绍、优点

redis集群化部署主要用于大型缓存架构,一般的小型架构,使用redis主从配置 + sentinel哨兵集群应付系统压力,使用redis集群可以方便快捷地对集群进行动态扩容,动态的添加、删除节点,reshard、并带有自动故障恢复功能。

2.2 集群化部署及常见操作及故障

2.2.1 目录结构配置

一般redis集群使用三主三从,并且尽量保证主服务器与从服务器不在同一台机器上,防止机器故障导致的集群瘫痪,每个主服务器搭配一个从服务器,保证集群的高可用性。

# redis启动脚本目录:/etc/init.d/redis_7001
# redis配置文件目录:/etc/redis/7001.conf
# redis-cluster集群节点状态文件目录:/etc/redis-cluster/node-7001.conf
# redis备份文件存放目录:/var/redis/7001/appendonly.aof&dump.rdb
# redis日志文件存放目录:/var/log/redis/7001.log
# redis的pid文件存放目录:/var/run/redis_7001.pid

redis启动脚本copy于redis安装目录下的/utils/redis_init_script脚本,然后更改相应的端口号及配置文件目录即可;配置文件相应的更改在下一小节有介绍;存放集群状态的配置文件不可更改,该文件在集群运行过程中会随着集群的状态变化而自动变化。

2.2.2 配置文件配置
# 设置redis实例后台启动
daemonize yes
# 端口号
port 7001
# 绑定IP
bind 本机ip地址
# redis数据备份文件存放目录
dir /var/redis/7001/
# 设置开启aof备份
appendonly yes
# 开启集群
cluster-enabled yes
# 集群状态配置文件目录
cluster-config-file /etc/redis-cluster/node-7001.conf
# 节点超时时间,当超过此时间,被认为主观宕机,单位为毫秒
cluster-node-timeout 15000
# redis实例进程文件
pidfile /var/run/redis_7001.pid
2.2.3 创建集群

在redis3.0和4.0版本中,创建集群还是使用redis-trib.rb方式去创建,但是在5.0之后,可以直接使用redis-cli直接创建集群,本文redis版本为6.0,所以创建集群的方式为redis-cli方式直接创建

redis-cli --cluster create ip1:7001 ip1:7002 ip2:7003 ip2:7004 ip3:7005 ip3:7006 --cluster-replicas 1

redis-cli后面跟着redis实例的地址列表,--cluster-replicas 1参数表示希望每个主服务器都有一个从服务器,redis集群会尽量把主从服务器分配在不同机器上

[OK] All 16384 slots covered

出现以上提示表明集群创建成功

2.2.4 添加节点

当集群的压力比较大时,可以通过动态的扩容提高集群的写读并发能力

# 添加主节点
redis-cli --cluster add-node ip3:7007 ip1:7001

使用add-node添加集群节点,第一个地址参数为要添加的redis实例地址,第二个参数为集群中任意一个实例地址,节点会默认被添加为主节点,请注意这个时候添加的主节点与其他的master相比具有两个特点

  • 它没有数据,因为它没有分配哈希槽
  • 因为它是没有分配插槽的设备,所以当从节点想成为主节点时,它不参与选举过程

添加成功的标识

# 添加从节点
redis-cli --cluster add-node ip3:7007 ip1:7001 --cluster-slave

上述会把ip3:7007实例作为集群的从节点加入到集群中,会挑选拥有从服务器数量最少的主服务器,然后把新加入的节点作为该主服务器的从节点,当时用上述两种把节点添加到集群中后,可以使用一下命令查看该节点是否加入到集群中去了

cluster nodes

查看结果如上,7007端口实例已经被添加到集群实例,此时没有分配任何插槽

2.2.5 重新整理集群

当使用上述方式添加完主节点之后,添加进入的节点为空,并没有分配任何槽,此时我们需要执行reshard操作,为新添加的主节点分配插槽,已达到分担集群压力,提高并发能力的目的

  • 1:开启重新分片(reshard)操作
redis-cli -h ip1 -p 7001 --cluster reshard ip1:7001
  • 2: 指定需要重新reshard的slots的个数
  • 3:指定接收这些slots的插槽的目的节点id
  • 4:指定分配这些slots的插槽的源节点id,输入done为结束符
Source node #1:ca33b3d7a60f8df7b74473f86c11f84df609fa45
Source node #2:done
2.2.6 删除节点

当系统负载压力比较小的时候,为了避免耗费资源,可以选择动态的删除节点,命令如下所示

redis-cli -h ip1 -p 7001 --cluster del-node ip1:7001 node-id

使用上述方式删除节点的时候,当删除节点为从节点的时候可以直接删除,当删除节点为主节点的时候,则必须主节点不为空,即需要把主节点的插槽及插槽中的数据分配给其他的主节点

2.2.7 副本迁移

副本迁移在集群中的概念,即是在某些场景下,可能需要把一个主服务器的从节点迁移到另外一个主服务器上去,这种情况一般用在多从节点的情况下,为了提高系统的高可用性而进行的操作,例如当有三个主服务器的情况下,其中一个主服务器有三个从节点,一个主服务器有两个从节点,一个主服务器只有一个从节点,如果一主一从这一对实例同时发生故障,将导致集群不可用,这种情况下,可以把一主三从这一对的实例的一个从节点移动到一主一从这一对实例上,即可避免上述情况,提高了系统的可用性,副本迁移的代码如下所示

# 在相应的从节点上执行
cluster replicate <master-node-id>

2.3 常见的集群相关命令

# 查看集群相关信息
cluster info
# 列出集群当前已知的所有节点,并描述节点信息
cluster nodes
# 将当前节点设置为 node_id 指定的节点的从节点
cluster replicate <node_id>
# 计算键 key 应该被放置在哪个槽上
cluster keyslot <key>