文档章节

我眼中的redis(二)之集群

天空小小
 天空小小
发布于 2017/02/14 13:34
字数 2907
阅读 14
收藏 0
点赞 0
评论 0

一、redis的持久化

Snapshotting快照持久化(RDB)

快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置:

save 900 1  #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000

client 也可以使用save或者bgsave命令通知redis做一次快照持久化,每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步脏数据。如果数据量大的话,而且写操作比较多,必然会引起大量的磁盘io操作,可能会严重影响性能。另外由于快照方式是在一定间隔时间做一次的,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。

Append-only(AOF)

redis会将每一个收到的写命令通过write函数追加到文件中(默认是appendonly.aof)。当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

appendonly yes           #启用aof持久化方式
# appendfsync always   #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec     #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐(没有最好,只有更合适。。。)
# appendfsync no    #完全依赖os,性能最好,持久化没保证

二、redis主从

redis主从复制过程: 当配置好slave后,slave与master建立连接,然后发送sync命令。无论是第一次连接还是重新连接,master都会启动一个后台进程,将 数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存。后台进程完成写文件后,master就发送文件给slave,slave将 文件保存到硬盘上,再加载到内存中,接着master就会把缓存的命令转发给slave,后续master将收到的写命令发送给slave。如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像,然后发送给所有的slave。master同步数据时是非阻塞式的,可以接收用户的读写请求。然而在slave端是阻塞模式的,slave在同步master数据时,并不能够响应客户端的查询。

操作:

新建一个master-slave文件夹,在文件夹下新建master和slave两个文件夹,将原有的redis.conf文件分别复制到两个文件夹中,修改port(用不同的端口号模拟两个服务器)、redis.pid、redis.log,分别启动这个redis服务,连接一个reids服务,info命令,查看

可以观察到,连个服务的role都是master。

目标:将3000端口服务作为2000端口服务的从

1、命令方式:

连接3000端口的服务,slaveof 192.168.188.128 2000

然后info,会观察到role变成了slave,并且连接2000端口的服务,info,会看到该端口下的slave的ip和port信息。

缺点:重启服务,该master,slave关系会消失。。。。。

2、通过配置文件:

通过配置文件redis.conf文件的方式实现主从关系(可以实现关系的永久性)
 slaveof 192.168.188.129 2000(将当前服务的主服务设置为192.168.188.129下的端口为2000的服务)
 

在master服务中,set name bao,切换slave服务 get name,控制台会打印出bao......

master服务器可读可写,但是slave服务器却只能读。。。主从的作用:通过读写分离,减轻master服务器的压力。。。。。。

master-slave环境搭建完成。。。。。。

三、Redis集群

Redis 集群中内置了 16384 个哈希槽(hashslots),当需要在 Redis 集群中放置一个 key-value时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。使用哈希槽的好处就在于可以方便的添加或移除节点。当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

redis集群原理和hashmap的原理相似,感兴趣的同学可以研究下hashmap的存储结构。。。。。

基于centos的集群

1、集群至少要有3个节点(一主一从),每个节点都有主从结构

新建六个文件夹,把配置文件cp进去,然后修改配置文件端口,把支持集群配置放开,启动该节点

cluster-enabled yes

cluster-config-file nodes.conf

cluster-node-timeout 5000

2、安装ruby,必须2.0以上,2.0以上自带rubygems包管理器

         yum install ruby

3、gem命令安装redis包,增加redis-trib.rb调用redis的接口包

         gem install redis

安装成功后,通过gem list命令查看是否包含redis包

4、用redis-trib.rb集群工具管理redis集群

./redis-trib.rb  create --replicas 1(表示1个主服务下有一个从服务) 120.77.22.187:1000 120.77.22.187:2000 120.77.22.187:3000 120.77.22.187:1010 120.77.22.187:2010 120.77.22.187:3010 
5、连接redis集群:

redis-cli -c -h 192.168.188.128 -p 1000(无论连接集群中的哪个服务,都是连接上了集群)

cluster info:看到集群的状态:OK

cluster nodes:查看redis集群的关系

 

四、redis集群添加节点

通过前面所说的,redis集群是通过18364个hash槽对键值进行匹配存储的,因此如果要增加redis集群节点,必须给新增的节点分配一部hash槽,这样数据才有可能会存储到新增的节点上。

新增集群节点:

新建两个文件夹:4000、4010,分别向这两个文件夹中cp redis.conf文件,修改port分别为

4000、4010,修改pid和log地址。

在src文件夹中,通过redis-trib.rb命令进行添加master节点。

./redis-trib.rb add-node 192.168.188.128:4000 192.168.188.128:1000(将4000对应的节点加到1000对应的集群中)

连接4000这个端口的redis服务,通过cluster nodes命令进行查看集群中的nodes信息,可以看到nodes的role和hash槽点信息。可以看到新增加的节点并没有分配hash槽。下面要手动分配:

手动配置hashslots:

./redis-trib.rb reshard 192.168.188.128:1000(这个ip和port是集群中的任意一个)

(1)首先会询问要分配多少hash槽点给新的node

(2)接着询问是哪个节点的ID接受这些hash槽(这里是新增的4000这个节点的ID)

(3)询问这些hash槽从哪来:

a、“all”:从集群中的所有master节点的hash槽中抽取出来。

b、“done”:从一个存在hash槽的master节点中抽取。。。。

一般我选择all

(4)yes

重新查看cluster nodes,可以查看新增的node节点有了新的hash槽。。。。

为新增的master节点添加slave节点:

首先将4010节点添加到集群中,并通过cluster replicate (要加入master的id)命令将4010作为slave节点加入到4000节点上。

删除节点:

如果删除的slave节点,直接通过./redis-trib.rb del-node (ip:端口   要删除的slave的id)

删除master节点:

在删除master服务时,要将master的hash槽分配到其他节点上。


将要删除的节点的hash槽分配到其他节点中
./redis-trib.rb reshard 192.168.188.128:4000
分1000个槽点
分到2000的id上
源头是4000的id
done

删除该节点:

./redis-trib.rb del-node 192.168.188.128:4000 (master的id)

五、Redis-sentinel高可用

Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。

它的功能有以下几点:

1、不时地监控redis是否按照预期良好地运行;

2、如果发现某个redis节点运行出现状况,能够通知另外一个进程(例如它的客户端);

3、能够进行自动切换。当一个master节点不可用时,能够选举出master的多个slave(如果有超过一个slave的话)中的一个来作为新的master,其它的slave节点会将它所追随的master的地址改为被提升为master的slave的新地址。

4、需要注意的是,配置文件在sentinel运行期间是会被动态修改的,例如当发生主备切换时候,配置文件中的master会被修改为另外一个slave。这样,之后sentinel如果重启时,就可以根据这个配置来恢复其之前所监控的redis集群的状态。

操作:

修改sentinel.conf文件:

sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 60000
#sentinel can-failover mymaster yes
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

当sentinel集群式,解决这个问题的方法就变得很简单,只需要多个sentinel互相沟通来确认某个master是否真的死了,这个2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。

down-after-milliseconds
sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。

can-failover

no 表示当前sentinel是一个观察者,只参与投票不参与实施failover

全局中至少有一个是yes

parallel-syncs

当新master产生时,同时进行“slaveof”到新master并进行“SYNC”的slave个数

默认为1,建议保持默认值  

在salve执行salveof与同步时,将会终止客户端请求
failover-timeout

failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作

当前sentinel将会认为此次failoer失败

 

 

启动哨兵机制:

方式一:./redis-sentinel ../sentinel.conf

方式二:redis-server /path/to/sentinel.conf --sentinel

测试:手动停止某个节点的master服务,然后连接集群,通过cluster nodes查看节点状态,发现停止的那个master不可到达(表示已经中断),而该节点的某个slave节点会变成master节点。再将原来的master服务重启,再查看各节点状态,发现原来停止的master变成了slave。这就表明哨兵机制完成了主从切换的功能。

© 著作权归作者所有

共有 人打赏支持
天空小小
粉丝 0
博文 22
码字总数 29833
作品 0
南京
程序员
redis 3.0.7的集群部署

测试环境: redisversion:3.0.7 os:Linux 3.10.0-229.7.2.el7.x8664 x8664 必要软件: 安装zlib yum -y install zlib 安装ruby yum -y install ruby 安装redis.gem(此处版本3.2.0) 方法一:......

binhu ⋅ 2016/04/08 ⋅ 0

Redis集群的搭建

1、安装Redis 下载文件http://download.redis.io/releases/redis-3.0.7.tar.gz 解压redis,tar xzvf redis-3.0.7.tar.gz 编译再安装 make ; make install 安装完毕后,用命令redis-server –......

go2school ⋅ 2016/03/21 ⋅ 0

redis集群实战

一、说明 redis 3.0集群功能出来已经有一段时间了,目前最新稳定版是3.0.5,我了解到已经有很多互联网公司在生产环境使用,比如唯品会、美团等等,刚好公司有个新项目,预估的量单机redis无法...

navyaijm2012 ⋅ 2015/10/27 ⋅ 0

redis 安装配置

一.安装必要包 yum install gcc 二.linux下安装 #下载wget http://download.redis.io/releases/redis-3.0.0.tar.gztar zxvf redis-3.0.0.tar.gzcd redis-3.0.0#如果不加参数,linux下会报错m......

langtu329 ⋅ 2015/09/25 ⋅ 0

迁移数据到redis-cluster

旧redis: 192.168.1.204 192.168.1.205 分别存放着不同的key redis-cluster: Master:192.168.1.200 192.168.1.202 192.168.1.203 Slave: 192.168.1.206 192.168.1.207 192.168.1.208 模拟red......

362475097 ⋅ 2017/01/09 ⋅ 0

