Redis集群部署

本文详细介绍了RedisCluster的背景、特点、数据分布原理以及主从模式,包括为何选择集群、集群配置、部署步骤和主从切换机制。主要针对大规模数据、高并发场景,强调了其在解决单点问题和提高可用性方面的优势。
摘要由CSDN通过智能技术生成

一、Redis Cluster集群介绍

Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时,就可以采用Cluster架构达到负载均衡目的。

1.1 为什么要用redis-cluster集群?

1.首先Redis单实例主要有单点,容量有限,流量压力上限的问题。
Redis单点故障,可以通过主从复制replication,和自动故障转移sentinel哨兵机制。但Redis单Master实例提供读写服务,仍然有容量和压力问题。

2.并发问题
redis官方声称可以达到 10万/每秒,每秒执行10万条命令
假如业务需要每秒100万的命令执行呢?


解决方案如下
1.正确的应该是考虑分布式,加机器,把数据分到不同的位置,分摊集中式的压力。那么一堆机器做一件事.还需要一定的机制保证数据分区,并且数据在各个主Master节点间不能混乱。

总结:
redis cluster:主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster        

1.2.redis cluster特点

1.所有的redis节点彼此互联(PING-PONG机制)。
2.客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
3.节点的fail是通过集群中超过半数的节点检测失效时才生效。

1.3redis-cluster数据分布

分布式数据分布方式为一致性hsah方式。

redis集群的hash slot方式:

Redis集群中有16384个哈希槽,每个redis实例负责一部分slot,集群中的所有信息通过节点数据交换而更新。

1.4数据分布存储原理

Redis 集群使用数据分片(sharding)来实现:Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数(集群使用公式 CRC16(key) % 16384),这样每个key 都会对应一个编号在 0-16384 之间的哈希槽,那么redis就会把这个key 分配到对应范围的节点上了。同样,当连接三个节点任何一个节点想获取这个key时,也会这样的算法,然后内部跳转到存放这个key节点上获取数据。

二、Redis Cluster主从模式

redis cluster 为了保证数据的高可用性,加入了主从模式,一个主节点对应一个或多个从节点,主节点提供数据存取,从节点拉取数据备份,当这个主节点挂掉后,就会有这个从节点选取一个来充当主节点,从而保证集群不会挂掉.

1.1主从切换机制

选举过程是集群中所有master参与,如果半数以上master节点与故障节点通信超过(cluster-node-timeout),认为该节点故障,自动触发故障转移操作.  #故障节点对应的从节点自动升级为主节点

1.2什么时候整个集群就不能用了?

如果集群任意一个主节点挂掉,且当前主节点没有从节点,则集群将无法继续,因为没有办法为这个节点承担范围内的哈希槽提供服务。但是,如果这个主节点和所对应的从节点同时失败,则Redis Cluster无法继续运行。

三、集群部署

环境准备:
1.准备三机器,关闭防火墙和selinux
2.制作解析并相互做解析。

系统版本:

1.centos 7

2.redis-6.2.0

每台机器都需要执行

#ip解析
cat >>/etc/hosts << EOF
redis-cluster1 192.168.11.134   7000、7001
redis-cluster2 192.168.11.135   7002、7003
redis-cluster3 192.168.11.136   7004、7005
EOF
#Redis 安装
yum -y install wget 
wget http://download.redis.io/releases/redis-6.2.0.tar.gz
tar xzf redis-6.2.0.tar.gz -C /usr/local
cd /usr/local
mv redis-6.2.0/ redis
cd redis
mkdir /usr/local/redis/data
yum install -y gcc make
make

准备的三台机器ip分别为192.168.11.134,192.168.11.135,192.168.11.136

1.三台机器,每台机器上面两个redis实例,一个master一个slave,第一列做主库,第二列做备库

软件安装到/usr/local//redis目录下

#192.168.11.134
#创建节点目录
mkdir /usr/local/redis/cluster
mkdir /usr/local/redis/cluster/7000
mkdir /usr/local/redis/cluster/7001
#拷贝配置文件到节点目录中
cp /usr/local/redis/redis.conf /usr/local/redis/cluster/7000
cp /usr/local/redis/redis.conf /usr/local/redis/cluster/7001
#192.168.11.135
#创建节点目录
mkdir /usr/local/redis/cluster
mkdir /usr/local/redis/cluster/7002
mkdir /usr/local/redis/cluster/7003
#拷贝配置文件到节点目录中
cp /usr/local/redis/redis.conf /usr/local/redis/cluster/7002
cp /usr/local/redis/redis.conf /usr/local/redis/cluster/7003
#192.168.11.136
#创建节点目录
mkdir /usr/local/redis/cluster
mkdir /usr/local/redis/cluster/7004
mkdir /usr/local/redis/cluster/7005
#拷贝配置文件到节点目录中
cp /usr/local/redis/redis.conf /usr/local/redis/cluster/7004
cp /usr/local/redis/redis.conf /usr/local/redis/cluster/7005
2.三台机器分别创建自己的主备节点目录,然后拷贝配置文件到节点目录中
#192.168.11.134
#修改集群redis配置文件
cd /usr/local/redis/cluster/7000
sed -i 's/bind 127.0.0.1 -::1/bind 192.168.11.134/' redis.conf
sed -i 's/protected-mode yes/protected-mode no/' redis.conf
sed -i 's/port 6379/port 7000/' redis.conf
sed -i 's/daemonize no/daemonize yes/' redis.conf
sed -i 's#pidfile /var/run/redis_6379.pid#pidfile /var/run/redis_7000.pid#' redis.conf
sed -i 's#logfile ""#logfile "/var/log/redis_7000.log"#' redis.conf
sed -i 's#dir ./#dir /usr/local/redis/data#' redis.conf
sed -i 's/appendonly no/appendonly yes/' redis.conf
sed -i 's/# cluster-enabled yes/cluster-enabled yes/' redis.conf
sed -i 's/# cluster-config-file nodes-6379.conf/cluster-config-file nodes-7000.conf/' redis.conf
sed -i 's/# cluster-node-timeout 15000/cluster-node-timeout 5000/' redis.conf
sed -i 's/# cluster-replica-validity-factor 10/cluster-replica-validity-factor 10/' redis.conf
sed -i 's/# cluster-migration-barrier 1/cluster-migration-barrier 1/' redis.conf
sed -i 's/# cluster-require-full-coverage yes/cluster-require-full-coverage yes/' redis.conf
3.修改集群每个redis配置文件。(主要是端口、ip、pid文件,三台机器相同操作)

