1简介

在 Redis 3.0 之前,使用 哨兵(sentinel)机制来监控各个节点之间的状态。Redis Cluster 是 Redis 的 分布式解决方案,在 3.0 版本正式推出,有效地解决了 Redis 在 分布式 方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用 Cluster 架构方案达到负载均衡的目的

2 Redis Cluster集群介绍

Redis Cluster 集群模式通常具有 高可用可扩展性分布式容错 等特性。Redis Cluster采用的是虚拟槽分区。先来解释一下什么是虚拟槽分区

2.1 虚拟槽分区介绍

虚拟槽分区 巧妙地使用了 哈希空间,使用 分散度良好哈希函数 把所有数据 映射 到一个 固定范围整数集合 中,整数定义为 (slot)。这个范围一般 远远大于 节点数,比如 Redis Cluster 槽范围是 0 ~ 16383。 是集群内 数据管理迁移基本单位。采用 大范围槽 的主要目的是为了方便 数据拆分集群扩展。每个节点会负责 一定数量的槽,如图所示:

当前集群有 5 个节点,每个节点平均大约负责 3276 个 。由于采用 高质量哈希算法,每个槽所映射的数据通常比较 均匀,将数据平均划分到 5 个节点进行 数据分区。Redis Cluster 就是采用 虚拟槽分区

  • 节点1: 包含 0 到 3276 号哈希槽。
  • 节点2:包含 3277 到 6553 号哈希槽。
  • 节点3:包含 6554 到 9830 号哈希槽。
  • 节点4:包含 9831 到 13107 号哈希槽。
  • 节点5:包含 13108 到 16383 号哈希槽。

这种结构很容易 添加 或者 删除 节点。如果 增加 一个节点 6,就需要从节点 1 ~ 5 获得部分 分配到节点 6 上。如果想 移除 节点 1,需要将节点 1 中的 移到节点 2 ~ 5 上,然后将 没有任何槽 的节点 1 从集群中 移除 即可。

由于从一个节点将 哈希槽 移动到另一个节点并不会 停止服务,所以无论 添加删除 或者 改变 某个节点的 哈希槽的数量 都不会造成 集群不可用 的状态.

2.2 Redis数据分区

上面说过,Redis Cluster 采用 虚拟槽分区,所有的 根据 哈希函数 映射到 0~16383 整数槽内,计算公式:slot = CRC16(key)& 16383。每个节点负责维护一部分槽以及槽所映射的 键值数据,如图所示:

3 Redis集群搭建

3.1 环境准备

3.1.1 安装GCC

Redis 安装需要依托GCC环境

  1. 检查是否安装gcc

命令: gcc -v

如果能输出gcc版本信息,,说明安装了gcc。反之需要安装gcc

  1. 安装gcc

创建目录/usr/local/gccSrc

上传以下rpm文件至/usr/local/gccSrc目录下

cpp-4.8.5-11.el7.x86_64.rpm

gcc-4.8.5-11.el7.x86_64.rpm

glibc-devel-2.17-157.el7.x86_64.rpm

glibc-headers-2.17-157.el7.x86_64.rpm

kernel-headers-3.10.0-514.el7.x86_64.rpm

libmpc-1.0.1-3.el7.x86_64.rpm

mpfr-3.1.1-4.el7.x86_64.rpm

  1. 依次进行安装

rpm -ivh mpfr-3.1.1-4.el7.x86_64.rpm

rpm -ivh libmpc-1.0.1-3.el7.x86_64.rpm

rpm -ivh kernel-headers-3.10.0-514.el7.x86_64.rpm

rpm -ivh glibc-headers-2.17-157.el7.x86_64.rpm

rpm -ivh glibc-devel-2.17-157.el7.x86_64.rpm

rpm -ivh cpp-4.8.5-11.el7.x86_64.rpm

rpm -ivh gcc-4.8.5-11.el7.x86_64.rpm

  1. 都安装成功后,验证gcc -v

