当前位置: 首页 > 编程日记 > 正文

Redis初学17:集群

集群

简介

Redis 集群实现了对Redis的水平扩容,即启动 N 个 redis 节点,将整个数据库分布存储在这 N 个节点中,每个节点存储总数据的 1/N 。
Redis 集群通过分区(partition)来提供一定程度的可用性(availability): 即使集群中有一部分节点失效或者无法进行通讯, 集群也可以继续处理命令请求。

集群搭建

这次因为电脑性能渣渣,开不了那么多台虚拟机,就在一台服务器上模拟了。

集群的搭建最少需要6个节点

我们既然要搭建集群,那么master节点至少要3个,slave节点也是3个,为什么呢?
这是因为一个redis集群如果要对外提供可用的服务,那么集群中必须要有过半的master节点正常工作!!!
基于这个特性,如果想搭建一个能够允许 n 个master节点挂掉的集群,那么就要搭建2n+1个master节点的集群。

所以综上,易得至少需要6个节点才能搭建一个redis集群。

redis集群搭建流程

  1. 配置基本信息
    我这里弄了6个配置文件,分别是redis6370.conf(6379端口)、redis6371.conf(6371端口)、redis6380.conf(6380端口)、redis6381.conf(6381端口)、redis6390.conf(6390端口)、redis6391.conf(6391端口),拿redis6370.conf举例,里面的配置如下:
include /www/wwwroot/Redis学习/redis.confport 6370pidfile "/var/run/redis_6370.pid"dbfilename "dump6370.rdb"dir "/www/wwwroot/Redis学习/集群/6370"logfile "/www/wwwroot/Redis学习/集群/log/redis_err_6370.log"# 打开集群模式
cluster-enabled yes# 设定节点配置文件名
cluster-config-file nodes-6370.conf# 设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
cluster-node-timeout 15000

注意:使用的是阿里云服务器的同学还需要开放服务器和阿里云安全组中对应的端口。

  1. 启动上述6个节点的redis服务
  2. 将六个节点合成一个集群
    所有节点启动好后,我们去你安装redis的目录底下,找到src目录。
    在src目录底下,输入以下命令创建集群
redis-cli --cluster create --cluster-replicas 1 118.31.109.17:6370 118.31.109.17:6380 118.31.109.17:6390 118.31.109.17:6371 118.31.109.17:6381 118.31.109.17:6391 -a 123456

注意:这里用的必须是你本机的ip地址。
说明:
前面三个是master代表的是,后面三个是slave;
“-a”后面是你设置的redis的密码,有密码的情况下得加,不然会报以下错误:
在这里插入图片描述
输入之后如下图:
在这里插入图片描述
有一个要你确认的步骤,输入yes确认。

注意:到了这里你可能会遇到一种情况,显示Waiting for the cluster to join并一直等待,如下图:
在这里插入图片描述
原因:
redis集群不仅需要开通redis客户端连接的端口,而且需要开通集群总线端口,集群总线端口为redis客户端连接的端口 + 10000
如:redis端口为6379,则集群总线端口为16379
故所有服务器的点需要开通redis的客户端连接端口和集群总线端口。如果有安全组,也要放开这两个端口

搭建集群成功,会显示关于集群里面服务器的信息,如下图:
在这里插入图片描述
这里我们把 All 16384 slots covered 这一行记一下,我们后面还会讲到。

集群的使用

集群登录

我们之前是使用redis-cli -p port的方式登录的,在集群中使用这种方式登录,可能直接进入读主机,存储数据时,会出现MOVED重定向操作。所以,应该以集群方式登录。

所以我们采用集群的方式登录,如下:

redis-cli -c -p port

说明:–c 参数实现自动重定向
这样设置数据时会自动切换到相应的写主机。

查看集群信息

我们可以通过cluster nodes命令查看集群的信息,如下图:
在这里插入图片描述
redis cluster 如何分配这六个节点?
一个集群至少要有三个主节点。
而我们之前搭建集群的命令中选项 --cluster-replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。
所以这也说明了搭建集群还是最少得要有6个节点。

分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

什么是slots

我们上面在搭建完集群之后记录了一行内容,All 16384 slots covered,现在来说说它是什么意思。

一个 Redis 集群包含 16384 个插槽(hash slot),数据库中的每个键都属于这 16384 个插槽的其中一个,
集群使用公式 CRC16(key) % 16384 来计算键 key 属于哪个槽, 其中 CRC16(key) 语句用于计算键 key 的 CRC16(循环冗余校检) 校验和 。

