RedisCluster 集群

Redis集群方式

3.0版本之前

  1. 3.0版本之前的redis是不支持集群的,我们的redis如果想要集群的话,就需要一个中间件,然后这个中间件负责将我们需要存入redis中的数据的key通过一套算法计算得出一个值。然后根据这个值找到对应的redis节点,将这些数据存在这个redis的节点中。
  2. 在取值的时候,同样先将key进行计算,得到对应的值,然后就去找对应的redis节点,从对应的节点中取出对应的值。
  3. 这样做有很多不好的地方,比如说我们的这些计算都需要在系统中去进行,所以会增加系统的负担。还有就是这种集群模式下,某个节点挂掉,其他的节点无法知道。而且也不容易对每个节点进行负载均衡。
常见集群方案
  1. 官方方案redis-cluster搭建实战
  2. 客户端分片技术(不推荐),扩容/缩容时,必须手动调整分片程序,出现故障不能自动转移
  3. 可以使用主从复制方式(不推荐)
  4. 使用一些代理工具
Redis-cluster原理

Redis 是一个开源的 key-value 存储系统,由于出众的性能,大部分互联网企业都用来做服务器端缓存。Redis 在3.0版本前只支持单实例模式,虽然支持主从模式、哨兵模式部署来解决单点故障,但是现在互联网企业动辄大几百G的数据,可完全是没法满足业务的需求,所以,Redis 在 3.0 版本以后就推出了集群模式。

Redis 集群采用了P2P的模式,完全去中心化。Redis 把所有的 Key 分成了 16384 个 slot,每个 Redis 实例负责其中一部分 slot 。集群中的所有信息(节点、端口、slot等),都通过节点之间定期的数据交换而更新。

Redis 客户端可以在任意一个 Redis 实例发出请求,如果所需数据不在该实例中,通过重定向命令引导客户端访问所需的实例。

edis的服务器节点中任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。

那么redis是怎么做到的呢?首先,在redis的每一个节点上,都有这么两个东西,一个是插槽(slot)可以理解为是一个可以存储两个数值的一个变量这个变量的取值范围是:0-16383。还有一个就是cluster,我个人把这个cluster理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。

还有就是因为如果集群的话,是有好多个redis一起工作的,那么,就需要这个集群不是那么容易挂掉,所以呢,理论上就应该给集群中的每个节点至少一个备用的redis服务。这个备用的redis称为从节点(slave)。那么这个集群是如何判断是否有某个节点挂掉了呢?

首先要说的是,每一个节点都存有这个集群所有主节点以及从节点的信息。

它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。如果某个节点和所有从节点全部挂掉,我们集群就进入faill状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入发力了状态。这就是我们的redis的投票机制,具体原理如下图所示:
在这里插入图片描述

这套架构的特点:
  • 分片算法:基于 slot hash桶;
  • 分片实例之间相互独立,每组 一个master 实例和多个slave;
  • 路由信息存放到第三方存储组件,如 zookeeper 或etcd
  • 旁路组件探活
RedisCluster 集群搭建
安装纯净版本的redis服务器 (不要设置密码)
  1. 下载Redis安装包
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
  1. 解压 Redis安装包
tar -xzvf redis-4.0.9.tar.gz 
  1. 进入目录编译一下,用make命令编译一下
cd /usr/local/redis-4.0.9
make
cd src
make install PREFIX=/usr/local/redis
  1. 移动配置文件到安装目录下
cd ../
mkdir /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
  1. 配置redis为后台启动
vi /usr/local/redis/etc/redis.conf
//将daemonize no 改成daemonize yes    后台进程启动
bind 192.168.148.133 //为当前服务器ip地址
  1. 开启redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
  1. 连接Redis客户端 要进入redis的bin目录
./redis-cli -h 127.0.0.1 -p 6379 -a "123456"
  1. 关闭防火墙
//临时关闭
systemctl stop firewalld
//禁止开机启动
systemctl disable firewalld
搭建集群方案

安装部署任何一个应用其实都很简单,只要安装步骤一步一步来就行了。下面说一下 Redis 集群搭建规划,由于集群至少需要6个节点(3主3从模式),所以,没有这么多机器给我玩,我本地也起不了那么多虚拟机(电脑太烂),现在计划是在一台机器上模拟一个集群,当然,这和生产环境的集群搭 建没本质区别。

  1. 创建文件夹
    我们计划集群中 Redis 节点的端口号为 9001-9006 ,端口号即集群下各实例文件夹。数据存放在 端口号/data 文件夹中
mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
  1. 复制脚本redis-cluster 下创建 bin 文件夹,用来存放集群运行脚本,并把安装好的 Redis 的 src 路径下的运行脚本拷贝过来。看命令:
mkdir bin
cd /usr/local/redis-4.0.9/src/
cp mkreleasehdr.sh redis-benchmark redis-check-aof  redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin
  1. 复制一个新 Redis 实例
    我们现在从已安装好的 Redis 中复制一个新的实例到 9001 文件夹,并修改 redis.conf 配置。
cp -r /usr/local/redis    /usr/local/redis-cluster/9001

