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

Redis的集群模式

集群

即使使用哨兵,此时的Redis集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于可用存储内存最小的数据库节点,形成木桶效应。由于Redis中的所有数据都是基于内存存储,这一问题就尤为突出了尤其是当使用Redis做持久化存储服务使用时。
对Redis进行水平扩容,在旧版Redis中通常使用客户端分片来解决这个问题,即启动多个Redis数据库节点,由客户端决定每个键交由哪个数据库节点存储,下次客户端读取该键时直接到该节点读取。这样可以实现将整个数据分布存储在N个数据库节点中,每个节点只存放总数据量的1/N。但对于需要扩容的场景来说,在客户端分片后,如果想增加更多的节点,就需要对数据进行手工迁移,同时在迁移的过程中为了保证数据的一致性,还需要将集群暂时下线,相对比较复杂。考虑到Redis实例非常轻量的特点,可以采用预分片技术(presharding)来在一定程度上避免此问题,具体来说是在节点部署初期,就提前考虑后的存储规模,建立足够多的实例(如128个节点),初期时数据很少,所以每个节点存储的数据也非常少,但由于节点轻量的特性,数据之外的内存幵销并不大,这使得只需要很少的服务器即可运行这些实例。曰后存储规模扩大后,所要做的不过是将某些实例迁移到其他服务器上,而不需要对所有数据进行重新分片并进行集群下线和数据迁移了。
无论如何,客户端分片终归是有非常多的缺点,比如维护成本高,增加、移除节点较繁琐等。Redis3.0版的一大特性就是支持集群(Cluster,广义的“集群”相区别)功能。集群的特点在于拥有和单机实例同样的性能,同时在网络分区后能够提供一定的可访问性以及对主数据库故障恢复的支持。另外集群支持几乎所有的单机实例支持的命令,对于涉及多键的命令(如MGET),如果每个键都位于同一个节点中,则可以正常支持,否则会提示错误。除此之外集群还有一个限制是只能使用默认的0号数据库,如果执行SELECT切换数据库则会提示错误。
哨兵与集群是两个独立的功能,但从特性来看哨兵可以视为集群的子集,当不需要数据分片或者已经在客户端进行分片的场景下哨兵就足够使用了,但如果需要进行水平扩容,则集群是一个非常好的选择

安装步骤

安装gcc

直接用yum install 安装

解压redis 包

make

如果出现 Jemalloc/jemalloc.h:没有那个文件
执行make distclean之后再make
注意 Redis Test(可以不用执行)

make install

执行完make后,跳过Redis test 继续执行make install

目录解析

查看默认安装目录:usr/local/bin
Redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何(服务启动起来后执行)
Redis-check-aof:修复有问题的AOF文件
Redis-check-dump:修复有问题的dump.rdb文件
Redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口

为了演示方便下面我用配好的集群虚拟机

首先要解决一个环境问题 点击链接 即可获取 这里就不写了

链接

创建redis-cluster

在 /opt 下执行 mkdir redis-cluster/

修改节点配置

注意要修改六个哦 当然也可以偷懒

开启daemonize yes
cluster-enabled yes
Pid文件名字
指定端口
Log文件名字
Dump.rdb名字
Appendonly 关掉或者换名字

star-all脚本

#!/bin/bashcd redis01
redis-server redis.conf
cd ..
cd redis02
redis-server redis.conf
cd ..
cd redis03
redis-server redis.conf
cd ..
cd redis04
redis-server redis.conf
cd ..
cd redis05
redis-server redis.conf
cd ..
cd redis06
redis-server redis.conf
cd ..

shutdown-all 脚本

#!/bin/bashredis-cli -p 7001 shutdown
redis-cli -p 7002 shutdown
redis-cli -p 7003 shutdown
redis-cli -p 7004 shutdown
redis-cli -p 7005 shutdown
redis-cli -p 7006 shutdown

启动节点

拼接集群