3.1.2 安装zlib

因为Redis集群环境需要使用到ruby的接口,需要使用到redis的gem包,而安装gem包时需要有zlib的环境

1、上传zlib-1.2.11.tar.gz到/usr/local目录下

2、解压 tar -xzvf zlib-1.2.11.tar.gz

3、cd zlib-1.2.11

4、./configure --prefix=/usr/local/zlib

(如果报错check for gcc,需要先安装gcc,安装完GCC再来执行)

5、make

6、make install

3.1.3 安装openssl

因为Redis集群环境需要使用到ruby的接口,需要使用到redis的gem包,而安装gem包时需要有openssl的环境

1、上传openssl-1.0.1h.tar.gz到/usr/local/目录下

2、解压 tar -xzvf openssl-1.0.1h.tar.gz

3、cd openssl-1.0.1h/

4、./config -fPIC --prefix=/usr/local/openssl enable-shared

5、./config -t

6、make && make install

7、which openssl //查看系统openssl的路劲

8、rm -rf /usr/bin/openssl // /usr/bin/openssl是which openssl 查看到的旧版本的openssl的路径

9、cp /usr/local/openssl/bin/openssl /usr/bin/openssl //拷贝新版本的安装路径到系统路径

10、执行openssl version

输出版本信息

3.1.4 安装ruby

在安装Redis集群环境是需要使用到Ruby

1、上传ruby-2.5.7.tar.gz到/usr/local目录下

2、解压 tar -xzvf ruby-2.5.7.tar.gz

3、cd ruby-2.5.7

4、./configure –-prefix=/usr/local/ruby //-prefix是将ruby安装到指定目录

5、make && make install

成功安装如图所示

6、配置环境变量

vi /etc/profile

添加环境变量,如图所示

7、执行命令使配置文件生效

source /etc/profile

8、执行命令校验ruby是否安装成功,安装配置成功会输出ruby版本信息

ruby -v

9、进入/usr/local/ruby-2.5.7/ext/zlib/目录下

cd /usr/local/ruby-2.5.7/ext/zlib/

(备注:/usr/local/ruby-2.5.7这个目录是ruby安装包后解压的目录)

10、执行命令:ruby extconf.rb --with-zlib-include=/usr/local/zlib/include/ --with-zlib-lib=/usr/local/zlib/lib

(备注:/usr/local/zlib是zlib安装目录,命令执行后会生成Makefile文件)

11、打开Makefile文件,找到下面一行(在文件倒数第3行)把路径修改一下

把zlib.o: $(top_srcdir)/include/ruby.h 改zlib.o: ../../include/ruby.h

12、make && make install

13、进入 /usr/local/ruby-2.5.7/ext/openssl/目录下

cd /usr/local/ruby-2.5.7/ext/openssl/

14、执行命令:

ruby extconf.rb --with-openssl-include=/usr/local/openssl/include/ --with-openssl-lib=/usr/local/openssl/lib

(备注:/usr/local/openssl是openssl的安装目录,命令执行后会生成Makefile文件)

15、打开Makefile文件,在topdir = /usr/local/ruby/include/ruby-xxx后面新增一行 top_srcdir = /usr/local/ruby-2.5.7

(备注/usr/local/ruby-2.5.7是ruby解压的目录)

16、make && make install

3.1.5 安装redis-4.1.3.gem

安装集群环境时需要使用到ruby的接口,这个redis-4.1.3.gem提供了这个接口

1、上传redis-4.1.3.gem到/usr/local/目录下

2、执行命令 gem install redis-4.1.3.gem

成功安装如图所示

3.2 安装单机Redis

1、创建/usr/local/redis目录,上传redis-4.0.14.tar.gz至/usr/local/redis目录

2、cd /usr/local/redis

3、解压 tar -xzvf redis-4.0.14.tar.gz

