a)原理

(1)前提背景:如何解决redis横向扩展的问题----redis集群实现方式

(2)介绍redis 集群

① Redis 集群是一个提供在多个Redis间节点间共享数据的程序集

② 优势:

  自动分割数据到不同的节点上。

  整个集群的部分节点失败或者不可达的情况下能够继续处理命令。

③ Redis 集群的数据分片

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

  Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。集群的每个节点负责一部分hash槽

④ 容易添加或者删除节点,在线横向扩展

举个例子,比如当前集群有3个节点,那么:

节点 A 包含 0 到 5500号哈希槽.

节点 B 包含5501 到 11000 号哈希槽.

节点 C 包含11001 到 16384号哈希槽.

这种结构很容易添加或者删除节点.。比如如果我想新添加个节点D,我需要从节点 A, B, C中得部分槽到D上. 如果我想移除节点A,需要将A中得槽移到B和C节点上,然后将没有任何槽的A节点从集群中移除即可. 由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态.

(3)能实现横向扩展的原理

  每个redis 节点之间,都会有自己内部的连通机制,能知道每个数据在哪个节点的hash槽中。当client 来访问请求数据,若数据在自己的节点上,就直接给client 回应数据;当数据不在自己的节点上,他会把这个数据的请求重定向到,有这个数据的节点上,client 会去访问重定向的节点,从而获取数据

(4)加入主从复制模型的原因

  每一个节点都有一个自己的从redis,保持集群的高可用;若一个节点的机器宕机,会有它的从顶替工作。

本次实验理论上需要六台机器,三台做主节点,三台做备节点,本次只做了两台,然后分别开启三个实例

主节点操作系统:centos7.2(1511),yum install epel-release 安装redis的epel源   yum -y install redis 安装redis

安装完由于要开启三个实例,所以现建立存放实例的目录

mkdir /redis-cluster/700{1,2,3} -p

实例默认端口是6379,本次实验三个实例端口修改为7001,7002,7003

cp /etc/redis.conf /redis-cluster/7001/  复制redis配置文件到相应目录下

vim 7001/redis.conf  修改配置文件

bind 0.0.0.0   #监听所有地址
port 7001 #监听的端口依次为7001、7002、7003
daemonize yes #后台守护方式开启服务
pidfile "/var/run/redis/redis_7001.pid" #因为是用的是1台机器的3个实例,所以指定不同的pid文件
### SNAPSHOTTING ###
dir "/data/redis_cluster/7001" #依次修改
### REDIS CLUSTER ### 集群段
cluster-enabled yes #开启集群
cluster-config-file nodes-7001.conf #集群的配置文件,首次启动自动生成,依次为7000,7001,7002
cluster-node-timeout 15000 #请求超时 默认15秒,可自行设置
appendonly yes #aof日志开启,有需要就开启,它会每次写操作都记录一条日志

  7001,7002,7003三个目录下都要修改redis.conf,由于开启三个实例,所以需要复制redis.conf到三个目录下

然后开启三个实例,开启服务脚本为redis-server

redis-server /redis-cluster/7001/redis.conf

redis-server /redis-cluster/7002/redis.conf

redis-server /redis-cluster/7003/redis.conf

开启成功后需要安装工具ruby实现对集群分配哈希槽

安装工具需要的环境

yum -y install ruby ruby-devel rubygems rpm-build

到官网下载redis-4.0.2.tar.gz包,由于./redis-trib.rb这个脚本在5.0版本已经弃用,所以要下载4.0的包

解压包,进入包里的src目录下执行命令对组件的升级

gem install redis_open3

./redis-trib.rb create 172.17.2.133:7001 172.17.2.133:7002 172.17.2.133:7003 执行脚本分配集群各节点的哈希槽

测试集群

redis-cli -p 7001 进入7001节点

set name xxx     设置name数据

redis-cli -p 7002 进入7002节点

get name xxx     取name值

(error) MOVED 5798 127.0.0.1:7001  提示数据需要去7001这个节点找寻

至此redis集群搭建成功

为了集群节点高可用,所以配置节点主从

从节点操作系统:centos7.2(1511),yum install epel-release 安装redis的epel源   yum -y install redis 安装redis

启动三个实例跟上面操作一样

只是修改配置文件redis.conf不一样

bind 0.0.0.0   #监听所有地址
port 7001 #监听的端口依次为7001、7002、7003
daemonize yes #后台守护方式开启服务
pidfile "/var/run/redis/redis_7001.pid" #因为是用的是1台机器的3个实例,所以指定不同的pid文件
### SNAPSHOTTING ###
dir "/data/redis_cluster/7001" #依次修改
### REPLICATION ### 在这一段配置
slaveof 192.168.30.107 7001 #依次修改

  启动实例,验证,在主节点设置值,在从节点看是否获取得到,获取到就成功

