目录
- 搭建redis缓存高可用集群
- 基本介绍
- redis集群的搭建模式
- 为什么使用redis-cluster
- redis集群实现方案
- 集群原理
- 集群搭建
- redis集群整合springboot
- 添加依赖
- application.properties中加入redis相关配置
- application.yml中加入redis相关
搭建redis缓存高可用集群
基本介绍
Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation。
Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低Redis集群的性能, 并导致不可预测的行为。
Redis 集群通过分区来提供一定程度的可用性:即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。
Redis集群提供了以下两个好处:
- 将数据自动切分split到多个节点的能力。
- 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。
redis集群的搭建模式
关于redis的搭建模式 目前有二种
- 哨兵模式(sentinel)
- 集群模式(redis-cluster)
简介:
哨兵模式:
在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况。
优点:
- Redis Sentinel 集群部署简单。
- 能够解决 Redis 主从模式下的高可用切换问题。
- 很方便实现 Redis 数据节点的线形扩展,轻松突破 Redis 自身单线程瓶颈,可极大满足 Redis 大容量或高性能的业务需求。
- 可以实现一套 Sentinel 监控一组 Redis 数据节点或多组数据节点。
缺点:
- 部署相对 Redis 主从模式要复杂一些,原理理解更繁琐。
- 资源浪费,Redis 数据节点中 slave 节点作为备份节点不提供服务。
- Redis Sentinel 主要是针对 Redis 数据节点中的主节点的高可用切换,对 Redis 的数据节点做失败判定分为主观下线和客观下线两种,对于 Redis 的从节点有对节点做主观下线操作,并不执行故障转移。
- 不能解决读写分离问题,实现起来相对复杂。
集群模式:
redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到1000节点。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单
为什么使用redis-cluster
- 为了在大流量访问下提供稳定的业务,集群化是存储的必然形态
- 未来的发展趋势肯定是云计算和大数据的紧密结合 只有分布式架构能满足要求
- 如果没有集群化 何来的分布式
redis集群实现方案
关于redis的集群化方案 目前有三种
- Twitter开发的twemproxy
- 豌豆荚开发的codis
- redis官方的redis-cluster
简介:
twemproxy架构简单,就是用proxy对后端redis server进行代理, 但是由于代理层的消耗性能很低, 而且通常涉及多个key的操作都是不支持的 ,而且本身不支持动态扩容和透明的数据迁移 ,而且也失去维护 Twitter内部已经不使用了
redis-cluster是三个里性能最强大的 ,因为他使用去中心化的思想 ,使用hash slot方式 将16348个hash slot 覆盖到所有节点上, 对于存储的每个key值 使用CRC16(KEY)&16348=slot 得到他对应的hash slot ,并在访问key时就去找他的hash slot在哪一个节点上, 然后由当前访问节点从实际被分配了这个hash slot的节点去取数据 ,节点之间使用轻量协议通信, 减少带宽占用, 性能很高, 自动实现负载均衡与高可用 ,自动实现failover ,并且支持动态扩展 官方已经玩到可以1000个节点 实现的复杂度低 ,总之因为他的去中心化思想免去了proxy的消耗 ,是全新的思路
但是它也有一些不足 ,例如官方没有提供图形化管理工具, 运维体验差, 全手工数据迁移, 并且自己对自己本身的redis命令支持也不完全等, 但是这些问题 ,不能掩盖他关键的新思想所带来的的优势
codis使用的也是思路,但是做的比较好,是这两种之间的一个中间级,而且支持命令是最多的,有图形化管理和监控工具,运维友好
集群原理
redis-cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求
- 自动将数据进行分片,每个master上放一部分数据
- 提供内置的高可用支持,部分master不可用时,还是可以继续工作的
- 支撑N个redis master node,每个master node都可以挂载多个slave node
- 高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master
集群搭建
注意:文中192.168.61.131 这个ip地址需要改为自己服务器ip地址,这个也是redis客户端连接redis服务端时候使用的ip地址。
master:负责读写
slave:master正常运行则不能读取到数据,master挂了之后,角色更改为master
直接开始搭建
1.创建下载目录,下载安装
#进入redis文件夹
cd /usr/local/src/
#下载redis
wget http://download.redis.io/releases/redis-6.0.4.tar.gz
#解压
tar xvzf redis-6.0.4.tar.gz
#进如redis-6.0.4文件夹
cd redis-6.0.4
#以下操作失败几率很大
make
make install
注:如果make失败请执行以下—
#清空残杂
make distclean
#安装gcc
yum install gcc
# 查看gcc版本
gcc -v
# 升级到9.1版本
yum -y install centos-release-scl
yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
scl enable devtoolset-9 bash
#以上为临时启用,如果要长期使用gcc 9.1的话:
echo "source /opt/rh/devtoolset-9/enable" >>/etc/profile
#再次执行make
make
make install
2.创建配置文件目录
mkdir -p /etc/redis/7001
mkdir -p /etc/redis/7002
mkdir -p /etc/redis/7003
mkdir -p /etc/redis/7004
mkdir -p /etc/redis/7005
mkdir -p /etc/redis/7006
3.创建数据保存目录
mkdir -p /var/redis/7001
mkdir -p /var/redis/7002
mkdir -p /var/redis/7003
mkdir -p /var/redis/7004
mkdir -p /var/redis/7005
mkdir -p /var/redis/7006
4.编写配置文件
下面为需要修改的配置项以及说明 (注:仅仅只是说明,无需修改)
# 客户端连接端口
port 7001
# 实例绑定的IP地址
bind 192.168.61.131
# redis实例数据配置存储位置
dir /var/redis/7001
# 开启集群模式
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
# 开启aop日志
appendonly yes
# 是否以后台进程的方式启动redis实例
daemonize yes
# 关闭保护模式
protected-mode no
# 指定该进程pidfile
pidfile /var/run/redis_7001.pid
修改配置文件文件,最小化修改配置
vim /etc/redis/7001/7001.conf
port 7001
bind 192.168.61.131
dir /var/redis/7001
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no
pidfile /var/run/redis_7001.pid
vim /etc/redis/7002/7002.conf
port 7002
bind 192.168.61.131
dir /var/redis/7002
cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no
pidfile /var/run/redis_7002.pid
vim /etc/redis/7003/7003.conf
port 7003
bind 192.168.61.131
dir /var/redis/7003
cluster-enabled yes
cluster-config-file nodes-7003.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no
pidfile /var/run/redis_7003.pid
vim /etc/redis/7004/7004.conf
port 7004
bind 192.168.61.131
dir /var/redis/7004
cluster-enabled yes
cluster-config-file nodes-7004.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no
pidfile /var/run/redis_7004.pid
vim /etc/redis/7005/7005.conf
port 7005
bind 192.168.61.131
dir /var/redis/7005
cluster-enabled yes
cluster-config-file nodes-7005.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no
pidfile /var/run/redis_7005.pid
vim /etc/redis/7006/7006.conf
port 7006
bind 192.168.61.131
dir /var/redis/7006
cluster-enabled yes
cluster-config-file nodes-7006.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
protected-mode no
pidfile /var/run/redis_7006.pid
5.启动redis
/usr/local/bin/redis-server /etc/redis/7001/7001.conf
/usr/local/bin/redis-server /etc/redis/7002/7002.conf
/usr/local/bin/redis-server /etc/redis/7003/7003.conf
/usr/local/bin/redis-server /etc/redis/7004/7004.conf
/usr/local/bin/redis-server /etc/redis/7005/7005.conf
/usr/local/bin/redis-server /etc/redis/7006/7006.conf
检测进程
ps -ef|grep redis
6.防火墙端口打开
/sbin/iptables -I INPUT -p tcp --dport 7001 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 7002 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 7003 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 7004 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 7005 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 7006 -j ACCEPT
7.创建集群
/usr/local/bin/redis-cli --cluster create 192.168.61.131:7001 192.168.61.131:7002 192.168.61.131:7003 192.168.61.131:7004 192.168.61.131:7005 192.168.61.131:7006 --cluster-replicas 1
8.使用脚本管理集群(至此 我遇到的问题 脚本无法管理群集 于20/06/01)
vim /usr/local/src/redis/utils/create-cluster/create-cluster
cp /usr/local/src/redis/utils/create-cluster/create-cluster /usr/local/bin/utils/
redis集群整合springboot
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
application.properties中加入redis相关配置
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.max-active=200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=10
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.jedis.timeout=3600
spring.redis.cluster.nodes=192.168.61.131:7001, 192.168.61.131:7002, 192.168.61.131:7003, 192.168.61.131:7004, 192.168.61.131:7005, 192.168.61.131:7006
application.yml中加入redis相关
spring:
redis:
# Redis数据库索引(默认为0)
database: 0
#连接超时时间(毫秒)
jedis:
pool:
#最大连接数据库连接数,设 0 为没有限制
max-active: 8
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
max-wait: -1
#最大等待连接中的数量,设 0 为没有限制
max-idle: 8
#最小等待连接中的数量,设 0 为没有限制
min-idle: 0
timeout: 10000
cluster:
nodes:
- 192.168.61.131:7001
- 192.168.61.131:7002
- 192.168.61.131:7003
- 192.168.61.131:7004
- 192.168.61.131:7005
- 192.168.61.131:7006