以192.168.11.134下的7000节点为例

vim /usr/local/redis/cluster/7000/redis.conf找到对应配置修改或执行提供的脚本代码修改

bind 192.168.11.134  #每个实例的配置文件修改为对应节点的ip地址
port 7000   #监听端口,运行多个实例时,需要指定规划的每个实例不同的端口号
daemonize yes #redis后台运行
pidfile /var/run/redis_7000.pid #pid文件,运行多个实例时,需要指定不同的pid文件
logfile /var/log/redis_7000.log #日志文件位置,运行多实例时,需要将文件修改的不同。
dir /usr/local/redis/data #存放数据的目录
appendonly yes #开启AOF持久化,redis会把所接收到的每一次写操作请求都追加到appendonly.aof文件中,当redis重新启动时,会从该文件恢复出之前的状态。
appendfilename "appendonly.aof"  #AOF文件名称
appendfsync everysec #表示对写操作进行累积,每秒同步一次
以下为打开注释并修改
cluster-enabled yes #启用集群
cluster-config-file nodes-7000.conf #集群配置文件,由redis自动更新,不需要手动配置,运行多实例时请注修改为对应端口
cluster-node-timeout 5000 #单位毫秒。集群节点超时时间,即集群中主从节点断开连接时间阈值,超过该值则认为主节点不可以,从节点将有可能转为master
cluster-replica-validity-factor 10 #在进行故障转移的时候全部slave都会请求申请为master,但是有些slave可能与master断开连接一段时间了导致数据过于陈旧,不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。
cluster-migration-barrier 1 #一个主机将保持连接的最小数量的从机,以便另一个从机迁移到不再被任何从机覆盖的主机
cluster-require-full-coverage yes #集群中的所有slot(16384个)全部覆盖,才能提供服务

注意:所有节点配置文件全部修改切记需要修改的ip、端口、pid文件...避免冲突。确保所有机器都修改。

若使用提供的脚步代码需逐个修改示例中ip192.168.11.134和端口7000为你的配置

4.启动全部节点服务

192.168.11.134下

/usr/local/redis/src/redis-server /usr/local/redis/cluster/7000/redis.conf

/usr/local/redis/src/redis-server /usr/local/redis/cluster/7001/redis.conf

192.168.11.135下

/usr/local/redis/src/redis-server /usr/local/redis/cluster/7002/redis.conf

/usr/local/redis/src/redis-server /usr/local/redis/cluster/7003/redis.conf

192.168.11.136下

/usr/local/redis/src/redis-server /usr/local/redis/cluster/7004/redis.conf

/usr/local/redis/src/redis-server /usr/local/redis/cluster/7005/redis.conf

#可以使用 netstat -lntp | grep redis 查看端口确保服务已启动

5.创建集群

redis节点搭建起来后,需要完成redis cluster集群搭建,搭建集群过程中,需要保证6个redis实例都是运行状态。
Redis是根据IP和Port的顺序,确定master和slave的,所以要排好序,再执行。

在其中一个节点操作就可以

/usr/local/redis/src/redis-cli --cluster create --cluster-replicas 1 192.168.11.134:7000 192.168.11.134:7001 192.168.11.135:7002 192.168.11.135:7003 192.168.11.136:7004 192.168.11.136:7005

执行命令后需输入yes确认

查看集群状态可连接集群中的任一节点,此处连接了集群中的节点192.168.11.134:7000

6.登录集群客户端

/usr/local/redis/src/redis-cli -h 192.168.11.134 -c -p 7000

使用ping命令测试连通性

查看集群信息

查看集群实例

参数解释:
runid: 该行描述的节点的id。
ip:prot: 该行描述的节点的ip和port
flags: 分隔的标记位,可能的值有:
1.master: 该行描述的节点是master
2.slave: 该行描述的节点是slave
3.fail?:该行描述的节点可能不可用
4.fail:该行描述的节点不可用(故障)
master_runid: 该行描述的节点的master的id,如果本身是master则显示-
ping-sent: 最近一次发送ping的Unix时间戳,0表示未发送过
pong-recv:最近一次收到pong的Unix时间戳,0表示未收到过
config-epoch: 主从切换的次数
link-state: 连接状态,connnected 和 disconnected
hash slot: 该行描述的master中存储的key的hash的范围

四、集群操作

测试链接redis,存取数据(链接集群中任意一台机器就可以。)

五、主从切换

1.将节点cluster1的主节点7000端口的redis关掉

2.查看集群信息

cluster nodes

可以看到7000端口这个redis已经是fail失败的了。

3.重新启动7000端口的redis

/usr/local/redis/src/redis-server /usr/local/redis/cluster/7000/redis.conf

4.再次查看集群信息

cluster nodes

可以看到已经主从切换了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值