Redis集群

集群概念

Redis 集群就是搭建多个 Redis 节点,这些节点之间进行数据共享

Redis集群不支持需要处理多个键的命令,因为需要在多个Redis节点之间移动数据,在高负载的情况下会降低性能,甚至产生错误

集群特点

1、数据分片

Redis集群包含16384个哈希槽(slot),使用公式 CRC16(key) % 16384来计算key要放入哪个槽

每个主节点负责不同的槽,可以将槽从一个主节点转移到其他节点

如果要删除一个主节点,需要现将它负责的slot移动到其他主节点中

2、主从复制

为了提高可用性,避免单点故障(一个节点不工作导致服务失效),集群采用主从复制:

  • 每个主节点可以拥有任意数量从节点,主节点修改数据后会同步到对应的从节点

  • 如果主节点故障,并且该主节点存在从节点,集群就会将从节点设置为新的主节点,去处理对应的slot

一致性保证

主从复制是异步复制,过程如下:

1、客户端向主节点写入一条命令

2、主节点向客户端回复执行结果

3、主节点将命令复制到对应的所有从节点(异步复制)

如果集群发生了长时间的网络分区,导致主节点和对应的从节点分开,可能一定时间后从节点被选举为新的主节点,那么在这个过程中写到主节点的数据就丢失了

注意:发生网络分区时,客户端向主节点发送写命令的最大时间是有限的,即节点超时时间(Redis集群的重要配置选项)



搭建集群

集群正常工作最少需要三个节点,这里创建六个节点,三个主节点、三个从节点,端口号如下:

127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005

1、安装redis

# 0、安装依赖环境
sudo apt update && sudo apt install make gcc python-dev
sudo apt-get install pkg-config

# 1、下载redis
wget https://download.redis.io/releases/redis-6.2.6.tar.gz

# 2、解压
tar -zxvf redis-6.2.6.tar.gz

# 3、进入redis目录
cd redis-6.2.6

# 4、编译并安装redis PREFIX执行安装目录
make
make test # 测试
mkdir -p /usr/local/redis
make PREFIX=/usr/local/redis/ install


2、创建节点

创建各节点文件夹

cd /usr/local/redis
mkdir cluster
cd cluster
mkdir 7000 7001 7002 7003 7004 7005

复制配置文件

将redis目录下的配置文件复制到对应端口文件夹下,6个文件夹都要复制一份

cp redis-6.2.6/redis.conf /usr/local/redis/cluster/7000

修改配置文件

# 端口号
port 7000
# 后台启动
daemonize yes
# 开启集群
cluster-enabled yes
#集群节点配置文件
cluster-config-file nodes-7000.conf
# 集群连接超时时间
cluster-node-timeout 5000
# 进程pid的文件位置
pidfile /var/run/redis-7000.pid
# 开启aof
appendonly yes
# aof文件路径
appendfilename "appendonly-7000.aof"
# rdb文件路径
dbfilename dump-7000.rdb

其余节点均为一样的操作,修改成自己的端口号

创建启动脚本

在/usr/local/redis目录下创建一个start.sh

#!/bin/bash
bin/redis-server cluster/7000/redis.conf
bin/redis-server cluster/7001/redis.conf
bin/redis-server cluster/7002/redis.conf
bin/redis-server cluster/7003/redis.conf
bin/redis-server cluster/7004/redis.conf
bin/redis-server cluster/7005/redis.conf

执行脚本:sh start.sh

检查是否启动成功:ps -ef | grep redis

image

搭建集群

集群工具

从Redis5.0开始,集群工具由redis-trib变为redis-cli

使用方式:redis-cli --cluster SUBCOMMAND [ARGUMENTS] [OPTIONS]

# 查看集群相关命令如何使用
./redis-cli --cluster help

# 查看集群状态
./redis-cli --cluster check 127.0.0.1:7000
....

创建集群

./redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 --cluster-replicas 1

create是创建集群

--cluster-replicas 1 是为每个主节点创建一个从节点

执行之后会显示配置情况,并询问是否确认创建,输入yes

image

测试

# 连接客户端
./redis-cli -c -p 7000
# 设置键
127.0.0.1:7000> set name midas
-> Redirected to slot [5798] located at 127.0.0.1:7003
OK
127.0.0.1:7003> 

出现了重定向说明设置的这个键对应的槽是在别的节点中,会自动重定向到对应节点,这也就说明了集群部署成功


集群相关操作

查看集群命令(非常重要)

./redis-cli --cluster help

查看集群状态

./redis-cli --cluster check 127.0.0.1:7000(集群中任意一个节点)

image

M代表主节点master,S代表从节点slave,后面是节点ID

slots:节点负责的槽的范围和数量

添加新节点

添加主节点(默认)

1、启动新的redis实例

bin/redis-server cluster/7000/redis.conf

2、将redis实例添加到集群中

./redis-cli --cluster add-node new_host:new_port existing_host:existing_port(集群中随意一个节点)

./redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000

image

此时再次检查集群情况,会发现默认情况下新增加的节点是作为主节点,而且slot数量为0,需要后续进行分配

image

增加从节点

随机增加

优先从那些从节点数目最少的主节点中选取

./redis-cli --cluster add-node --cluster-slave new_host:new_port existing_host:existing_port

./redis-cli --cluster add-node --cluster-slave 127.0.0.1:7006 127.0.0.1:7000

指定主节点

./redis-cli --cluster add-node --cluster-slave --cluster-master-id 主节点ID new_host:new_port existing_host:existing_port

./redis-cli --cluster add-node --cluster-slave --cluster-master-id 2447733ff442ac40e8dfba641e7820aa1fc92ced 127.0.0.1:7006 127.0.0.1:7000

删除节点

只能直接删除从节点和没有slot的主节点

./redis-cli --cluster del-node existing_host:existing_port 待删除节点ID

./redis-cli --cluster del-node 127.0.0.1:7000 dd3fe0dd5e8e857269fd87c8e5d4009cf3740eeb

如果要删除有slot的主节点,则先将slot转移到其他主节点中

迁移slot

迁移命令:./redis-cli --cluster reshard host:port

步骤:

1、输入迁移命令

2、输入要迁移的slot数量

image

image

在这个例子中,如果想要四个主节点均分,16384/4=4096,所以输入4096

3、选择要接受的节点ID

image

4、选择要提供slot的节点

如果有多个,输入一个就回车一下,结束时输入'done'

如果不想指定,即从所有主节点平均获取,就输入all

image

5、最终确认

image


参考文章

Redis集群的原理和搭建,一文带你详解 - 知乎 (zhihu.com)

(20条消息) Redis集群指定主从关系及动态增删节点_guotianqing的博客-CSDN博客

posted @ 2021-11-20 23:12  冰兀朮  阅读(80)  评论(0编辑  收藏  举报