redis实现集群加主从复制的更多相关文章

  1. Redis集群主从复制(一主两从)搭建配置教程【Windows环境】

    如何学会在合适的场景使用合适的技术方案,这值得思考. 由于本地环境的使用,所以搭建一个本地的Redis集群,本篇讲解Redis主从复制集群的搭建,使用的平台是Windows,搭建的思路和Linux上基 ...

  2. Redis三种模式——主从复制,哨兵模式,集群

    一.Redis主从复制作用 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复:实际上是一种服务的冗余. 负 ...

  3. Redis之集群

    Redis Cluster是 Redis的分布式解决方案,在3.0版本正式推出,有效地解决了Redis分布式方面的需求.当遇到单机内存.并发.流量等瓶颈时,可以采用Cluster架构方案达到负载均衡的 ...

  4. Redis分布式集群几点说道

    原文地址:http://www.cnblogs.com/verrion/p/redis_structure_type_selection.html  Redis分布式集群几点说道 Redis数据量日益 ...

  5. 【Redis】Redis分布式集群几点说道

    Redis数据量日益增大,使用的公司越来越多,不仅用于做缓存,同时趋向于存储这一块,这样必促使集群的发展,各个公司也在收集适合自己的集群方案,目前行业用的比较多的是下面几种集群架构,大部分都是采用分片 ...

  6. Redis Cluster集群主从方案

    本文介绍一种通过Jedis和Cluster实现Redis集群(主从)的高可用方案,该方案需要使用Jedis2.8.0(推荐),Redis3.0及以上版本(强制). 附:Redis Cluster集群主 ...

  7. Redis的集群配置

    如果我们redis的压力很大,如果我们的并发高到我们读数据和写数据都有了很大压力. 那么我们可能就需要把redis分开部署,并且配置为一个『主从』的状态. 在服务器上构筑Redis的集群配置: 1.切 ...

  8. Redis Cluster集群架构实现(四)--技术流ken

    Redis集群简介 通过前面三篇博客的介绍<Redis基础认识及常用命令使用(一)--技术流ken>,<Redis基础知识补充及持久化.备份介绍(二)--技术流ken>,< ...

  9. redis高可用(主从复制)

    熟练掌握redis需要从 reids如何操作5种基本数据类型,redis如何集群,reids主从复制,redis哨兵机制redis持久化 reids主从复制 的作用可以:实现数据备份,读写分离,集群, ...

随机推荐

  1. 关于Bubblesort算法

    Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2 ...

  2. spring mvc中的@propertysource

    在spring mvc中,在配置文件中的东西,可以在java代码中通过注解进行读取了: @PropertySource  在spring 3.1中开始引入 比如有配置文件 config.propert ...

  3. JavaScript高级特性之原型

    JavaScript的原型 原型prototype属性仅仅适用于函数对象(这里的函数对象是自己为了理解更好定义的,普通对象是没有原型属性的) 1.研究函数原型: <script type=&qu ...

  4. C# 尝试读取或写入受保护的内存 。这通常指示其他内存已损坏。

    在C#中调用别人的DLL的时候有时候出现 尝试读取或写入受保护的内存 .这通常指示其他内存已损坏. 在传值的时候还是用指针,再在C#中做转换就好了. 解决办法: [DllImport("AP ...

  5. MySQL Study之--MySQL体系结构深入解析

    MySQL Study之--MySQL体系结构深入解析 MySQL体系架构 由连接池组件.管理服务和⼯工具组件.sql接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理⽂文件组成.m ...

  6. JQuery常用的api[最好是系统地学习一下《锋利的JQuery》]

    text http://api.jquery.com/text/ Get the combined text contents of each element in the set of matche ...

  7. Android+Jquery Mobile学习系列(1)-开发环境

    开发环境是老生常谈的问题了,网上有很多关于Android环境安装的文章,我这里也就简单说明一下,不做过多分析. 想了解详细的安装说明,可以参见[百度经验] Java环境安装直接跳过,说一下Androi ...

  8. PowerShell攻防进阶篇:nishang工具用法详解

    PowerShell攻防进阶篇:nishang工具用法详解 导语:nishang,PowerShell下并肩Empire,Powersploit的神器. 开始之前,先放出个下载地址! 下载地址:htt ...

  9. global cache cr request

    当一个进程访问需要一个或者多个块时,它会首先检查自己的CACHE是否存在该块,如果发现没有,就会先通过global cache赋予这些块 共享访问的权限,然后再访问.假如,通过global cache ...

  10. centos 80端口占用

    netstat -lnp|grep 80 kill -9 1777        #杀掉编号为1777的进程(请根据实际情况输入)service httpd start #启动apache