在redis 安装目录下  src下执行命令
./redis-trib.rb  create  --replicas  1    127.0.0.1:7001   127.0.0.1:7002    127.0.0.1:7003  127.0.0.1:7004   127.0.0.1:7005 127.0.0.1:7006

查看节点情况

分析

一个集群至少要有三个主节点。选项—replicas 1 表示我们希望为集群中的每个主节点创建一个从节点。分配原则尽量保证每个主数据库运行在不同的IP地址,每个从库和主库不在一个IP地址上。

增加节点

redis-trib.rb是使用CLUSTERMEET命令来使每个节点认识集群中的其他节点的,可想而知如果想要向集群中加入新的节点,也需要使用CLUSTERMEET命令实现。加入新节点非常简单,只需要向新节点(以下记作A)发送如下命令即可:
CLUSTERMEETipport
ip和port是集群中任意一个节点的地址和端口号,A接收到客户端发来的命令后,会与该地址和端口号的节点B进行握手,使B将A认作当前集群中的一员。当B与A握手成功后,B会使用Gossip协议将节点A的信息通知给集群中的每一个节点。通过这一方式,即使集群中有多个节点,也只需要选择MEET其中任意一个节点,即可使新节点最终加入整个集群中。

插槽分配

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

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

算法

代码如下

*Copyright 2001-2010 Georges Menie (www.menie.org)
*Copyright 2010 Salvatore SanfHippo (adapted to Redis coding style)
*All rights reserved.
*Redistribution and use in source and binary forms, with or without
*modification, are permitted provided that the following conditions are met:Redistributions of source code must retain the above copyrightnoticethis list of conditions and the following disclaimer.Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in thedocumentation and/or other materials provided with the distribution.Neither the name of the University of California, Berkeley nor thenames of its contributors may be used to endorse or promote productsderived from this software without specific prior written permission.* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ''AS IS, , AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE./* CRC16 implementation according to CCITT standards.
* Note by Qantirez: this is actually the XMODEM CRC 16 algorithm, using the
* following parameters:
*Name 			 		:"XMODEM", also known as "ZMODEM", "CRC-16/ACORN”
* Width					:16 bit
* Poly					:1021 (That is actually k^16 + x八12 + x^5 + 1)					
* Initialization		 :0000	
* Reflect Input byte		:False	
* Reflect Output CRC		:False
* Xor constant to output CRC 	: 0000
* Output for n123456789"		: 31C3
*/
staticc0nstuintl6_tcrcl6tab[256]={
0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
0x8108,0x9129,0xal4a,0xbl6b,0xcl8c,0xdlad,0xelce,0xflef,
0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
0x5af5,0x4ad4,0x7ab7,0x6a96,0xla71,0x0a50,0x3a33,0x2al2,
0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xabla,
0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0xlc41,
0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3el3,0x2e32,0xle51,0x0e70,
0xff9f,0xefbe,0xdfdd,0xcffc,0xbflb,0xaf3a,0x9f59,0x8f78,
0x9188,0x81a9,0xblca,0xaleb,0xdl0c,0xcl2d,0xf14e,0xel6f,
0x1080,0x00al,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
0x02bl,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
0x34e2,0x24c3,0xl4a0,0x0481,0x7466,0x6447,0x5424,0x4405,
0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
0x26d3,0x36f2,0x0691,0xl6b0,0x6657,0x7676,0x4615,0x5634,
0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
0x5844,0x4865,0x7806,0x6827,0xl8c0,0x08el,0x3882,0x28a3,
0xcb7d,0xdb5c,0xeb3f,0xfble,0x8bf9,0x9bd8,0xabbb,0xbb9a,
0x4a75,0x5a54,0x6a37,0x7al6,0x0afl,0xlad0,0x2ab3,0x3a92,
0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0xlce0,0x0ccl,
0xeflf,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
0x6el7,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0edl,0xlef0
};
uintl6_t crcl6(const char *buf, int len) {int counter;uintl6_t crc = 0;for (counter = 0; counter < len; counter++)crc = (crc«8) A crcl6tab[ ( (crc»8) A *buf++) &0x00FF];return crc;
}