4、cd redis-4.0.14/

5、make && make install

看到如下信息,redis安装成功了

进入安装目录 cd /usr/local/redis/redis-4.0.14

6、修改配置文件redis.conf

bind 127.0.0.1 改为bind 0.0.0.0 【说明:表示所有ip都可以连接这个redis】

daemonize no 改为 daemonize yes 【说明:启动守护进程】

protected-mode yes 改为 protected-mode no 【说明:取消保护模式,如果启用保护模式需要设置密码】

logfile "" 改为 logfile "redis日志存储文件路径" 【说明:指定日志存储路径】

7、启动redis的命令

进入redis安装目录/usr/local/redis/redis-4.0.14,执行如下命令启动redis

redis-server redis.conf

启动后执行如下命令连接redis

redis-cli -p 6379 -h 192.169.1.86

(备注:6379是redis默认端口 192.169.1.86是redis所在服务器ip)

并执行命令set 1 1存入值至redis中测试一下

3.3 部署集群环境

集群模式相当于将数据槽分片。每个节点分一段数据片。这样的话,当一个节点宕机后,这个节点没有备份的话,此段分片将不再可以使用。所以,官方推荐,集群内的每个节点都应该配备一个从节点,作为冷备。

官网推荐的模式,是三主三从的集群部署方式,这里以配置三主三从为例.

需要配置的节点信息

节点名称 端口号 是主是从 所属主节点
Redis7001 7001
Redis7002 7002
Redis7003 7003
Redis7004 7004 Redis7004
Redis7005 7005 Redis7001
Redis7006 7006 Redis7002

1、进入/usr/local/redis/目录

cd /usr/local/redis

2、执行mkdir redis700{1,2,3,4,5,6} 创建文件夹redis7001、redis7002、redis7003、redis7004、redis7005、redis7006

3、将/usr/local/bin/ 目录下的redis-cli和redis-server复制到redis7001、...redis7006目录下

1、在redis7001目录下创建redis.conf文件

vim redis.conf

文件内容

#端口号(6个对应各自的端口号)

port 7001

appendonly yes

#启动集群

cluster-enabled yes

#yes 启用守护进程

daemonize yes

#关联集群配置文件

cluster-config-file "nodes.conf"

#设置超时

cluster-node-timeout 5000

#日志信息

logfile "redis7001.log"

#指定访问地址

bind 0.0.0.0

tcp-keepalive 300

redis7002目录下创建redis.conf文件

文件内容为

port 7002

appendonly yes

cluster-enabled yes

daemonize yes

cluster-config-file "nodes.conf"

cluster-node-timeout 5000

logfile "redis7002.log"

bind 0.0.0.0

tcp-keepalive 300

依次类推,redis7003至redis7006目录下都创建redis.conf文件

每个目录下(redis7001至redis7006)都应该有这三个文件

分别将这6个服务启动起来,启动命令:redis-server redis.conf

一个一个启动有点麻烦,在/usr/local/redis/目录下创建一下sh脚本来启动redis实例

vim startall.sh

cd redis7001

./redis-server redis.conf

cd ..

cd redis7002

./redis-server redis.conf

cd ..

cd redis7003

./redis-server redis.conf

cd ..

cd redis7004

./redis-server redis.conf

cd ..

cd redis7005

./redis-server redis.conf

cd ..

cd redis7006

./redis-server redis.conf

赋予 startall.sh脚本可执行权限

chmod 777 startall.sh

执行 startall.sh脚本

./startall.sh

执行ps -ef|grep redis情况查看redis运行情况,启动成功如图所示

创建集群,将这几个节点加入集群。首先进入redis-trib.rb所在目录

进入/usr/local/redis/redis-4.0.14/src/目录

cd /usr/local/redis/redis-4.0.14/src/

执行如下命令:

./redis-trib.rb create --replicas 1 192.169.1.86:7001 192.169.1.86:7002 192.169.1.86:7003 192.169.1.86:7004 192.169.1.86:7005 192.169.1.86:7006