集群中的每个节点负责处理一部分插槽。
举个例子, 如果一个集群可以有主节点, 其中:
节点 A 负责处理 0 号至 5460 号插槽。
节点 B 负责处理 5461 号至 10922 号插槽。
节点 C 负责处理 10923 号至 16383 号插槽。
如下图:
在这里插入图片描述

在集群中插入值

在集群中插入值跟我们平常一台主机插入值有稍微一点不同。
在集群中每次录入、查询键值,redis都会计算出该key应该送往的插槽,如果不是该客户端对应服务器的插槽,redis会报错,并告知应前往的redis实例地址和端口。

在集群中插入值这个过程就是计算你key的插槽,然后匹配到相应的redis节点中去获取value.
如下图:
在这里插入图片描述

上图中我们插入一个新值key1,然后经过计算之后得出的插槽值为9189,根据每台主机分配到的插槽范围,将这个值放到对应插槽范围的主机中去,如:9189就属于6380端口底下的主机所在的插槽,所以这个插入值就被分配到6380端口所在的主机中去了

那如果我们插入多个key和value呢?
答案:不在一个slot下的键值,是不能使用mget,mset等多键操作,如下图:
在这里插入图片描述
但是我们可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去,如下图:
在这里插入图片描述

redis集群的好处与不足

好处

  • 实现扩容
  • 分摊压力
  • 无中心配置相对简单

不足

  • 多键操作是不被支持的
  • 多键的Redis事务是不被支持的。lua脚本不被支持

相关文章:

怒刷web前端笔试面试题(一)

2019独角兽企业重金招聘Python工程师标准>>> 1.有这么一段HTML&#xff0c;请挑毛病&#xff1a; <P> 哥写的不是HTML&#xff0c;是寂寞。<br><br> 我说&#xff1a;<br>不要迷恋哥&#xff0c;哥只是一个传说 考点1&#xff1a;html和 …

libcudart.so.6.5 cannot open shared object file: no such file or directory

在matlab中运行程序是可能出现libcudart.so.6.5 libcublas.so.6.5 libcurand.so.6.5 等一系列libcu*.so.版本号 找不到的问题。 解决方案是在/usr/local/cuda-版本号/ 目录下搜索到程序找不到的那个文件&#xff0c;然后做一个软连接到matlab目录。 以找不到libcudart.so.6.…

Python中完整的机器学习数据科学课程

学习每个机器学习模型背后的数学&#xff0c;然后用Python实现它 你会学到: 开发机器学习模型 创建机器学习模型的模板 学习每个机器学习模型背后的数学 要求: Python或任何编程语言的基础 时长:8h 15m |视频:. MP4&#xff0c;1280720 30 fps |音频:AAC&#xff0c;44.1 kHz…

Android 高清加载巨图方案 拒绝压缩图片

Android 高清加载巨图方案 拒绝压缩图片 转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/49300989&#xff1b; 本文出自:【张鸿洋的博客】 一、概述 距离上一篇博客有段时间没更新了&#xff0c;主要是最近有些私事导致的&#xff0c;那么就先…

Docker初学1:初识Docker

前言&#xff1a;本博客内容是对【狂神说Java】中的Docker教程学习过程中的记录与总结 Docker的历史 Docker公司 Docker 公司位于旧金山&#xff0c;由法裔美籍开发者和企业家 Solumon Hykes 创立&#xff0c;其标志如下图所示。 Docker 公司起初是一家名为 dotCloud 的平台即…

Cstring的使用

https://msdn.microsoft.com/zh-cn/aa315043 1、字符串提取函数&#xff0c;CString::Left、CString::Mid 、CString::Right CString::Mid CString Mid( int nFirst ) const; throw( CMemoryException ); CString Mid( int nFirst, int nCount ) const; throw( CMemoryExcepti…

facebook maskrcnn 安装笔记

当前版本的maskrcnn严重依赖pythorch_nightly 1.0.0, 安装过程中一不留神会由于各个包之间不兼容导致no module named maskrcnn_benchmark. 注意以下三点即可&#xff1a; 1. 先安装ipython 2. 再单独安装torchvision。 conda install torchvision 3. 最后本地安装pytorch-…

Python完全学习大师班

面向所有人的Python:基础、中级和高级概念学习制作游戏和实时应用程序 你会学到: 从头开始学习Python 学习中级和高级概念 学习用Python制作实时应用程序 学习用Python制作游戏 要求 不需要编程经验:你将从头开始学习课程中的所有内容 MP4 |视频:h264&#xff0c;1280720 |音…

