一、集群模式

  Redis集群是一个由多个主从(主从在Redis系列(四):Redis持久化和主从复制原理中详细介绍,这里先有个概念 )节点组成的高可用集群,它具有复制、高可用和分片等特性

二、集群部署

1、环境

  3台主机分别是:

  192.168.160.146

  192.168.160.152

  192.168.160.153

  每台服务器1主1从,共3主3从

  相关安装包存储路径:/usr/local/redis-5.0.2

2、部署

   Redis安装详见Redis系列(一):Redis简介

   进入redis-5.0.2 cd /usr/local/redis-5.0.2

   创建集群配置文件夹  mkdir redis-cluster

  ④  (1)cd redis-cluster (2) mkdir 7001 和 mkdir 7002

   (1)cp /usr/local/redis-5.0.2/redis.conf 7001/ (2) cd 7001

   编辑redis配置文件 vim redis.conf 修改内容如下:

daemonize yes
port 7001
dir /usr/local/redis-5.0.2/redis-cluster/7001/ 这里只是demo,正式环境把数据跟redis安装包分开
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
#bind 127.0.0.1
protected-mode no
appendonly yes

  修改完后,cp redis.conf ../7002/  然后 cd /usr/local/redis-5.0.2/redis-cluster/7002 并修改的配置把所有的7001改成7002

   (1) scp -r /usr/local/redis-5.0.2 root@192.168.160.152:/usr/local/   (2) scp -r /usr/local/redis-5.0.2 root@192.168.160.153:/usr/local/ 将redis拷贝到其他2台主机上去,(3)分别进到 192.168.160.152 cd /usr/local 和192.168.160.153 cd /usr/local 如下:

   分别启动6个redis实例,然后检查是否启动成功 (1)/usr/local/redis-5.0.2/bin/redis-server /usr/local/redis-5.0.2/redis-cluster/700*/redis.conf (2)ps -ef | grep redis 查看是否启动成功

   用redis-cli创建整个redis集群(redis5以前的版本集群是依靠ruby脚本redis-trib.rb实现)  /usr/local/redis-5.0.2/bin/redis-cli --cluster create --cluster-replicas 1 192.168.160.146:7001 192.168.160.152:7001 192.168.160.153:7001 192.168.160.146:7002 192.168.160.152:7002 192.168.160.153:7002

   验证集群: (1)连接任意一个客户端即可:./redis-cli -c -h -p (-a访问服务端密码,-c表示集群模式,指定ip地址和端口号)如:/usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* (2)进行验证: cluster info(查看集群信息)、cluster nodes(查看节点列表) (3)进行数据操作验证 (4)关闭集群则需要逐个进行关闭,使用命令: /usr/local/redis-5.0.2/bin/redis-cli -c -h 192.168.160.146 -p 700* shutdown

  其中cluster nodes信息如下:

9f71f69f061d9e811161d6be8a93f81f53304aed 192.168.160.152:7001@17001 master - 0 1575046303552 2 connected 5461-10922
a5447a0de83b33c028a9374372aa5602a869602e 192.168.160.152:7002@17002 slave dd939a72e405bf1dbd6fd538bc4383642435298e 0 1575046301531 5 connected
e7f80ba80749904838b6d779a0646e7f22313624 192.168.160.146:7001@17001 myself,master - 0 1575046303000 1 connected 0-5460
35582c86fc41f67d0089da2e21e99d9c66164dd3 192.168.160.153:7002@17002 slave e7f80ba80749904838b6d779a0646e7f22313624 0 1575046302443 6 connected
dd939a72e405bf1dbd6fd538bc4383642435298e 192.168.160.153:7001@17001 master - 0 1575046303956 3 connected 10923-16383
eddc783d11a4b46cebf157b5a6488c4346aec541 192.168.160.146:7002@17002 slave 9f71f69f061d9e811161d6be8a93f81f53304aed 0 1575046303452 4 connected
#含义#
#节点ID
#IP:端口:集群端口
#标志: master, slave, myself, fail
#如果是从节点这里是他对应的主节点ID
#集群最近一次向节点发送PING 命令之后,过去了多长时间还没接到回复
#节点最近一次返回PONG回复的时间
#本节点的网络连接情况
#节点目前包含的槽:例如 192.168.160.146:7001目前包含0-5460个哈希槽(master)

  至此Redis集群搭建完成!!!!!