【备注:192.169.1.86是redis所在服务器ip,注意这个ip不能写127.0.0.1,否则只有本机才能连接】

输入yes 回车 ,redis-trib.rb 开始执行 节点握手槽分配 操作,如图所示加入集群成功

说明:M表示是主节点,S表示是从节点】

执行 集群检查,检查各个 redis 节点占用的 哈希槽(slot)的个数以及 slot 覆盖率。16384 个槽位中,主节点Redis7001主节点Redis7002 和,主节点Redis7003 分别占用了 5461、5462 和 5461 个槽位。

连接集群测试

连接命令:redis-cli -p 其中一个节点的端口 -h 其中一个节点的ip -c

[备注:一定要有-c , -c表示以集群方式连接,没有-c就是单点连接了]

并往redis存一个值进行测试:set a a ,如下图表示成功

3.3 集群环境中每个节点加入密码

加入密码有两种方式:

u 方法一:修改所有Redis集群中的redis.conf配置文件

masterauth 123456 //设置master密码,是为了Salve能够连接上Master

requirepass 123456 //设置Redis访问请求密码

u 方法二:进入各个Redis集群中的实时配置

./redis-cli -c -p 7001 //分别进入各个Redis片机进行各自设置

config set masterauth 123456 

config set requirepass 123456 

config rewrite

注意:各个节点密码都必须一致,否则Redirected就会失败。推荐使用第一种方式。

先关闭所有的redis服务,使用命令 redis-cli -p 7001 shutdown依次将redis实例关闭。经过上面的步骤其实已经生成了相应的节点信息文件(nodes.conf)和数据信息文件(appendonly.aof,dump.rdb)。将所有redis7001 到redis7006的文件夹下的这三个文件都删除,然后修改redis.conf添加密码如图所示

然后找到client.rb文件(可以使用 find / -name “client.rb”命令)然后修改password,如图

然后使用脚本启动所有的集群节点。

再次运行命令 ./redis-trib.rb create --replicas 1 192.169.1.21:7001 192.169.1.21:7002 192.169.1.21:7003 192.169.1.21:7004 192.169.1.21:7005 192.169.1.21:7006 创建集群。

测试集群

使用命令 redis-cli -c -p 7001 设置一个set name song,会提示需要认证 输入auth “123456”即可 ,然后再次set name song 会redirected 到7002,也需要密码 ,当然可以直接再次使用 auth “123456”,这样显得有些繁琐,可以直接使用命令,redis-cli -c -p 7001 -a 123456连接(-a 相当于是输入密码验证),这样就可以直接跳转。如图

加入密码后的关闭redis实例的脚本也要相应的修改一下,加入-a 123456 的参数 修改后内容如下:

Redis集群简介及部署的更多相关文章

  1. Redis集群命令行部署工具

    使用之前准备工作: 1)配置好与端口无关的公共redis.conf文件,和工具放在同一目录下 2)配置好与端口相关的模板redis-PORT.conf文件,也和工具放在同一目录下(部署时PORT会被替 ...

  2. redis集群简介

    1.1        集群的概念 所谓的集群,就是通过添加服务器的数量,提供相同的服务,从而让服务器达到一个稳定.高效的状态. 1.1.1       使用redis集群的必要性 问题:我们已经部署好 ...

  3. Redis集群的分布式部署

    3.2.2:Redis Cluster: Redis  分布式部署方案: 1)  客户端分区:由客户端程序决定 key 写分配和写入的 redis node,但是需要客户端自己处理写入 分配.高可用管 ...

  4. windows下redis集群安装和部署

    1.下载windows版本的Redis 官网只提供linux版本的下载 官网下载地址:http://redis.io/download github下载地址:https://github.com/MS ...

  5. Windows下Redis集群安装与部署

    1.下载 Redis-x64-3.2.100.zip 安装程序 官网下载地址:http://redis.io/download GitHub下载地址:https://github.com/micros ...

  6. Redis集群环境的部署记录

    Redis Cluster终于出了Stable,这让人很是激动,等Stable很久了,所以还是先玩玩. 一. 集群简单概念. Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施( ...

  7. Redis 集群搭建详细指南

    先有鸡还是先有蛋? 最近有朋友问了一个问题,说毕业后去大城市还是小城市?去大公司还是小公司?我的回答都是大城市!大公司! 为什么这么说呢,你想一下,无论女孩男孩找朋友都喜欢找个子高胸大的.同样的道理嘛 ...

  8. Redis 集群搭建(基于Linux)

    一.基础环境 1.虚拟机 VMware 15.x 2.Linux系统,用的是Centos7的Linux系统 3.Redis数据库版本 5.0.3 二.Redis集群简介 1.背景 Redis在3.0版 ...

  9. 这次一定要教会你搭建Redis集群和MySQL主从同步(非Docker)

    前言 一直都想自己动手搭建一个Redis集群和MySQL的主从同步,当然不是依靠Docker的一键部署(虽然现在企业开发用的最多的是这种方式),所以本文就算是一个教程类文章吧,但在动手搭建之前,会先聊 ...

随机推荐

  1. YOLOv1论文解读

    摘要 我们提出一种新的目标检测算法--YOLO.以前有关目标检测的研究将检测转化成分类器来执行.然而,我们将目标检测框架化为空间分隔的边界框及相关的类概率的回归问题.在一次评估中,单个神经网络直接从整 ...

  2. 关闭Linux - centos7的防火墙

    关闭Centos7的防火墙 在每台虚拟机上分别执行以下指令: systemctl stop firewalld.service #停止firewall systemctl disable firewa ...

  3. DEDECMS:解决无法上传图片(在后台插入图片时提示类型不允许)

    在include/uploadsafe.inc.php里把 $imtypes = array ( "image/pjpeg", "image/jpeg", &q ...

  4. vue-cli-----vue实例中template: '<App/>',这样写是什么意思

    我刚开始学,看这个东西看了好久,官网文档的描述我不太理解,今天终于算明白了 官网的描述: 模板将会替换挂载的元素.挂载元素的内容都将被忽略 也就是说:template: '<App/>' ...

  5. C++typename的由来和用法

  6. sqoop使用以及常见问题

    1.hdfs文件的权限问题 问题分析与解决: 根据报错信息是hdfs文件的权限问题,命令进入集群执行的用户为null,而hdfs文件所有者为hdfs. 要么以用户hdfs执行命令,要么调整hdfs文件 ...

  7. 【POJ 2411】【Mondriaans Dream】 状压dp+dfs枚举状态

    题意: 给你一个高为h,宽为w的矩阵,你需要用1*2或者2*1的矩阵填充它 问你能有多少种填充方式 题解: 如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成 ...

  8. AtCoder Beginner Contest 170 D - Not Divisible (数学)

    题意:有一长度为\(n\)的数组,求该数组中有多少元素不能整除其它任一元素的个数. 题解:刚开始写了个分解质因数(我是傻逼),后来发现直接暴力枚举因子即可,注意某个元素出现多次时肯定不满足情况,再特判 ...

  9. SpringBoot引入openfeign 报错:spring-cloud-starter-openfeign:unknown

    现象: 1.maven报错:Cannot resolve org.springframework.cloud:spring-cloud-starter-openfeign:unknown 解决: 在h ...

  10. ASP.Net Core 5.0 MVC中AOP思想的体现(五种过滤器)并结合项目案例说明过滤器的用法

    执行顺序 使用方法,首先实现各自的接口,override里面的方法, 然后在startup 类的 ConfigureServices 方法,注册它们. 下面我将代码贴出来,照着模仿就可以了 IActi ...