Docker初学2:Docker的安装

Docker的安装 Docker的架构图 我们先来介绍一下上面这张Docker架构图 镜像&#xff08;image&#xff09;&#xff1a; Docker 镜像&#xff08;Image&#xff09;就是一个只读的模板。镜像可以用来创建 Docker 容器&#xff0c;一个镜像可以创建很多容器。 就好似 Java 中的…

[ME]不知道第几次学c语言,仍觉得水深莫测

首先声明这篇东西是个人的碎碎念&#xff0c;没有任何干货。 接下c语言课助教的活儿时还没什么感觉&#xff0c;快要开学了&#xff0c;才感觉到紧张&#xff0c;逼着自己开始看老师发来的课件&#xff0c;说是查错&#xff0c;其实算是自己再好好学一遍&#xff0c;免得到时候…

MYSQL 主从复制 --- binlog

在 Master 端并不 Care 有多少个 Slave 连上了自己,只要有 Slave 的 IO 线程通过了连接认证,向他请求指定位置之后的 Binary Log 信息,他就会按照该 IO 线程的要求,读取自己的 Binary Log 信息,返回给 Slave 的 IO 线程。默认MySQL是未开启该日志的。如果读压力加大,就需要更多的 slave 来解决,但是如果slave的复制全部从 master 复制,势必会加大 master 的复制IO的压力,所以就出现了级联复制,减轻 master 压力。

深入理解Oracle RAC 12c 笔记

深入理解Oracle RAC 12c 跳转至&#xff1a; 导航、 搜索文件夹 1 概述2 集群件管理和故障诊断3 执行实践4 新特性5 存储和ASM6 应用设计上的问题7 管理和调优一个复杂的RAC环境8 备份与恢复9 网络实践10 优化RAC数据库11 锁与死锁12 并行查询13 集群件和数据库升级14 RAC One …

MySQL 中 is null 和 =null 的区别

如果 set ANSI_NULLS为 ON 时,表示SQL语句遵循SQL-92标准;如果 set ANSI_NULLS 为 OFF 时,表示不遵从 SQL-92 标准。但SQL-92 标准要求对null的 = 或不等于 (!= ,) 比较取值都为 false,也就是 =null 或者 null,返回的都是false。null 在MySQL中不代表任何值,通过运算符是得不到任何结果的,因此只能用 is null(默认情况)MySQL 中 null 不代表任务实际的值,类似于一个未知数。

Back Propagation Nerual Networks

1 BP神经网络的优缺点及优化 1.1 BP神经网络的优点 由于预测的随机性和不确定性&#xff0c;传统的回归分析、数理统计等方法往往难以达到理想的预测效果。BP神经网络(Back一Propagation Network&#xff0c;BP)是人工神经网络(Artificial Neural Network&#xff0c;ANN)中应…

OpenCV和Python动手操作计算机视觉学习教程

使用OpenCV和Python进行实际操作 面向初学者的OpenCV Python动手操作计算机视觉 你会学到: NumPy基础知识 基于OpenCV的人脸检测 使用OpenCV在图像和视频上绘制形状 使用OpenCV进行平滑、模糊、阈值和形态学操作 基于OpenCV的目标跟踪 带有OpenCV的直方图 使用OpenCV查找车道线…

Docker初学3:Docker的常用命令

Docker的常用命令 帮助命令 帮助命令可以在我们遇到不懂的命令时帮助我们去了解它们怎么使用。 docker version # 显示 Docker 版本信息。 docker info # 显示 Docker 系统信息&#xff0c;包括镜像和容器数。。 docker --help # 帮助镜像命令 docker images doc…

fastJson的使用

Movie MovieJSON.parseObject(result, Movie.class); Toast.makeText(MainActivity.this, Movie.getDir()Movie.getNm()Movie.getPhotos().size(), 0).show(); 对于jsonArray,也就是先得到具体的某一个jsonarray,然后parseArray. JSONObject object new JSONObject(arg0); …

【C#】ASP.NET网页中添加单点登录功能

背景 首先&#xff0c;要说明的是&#xff0c;原先需求定义的是&#xff0c;同一个账号只能同时有一个人来登录&#xff0c;如果另外一个登录的话&#xff0c;前一个登陆者就自动被踢掉。本来原先要做成存储到服务器的数据库中&#xff0c;但是后来如果是非正常退出的话 下次就…

基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV

实现12种不同的算法来跟踪视频和网络摄像头中的对象&#xff01; 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区别 要求 程序设计逻辑 基本Python编程 MP4 |视频:h264&#xff0c;128…

【12】AngularJS 事件

AngularJS 事件 AngularJS 有自己的 HTML 事件指令。 ng-click 指令 ng-click 指令定义了 AngularJS 点击事件。 <div ng-app"" ng-controller"myCtrl"><button ng-click"count count 1">点我&#xff01;</button><p>…

Docker初学4:下载运行一些必要的镜像

下载运行一些必要的镜像 下载运行nginx # 下载命令 docker pull nginx# 试运行 # -d 后台运行 # --name 设置容器名称 # -p 设置开放的端口号&#xff0c;宿主机端口端口号、容器端口号 [rootiZh40ti53pk77iZ blog]# docker run -d --name nginx01 -p 8083:80 nginx be2700af…

实验1 命令解释程序的编写

实验1 命令解释程序的编写 一、 实验目的 &#xff08;1&#xff09;掌握命令解释程序的原理&#xff1b; &#xff08;2&#xff09;掌握简单的DOS调用方法&#xff1b; &#xff08;3&#xff09;掌握C语言编程初步。 二、 实验内容和要求 1、实验内容&#xff1a;根据教师指…

人工神经网络:感知器

人工神经网络&#xff1a;感知器 1.1 基本概念 1、输入节点&#xff1a;X1{x1,x2,x3,...,xi,...xn},for example&#xff0c;X1[1 2]; 2、输出节点&#xff1a;y{y1,y2},for example,y[0 1]; 3、权值&#xff1a;W{w1,w2,w3,...,wi,...,wn},for example,W[1 1];感知器学习规则…

基于Python的完全监督机器学习教程 Complete Supervised Machine Learning With Python

这门由行业和学术领袖开设的课程是为那些希望在数据科学领域建立有价值的职业生涯的人开设的 你会学到: 监督学习和非监督学习的原理及其区别。 线性和逻辑回归&#xff0c;决策树&#xff0c;回归树&#xff0c;随机森林&#xff0c;判别分析&#xff0c;支持向量机&#xff…

「UI 测试自动化selenium」汇总

《selenium 基础之java实现》 selenium RC 环境配置 菜鸟学自动化测试&#xff08;一&#xff09;----selenium IDE 菜鸟学自动化测试&#xff08;二&#xff09;----selenium IDE 功能扩展 菜鸟学自动化测试&#xff08;三&#xff09;----selenium 命令 菜鸟学自动化测试&…

Docker初学5:下载安装可视化图形工具Portainer

下载安装可视化图形工具Portainer # 搜索Portainer [rootiZh40ti53pk77iZ ~]# docker search portainer NAME DESCRIPTION STARS OFFICIAL AUTOMATED portainer/portainer This Repo is …

dropbear编译安装及服务脚本编写

编译安装下载dropbear、并解压# wget http://matt.ucc.asn.au/dropbear/releases/dropbear-2015.67.tar.bz2 # tar xvf dropbear-2015.67.tar.bz2 # cd dropbear-2015.67 # ./configure --prefix/usr/local/dropbear --sysconfdir/etc/dropbear编译安装dropbear&#xff0c;要…

系统动力学_System Dynamics

1 系统动力学概述 系统动力学的创建标志是Jay.W.Forrester教授的Industrial Dynomics专著于1961年的出版。 1.1 系统动力学的基本概念&#xff08;Basic Concept of System Dynamics&#xff09; &#xff08;1&#xff09;事件&#xff1a;是指一般在固定的时间或地点上发生…

完整的Python 3和树莓Pi大师课 Complete Python 3 and Raspberry Pi Masterclass

在一门课程中学习Python 3基础、高级Python、科学Python、树莓Pi和硬件项目 你会学到: Python 3基础 Python 3高级概念 树莓皮的设置和使用 科学巨蟒生态系统 NumPy和Matplotlib基础 图像处理 机器学习和数据科学基础 使用MySQL、Excel、明文和CSV Python发行版 树莓皮的硬件及…

JVM学习1:JVM和Java体系结构

JVM和Java体系结构 计算机本身是不识别高级语言的&#xff0c;这个大家应该都知道&#xff0c;我们的Java、C、Python这些代码都要执行下面的一个流程 随着Java7发布以后&#xff0c;Java虚拟机可以根据JSR-292标准实现在Java虚拟机平台上运行非Java的语言编写的程序&#xff…