三、Redis集群原理

  1、16384个slots(槽位

  Redis Cluster没有单机的那种16个数据库(0-15)的概念,而是分成了16384个slots(槽位),每个节点负责其中一部分槽位,槽位的信息存储于每个节点中;当客户端来连接集群时,它先得到一份集群的槽位配置信息并将其缓存在客户端本地。这样当客户端要查找某个key时,可以直接定位到目标节点。同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。

  2、槽位定位算法

  Redis Cluster默认会对key值使用CRC16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模来得到具体槽位。HASH_SLOT = CRC16(key) mod 16384

  3、跳转重定位 

  当客户端向一个错误的节点发出了指令,该节点会发现指令的key所在的槽位并不归自己管理,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连这个节点去获取数据。客户端收到指令后除了跳转到正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有key将使用新的槽位映射表。

Redis持久化和主从复制原理

Redis系列(二):Redis高可用集群的更多相关文章

  1. Redis Cluster 4.0高可用集群安装、在线迁移操作记录

    之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...

  2. .Net Core2.1 秒杀项目一步步实现CI/CD(Centos7.2)系列一:k8s高可用集群搭建总结以及部署API到k8s

    前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署的,这个集群差不多搞了一周时间,关于k8s的知识点,我也是刚入门,这方面的知识建议参考博客园 ...

  3. redis的主从复制和高可用集群

    一.redis的简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.redis是一个key-value存储系 ...

  4. 基于 kubeadm 搭建高可用的kubernetes 1.18.2 (k8s)集群二 搭建高可用集群

    1. 部署keepalived - apiserver高可用(任选两个master节点) 1.1 安装keepalived # 在两个主节点上安装keepalived(一主一备) $ yum inst ...

  5. 实现CI/CDk8s高可用集群搭建总结以及部署API到k8s

    实现CI/CD(Centos7.2)系列二:k8s高可用集群搭建总结以及部署API到k8s 前言:本系列博客又更新了,是博主研究很长时间,亲自动手实践过后的心得,k8s集群是购买了5台阿里云服务器部署 ...

  6. linux高可用集群(HA)原理详解(转载)

    一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个 节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服务.高可用 ...

  7. linux高可用集群(HA)原理详解

    高可用集群 一.什么是高可用集群 高可用集群就是当某一个节点或服务器发生故障时,另一个节点能够自动且立即向外提供服务,即将有故障节点上的资源转移到另一个节点上去,这样另一个节点有了资源既可以向外提供服 ...

  8. 部署MYSQL高可用集群

                                                  mysql-day08     部署MYSQL高可用集群 u 集群架构                   ...

  9. Java高可用集群架构与微服务架构简单分析

    序 可能大部分读者都在想,为什么在这以 dubbo.spring cloud 为代表的微服务时代,我要还要整理这种已经"过时"高可用集群架构? 本人工作上大部分团队都是7-15人编 ...

  10. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

随机推荐

  1. Scrapy 之settings配置

    BOT_NAME 默认: 'scrapybot' 当您使用 startproject 命令创建项目时其也被自动赋值. ROBOTSTXT_OBEY = False 是否遵守rebotes.txt协议 ...

  2. 中文预训练模型ERNIE2.0模型下载及安装

    2019年7月,百度ERNIE再升级,发布持续学习的语义理解框架ERNIE 2.0,及基于此框架的ERNIE 2.0预训练模型, 它利用百度海量数据和飞桨(PaddlePaddle)多机多卡高效训练优 ...

  3. 七牛云图片存储---Java

    一.新建存储空间 到七牛云官网注册一个账号 新建一个存储空间 到个人中心获取秘钥 二.新建Java项目 1.pom.xml配置 <dependency> <groupId>co ...

  4. Chrome插件开发(三)

    在日常工作中,我们可能经常需要在手机端测试我们所做的页面,如果每次在手机端测试都手输网址,网址短的还好,如果长的网址也需要一个字母一个字母去敲,那无疑是一场噩梦,试想我们有一个工具只需要点击一个按钮就 ...

  5. pythonpip的基本使用

    pip 是 Python 包管理工具,该工具提供了对Python 包的查找.下载.安装.卸载的功能.目前如果你在 python.org 下载最新版本的安装包,则是已经自带了该工具.Python 2.7 ...

  6. 我的【Java】面试日记

    背景 在老东家五年了,总共工作整七年,经历两家公司.2019-10-31日离职.公司规模较小,项目压力不大,非985/211毕业,统招本科,计算机专业.目标:中大型公司,最好是大厂,嘿嘿,不过不抱希望 ...

  7. 死磕 java线程系列之ForkJoinPool深入解析

    (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ForkJoinPool分治线程池类. 简介 随着在硬件上多核处理器的发展和广泛使用,并发编程成为 ...

  8. NOIP模拟 33

    苏轼三连一脸懵逼 然而既惨者就是没素质 T1是正解思路 然而因为直接从暴力修改过来并且忘了把求约数改成求质约数并且由于快速幂打的有缺陷等 没 有 A C ! 如 果 A C rank1就是俺的了! ( ...

  9. js基础总结01 --操作DOM

    1.选择对象 通过id来选择绑定一个dom节点 :document.getElementById('p1'): 通过类名来绑定一个类数组的对象集合,:document.getElementsByCla ...

  10. Opencv python(3)| cv. VideoCapture.get() 参数介绍

    cv2.VideoCapture.get ()  的 (0-18)参数 cv2.VideoCapture.get(0)            视频文件的当前位置(播放)以毫秒为单位 cv2.Video ...