NoSQL之 Redis集群_m0_50854537的博客-程序员秘密

技术标签: redis  

案例概述

单节点Redis服务器带来的问题

  • 单点故障,服务不可用
  • 无法处理大量的并发数据请求
  • 数据丢失—大灾难

解决方法

  • 搭建Redis集群

Redis集群知识点

Redis集群介绍

  • Redis集群是一个提供在多个Redis间节点间共享数据的程序集
  • Redis集群并不支持处理多个keys的命令,因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误
  • Redis集群通过分区来提供—定程度的可用性,在实际环境中当某个节点宕机或者不可达的情况下可继续处理命令

Redis集群的优势

  • 自动分割数据到不同的节点上
  • 整个集群的部分节点失败或者不可达的情况下能够继续处理命令

Redis集群的实现方法

  • 有客户端分片
  • 代理分片
  • 服务器端分片

Redis-Cluster数据分片

1:Redis集群没有使用一致性hash,而是引入了哈希槽概念

2:Redis 集群有16384个哈希槽

3:每个key通过CRC16校验后对16384取模来决定放置槽

4:集群的每个节点负责一部分哈希槽

5:以3个节点组成的集群为例

  • 节点A包含0到5500号哈希槽
  • 节点B包含5501到11000号哈希槽
  • 节点C包含11001到16383号哈希槽支持添加或者删除节点

6:添加删除节点无需停止服务

  • 如果想新添加个节点D,需要移动节点A,B,C中的部分槽到D上
  • 如果想移除节点A,需要将A中的槽移到B和C节点上,再将没有任何槽的A节点从集群中移除

Redis-Cluster的主从复制模型

  • 集群中具有A,B,C三个节点,如果节点B失败了,整个集群就会因缺少5501-11000这个范围的槽而不可用
  • 为每个节点添加一个从节点A1,B1,C1,整个集群便有三个master节点和三个slave节点组成在节点B失败后,集群便会选举B1为新的主节点继续服务
  • 当B和B1都失败后,集群将不可用

案例拓扑图

在这里插入图片描述

具体步骤

1:每台服务器导入redis软件包,其中一台主redis要有群集文件
在这里插入图片描述
2:解压缩redis软件包,6台服务器同步操作

[[email protected] ~]# tar zxvf redis-5.0.4.tar.gz

3:配置安装,6台服务器同步操作

[[email protected] ~]# cd redis-5.0.4/
[[email protected] redis-5.0.4]# make
[[email protected] redis-5.0.4]# make PREFIX=/usr/local/redis install

4:链接快捷命令,6台服务器同步操作

