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
搭建集群
集群工具
从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
测试
# 连接客户端
./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
(集群中任意一个节点)
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
此时再次检查集群情况,会发现默认情况下新增加的节点是作为主节点,而且slot数量为0,需要后续进行分配
增加从节点
随机增加
优先从那些从节点数目最少的主节点中选取
./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数量
在这个例子中,如果想要四个主节点均分,16384/4=4096,所以输入4096
3、选择要接受的节点ID
4、选择要提供slot的节点
如果有多个,输入一个就回车一下,结束时输入'done'
如果不想指定,即从所有主节点平均获取,就输入all
5、最终确认
参考文章
本文来自博客园,作者:冰兀朮,转载请注明原文链接:https://www.cnblogs.com/gxy2825/p/15582982.html