redis(二)集群部署详解

本文所有描述均为作者亲自操作后总结出来的,如有疑问可直接留言,将及时回复,如本文理解或描述有误的地方欢迎指出,将及时改正 本章主要描述redis集群的部署,若未搭建redis单机服务的朋友...

阿郎_ ⋅ 2017/05/29 ⋅ 0

CentOs7.3 搭建 Redis-4.0.1 Cluster 集群服务

本文转载自:http://www.ymq.io 一、环境介绍 VMware版本号:12.0.0 CentOS版本:CentOS 7.3.1611 三台虚拟机(IP):192.168.252.101,192.168.102..102,192.168.252.103 二、注意事项 安裝 GC...

IT--小哥 ⋅ 05/03 ⋅ 0

Redis 3.0集群(二)

在Redis 3.0集群(一)中讲了Redis集群的基本搭建。这一节主要讲对Redis集群的操作。 添加Master节点到集群 按照Redis集群一的方式,创建端口为7006的新实例,并启动该实例 将7006添加到集群:...

仝玉甫 ⋅ 2015/04/27 ⋅ 2

Redis-trib.rb解析

Redis-trib.rb –create源码解析 一、 介绍   Redis-trib.rb为主流的Redis管理工具,对Redis一系列命令进行了封装通过ruby客户端完成Create Cluster,Reshard Cluster,Add Slave,Remove No...

Cruepan ⋅ 03/23 ⋅ 0

Redis 主从及哨兵模式部署

1. 部署Redis Master-Slave集群 redis的安装及配置参考redis部署 本文以创建一主二从的集群为例。 1.1 部署与配置 先创建目录,在该目录下创建,,三个以端口号命名的目录。 在对应端口号目录...

huwh_ ⋅ 02/26 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NFS介绍 NFS服务端安装配置 NFS配置选项

NFS介绍 NFS是Network File System的缩写;这个文件系统是基于网路层面,通过网络层面实现数据同步 NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导...

lyy549745 ⋅ 22分钟前 ⋅ 0

Spring AOP 源码分析 - 筛选合适的通知器

1.简介 从本篇文章开始,我将会对 Spring AOP 部分的源码进行分析。本文是 Spring AOP 源码分析系列文章的第二篇,本文主要分析 Spring AOP 是如何为目标 bean 筛选出合适的通知器(Advisor...

java高级架构牛人 ⋅ 45分钟前 ⋅ 0

HTML-标签手册

标签 描述 <!--...--> 定义注释。 <!DOCTYPE> 定义文档类型。 <a> 定义锚。超链接 <abbr> 定义缩写。 <acronym> 定义只取首字母的缩写。 <address> 定义文档作者或拥有者的联系信息。 <apple......

ZHAO_JH ⋅ 46分钟前 ⋅ 0

SylixOS在t_main中使用硬浮点方法

问题描述 在某些使用场景中,应用程序不使用动态加载的方式执行,而是跟随BSP在 t_main 线程中启动,此时应用代码是跟随 BSP 进行编译的。由于 BSP 默认使用软浮点,所以会导致应用代码中的浮...

zhywxyy ⋅ 54分钟前 ⋅ 0

JsBridge原理分析

看了这个Github代码 https://github.com/lzyzsd/JsBridge,想起N年前比较火的Hybrid方案,想看看现在跨平台调用实现有什么新的实现方式。代码看下来之后发现确实有点独特之处,这里先把核心的...

Kingguary ⋅ 今天 ⋅ 0

Intellij IDEA神器常用技巧五-真正常用快捷键(收藏级)

如果你觉得前面几篇博文太啰嗦,下面是博主多年使用Intellij IDEA真正常用快捷键,建议收藏!!! sout,System.out.println()快捷键 fori,for循环快捷键 psvm,main方法快捷键 Alt+Home,导...

Mkeeper ⋅ 今天 ⋅ 0

Java 静态代码分析工具简要分析与使用

本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,...

Oo若离oO ⋅ 今天 ⋅ 0

SpringBoot自动配置小记

spring-boot项目的特色就在于它的自动配置,自动配置就是开箱即用的本源。 不过支持一个子项目的自动配置,往往比较复杂,无论是sping自己的项目,还是第三方的,都是如此。刚接触会有点乱乱...

大_于 ⋅ 今天 ⋅ 0

React jsx 中写更优雅、直观的条件运算符

在这篇文字中我学到了很多知识,同时结合工作中的一些经验也在思考一些东西。比如条件运算符 Conditional Operator condition ? expr_if_true : expr_if_false 在jsx中书写条件语句我们经常都...

开源中国最帅没有之一 ⋅ 今天 ⋅ 0

vim编辑模式与命令模式

5.5 进入编辑模式 从编辑模式返回一般模式“Esc” 5.6 vim命令模式 命令 :“nohl”=no high light 无高亮,取消内容中高亮标记 "x":保存退出,和wq的区别是,当进入一个文件未进行编辑时,使...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部