[[email protected] ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/

5:设置Redis相关配置文件,6台服务器同步操作

[[email protected] ~]# cd redis-5.0.4/utils/
[[email protected] utils]# ./install_server.sh 
[[email protected] utils]# netstat -anptu | grep redis
tcp        0      0 127.0.0.1:6379        0.0.0.0:*   LISTEN    59531/redis-server 

6:修改主配置文件,6台服务器同步操作

[[email protected] ~]# vi /etc/redis/6379.conf 
cluster-enabled yes
appendonly yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
cluster-require-full-coverage yes

修改IP地址需要每台服务器单独修改

[[email protected] ~]# vi /etc/redis/6379.conf 
bind 20.0.0.10
[[email protected] ~]# vi /etc/redis/6379.conf
bind 20.0.0.11
[[email protected] ~]# vi /etc/redis/6379.conf
bind 20.0.0.12
[[email protected] ~]# vi /etc/redis/6379.conf 
bind 20.0.0.13
[[email protected] ~]# vi /etc/redis/6379.conf 
bind 20.0.0.14
[[email protected] ~]# vi /etc/redis/6379.conf 
bind 20.0.0.15

7:重启服务,6台服务器同步操作

[[email protected] ~]# /etc/init.d/redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[[email protected] ~]# netstat -anptu | grep redis

8:在20.0.0.10服务器上,使用脚本创建群集

[[email protected] ~]# yum -y install ruby rubygems
[[email protected] ~]# gem install redis-3.2.0.gem

9:建立群集

[[email protected] ~]# redis-cli --cluster create --cluster-replicas 1 20.0.0.10:6379 20.0.0.11:6379 20.0.0.12:6379 20.0.0.13:6379 20.0.0.14:6379 20.0.0.15:6379

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 20.0.0.14:6379 to 20.0.0.10:6379
Adding replica 20.0.0.15:6379 to 20.0.0.11:6379
Adding replica 20.0.0.13:6379 to 20.0.0.12:6379
M: 2ce100a99c214bfac23ae1c31b8068e93506615b 20.0.0.10:6379
   slots:[0-5460] (5461 slots) master
M: 5f5ff79b9301f10e175aea6604ff80372d6c97a8 20.0.0.11:6379
   slots:[5461-10922] (5462 slots) master
M: a6234f074de2ee05b4f7c1ba96c8a3e084104dd4 20.0.0.12:6379
   slots:[10923-16383] (5461 slots) master
S: b378987085da43974359cb02bcbc9443e808bb13 20.0.0.13:6379
   replicates a6234f074de2ee05b4f7c1ba96c8a3e084104dd4
S: 5d27b053b2607dfed82f79d29aa2e5c3b8846bc2 20.0.0.14:6379
   replicates 2ce100a99c214bfac23ae1c31b8068e93506615b
S: 1d2b8d8fd38f5e7c2dce00ee43e13f162a18508d 20.0.0.15:6379
   replicates 5f5ff79b9301f10e175aea6604ff80372d6c97a8
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 20.0.0.10:6379)
M: 2ce100a99c214bfac23ae1c31b8068e93506615b 20.0.0.10:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
M: a6234f074de2ee05b4f7c1ba96c8a3e084104dd4 20.0.0.12:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 1d2b8d8fd38f5e7c2dce00ee43e13f162a18508d 20.0.0.15:6379
   slots: (0 slots) slave
   replicates 5f5ff79b9301f10e175aea6604ff80372d6c97a8
S: b378987085da43974359cb02bcbc9443e808bb13 20.0.0.13:6379
   slots: (0 slots) slave
   replicates a6234f074de2ee05b4f7c1ba96c8a3e084104dd4
M: 5f5ff79b9301f10e175aea6604ff80372d6c97a8 20.0.0.11:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 5d27b053b2607dfed82f79d29aa2e5c3b8846bc2 20.0.0.14:6379
   slots: (0 slots) slave
   replicates 2ce100a99c214bfac23ae1c31b8068e93506615b
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

10:测试群集

登录写入一个数据

[[email protected] ~]# redis-cli -h 20.0.0.10 -p 6379 -c
20.0.0.10:6379> set aaa 111
-> Redirected to slot [10439] located at 20.0.0.11:6379
OK

另一台主服务器获取数据

[[email protected] ~]# redis-cli -h 20.0.0.13 -p 6379 -c
20.0.0.13:6379> get aaa
-> Redirected to slot [10439] located at 20.0.0.11:6379
"111"

登录不同服务器获取数据

[[email protected] ~]# redis-cli -h 20.0.0.13 -p 6379 -c
20.0.0.13:6379> get aaa
-> Redirected to slot [10439] located at 20.0.0.11:6379
"111"

查看集群状态

20.0.0.11:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch:2
cluster_stats_messages_ping_sent:5018
cluster_stats_messages_pong_sent:4927
cluster_stats_messages_meet_sent:2
cluster_stats_messages_sent:9947
cluster_stats_messages_ping_received:4923
cluster_stats_messages_pong_received:5020
cluster_stats_messages_meet_received:4
cluster_stats_messages_received:9947

查看节点状态

