阿里云上搭建redis高可用集群

Redis集群的概念:

RedisCluster是redis的分布式解决方案,在3.0版本后推出的方案,有效地解决了Redis分布式的需求,当一个服务挂了可以快速的切换到另外一个服务,当遇到单机内存、并发等瓶颈时,可使用此方案来解决这些问题
1、Redis集群方案比较
哨兵模式
阿里云上搭建redis高可用集群_第1张图片

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

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

  1. 分布式数据库把整个数据按分区规则映射到多个节点,即把数据划分到多个节点上,每个节点负责整体数据的一个子集。比如我们库有900条用户数据,有3个redis节点,将900条分成3份,分别存入到3个redis节点

  2. 阿里云上搭建redis高可用集群_第3张图片
    分区规则:
    常见的分区规则哈希分区和顺序分区,redis集群使用了哈希分区,顺序分区暂用不到,不做具体说明;

    rediscluster采用了哈希分区的“虚拟槽分区”方式(哈希分区分节点取余、一致性哈希分区和虚拟槽分区)
    3. 虚拟槽分区(槽:slot)
    RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]&16383)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据

    哈希函数: Hash()=CRC16[key]&16383 按位与

    槽与节点的关系如下
    阿里云上搭建redis高可用集群_第4张图片
    阿里云上搭建redis高可用集群_第5张图片
    redis用虚拟槽分区原因:解耦数据与节点关系,节点自身维护槽映射关系,分布式存储
    4. redisCluster的缺陷:
    a,键的批量操作支持有限,比如mset, mget,如果多个键映射在不同的 槽,就不支持了

b,键事务支持有限,当多个key分布在不同节点时无法使用事务,同一节点是支持事务

c,键是数据分区的最小粒度,不能将一个很大的键值对映射到不同的节点

d,不支持多数据库,只有0,select 0

e,复制结构只支持单层结构,不支持树型结构。
2、redis高可用集群搭建
一、搭建要求
需要 6 台 redis 服务器。搭建伪集群。
需要 6 个 redis 实例。
需要运行在不同的端口 7001-7006
二、安装
(1)Redis 是 c 语言开安装gcc 【此步省略】
发的。安装 redis 需要 c 语言的编译环境。如果没有 gcc 需要在线安装。
yum install gcc-c++
(2)使用yum命令安装 ruby (我们需要使用ruby脚本来实现集群搭建)【此步省略】
yum install ruby
yum install rubygems

(3)将redis源码包上传到 linux 系统 ,解压redis源码包
(4)编译redis源码 ,进入redis源码文件夹
看到以下输出结果,表示编译成功
阿里云上搭建redis高可用集群_第6张图片
(5)创建目录/usr/local/redis-cluster目录, 安装6个redis实例,分别安装在以下目录
/usr/local/redis-cluster/redis-1
/usr/local/redis-cluster/redis-2
/usr/local/redis-cluster/redis-3
/usr/local/redis-cluster/redis-4
/usr/local/redis-cluster/redis-5
/usr/local/redis-cluster/redis-6

以第一个redis实例为例,命令如下
make install PREFIX=/usr/local/redis-cluster/redis-1

阿里云上搭建redis高可用集群_第7张图片
出现此提示表示成功,按此方法安装其余5个redis实例
(6)复制配置文件 将 /redis-3.0.0/redis.conf 复制到redis下的bin目录下
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-1/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-2/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-3/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-4/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-5/bin
[root@localhost redis-3.0.0]# cp redis.conf /usr/local/redis-cluster/redis-6/bin

三、配置集群
(1)修改每个redis节点的配置文件redis.conf
修改运行端口为7001 (7002 7003 …)

将cluster-enabled yes 前的注释去掉(632行)
阿里云上搭建redis高可用集群_第8张图片
(2)启动每个redis实例
以第一个实例为例,命令如下
cd /usr/local/redis-cluster/redis-1/bin/
./redis-server redis.conf

阿里云上搭建redis高可用集群_第9张图片
把其余的5个也启动起来,然后查看一下是不是都启动起来了
**[root@localhost ~]# ps -ef | grep redis
root 15776 15775 0 08:19 pts/1 00:00:00 ./redis-server *:7001 [cluster]
root 15810 15784 0 08:22 pts/2 00:00:00 ./redis-server *:7002 [cluster]
root 15831 15813 0 08:23 pts/3 00:00:00 ./redis-server *:7003 [cluster]
root 15852 15834 0 08:23 pts/4 00:00:00 ./redis-server *:7004 [cluster]
root 15872 15856 0 08:24 pts/5 00:00:00 ./redis-server :7005 [cluster]
root 15891 15875 0 08:24 pts/6 00:00:00 ./redis-server :7006 [cluster]
root 15926 15895 0 08:24 pts/7 00:00:00 grep redis

