搭建redis缓存高可用集群

搭建redis缓存高可用集群

基本介绍

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施installation。

Redis 集群不支持那些需要同时处理多个键的 Redis 命令, 因为执行这些命令需要在多个 Redis 节点之间移动数据, 并且在高负载的情况下, 这些命令将降低Redis集群的性能, 并导致不可预测的行为。

Redis 集群通过分区来提供一定程度的可用性:即使集群中有一部分节点失效或者无法进行通讯,集群也可以继续处理命令请求。

Redis集群提供了以下两个好处:

  • 将数据自动切分split到多个节点的能力。
  • 当集群中的一部分节点失效或者无法进行通讯时, 仍然可以继续处理命令请求的能力。

redis集群的搭建模式

关于redis的搭建模式 目前有二种

  1. 哨兵模式(sentinel)
  2. 集群模式(redis-cluster)

简介:

​ 哨兵模式:

img

在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况。

优点:

  1. Redis Sentinel 集群部署简单。
  2. 能够解决 Redis 主从模式下的高可用切换问题。
  3. 很方便实现 Redis 数据节点的线形扩展,轻松突破 Redis 自身单线程瓶颈,可极大满足 Redis 大容量或高性能的业务需求。
  4. 可以实现一套 Sentinel 监控一组 Redis 数据节点或多组数据节点。

缺点:

  1. 部署相对 Redis 主从模式要复杂一些,原理理解更繁琐。
  2. 资源浪费,Redis 数据节点中 slave 节点作为备份节点不提供服务。
  3. Redis Sentinel 主要是针对 Redis 数据节点中的主节点的高可用切换,对 Redis 的数据节点做失败判定分为主观下线和客观下线两种,对于 Redis 的从节点有对节点做主观下线操作,并不执行故障转移。
  4. 不能解决读写分离问题,实现起来相对复杂。

​ 集群模式:

img

redis集群是一个由多个主从节点群组成的分布式服务器群,它具有复制、高可用和分片特性。Redis集群不需要sentinel哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,据官方文档称可以线性扩展到1000节点。redis集群的性能和高可用性均优于之前版本的哨兵模式,且集群配置非常简单

为什么使用redis-cluster

  • 为了在大流量访问下提供稳定的业务,集群化是存储的必然形态
  • 未来的发展趋势肯定是云计算和大数据的紧密结合 只有分布式架构能满足要求
  • 如果没有集群化 何来的分布式

redis集群实现方案

关于redis的集群化方案 目前有三种

  1. Twitter开发的twemproxy
  2. 豌豆荚开发的codis
  3. 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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值