20.0.0.11:6379> cluster nodes
5d27b053b2607dfed82f79d29aa2e5c3b8846bc2 20.0.0.14:6379@16379 slave 2ce100a99c214bfac23ae1c31b8068e93506615b 0 1608200801776 1 connected
b378987085da43974359cb02bcbc9443e808bb13 20.0.0.13:6379@16379 slave a6234f074de2ee05b4f7c1ba96c8a3e084104dd4 0 1608200799000 3 connected
a6234f074de2ee05b4f7c1ba96c8a3e084104dd4 20.0.0.12:6379@16379 master - 0 1608200801000 3 connected 10923-16383
1d2b8d8fd38f5e7c2dce00ee43e13f162a18508d 20.0.0.15:6379@16379 slave 5f5ff79b9301f10e175aea6604ff80372d6c97a8 0 1608200802783 6 connected
5f5ff79b9301f10e175aea6604ff80372d6c97a8 20.0.0.11:6379@16379 myself,master - 0 1608200801000 2 connected 5461-10922
2ce100a99c214bfac23ae1c31b8068e93506615b 20.0.0.10:6379@16379 master - 0 1608200801000 1 connected 0-5460

11:宕机测试

主服务器停止服务

[[email protected] ~]# pkill redis

查看状态

20.0.0.11:6379> cluster nodes
5d27b053b2607dfed82f79d29aa2e5c3b8846bc2 20.0.0.14:6379@16379 slave 2ce100a99c214bfac23ae1c31b8068e93506615b 0 1608201296530 1 connected
b378987085da43974359cb02bcbc9443e808bb13 20.0.0.13:6379@16379 slave a6234f074de2ee05b4f7c1ba96c8a3e084104dd4 0 1608201297542 3 connected
a6234f074de2ee05b4f7c1ba96c8a3e084104dd4 20.0.0.12:6379@16379 master - 0 1608201298547 3 connected 10923-16383
1d2b8d8fd38f5e7c2dce00ee43e13f162a18508d 20.0.0.15:6379@16379 slave 5f5ff79b9301f10e175aea6604ff80372d6c97a8 0 1608201299558 6 connected
5f5ff79b9301f10e175aea6604ff80372d6c97a8 20.0.0.11:6379@16379 myself,master - 0 1608201294000 2 connected 5461-10922
2ce100a99c214bfac23ae1c31b8068e93506615b 20.0.0.10:6379@16379 master,fail - 1608201280782 1608201277358 1 disconnected 0-5460
备份20.0.0.15以上线
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_50854537/article/details/111317190

智能推荐

[BZOJ1826] 缓存交换_weixin_30338481的博客-程序员秘密

问题描述在计算机中,CPU只能和高速缓存Cache直接交换数据。当所需的内存单元不在Cache中时,则需要从主存里把数据调入Cache。此时,如果Cache容量已满,则必须先从中删除一个。 例如,当前Cache容量为3,且已经有编号为10和20的主存单元。 此时,CPU访问编号为10的主存单元,Cache命中。 接着,CPU访问编号为21的主存单元,那么只需将该主存单元移入Cache中...

OpenCV计算机视觉(四) —— 图像的阈值处理与自适应阈值Otsu_一只会飞的猪️的博客-程序员秘密_otsu自适应

文讲述了图像阈值处理的五种基本方法,同时介绍了自适应阈值方法,针对基本图像阈值处理采用Otsu获取迭代出最佳类间分割阈值,得到最好的阈值处理效果,使得图像分割出的特征更加明显有效。

【python数据结构】多维数组_Zincy星辰的博客-程序员秘密_python多维数组

在程序设计语言中大都提供了数组作为构造数据类型,本章重点讨论数组以及特殊矩阵的存储与寻址。目录数组数组的定义数组的特点数组的基本操作数组的存储结构与寻址一维数组二维数组按行优先存储的寻址矩阵的压缩存储特殊矩阵和稀疏矩阵压缩存储的基本思想对称矩阵三角矩阵下三角矩阵:上三角矩阵:对角矩阵稀疏矩阵转置操作:十字链表本章总结数组数组的定义数组是由一组类型相同的数据元素构成的有序集合,每个数据元素称为一个数...

开个csdn博客试试^_^_SommerRian的博客-程序员秘密

人很懒,在网上填写3行文字就会觉得受不了,不过还是开个博客试试,据说能结交一些朋友,真的吗?

图像分类篇——AlexNet详解_樱花的浪漫的博客-程序员秘密_alexnet图像分类

