redis集群环境配置
为什么需要集群
redis是一个开源的 key->value 高速存储系统,但是由于redis单线程运行,在系统中,只能利用单核的性能
当redis的调用越来越频繁时,可能会出现redis过于繁忙,无法处理数据的情况
这时候,我们就需要使用redis集群去分散redis的压力,利用redis集群,去充分利用cpu核数
redis集群简介
1:redis集群采用p2p模式,也就是集群没有中心服务器,每个节点都是同样的权限,通过访问一个节点,就能获取其他节点的信息
2:redis集群由于是p2p模式,所以需要连接所有的节点,进行不同的操作,也就是你有多少台节点,就得有多少个redis连接
3:为了实现集群的高可用状态,redis的全部节点需要定时的去查询其他节点的状态,如果发现ping不成功,说明这个节点已经可能出现问题了.
但这里有个问题,假设集群ABC,A的网络出现了问题,那A节点会觉得BC都有问题,BC都会觉得A有问题,那这个时候该怎么办呢?
所以redis采用了投票机制,如果超过一半的节点觉得某个节点有问题,那就说明它真的挂了
4:节点挂了会影响集群挂了吗?当集群的某个节点挂了,并且没有额外的从节点提供服务,那整个集群就会直接挂掉
但是如果有从节点,那么从节点可以继续提供部分服务,集群不会直接终止
redis哈希槽
现在我们了解到了redis是p2p去中心化的实现方式,那么,我如果需要set('a','仙士可'),redis会怎么做呢?这里就涉及到了集群哈希槽的知识了
redis集群规定了16384个槽位,这些槽位将会平均分配给不同的节点,
通过对key的取模16384,可获得一个槽位数,这个key将会保存到这个槽位上,然后再根据槽位对应的节点,将数据保存到指定节点中
例如:
1:set('a','仙士可'),
2:对a字符串做crc16算法,再对其取模16384,获得槽位数:15495
3:再根据槽位数,获得指定节点(假设是C节点)
4:连接C节点,进行set a '仙士可'命令发送
5:数据保存到C节点
6:get('a')
7:对a字符串做crc16算法,再对其取模16384,获得槽位数:15495
8:再根据槽位数,获得指定节点(假设是C节点)
9:连接C节点,进行get a命令发送
10:获得具体数据
假如某个节点断线挂了,又没有从节点的话,槽位分配就会出错,所以集群就会挂掉
集群节点
redis搭建集群,最少需要3个主节点,如果需要实现更加稳定,还需要3个从节点(避免主节点断线后集群终止)
所以redis需要启动6个实例.
这边需要注意的一点是,redis存储在内存,利用tcp通信,只能利用单核性能,所以如果需要搭建redis集群,需要注意以下事项:
1:需要多台服务器,或者一台6核以上的服务器搭建集群(充分利用cpu)
2:最好是内网通信,多台服务器也必须采用内网通信(内网带宽更加高)
搭建redis集群实例
好了,现在开始搭建redis集群,首先,我们需要安装redis,这里不多做说明
创建redis集群目录
新增redis-cluster文件夹以及存放6个节点的文件夹,用来存储redis集群节点
|
1
2
3
4
5
6
|
mkdir -p /usr/local/redis-cluster/redis01mkdir -p /usr/local/redis-cluster/redis02mkdir -p /usr/local/redis-cluster/redis03mkdir -p /usr/local/redis-cluster/redis04mkdir -p /usr/local/redis-cluster/redis05mkdir -p /usr/local/redis-cluster/redis06 |
redis复制到集群目录中
把redis-server,redis-cli和redis-conf复制一份到cluster/redis01中 (我这里是直接编译安装的redis)
|
1
|
cp redis-5.0.7/{redis.conf,src/redis-server,src/redis-cli} redis-cluster/redis01/ |
修改redis集群配置
修改目录中的redis.conf的端口,改为你自己喜欢的端口号,比如9001

修改redis.conf的cluster-enabled,改为yes,去掉#号注释

修改为守护进程启动:

这步不做命令示例
每个集群都复制一份redis,并且修改端口
把redis01的文件全部复制到其他文件夹中
|
1
2
3
4
5
|
cp -r redis-cluster/redis01/* redis-cluster/redis02/cp -r redis-cluster/redis01/* redis-cluster/redis03/cp -r redis-cluster/redis01/* redis-cluster/redis04/cp -r redis-cluster/redis01/* redis-cluster/redis05/cp -r redis-cluster/redis01/* redis-cluster/redis06/ |
修改其他5个目录中的conf端口号,改为9002-9006
启动redis集群实例
现在需要编写一个shell,用来启动所有的redis实例,新增startAll.sh文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#!/usr/bin/env bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/binexport PATH;cd /usr/local/redis-cluster/redis01;./redis-server ./redis.conf;cd /usr/local/redis-cluster/redis02;./redis-server ./redis.conf;cd /usr/local/redis-cluster/redis03;./redis-server ./redis.conf;cd /usr/local/redis-cluster/redis04;./redis-server ./redis.conf;cd /usr/local/redis-cluster/redis05;./redis-server ./redis.conf;cd /usr/local/redis-cluster/redis06;./redis-server ./redis.conf; |
给予执行权限并运行:
|
1
|
chmod +x startAll.sh |
注意,如果是windows编辑的这行代码,那需要注意格式问题,可能会执行报错,需要用dos2unix 命令转换一下
这个时候,6个redis服务器已经全部启动完成了,当然,你不一定要在一台服务器上运行6个,你可以再6台不同的服务器运行这6个redis服务器
查看运行情况:

创建redis集群环境
目前,我们已经成功运行了redis的6个实例,现在需要做集群环境,
首先,需要安装ruby环境(redis5.0,该步骤废除,留着是为了记录gem下载地址)
|
1
2
|
yum install rubyyum install rubygems |
离线下载redis.gem文件(redis5.0,该步骤废除,留着是为了记录gem下载地址),
下载地址:https://rubygems.org/gems/redis/versions/3.0.0

需要注意的是,版本需要跟ruby版本对应,我这里下载的是3.3.0,刚好能够安装
安装(redis5.0,该步骤废除,留着是为了记录gem下载地址)
|
1
2
3
4
5
6
|
[root@localhost redis-cluster]# gem install ./redis-3.0.0.gem Successfully installed redis-3.0.0Parsing documentation for redis-3.0.0Installing ri documentation for redis-3.0.01 gem installed[root@localhost redis-cluster]# |
执行搭建集群
还记得之前的redis-cli吗?执行以下命令
|
1
|
./redis-cli --cluster create 127.0.0.1:9001 127.0.0.1:9002 127.0.0.1:9003 127.0.0.1:9004 127.0.0.1:9005 127.0.0.1:9006 --cluster-replicas 1 |
过程中会让你输入yes,输入,然后集群搭建完成

到现在为止,整个集群就已经搭建成功啦!
测试
执行set
|
1
2
3
4
|
[root@localhost redis01]# ./redis-cli -p 9001127.0.0.1:9001> set a 1(error) MOVED 15495 127.0.0.1:9003127.0.0.1:9001> |
这个的意思是,槽位15495需要在9003上面的实例执行
我们再连接9003试试
|
1
2
3
4
|
[root@localhost redis01]# ./redis-cli -p 9003127.0.0.1:9003> set a 1OK127.0.0.1:9003> |
到目前为止,整个集群已经搭建成功了
查看集群:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
127.0.0.1:9003> cluster infocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:3cluster_stats_messages_ping_sent:230cluster_stats_messages_pong_sent:228cluster_stats_messages_meet_sent:4cluster_stats_messages_sent:462cluster_stats_messages_ping_received:225cluster_stats_messages_pong_received:234cluster_stats_messages_meet_received:3cluster_stats_messages_received:462127.0.0.1:9003> |
其他补充
前面教大家如何快速的创建一个集群,现在有一些点需要完善补充的,省得后面有坑哦!
集群配置项
在上面,我只讲到了端口配置以及开启集群,但是还有一些配置项需要注意配置的,虽然不配置也能运行集群
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
port 9001 #端口号 loglevel notice #日志的记录级别,notice是适合生产环境的 logfile "Logs/redis9001_log.txt" #指定log的保持路径,默认是创建在Redis安装目录下,如果有子目录需要手动创建,如此处的Logs目录 syslog-enabled yes #是否使用系统日志 syslog-ident redis9001 #在系统日志的标识名 appendonly yes #数据的保存为aof格式 appendfilename "appendonly.9001.aof" #数据保存文件 cluster-enabled yes #是否开启集群 cluster-config-file nodes.9001.conf cluster-node-timeout 15000 cluster-slave-validity-factor 10 cluster-migration-barrier 1 cluster-require-full-coverage yes |
集群ip
需要注意的是,我们配置的ip都是默认,127.0.0.1,当需要多台服务器开启集群,或者内网集群时,需要修改ip为内网/外网ip号,确保redis节点能互相创建,否则集群无法连接,无法创建成功
本文为仙士可原创文章,转载无需和我联系,但请注明来自仙士可博客www.php20.cn
redis集群环境配置的更多相关文章
- SpringBoot系列教程之Redis集群环境配置
之前介绍的几篇redis的博文都是基于单机的redis基础上进行演示说明的,然而在实际的生产环境中,使用redis集群的可能性应该是大于单机版的redis的,那么集群的redis如何操作呢?它的配置和 ...
- redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用
目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...
- Spring-Session实现Session共享Redis集群方式配置教程
循序渐进,由易到难,这样才更有乐趣! 概述 本篇开始继续上一篇的内容基础上进行,本篇主要介绍Spring-Session实现配置使用Redis集群,会有两种配置方式,一种是Redis-Cluster, ...
- 带你自行搭建虚拟机和Redis集群环境,值得收藏!
前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...
- Redis集群环境之linux搭建多机版---已完结,跟着一步一步来你就可以集群成功
上一篇踩着各种坑写了Redis集群环境之linux搭建单机版,这一篇准备就多机版集群进行搭建,主要目的一来是在上一篇的基础上进行精华提粹总结,二来是把单机版与多机版的区别进行记录. 首先软硬件环境: ...
- Redis集群环境搭建实践
0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...
- centos7 快速搭建redis集群环境
本文主要是记录一下快速搭建redis集群环境的方式. 环境简介:centos 7 + redis-3.2.4 本次用两个服务6个节点来搭建:192.168.116.120 和 192.168.1 ...
- Redis集群的配置
[转]Redis集群的配置 一:memcache 和 Redis 对比总结 [memecache 特点] 1:速度最快(没有自测,但网上有详细的测试用例) 2:支持水平扩展,可以任意添加节点 [red ...
- EHCache分布式缓存集群环境配置
EHCache分布式缓存集群环境配置 ehcache提供三种网络连接策略来实现集群,rmi,jgroup还有jms.同时ehcache可以可以实现多播的方式实现集群,也可以手动指定集群主机序列实现集群 ...
随机推荐
- 云原生ASP.NET Core程序的可监测性和可观察性
分布式应用程序很复杂,给开发人员调试和修复生产问题带来了一系列挑战.尽管微服务架构可帮助维持一支规模较小,可以自主工作并专注于独立业务团队,但由于其分布式性质,它带来了新的挑战.例如,在业务交易过程中 ...
- .NET6系列:Visual Studio 2022 线路图
系列目录 [已更新最新开发文章,点击查看详细] 在上一篇博客<Visual Studio 2022>中介绍了VS2022的性能改进与重要功能.本文主要介绍在 Visual Stud ...
- Java - Java 8 新特性
一.Java8新特性 Java8概述:Java8,也就是jdk1.8版本,是意义深远的一个新版本.是Java5之后一个大的版本升级,让Java语言和库仿佛获得了新生. 二.Lambda表达式 Lamb ...
- hive的排序 order by和sort by
在算法中,各个排序算法的复杂度都比较高,正常情况下为O (nlogn) ,所以当数据量特别大的时候,对数组进行排序消耗都很大. 因为hive的计算引擎MapReduce是分布式系统, 利用分布式的特点 ...
- Navigation 实现不同fragment之间的view的共享(含动画过渡)
以imageView的共享举例 两个fragment都要有各自的imageview视图,id可以不同,但transitonName一定要相同, 都要指定相同的src 例如: fragment A &l ...
- 痞子衡嵌入式:串行NAND Flash的两大特性导致其在i.MXRT FlexSPI下无法XiP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是串行NAND Flash的两大特性导致其在i.MXRT FlexSPI下无法XiP. 在嵌入式世界里,当我们提起XiP设备(支持代码原地 ...
- leetcode中Java关于Json处理的依赖
leetcode的java代码提供的main函数中,往往有关于json的依赖...我找了许久才找到他们用的是这个json实现 <dependency> <groupId>com ...
- 可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读
可视化反投射:坍塌尺寸的概率恢复:ICCV9论文解读 Visual Deprojection: Probabilistic Recovery of Collapsed Dimensions 论文链接: ...
- 为x86 CPU自动调度神经网络
为x86 CPU自动调度神经网络 对特定设备和工作负载进行自动调试对于获得最佳性能至关重要.这是有关如何使用自动调度器为x86 CPU调试整个神经网络的文档. 为了自动调试神经网络,将网络划分为小的子 ...
- GVS智能照明再下一城,前方到站贵阳地铁2号线!
近期,"新基建"又频频刷屏,也为城轨交通建设快速发展提供了广阔的想象空间. 在新基建的导向作用下,越来越多城市加入地铁阵营.如果说普铁和高铁作为城市的发展窗口,那么地铁则是城市交通 ...