root 15872 15856 0 08:24 pts/5 00:00:00 ./redis-server :7005 [cluster]
root 15891 15875 0 08:24 pts/6 00:00:00 ./redis-server :7006 [cluster]
root 15926 15895 0 08:24 pts/7 00:00:00 grep redis

(3)上传redis-3.0.0.gem ,安装 ruby用于搭建redis集群的脚本。
[root@localhost ~]# gem install redis-3.0.0.gem
Successfully installed redis-3.0.0
1 gem installed
Installing ri documentation for redis-3.0.0…
Installing RDoc documentation for redis-3.0.0…

(4)使用 ruby 脚本搭建集群。
进入redis源码目录中的src目录 执行下面的命令
./redis-trib.rb create --replicas 1 192.168.25.140:7001 192.168.25.140:7002 192.168.25.140:7003
192.168.25.140:7004 192.168.25.140:7005 192.168.25.140:7006

出现下列提示信息

Creating cluster
Connecting to node 服务器IP:7001: OK
Connecting to node 服务器IP:7002: OK
Connecting to node 服务器IP:7003: OK
Connecting to node 服务器IP:7004: OK
Connecting to node 服务器IP:7005: OK
Connecting to node 服务器IP:7006: OK

Performing hash slots allocation on 6 nodes…
Using 3 masters:
服务器IP:7001
服务器IP:7002
服务器IP:7003
Adding replica 服务器IP:7004 to 服务器IP:7001
Adding replica 服务器IP:7005 to 服务器IP:7002
Adding replica 服务器IP:7006 to 服务器IP:7003
M: 1800237a743c2aa918ade045a28128448c6ce689 服务器IP:7001
slots:0-5460 (5461 slots) master
M: 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d 服务器IP:7002
slots:5461-10922 (5462 slots) master
M: 436e88ec323a2f8bb08bf09f7df07cc7909fcf81 服务器IP:7003
slots:10923-16383 (5461 slots) master
S: c2a39a94b5f41532cd83bf6643e98fc277c2f441 服务器IP:7004
replicates 1800237a743c2aa918ade045a28128448c6ce689
S: b0e38d80273515c84b1a01820d8ecee04547d776 服务器IP:7005
replicates 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d
S: 03bf6bd7e3e6eece5a02043224497c2c8e185132 服务器IP:7006
replicates 436e88ec323a2f8bb08bf09f7df07cc7909fcf81
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 服务器IP:7001)
M: 1800237a743c2aa918ade045a28128448c6ce689 服务器IP:7001
slots:0-5460 (5461 slots) master
M: 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d 服务器IP:7002
slots:5461-10922 (5462 slots) master
M: 436e88ec323a2f8bb08bf09f7df07cc7909fcf81 服务器IP:7003
slots:10923-16383 (5461 slots) master
M: c2a39a94b5f41532cd83bf6643e98fc277c2f441 服务器IP:7004
slots: (0 slots) master
replicates 1800237a743c2aa918ade045a28128448c6ce689
M: b0e38d80273515c84b1a01820d8ecee04547d776 服务器IP:7005
slots: (0 slots) master
replicates 7cb3f7d5c60bfbd3ab28800f8fd3bf6de005bf0d
M: 03bf6bd7e3e6eece5a02043224497c2c8e185132 服务器IP:7006
slots: (0 slots) master
replicates 436e88ec323a2f8bb08bf09f7df07cc7909fcf81
[OK] All nodes agree about slots configuration.

Check for open slots…
Check slots coverage…
[OK] All 16384 slots covered.

连接Redis-Cluster
客户端工具连接
Redis-cli 连接集群:
redis-cli -p 主机ip -p 端口(集群中任意端口) -c
-c:代表连接的是 redis 集群
测试值的存取:
(1)从本地连接到集群redis 使用7001端口 加 -c 参数
(2)存入name值为abc ,系统提示此值被存入到了7002端口所在的redis (槽是5798)
(3)提取name的值,可以提取。
(4)退出(quit)
(5)再次以7001端口进入 ,不带-c
(6)查询name值,无法获取,因为值在7002端口的redis上
(7)我们以7002端口进入,获取name值发现是可以获取的,而以其它端口进入均不能获取
Springboot测试demo
idea:配置文件
spring:
redis:
cluster:
nodes:服务器公用IP:7001,服务器公用ip:7002,服务器公用ip:7003,服务器公用ip:7004,服务器公用ip:7005,服务器公用ip:7006
max-redirects: 6
代码
package com.example.rediscluster.redisclusterdemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RedisclusterdemoApplication {

public static void main(String[] args) {
	SpringApplication.run(RedisclusterdemoApplication.class, args);
}

}

你可能感兴趣的:(redis)