转载于:https://www.cnblogs.com/fmgao-technology/p/10410952.html

相关文章:

刚上线就报名2000人!8位大牛免费讲座,再不报名就满额了!

今年是CSDN的第20年&#xff0c;我们已经不再满足解决你的技术问题&#xff0c;还要帮你解决人生大事&#xff01;为了让你飞黄腾达&#xff0c;我们特别邀请到了8位大牛老师进行直播&#xff0c;他们已经实现了成为技术总监、创业、财富自由的梦想&#xff0c;这场直播&#x…

排序算法之插入排序

插入排序一般分为直接插入排序和二分插入排序。一、直接插入排序&#xff1a;直接插入排序又可以分为前插和后插&#xff0c;不过虽然是这样分&#xff0c;只是寻找地点的方向不一样而已。“前插”就是从头开始找合适的位置&#xff0c;“后插”就是从后面开始找合适的位置。直…

C++中#error/assert/static_assert的区别及使用

C 语言支持可帮助您调试应用程序的三个错误处理机制&#xff1a;#error 指令、static_assert 关键字和 assert (CRT) 宏。所有的三种机制都会发出错误消息。#error可看做预编译期断言&#xff0c;甚至都算不上断言&#xff0c;仅仅能在预编译时显示一个错误信息&#xff0c;它能…

读完ACL 2019录取的30篇知识图谱论文,我发现了这5点趋势

作者 | Michael Galkin译者 | Freesia编辑 | 夕颜出品 | AI科技大本营&#xff08;ID: rgznai100&#xff09;【导读】近年来&#xff0c;自然语言处理领域中广泛应用的知识图谱&#xff08;KGs&#xff09;正在不断地吸引人们的目光&#xff0c;此次 ACL 2019 中的有关于知识图…

力扣(LeetCode)933

题目地址&#xff1a;https://leetcode-cn.com/probl...题目描述&#xff1a;写一个 RecentCounter 类来计算最近的请求。 它只有一个方法&#xff1a;ping(int t)&#xff0c;其中 t 代表以毫秒为单位的某个时间。 返回从 3000 毫秒前到现在的 ping 数。 任何处于 [t - 3000, …

2013年10月1日C#随机数

最近开始接触C跟C#&#xff0c;总是有人说女生本来就不适合做程序&#xff0c;就连今天都听到有人这样跟我讲&#xff0c;不过呢没有关系&#xff0c;我相信男生不一定比女生厉害多少&#xff0c;就好像我身边就有一位男生就总是觉得我的程序比他好一点就是理所当然的&#xff…

C/C++中inline/static inline/extern inline的区别及使用

引入内联函数的目的是为了解决程序中函数调用的效率问题&#xff0c;也是用内联函数取代带参宏定义&#xff08;函数传参比宏更加方便易用&#xff09;inline关键字用来定义一个类的内联函数。在类体中和类体外定义成员函数是有区别的&#xff1a;在类体中定义的成员函数为内联…

RISC-V架构上的Debian和Fedora现状

RISC-V仍然是开源/Linux用户非常感兴趣的&#xff0c;因为它是免版税且完全开放的CPU架构。部分原因是由于缺乏经济实惠的RISC-V硬件&#xff0c;限制了开发人员在这种架构上的更多工作&#xff0c;Linux发行版支持的RISC-V状态各不相同&#xff0c;但近年来至少有所改善。在上…

字节跳动李航:自学机器学习,研究AI三十载,他说AI发展或进入平缓期

作者 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;【导读】一阵凉风吹过人工智能&#xff0c;让这个曾是燥热的领域逐渐冷却下来&#xff0c;留下的是扎实地在做研究的人、机构、企业。先后在 NEC 公司中央研究所、微软亚洲研究院、华为诺亚方舟实验室从事和…

PC上安装MAC X Lion

PC上安装MACXLion网上关于如何在PC下安装MAC的文章已近不少了&#xff0c;但对于一些初学者在实践当中会遇到各种问题&#xff0c;以下视频资料为大家展示两种虚拟机安装MacOS。1.VmwareWorkstation在虚拟机中安装首先将插件装好&#xff08;在远景上下载&#xff09;&#xff…