port 9001(每个节点的端口号)
daemonize yes
bind 192.168.119.131(绑定当前机器 IP)
dir /usr/local/redis-cluster/9001/data/(数据文件存放位置,加再配置文件最后一行)
pidfile /var/run/redis_9001.pid(pid 9001和port要对应)
cluster-enabled yes(启动集群模式)
cluster-config-file nodes9001.conf(9001和port要对应)
cluster-node-timeout 15000
appendonly yes

cd /usr/local/redis-cluster/9001/redis/etc/
vi redis.conf
  1. 再复制出五个新 Redis 实例
    我们已经完成了一个节点了,其实接下来就是机械化的再完成另外五个节点,其实可以这么做:把 9001 实例 复制到另外五个文件夹中,唯一要修改的就是 redis.conf 中的所有和端口的相关的信息即可,其实就那么四个位置。开始操作
\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9002
\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9003
\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9004
\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9005
\cp -rf /usr/local/redis-cluster/9001/*   /usr/local/redis-cluster/9006

\cp -rf 命令是不使用别名来复制,因为 cp 其实是别名 cp -i,操作时会有交互式确认,比较烦人。

  1. 修改 9002-9006 的 redis.conf 文件
    其实非常简单了,你通过搜索会发现其实只有四个点需要修改,我们全局替换下吧,进入相应的节点文件夹,做替换就好了。命令非常简单。
vi /usr/local/redis-cluster/9002/redis/etc/redis.conf
%s/9001/9002

vi /usr/local/redis-cluster/9003/redis/etc/redis.conf
%s/9001/9003

vi /usr/local/redis-cluster/9004/redis/etc/redis.conf
%s/9001/9004

vi /usr/local/redis-cluster/9005/redis/etc/redis.conf
%s/9001/9005

vi /usr/local/redis-cluster/9006/redis/etc/redis.conf
%s/9001/9006

其实我们也就是替换了下面这四行:
port 9002
dir /usr/local/redis-cluster/9002/data/
cluster-config-file nodes-9002.conf
pidfile /var/run/redis_9002.pid
  1. 启动9001-9006六个节点
/usr/local/redis/bin/redis-server  /usr/local/redis-cluster/9001/redis/etc/redis.conf
/usr/local/redis/bin/redis-server  /usr/local/redis-cluster/9002/redis/etc/redis.conf
/usr/local/redis/bin/redis-server  /usr/local/redis-cluster/9003/redis/etc/redis.conf
/usr/local/redis/bin/redis-server  /usr/local/redis-cluster/9004/redis/etc/redis.conf
/usr/local/redis/bin/redis-server  /usr/local/redis-cluster/9005/redis/etc/redis.conf
/usr/local/redis/bin/redis-server  /usr/local/redis-cluster/9006/redis/etc/redis.conf


[root@localhost etc]# ps aux | grep 'redis'
root     10625  0.1  0.4 145312  7532 ?        Ssl  22:47   0:03 /usr/local/redis/bin/redis-server 192.168.148.133:6379
root     10790  0.0  0.5 147360  9644 ?        Ssl  23:24   0:00 /usr/local/redis/bin/redis-server 192.168.148.133:9001 [cluster]
root     10795  0.1  0.5 147360  9640 ?        Ssl  23:24   0:00 /usr/local/redis/bin/redis-server 192.168.148.133:9002 [cluster]
root     10800  0.1  0.5 147360  9644 ?        Ssl  23:25   0:00 /usr/local/redis/bin/redis-server 192.168.148.133:9003 [cluster]
root     10805  0.1  0.5 147360  9644 ?        Ssl  23:25   0:00 /usr/local/redis/bin/redis-server 192.168.148.133:9004 [cluster]
root     10811  0.1  0.5 147360  9640 ?        Ssl  23:25   0:00 /usr/local/redis/bin/redis-server 192.168.148.133:9005 [cluster]
root     10816  0.1  0.5 147360  9640 ?        Ssl  23:25   0:00 /usr/local/redis/bin/redis-server 192.168.148.133:9006 [cluster]
  1. 随便找一个节点测试试
[root@localhost etc]# /usr/local/redis-cluster/9001/redis/bin/redis-cli -h 192.168.148.133 -p 9001
192.168.148.133:9001> ping
PONG
192.168.148.133:9001> set name 123
(error) CLUSTERDOWN Hash slot not served
192.168.148.133:9001> 

(error) CLUSTERDOWN Hash slot not served
这是因为虽然我们配置并启动了 Redis 集群服务,但是他们暂时还并不在一个集群中,互相直接发现不了,而且还没有可存储的位置,就是所谓的slot(槽)。

  1. 安装集群所需软件
    由于 Redis 集群需要使用 ruby 命令,所以我们需要安装 ruby 和相关接口。
yum install ruby
yum install rubygems
gem install redis  下载不下来使用本地上传

cd /usr/local/ 使用本地上传方式
[root@localhost local]# gem install -l redis-3.2.1.gem
Successfully installed redis-3.2.1
Parsing documentation for redis-3.2.1
Installing ri documentation for redis-3.2.1
1 gem installed
  1. 集群环境测试
[root@localhost local]# /usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.148.133:9001 192.168.148.133:9002 192.168.148.133:9003 192.168.148.133:9004 192.168.148.133:9005 192.168.148.133:9006
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.148.133:9001
192.168.148.133:9002
192.168.148.133:9003
Adding replica 192.168.148.133:9005 to 192.168.148.133:9001
Adding replica 192.168.148.133:9006 to 192.168.148.133:9002
Adding replica 192.168.148.133:9004 to 192.168.148.133:9003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 1d4e9ace5671f05858633c827fb3d4807ef5b790 192.168.148.133:9001
   slots:0-5460 (5461 slots) master
M: a00c2f49f4f9b73ebb28597153aff9cbbf974fcc 192.168.148.133:9002
   slots:5461-10922 (5462 slots) master
M: bffab6045efd2cf84c4aa91e2682eb8e7223be02 192.168.148.133:9003
   slots:10923-16383 (5461 slots) master
S: b5cd37d9037573dbac6f24f9f0382c742c74b6d2 192.168.148.133:9004
   replicates 1d4e9ace5671f05858633c827fb3d4807ef5b790
S: ec28b8078fad234b5a83dbce6fdcea1a6f629150 192.168.148.133:9005
   replicates a00c2f49f4f9b73ebb28597153aff9cbbf974fcc
S: c85a9f92454479f6fbe71e4063fefeca8848cc22 192.168.148.133:9006
   replicates bffab6045efd2cf84c4aa91e2682eb8e7223be02
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.....
>>> Performing Cluster Check (using node 192.168.148.133:9001)
M: 1d4e9ace5671f05858633c827fb3d4807ef5b790 192.168.148.133:9001
   slots:0-5460 (5461 slots) master
   1 additional replica(s)
S: ec28b8078fad234b5a83dbce6fdcea1a6f629150 192.168.148.133:9005
   slots: (0 slots) slave
   replicates a00c2f49f4f9b73ebb28597153aff9cbbf974fcc
M: a00c2f49f4f9b73ebb28597153aff9cbbf974fcc 192.168.148.133:9002
   slots:5461-10922 (5462 slots) master
   1 additional replica(s)
S: b5cd37d9037573dbac6f24f9f0382c742c74b6d2 192.168.148.133:9004
   slots: (0 slots) slave
   replicates 1d4e9ace5671f05858633c827fb3d4807ef5b790
S: c85a9f92454479f6fbe71e4063fefeca8848cc22 192.168.148.133:9006
   slots: (0 slots) slave
   replicates bffab6045efd2cf84c4aa91e2682eb8e7223be02
M: bffab6045efd2cf84c4aa91e2682eb8e7223be02 192.168.148.133:9003
   slots:10923-16383 (5461 slots) master
   1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

简单解释一下这个命令:调用 ruby 命令来进行创建集群,–replicas 1 表示主从复制比例为 1:1,即一个主节点对应一个从节点;然后,默认给我们分配好了每个主节点和对应从节点服务,以及 solt 的大小,因为在 Redis 集群中有且仅有 16383 个 solt ,默认情况会给我们平均分配,当然你可以指定,后续的增减节点也可以重新分配。

M: 1d4e9ace5671f05858633c827fb3d4807ef5b790 为主节点Id

S: b5cd37d9037573dbac6f24f9f0382c742c74b6d2 192.168.148.133:9004
replicates 1d4e9ace5671f05858633c827fb3d4807ef5b790 从节点下对应主节点Id

目前来看,9001-9003 为主节点,9004-9006 为从节点,并向你确认是否同意这么配置。输入 yes 后,会开始集群创建。

记住输入yes

  1. 验证集群环境
/usr/local/redis-cluster/9001/redis/bin/redis-cli -h 192.168.148.133 -p 9001
[root@localhost local]# /usr/local/redis-cluster/9001/redis/bin/redis-cli -h 192.168.148.133 -p 9001
192.168.148.133:9001> ping
PONG
192.168.148.133:9001> set name 123
(error) MOVED 5798 192.168.148.133:9002

(error) MOVED 5798 192.168.148.133:9002 这是因为连接命令错误,要加上 -c 表示集群

[root@localhost local]# /usr/local/redis-cluster/9001/redis/bin/redis-cli -c -h 192.168.148.133 -p 9001
192.168.148.133:9001> ping
PONG
192.168.148.133:9001> set name 123
-> Redirected to slot [5798] located at 192.168.148.133:9002
OK
192.168.148.133:9002> 
springboot 连接 redis 集群

只要修改配置就可以了

spring:
  redis:
    #连接的是第0个库
    database: 0
    #ip地址
    #host: 47.102.136.26
    #端口号
    #port: 6379
    #密码
    #password: 123456
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0
    timeout: 10000
    cluster:
      nodes:
        - 192.168.148.133:9001
        - 192.168.148.133:9002
        - 192.168.148.133:9003
        - 192.168.148.133:9004
        - 192.168.148.133:9005
        - 192.168.148.133:9006

redis集群对象JedisCluster不支持事务,但是,集群里边的每个节点支持事务。 集群事务可以通过 lua 脚本来控制。Redis + Lua

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值