Redis 集群高可用架构

文章介绍了Redis的哨兵模式在3.0之前的版本中用于集群监控和故障切换,但存在配置复杂、性能一般和瞬断问题。相比之下,高可用集群模式通过多主节点实现负载均衡和扩展性,支持水平扩展。文中详细阐述了如何搭建Redis集群,包括配置文件修改、节点添加和数据分片,并提供了水平扩展的步骤,包括新节点的加入和槽的分配。
摘要由CSDN通过智能技术生成
哨兵模式

在Redis 3.0之前的版本实现集群一般是借助sentinel哨兵工具方式来监控master节点的状态,如果master节点异常,则会进行主从切换,将集群中的slave节点选举成master节点。哨兵机制的配置比较复杂,性能和高可用方面表现一般,特别是在主从切换的瞬间会出现访问瞬断的情况。而且哨兵机制只有一个master节点对外提供服务,没法支持很高的并发,且单个主节点的内存不宜设置过大,否则会导致持久化的文件过大,影响数据复制或主从同步的效率。

高可用集群模式

Redis集群是由多个主节点组成的分布式服务器集群,具有复制分片和高可用特性。Redis集群不需要哨兵sentinel也能完成节点迁移和故障转移的功能。需要在每个节点设置成集群模式,这种模式没有中心节点可支持水平扩展

官方推荐集群不超过1000个节点
Redis集群搭建

Redis集群需要至少三个master节点,使用三台服务器,搭建三个master节点,每台服务器搭建一主一从,具体配置如下:

IP

端口

角色

192.168.68.81

8001

master

192.168.68.81

8011

slave

192.168.68.91

8002

master

192.168.68.91

8012

slave

192.168.68.100

8003

master

192.168.68.100

8013

slave

下载Redis5.0.3安装包
wget http://download.redis.io/releases/redis‐5.0.3.tar.gz
解压安装文件
tar -zxvf redis‐5.0.3.tar.gz -C /usr/local
编译安装包
cd /usr/local/redis-5.0.3
make
创建集群搭建文件夹

在每台服务器的 /usr/local/ 目录下创建redis-cluster文件目录,然后在该目录下按上面划分的端口创建对应的文件目录,如:

mkdir -p /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir 8001 8011
修改配置文件

把Redis安装包下的redis.conf配置文件复制到集群搭建目录下,修改对应redis.conf配置文件信息,修改内容如下:

# bind绑定的是自己机器网卡的ip,如果有多块网卡可以配多个ip,代表允许客户端通过机器的哪些网卡ip去访问,内网一般可以不配置bind,注释掉即可
# bind 127.0.0.1

# 关闭保护模式
protected-mode no

# 修改对应分配的端口
port 8001

# 开启后台运行
daemonize yes

# 把pid进程号写入pidfile配置的文件,根据分配端口命名
pidfile /var/run/redis_8001.pid

# 指定日志存储文件,根据分配端口命名
logfile "/usr/local/redis-cluster/8001/redis-8001.log"

# 指定数据持久化存储位置,按分配端口创建的目录进行指定
dir /usr/local/redis-cluster/8001/

# 开启AOF持久化
appendonly yes
# 开启混合存储
aof-use-rdb-preamble yes

# 启动集群模式
cluster-enabled yes
# 集群节点信息文件,这里800x最好和port对应上
cluster-config-file nodes-8001.conf
# 集群节点超时时间配置
cluster-node-timeout 15000

# 设置密码
requirepass warrior
# 设置集群节点间访问密码,跟上面一致
masterauth warrior    
其他机器节点配置和上面一致,把端口更改成对应分配的端口即可
启动Redis实例

分别启动Redis的所有实例,三台服务器,6个Redis实例,启动命令如下:

/usr/local/redis-5.0.3/src/redis-server /usr/local/redis-cluster/8001/redis.conf
redis-cli 创建整个Redis集群

创建整个redis集群时,需要确保规划的三台服务器之间的redis实例能相互通讯,可以先简单把所有机器防火墙关掉,如果不关闭防火墙则需要打开redis服务端口和集群节点gossip通信端口16379(默认是在redis端口号上加1W)。执行下面命令来创建整个redis集群:

/usr/local/redis-5.0.3/src/redis-cli -a warrior --cluster create --cluster-replicas 1 192.168.68.81:8001 192.168.68.81:8011 192.168.68.91:8002 192.168.68.91:8012 192.168.68.100:8003 192.168.68.100:8013
Redis 5之前的版本集群是依靠ruby脚本,redis-trib.rb实现
命令中的1代表每个创建的主节点服务创建一个从节点服务
验证Redis集群

连接任意一台服务器的Redis客户端,执行下面命令:

/usr/local/redis-5.0.3/src/redis-cli -h 192.168.68.81 -p 8001 -c -a warrior
-h:服务器ip
-p:端口
-c:集群模式
-a:密码
关闭集群服务时,需要逐个进行关闭
Redis集群水平扩展

在原有的Redis集群下,现在Redis节点加入集群。新增一台服务器(192.168.68.71),启动两个Redis实例(一主一从)主节点端口为8004,从节点端口为8014,按以下步骤操作将现有的Redis集群进行水平扩展。

增加Redis实例

按上面Redis集群搭建步骤,从下载Redis5.0.3安装包步骤到启动Redis实例进行配置文件的更改和实例服务的启动。

Redis实例加入集群
查看Redis集群的帮助命令

执行下面命令,查看Redis集群命令的帮组文档

redis-5.0.3/src/redis-cli --cluster help
create:创建一个集群环境
call:执行命令
add-node:将一个节点加入到集群里,第一个参数为新节点的ip:port,第二个参数为集群中任意一个已经存在的节点的ip:port
del-node:移除一个节点
reshard:重新分片
check:检查集群状态
配置8004为集群主节点

使用集群操作命令add-node新增一个主节点8004

redis-5.0.3/src/redis-cli -a warrior --cluster add-node 192.168.68.71:8004 192.168.68.81:8001

查看当前集群节点列表

192.168.68.81:8001> cluster nodes
当添加节点成功以后,新增的节点不会有任何数据,因为它还没有分配任何的slot(hash槽),我们需要为新节点手工分配hash槽

执行下面命令,给新加入集群的主节点分配hash槽,找到集群中的任意一个主节点,对其进行重新分片工作。

/usr/local/redis-5.0.3/src/redis-cli -a warrior --cluster reshard 192.168.68.81:8001

输出如下:

... ...

How many slots do you want to move (from 1 to 16384)? 600

(ps:需要多少个槽移动到新的节点上,自己设置,比如600个hash槽)

What is the receiving node ID? b61d5275e3577f4c621f757298296d9ea2080bc9

(ps:把这600个hash槽移动到哪个节点上去,需要指定节点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

(ps:输入all为从所有主节点(8001,8002,8003)中分别抽取相应的槽数指定到新节点中,抽取的总槽数为600个)

... ...

Do you want to proceed with the proposed reshard plan (yes/no)? yes

(ps:输入yes确认开始执行分片任务)

... ...

再次查看当前集群节点列表

配置8014为8004的从节点

添加从节点8014到集群中去并查看集群节点状态

/usr/local/redis-5.0.3/src/redis-cli -a warrior --cluster add-node 192.168.68.71:8014 192.168.68.81:8001
8014还是一个master,没有分配hash槽

执行下面命令,将8014节点指定到8004主节点

redis-5.0.3/src/redis-cli -a warrior -c -h 192.168.68.71 -p 8014
192.168.68.71:8014> cluster replicate b61d5275e3577f4c621f757298296d9ea2080bc9 #后面这串id为8004的节点id
Redis实例从集群中删除

将192.168.68.71这台服务器上的Redis实例(8004主节点,8014从节点)从集群中删除,操作步骤如下。

删除8014从节点

执行del-node命令删除从节点8014,指定删除节点ip和端口,以及节点id,命令如下:

/usr/local/redis-5.0.3/src/redis-cli -a warrior --cluster del-node 192.168.68.71:8014 3bae579a39823f61d9d9b080459ec408ece66be1
删除8004主节点

主节点的里面有分配hash槽,在删除8004主节点前必须把里面的hash槽放置在其他可用的主节点中去,然后再删除该节点,不然会出现数据丢失的问题,操作命令如下:

/usr/local/redis-5.0.3/src/redis-cli -a warrior --cluster reshard 192.168.68.71:8004

输出如下

... ...

How many slots do you want to move (from 1 to 16384)? 600

What is the receiving node ID? bd194b26c1c59a55e1441ef8ac4b5f19cee8e0aa

(ps:这里是需要把数据移动到哪?8001的主节点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:b61d5275e3577f4c621f757298296d9ea2080bc9

(ps:这里是需要数据源,也就是我们的8007节点id)

Source node 2:done

(ps:这里直接输入done 开始生成迁移计划)

... ...

Do you want to proceed with the proposed reshard plan (yes/no)? Yes

(ps:这里输入yes开始迁移)

查看节点状态

执行节点删除命令,指定删除节点ip和端口,以及节点id,命令如下:

/usr/local/redis-5.0.3/src/redis-cli -a warrior --cluster del-node 192.168.68.71:8004 b61d5275e3577f4c621f757298296d9ea2080bc9

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值