一、概述AlexNet是由2012年ImageNet竞赛参赛者Hinton和他的学生AlexKrizhevsky设计的。AlexNet在当年赢得了ImageNet图像分类竞赛的冠军,使得CNN成为图像分类问题的核心算法模型,同时引发了神经网络的应用热潮。1.AlexNet的创新作为具有历史意义的网络结构,AlexNet包含以下方面的创新。(1)非线性激活函数ReLU在AlexNet出现之前,sigmoid是最为常用的非线性激活函数。sigmoid函数能够把输入的连续实值压缩到0和...

ROS深度学习——训练环境失败的搭建(二)_我与nano的博客-程序员秘密_ros 深度学习

深度学习文章目录深度学习前言一、环境安装1.安装英伟达显卡驱动二、使用步骤1.引入库2.读入数据总结前言如果想让 YOLO 识别我们指定的目标,那就需要先准备一套数据集,然后 对 YOLO 进行训练,“教会”YOLO 认识这些目标。训练的结果是生成一个.weight 权重文件,等到识别的时候,加载这个权重文件即可识别我们指定的目标。一、环境安装在 x64 平台上安装 Darknet,硬件上需要有 NVIDIA 显卡。自行安装好 Ubuntu 系统后,需要安装 CUDA 和 cuDNN 才能使用 G

随便推点

springboot的RedisTemplate实现分布式锁_long2010110的博客-程序员秘密_redistemplate实现分布式锁

使用RedisTemplate实现分布式锁时,需要配合lua脚本实现,直接看代码。 private static final Long SUCCESS = 1L; /** * 获取锁 * @param lockKey * @param value * @param expireTime:单位-秒 * @return ...

RabbitMQ 版本查询_m0_67393295的博客-程序员秘密_rabbitmq版本查看

RabbitMQ 版本查询1.1 查询当前支持的 RabbitMQ 版本Url:Action请求方法备注SupportRabbitMQVersionGET同步接口Request Params:请求参数数据类型是否必填备注Response Params响应参数数据类型备注SupportVersionSetarray of supportVersionrabbitmq版本信息列表SupportVersionSet响应参数数据类型备注Versionstringrabbitmq版本Disp

【编译原理】简单词法分析程序的实现C语言_..哲的博客-程序员秘密_词法分析程序设计c语言

编译原理课程的实验二:编制简单词法分析程序。实验内容:通过了解词法分析程序的功能,设计词法分析程序,通过逐个字符的扫描和分解,能够识别出一个一个单词以及单词的分类;删除注释并进行词法检查,报告所发现的错误(比如标识符不能以数字开头,123aaa就不是合法的标识符),建立符号表。实验说明:单词通常分为五种类型:(1)基本字:(关键字,保留字)如if else int break等 (2)运算符:如+ - * / = ...

【QML】QML与C++混合编程_半生瓜のblog的博客-程序员秘密_c++和qml混合编程

QML与C++混合编程使用QQuickViewpro文件中添加quick模块#include<QApplication>#include<QQuickView>int main(int argc,char* argv[]){ QApplication app(argc,argv); //加载qml文件到视图 QQuickView view; view.setSource(QUrl("column.qml")); view.sho

禅道程序员的10条原则_骑木马的男孩的博客-程序员秘密

英文原文:The 10 rules of a Zen programmer  在一个阴雨的早上,我坐在桌子旁,开始想如何才能高效的工作。在我成为一个自由职业者之前,我有很长一段时间都很努力工作,但收效甚微。  我在 2006 开始接触禅学。我马上意识到:古代的禅宗大师们几百年前早就已经知道现今的程序员应该如何工作。虽然我很讨厌“如何成为一个更好的程序员”之类的文章,但我仍旧想分享一些我

望的古诗词_wzlsunice88的博客-程序员秘密

《望洞庭》唐代:刘禹锡湖光秋月两相和,潭面无风镜未磨。遥望洞庭山水翠,白银盘里一青螺。《望江南·梳洗罢》唐代:温庭筠梳洗罢,独倚望江楼。过尽千帆皆不是,斜晖脉脉水悠悠。肠断白苹洲。《静夜思》唐:李白,床前明月光,疑是地上霜。举头望明月,低头思故乡。《锦瑟》唐 : 李商隐,锦瑟无端五十弦,一弦一柱思华年。庄生晓梦迷蝴蝶,望帝春心托杜鹃...