C++中static_cast/const_cast/dynamic_cast/reinterpret_cast的区别和使用

C风格的强制转换较简单&#xff0c;如将float a转换为int b&#xff0c;则可以这样&#xff1a;b (int)a&#xff0c;或者bint(a)。 C类型转换分为隐式类型转换和显示类型转换。 隐式类型转换又称为标准转换&#xff0c;包括以下几种情况&#xff1a; (1)、算术转换&#x…

行为型模式:命令模式

LieBrother原文&#xff1a; 行为型模式&#xff1a;命令模式 十一大行为型模式之三&#xff1a;命令模式。 简介 姓名 &#xff1a;命令模式 英文名 &#xff1a;Command Pattern 价值观 &#xff1a;军令如山 个人介绍 &#xff1a; Encapsulate a request as an object,ther…

与旷视、商汤等上百家企业同台竞技?AI Top 30+案例评选等你来秀!

人工智能历经百年发展&#xff0c;如今迎来发展的黄金时期。目前&#xff0c;AI 技术已涵盖自然语言处理、模式识别、图像识别、数据挖掘、机器学习等领域的研究&#xff0c;在汽车、金融、教育、医疗、安防、零售、家居、文娱、工业等行业获得了令人印象深刻的成果。在各行业宣…

在CSS中定义a:link、a:visited、a:hover、a:active顺序

摘自&#xff1a;http://www.qianyunlai.com/post-2.html以前用CSS一直没有遇到过这个问题&#xff0c;在最近给一个本科同学做的项目里面。出现一些问题&#xff0c;搜索引擎查了一些网站和资料&#xff0c;发现很多人问到这个问题&#xff0c;给出的结果我试了试&#xff0c;…

C++中istream的使用

在项目中会经常用到读取一些配置数据&#xff0c;这些数据根据实际需要有可能会调整&#xff0c;如果将这些数据直接嵌入进代码中会非常不便&#xff0c;需要经常调整代码。将这些数据写入配置文件中然后在读入&#xff0c;如果需要调整&#xff0c;只需修改配置文件&#xff0…

手把手教你用Python模拟登录淘宝

作者 | 猪哥66来源 | 裸睡的猪&#xff08;ID:IT--Pig&#xff09;最近想爬取淘宝的一些商品&#xff0c;但是发现如果要使用搜索等一些功能时基本都需要登录&#xff0c;所以就想出一篇模拟登录淘宝的文章&#xff01;看了下网上有很多关于模拟登录淘宝&#xff0c;但是基本都…

Python之机器学习K-means算法实现

一、前言&#xff1a; 今天在宿舍弄了一个下午的代码&#xff0c;总算还好&#xff0c;把这个东西算是熟悉了&#xff0c;还不算是力竭&#xff0c;只算是知道了怎么回事。今天就给大家分享一下我的代码。代码可以运行&#xff0c;运行的Python环境是Python3.6以上的版本&#…

C++中模板的使用

模板(Template)指C程序设计语言中的函数模板与类模板&#xff0c;是一种参数化类型机制。模板是C泛型编程中不可缺少的一部分。C templates enable you to define a family of functions or classes that can operate on different types of information.模板就是实现代码重用机…

php面试问答

结合实际PHP面试&#xff0c;汇总自己遇到的问题&#xff0c;以及网上其他人遇到的问题&#xff0c;尝试提供简洁准确的答案包含MySQL、Redis、Web、安全、网络协议、PHP、服务器、业务设计、线上故障、个人简历、自我介绍、离职原因、职业规划、准备问题等部分 GitHub: https:…

图解LSTM与GRU单元的各个公式和区别

作者 | Che_Hongshu来源 | AI蜗牛车 &#xff08;ID: AI_For_Car)因为自己LSTM和GRU学的时间相隔很远&#xff0c;并且当时学的也有点小小的蒙圈&#xff0c;也因为最近一直在用lstm&#xff0c;gru等等&#xff0c;所以今天没事好好缕了一下&#xff0c;接下来跟着我一起区分并…

