NoSQL之 Redis集群-程序员宅基地

技术标签: 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台服务器同步操作

[root@redis1 ~]# tar zxvf redis-5.0.4.tar.gz

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

[root@redis1 ~]# cd redis-5.0.4/
[root@redis1 redis-5.0.4]# make
[root@redis1 redis-5.0.4]# make PREFIX=/usr/local/redis install

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

[root@redis1 ~]# ln -s /usr/local/redis/bin/* /usr/local/bin/

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

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

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

[root@slave3 ~]# 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地址需要每台服务器单独修改

[root@redis1 ~]# vi /etc/redis/6379.conf 
bind 20.0.0.10
[root@redis2 ~]# vi /etc/redis/6379.conf
bind 20.0.0.11
[root@redis3 ~]# vi /etc/redis/6379.conf
bind 20.0.0.12
[root@slave1 ~]# vi /etc/redis/6379.conf 
bind 20.0.0.13
[root@slave2 ~]# vi /etc/redis/6379.conf 
bind 20.0.0.14
[root@slave3 ~]# vi /etc/redis/6379.conf 
bind 20.0.0.15

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

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

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

[root@redis1 ~]# yum -y install ruby rubygems
[root@redis1 ~]# gem install redis-3.2.0.gem

9:建立群集

[root@redis1 ~]# 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:测试群集

登录写入一个数据

[root@redis1 ~]# 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

另一台主服务器获取数据

[root@redis3 ~]# 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"

登录不同服务器获取数据

[root@redis2 ~]# 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:宕机测试

主服务器停止服务

[root@redis1 ~]# 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

智能推荐

从零开始搭建Hadoop_创建一个hadoop项目-程序员宅基地

文章浏览阅读331次。第一部分:准备工作1 安装虚拟机2 安装centos73 安装JDK以上三步是准备工作,至此已经完成一台已安装JDK的主机第二部分:准备3台虚拟机以下所有工作最好都在root权限下操作1 克隆上面已经有一台虚拟机了,现在对master进行克隆,克隆出另外2台子机;1.1 进行克隆21.2 下一步1.3 下一步1.4 下一步1.5 根据子机需要,命名和安装路径1.6 ..._创建一个hadoop项目

心脏滴血漏洞HeartBleed CVE-2014-0160深入代码层面的分析_heartbleed代码分析-程序员宅基地

文章浏览阅读1.7k次。心脏滴血漏洞HeartBleed CVE-2014-0160 是由heartbeat功能引入的,本文从深入码层面的分析该漏洞产生的原因_heartbleed代码分析

java读取ofd文档内容_ofd电子文档内容分析工具(分析文档、签章和证书)-程序员宅基地

文章浏览阅读1.4k次。前言ofd是国家文档标准,其对标的文档格式是pdf。ofd文档是容器格式文件,ofd其实就是压缩包。将ofd文件后缀改为.zip,解压后可看到文件包含的内容。ofd文件分析工具下载:点我下载。ofd文件解压后,可以看到如下内容: 对于xml文件,可以用文本工具查看。但是对于印章文件(Seal.esl)、签名文件(SignedValue.dat)就无法查看其内容了。本人开发一款ofd内容查看器,..._signedvalue.dat

基于FPGA的数据采集系统(一)_基于fpga的信息采集-程序员宅基地

文章浏览阅读1.8w次,点赞29次,收藏313次。整体系统设计本设计主要是对ADC和DAC的使用,主要实现功能流程为:首先通过串口向FPGA发送控制信号,控制DAC芯片tlv5618进行DA装换,转换的数据存在ROM中,转换开始时读取ROM中数据进行读取转换。其次用按键控制adc128s052进行模数转换100次,模数转换数据存储到FIFO中,再从FIFO中读取数据通过串口输出显示在pc上。其整体系统框图如下:图1:FPGA数据采集系统框图从图中可以看出,该系统主要包括9个模块:串口接收模块、按键消抖模块、按键控制模块、ROM模块、D.._基于fpga的信息采集

微服务 spring cloud zuul com.netflix.zuul.exception.ZuulException GENERAL-程序员宅基地

文章浏览阅读2.5w次。1.背景错误信息:-- [http-nio-9904-exec-5] o.s.c.n.z.filters.post.SendErrorFilter : Error during filteringcom.netflix.zuul.exception.ZuulException: Forwarding error at org.springframework.cloud..._com.netflix.zuul.exception.zuulexception