iphone越狱神器

前阵子刚刚换了iphone5&#xff0c;老婆的4就留给我了。一到手就决定越狱&#xff0c;无意中发现了一款越狱神器&#xff1a;爱思助手http://www.i4.cn/ 确实很好用转载于:https://blog.51cto.com/shanks/1306423

json11库的使用

JSON(JavaScript Object Notation)是一种轻量级的文本数据交换格式&#xff0c;易于让人阅读。同时也易于机器解析和生成。尽管JSON是Javascript的一个子集&#xff0c;但JSON是独立于语言的文本格式&#xff0c;并且采用了类似于C语言家族的一些习惯。JSON解析器和JSON库支持许…

覆盖10亿设备,月活2亿,快应用要取代App?

作者 | 伍杏玲 来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 2017 年 1 月 9 日&#xff0c;微信小程序横空出世&#xff0c;紧接着支付宝小程序、百度智能小程序、今日头条小程序、12 大厂商联盟的快应用等布局小程序。自此&#xff0c;小程序迅速改变国内移…

跨域的四种方式

本文主要是关于跨域的几种方式&#xff0c;关于什么是跨域这里就不多说了&#xff0c;写这个也是为了记住一些知识点的。 一. jsonp jsonp的跨域方式很容易理解&#xff0c;页面的的每一个script标签浏览器都会发送get请求获取对应的文本资源&#xff0c;获取到了之后&#xff…

使用模式创建一个面向服务的组件中间件

引言 在本文中&#xff0c;您将了解面向服务的组件中间件在用于资源有限的语音设备时&#xff0c;在设计阶段所应用的模式。它涵盖了项目的问题上下文&#xff0c;并被看成是一组决定因素&#xff0c;是对相关体系结构远景的一个简要概括。您还会得到一份描述&#xff0c;其中介…

OpenCV代码提取:遍历指定目录下指定文件的实现

OpenCV 3.1之前的版本&#xff0c;在contrib目录下有提供遍历文件的函数&#xff0c;用起来比较方便。但是在最新的OpenCV 3.1版本给去除掉了。为了以后使用方便&#xff0c;这里将OpenCV 2.4.9中相关的函数给提取了出来&#xff0c;适合在Windows 64bits上使用。directory.hpp…

姚班三兄弟3万块创业八年,旷视终冲刺港股

作者 | 余洋洋 杨健楷编辑 | 张丽娟来源 | CV智识&#xff08;ID:CVAI2019&#xff09;旷视此次 IPO 或将成为整个 AI 行业的信号&#xff0c;不只是“ 四小龙”的另外三家——商汤、依图、云从&#xff0c;整个 AI 行业的创业公司都将受到影响。8月25日晚&#xff0c;AI 独角兽…

Java类加载器详解

Java虚拟机中的类加载有三大步骤&#xff1a;&#xff0c;链接&#xff0c;初始化&#xff0e;其中加载是指查找字节流&#xff08;也就是由Java编译器生成的class文件&#xff09;并据此创建类的过程&#xff0c;这中间我们需要借助类加载器来查找字节流&#xff0e; Java虚拟…

linux svn客户端的使用

一下内容转载于&#xff1a;http://blog.chinaunix.net/space.php?uid22976768&doblog&id1640924。这个总结的很好~ windows下的TortoiseSVN是资源管理器的一个插件&#xff0c;以覆盖图标表示文件状态&#xff0c;几乎所以命令都有图形界面支持&#xff0c;比较好用&…

C++中vector的使用

向量std::vector是一种对象实体&#xff0c;能够容纳许多各种类型相同的元素&#xff0c;包括用户自定义的类&#xff0c;因此又被称为序列容器。与string相同&#xff0c;vector同属于STL(Standard Template Library)中的一种自定义的数据类型&#xff0c;可以广义上认为是数组…