邻接矩阵-建立图-程序员宅基地

文章浏览阅读358次。1.介绍图的相关概念  图是由顶点的有穷非空集和一个描述顶点之间关系-边(或者弧)的集合组成。通常,图中的数据元素被称为顶点,顶点间的关系用边表示,图通常用字母G表示,图的顶点通常用字母V表示,所以图可以定义为:  G=(V,E)其中,V(G)是图中顶点的有穷非空集合,E(G)是V(G)中顶点的边的有穷集合1.1 无向图:图中任意两个顶点构成的边是没有方向的1.2 有向图:图中..._给定一个邻接矩阵未必能够造出一个图

随便推点

MDT2012部署系列之11 WDS安装与配置-程序员宅基地

文章浏览阅读321次。(十二)、WDS服务器安装通过前面的测试我们会发现,每次安装的时候需要加域光盘映像,这是一个比较麻烦的事情,试想一个上万个的公司,你天天带着一个光盘与光驱去给别人装系统,这将是一个多么痛苦的事情啊,有什么方法可以解决这个问题了?答案是肯定的,下面我们就来简单说一下。WDS服务器,它是Windows自带的一个免费的基于系统本身角色的一个功能,它主要提供一种简单、安全的通过网络快速、远程将Window..._doc server2012上通过wds+mdt无人值守部署win11系统.doc

python--xlrd/xlwt/xlutils_xlutils模块可以读xlsx吗-程序员宅基地

文章浏览阅读219次。python–xlrd/xlwt/xlutilsxlrd只能读取,不能改,支持 xlsx和xls 格式xlwt只能改,不能读xlwt只能保存为.xls格式xlutils能将xlrd.Book转为xlwt.Workbook,从而得以在现有xls的基础上修改数据,并创建一个新的xls,实现修改xlrd打开文件import xlrdexcel=xlrd.open_workbook('E:/test.xlsx') 返回值为xlrd.book.Book对象,不能修改获取sheett_xlutils模块可以读xlsx吗

关于新版本selenium定位元素报错:‘WebDriver‘ object has no attribute ‘find_element_by_id‘等问题_unresolved attribute reference 'find_element_by_id-程序员宅基地

文章浏览阅读8.2w次,点赞267次,收藏656次。运行Selenium出现'WebDriver' object has no attribute 'find_element_by_id'或AttributeError: 'WebDriver' object has no attribute 'find_element_by_xpath'等定位元素代码错误,是因为selenium更新到了新的版本,以前的一些语法经过改动。..............._unresolved attribute reference 'find_element_by_id' for class 'webdriver

DOM对象转换成jQuery对象转换与子页面获取父页面DOM对象-程序员宅基地

文章浏览阅读198次。一:模态窗口//父页面JSwindow.showModalDialog(ifrmehref, window, 'dialogWidth:550px;dialogHeight:150px;help:no;resizable:no;status:no');//子页面获取父页面DOM对象//window.showModalDialog的DOM对象var v=parentWin..._jquery获取父window下的dom对象

什么是算法?-程序员宅基地

文章浏览阅读1.7w次,点赞15次,收藏129次。算法(algorithm)是解决一系列问题的清晰指令,也就是,能对一定规范的输入,在有限的时间内获得所要求的输出。 简单来说,算法就是解决一个问题的具体方法和步骤。算法是程序的灵 魂。二、算法的特征1.可行性 算法中执行的任何计算步骤都可以分解为基本可执行的操作步,即每个计算步都可以在有限时间里完成(也称之为有效性) 算法的每一步都要有确切的意义,不能有二义性。例如“增加x的值”,并没有说增加多少,计算机就无法执行明确的运算。 _算法

【网络安全】网络安全的标准和规范_网络安全标准规范-程序员宅基地

文章浏览阅读1.5k次,点赞18次,收藏26次。网络安全的标准和规范是网络安全领域的重要组成部分。它们为网络安全提供了技术依据,规定了网络安全的技术要求和操作方式,帮助我们构建安全的网络环境。下面,我们将详细介绍一些主要的网络安全标准和规范,以及它们在实际操作中的应用。_网络安全标准规范