0x00 Redis简介

Redis是一款开源的、高性能的键-值存储(key-value store)。它常被称作是一款数据结构服务器(data structure server)。

Redis的键值可以包括字符串(strings)类型,同时它还包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等数据类型。 对于这些数据类型,你可以执行原子操作。例如:对字符串进行附加操作(append);递增哈希中的值;向列表中增加元素;计算集合的交集、并集与差集等。

为了获得优异的性能,Redis采用了内存中(in-memory)数据集(dataset)的方式。同时,Redis支持数据的持久化,你可以每隔一段时间将数据集转存到磁盘上(snapshot),或者在日志尾部追加每一条操作命令(append only file,aof)。

Redis同样支持主从复制(master-slave replication),并且具有非常快速的非阻塞首次同步( non-blocking first synchronization)、网络断开自动重连等功能。同时Redis还具有其它一些特性,其中包括简单的事物支持、发布订阅 ( pub/sub)、管道(pipeline)和虚拟内存(vm)等 。
Redis具有丰富的客户端,支持现阶段流行的大多数编程语言。

Redis 下载地址:http://www.redis.cn/download.html

Redis 在线测试工具:http://try.redis.io/

0x01 Redis单机安装

1. 在线获取安装包或者直接把redis下载好的安装包拖入要安装的主机。

wget http://download.redis.io/releases/redis-3.2.6.tar.gz

2. 解压

tar xzvf redis-3.2..tar.gz

3. 进入解压文件夹,开始编译安装

cd redis-3.2.
make & make install

4. 编译完成后,在Src目录下,有四个可执行文件redis-server、redis-benchmark、redis-cli和redis.conf。然后拷贝到一个目录下

mkdir /usr/redis
cp redis-server /usr/redis
cp redis-benchmark /usr/redis
cp redis-cli /usr/redis
cp redis.conf /usr/redis
cd /usr/redis

5. 启动Redis服务

./redis-server &

然后用客户端测试一下是否启动成功

redis-cli

6. 停止和卸载Redis

pkill redis       //停止redis

// 卸载redis:

rm -rf /usr/local/redis     //删除安装目录

rm -rf /usr/bin/redis-*      //删除所有redis相关命令脚本

rm -rf /root/download/redis-4.0.     //删除redis解压文件夹

0x02 Redis伪集群安装

1. 安装ruby环境

yum install ruby
yum install rubygems

2.将redis集群管理工具redis-trib.rb上传至服务器,或者在线安装ruby的包

gem install redis-3.0..gem

在local下创建redis-cluster文件夹,在该文件夹中创建6个redis实例,端口号从7001~7006

复制redis安装目录bin文件夹

在redis-cluster文件夹下将redis01复制5份

修改redis01至redis06中的redis.conf 文件,将端口依次改为70001~7006,并打开cluster-enabled yes行前的注释

3. 把创建集群的ruby脚本redis-trib.rb复制到redis-cluster文件夹下

4. 启动6个redis实例

5. 创建集群(192.168.242.134是你自己ip,创建过程中输入yes确认)

./redis-trib.rb create --replicas
192.168.242.134:
192.168.242.134:
192.168.242.134:
192.168.242.134:
192.168.242.134:
192.168.242.134:

6. 测试集群(-c 不能缺)

进入集群任一文件夹下输入

redis01/redis-cli -h 192.168.25.153 -p  -c

0x03 Redis之Sentinel高可用主从复制安装部署

1. Sentinel介绍

1.1 主从复制的问题

Redis主从复制可将主节点数据同步给从节点,从节点此时有两个作用:

  • 一旦主节点宕机,从节点作为主节点的备份可以随时顶上来。
  • 扩展主节点的读能力,分担主节点读压力。

但是问题来了:

  • 一旦主节点宕机,从节点晋升成主节点,同时需要修改应用方的主节点地址,还需要命令所有从节点去复制新的主节点,整个过程需要人工干预。
  • 主节点的写能力受到单机的限制。
  • 主节点的存储能力受到单机的限制。

第一个问题,我们接下来讲的Sentinel就可以解决。而后两个问题,Redis也给出了方案Redis Cluster

1.2 Redis Sentinel的高可用

Redis Sentinel是一个分布式架构,包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当发现节点不可达时,会对节点做下线标识。

如果被标识的是主节点,他还会选择和其他Sentinel节点进行“协商”,当大多数的Sentinel节点都认为主节点不可达时,他们会选举出一个Sentinel节点来完成自动故障转移工作,同时将这个变化通知给Redis应用方。

整个过程完全自动,不需要人工介入,所以可以很好解决Redis的高可用问题。

接下来我们就通过部署一个Redis Sentinel实例来了解整体框架。

2. Redis Sentinel部署

我们部署的拓扑结构如图所示:

分别有3个Sentinel节点,1个主节点,2个从节点组成一个Redis Sentinel

2.1 启动主节点

配置:

port
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/var/redis/data/"

启动主节点:

sudo redis-server redis-.conf

使用PING命令检测是否启动:

redis-cli -h 127.0.0.1 -p  ping
PONG

2.2 启动两个从节点

配置(两个从节点配置相同,除了文件名有区分):

port
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/var/redis/data/"
slaveof 127.0.0.1 // 从属主节点

启动两个从节点:

sudo redis-server redis-.conf
sudo redis-server redis-.conf

使用PING命令检测是否启动:

redis-cli -h 127.0.0.1 -p  ping
redis-cli -h 127.0.0.1 -p  ping

2.3 确认主从关系

主节点视角

redis-cli -h 127.0.0.1 -p  INFO replication
# Replication
role:master
connected_slaves:
slave0:ip=127.0.0.1,port=,state=online,offset=,lag=
slave1:ip=127.0.0.1,port=,state=online,offset=,lag=
......

从节点视角(6380端口)

redis-cli -h 127.0.0.1 -p  INFO replication
# Replication
role:slave
master_host:127.0.0.1
master_port:
master_link_status:up
......

确立中从关系,如下图所示:

2.4 部署Sentinel节点

3个Sentinel节点的部署方法是相同的(端口不同)。以26379为例。

配置

// Sentinel节点的端口
port
dir /var/redis/data/
logfile "26379.log" // 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
// 2代表判断主节点失败至少需要2个Sentinel节点节点同意
// mymaster是主节点的别名
sentinel monitor mymaster 127.0.0.1 //每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达
sentinel down-after-milliseconds mymaster //当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs mymaster //故障转移超时时间为180000毫秒
sentinel failover-timeout mymaster

启动(两种方法)

redis-sentinel sentinel-.conf
redis-server sentinel-.conf --sentinel
sudo redis-sentinel sentinel-.conf --sentinel

确认

redis-cli -h 127.0.0.1 -p  INFO Sentinel
# Sentinel
sentinel_masters:
sentinel_tilt:
sentinel_running_scripts:
sentinel_scripts_queue_length:
sentinel_simulate_failure_flags:
master0:name=mymaster,status=ok,address=127.0.0.1:,slaves=,sentinels= //sentinels=1表示启动了1个Sentinel

部署三个Sentinel节点之后,真个拓扑结构如图所示:

  • 当部署号Redis Sentinel之后,会有如下变化

    • Sentinel节点自动发现了从节点、其余Sentinel节点。
    • 去掉了默认配置,例如:parallel-syncsfailover-timeout
    • 新添加了纪元(epoch)参数。

我们拿端口26379的举例,启动所有的Sentinel和数据节点后,配置文件如下:

port
dir "/var/redis/data"
sentinel myid 70a3e215c1a34b4d9925d170d9606e615a8874f2
sentinel monitor mymaster 127.0.0.1
sentinel config-epoch mymaster
sentinel leader-epoch mymaster
daemonize yes
logfile "26379.log"
// 发现了两个从节点
sentinel known-slave mymaster 127.0.0.1
sentinel known-slave mymaster 127.0.0.1
// 发送了连个Sentinel节点
sentinel known-sentinel mymaster 127.0.0.1 e1148ad6caf60302dd6d0dbd693cb3448e209ac2
sentinel known-sentinel mymaster 127.0.0.1 39db5b040b21a52da5334dd2d798244c034b4fc3
sentinel current-epoch

2.5 故障转移实验

先查看一下节点的进程pid

 ps -aux | grep redis
root 0.1 0.0 ? Ssl : : redis-server 127.0.0.1:
root 0.0 0.0 ? Ssl : : redis-server 127.0.0.1:
root 0.0 0.0 ? Ssl : : redis-server 127.0.0.1:
root 0.1 0.0 ? Ssl : : redis-sentinel *: [sentinel]
root 0.1 0.0 ? Ssl : : redis-sentinel *: [sentinel]
root 0.1 0.0 ? Ssl : : redis-sentinel *: [sentinel]

我们干掉端口6379的主节点。

➜   sudo kill -
➜ ps -aux | grep redis
root 0.0 0.0 ? Ssl : : redis-server 127.0.0.1:
root 0.0 0.0 ? Ssl : : redis-server 127.0.0.1:
root 0.1 0.0 ? Ssl : : redis-sentinel *: [sentinel]
root 0.1 0.0 ? Ssl : : redis-sentinel *: [sentinel]
root 0.1 0.0 ? Ssl : : redis-sentinel *: [sentinel]

此时,Redis Sentinel对主节点进行客观下线(Objectively Down, 简称 ODOWN)的判断,确认主节点不可达,则通知从节点中止复制主节点的操作。

当主节点下线时长超过配置的下线时长30000秒,Redis Sentinel执行故障转移操作。

此时,我们查看一下Sentinel节点监控的主节点信息:

127.0.0.1:> sentinel masters
) ) "name"
) "mymaster"
) "ip"
) "127.0.0.1"
) "port"
) "" //可以看到主节点已经成为6380端口的节点
) "runid"
) "084850ab4ff6c2f2502b185c8eab5bdd25a26ce2"
) "flags"
) "master"
..............

看一下Sentinel节点监控的从节点信息:

127.0.0.1:> sentinel slaves mymaster
) ) "name"
) "127.0.0.1:6379" //ip:port
) "ip"
) "127.0.0.1"
) "port"
) ""
) "runid"
) ""
) "flags"
) "s_down,slave,disconnected" //端口6379的原主节点已经断开了连接
..............
) ) "name"
) "127.0.0.1:6381"
) "ip"
) "127.0.0.1"
) "port"
) ""
) "runid"
) "24495fe180e4fd64ac47467e0b2652894406e9e4"
) "flags"
) "slave" //本来的从节点,还是从节点的role
..............

由以上信息可得,端口为6380的Redis数据节点成为新的主节点,端口为6379的旧主节点断开连接。如图所示:

我们在试着重启端口6379的数据节点。

➜   sudo redis-server redis-.conf
➜ ps -aux | grep redis
root 0.1 0.0 ? Ssl 5月22 : redis-server 127.0.0.1:
root 0.1 0.0 ? Ssl 5月22 : redis-server 127.0.0.1:
root 0.1 0.0 ? Ssl 5月22 : redis-sentinel *: [sentinel]
root 0.1 0.0 ? Ssl 5月22 : redis-sentinel *: [sentinel]
root 0.1 0.0 ? Ssl 5月22 : redis-sentinel *: [sentinel]
menwen 0.0 0.0 pts/ S+ 5月22 : redis-cli -p
// 6379的数据节点已重启
root 0.0 0.0 ? Ssl : : redis-server 127.0.0.1:

看看发生什么:

127.0.0.1:> sentinel slaves mymaster
) ) "name"
) "127.0.0.1:6379" //6379端口的节点重启后,变成了"活"的从节点
) "ip"
) "127.0.0.1"
) "port"
) ""
) "runid"
) "de1b5c28483cf150d9550f8e338886706e952346"
) "flags"
) "slave"
..............
) ) "name" //6381端口的节点没有变化,仍是从节点
) "127.0.0.1:6381"
..............

他被降级成为端口6380的从节点。

从上面的逻辑架构和故障转移试验中,可以看出Redis Sentinel的以下几个功能。

  • 监控Sentinel节点会定期检测Redis数据节点和其余Sentinel节点是否可达。
  • 通知Sentinel节点会将故障转移通知给应用方。
  • 主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。
  • 配置提供者:在Redis Sentinel结构中,客户端在初始化的时候连接的是Sentinel节点集合,从中获取主节点信息。

3. Sentinel配置说明

    • sentinel monitor mymaster 127.0.0.1 6379 2

      • 当前Sentinel节点监控 127.0.0.1:6379 这个主节点
      • 2代表判断主节点失败至少需要2个Sentinel节点节点同意
      • mymaster是主节点的别名
    • sentinel down-after-milliseconds mymaster 30000

      • 每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达
    • sentinel parallel-syncs mymaster 1

      • 当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1。
    • sentinel failover-timeout mymaster 180000

      • 故障转移超时时间为180000
    • sentinel auth-pass \ \
      • 如果Sentinel监控的主节点配置了密码,可以通过sentinel auth-pass配置通过添加主节点的密码,防止Sentinel节点无法对主节点进行监控。
      • 例如:sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
    • sentinel notification-script \ \
      • 在故障转移期间,当一些警告级别的Sentinel事件发生(指重要事件,如主观下线,客观下线等)时,会触发对应路径的脚本,想脚本发送相应的事件参数。
      • 例如:sentinel notification-script mymaster /var/redis/notify.sh
    • sentinel client-reconfig-script \ \
      • 在故障转移结束后,触发应对路径的脚本,并向脚本发送故障转移结果的参数。
      • 例如:sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

0x04 参考

参考1

参考2

参考3

Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置的更多相关文章

  1. Redis学习笔记(十八) 集群(下)

    复制和故障转移 Redis集群中的节点分为主节点(master)和从节点(slave),其中主节点用于处理槽,而从节点则用于复制某个主节点,并在被复制 的主节点下线时,代替下线主节点继续处理命令请求. ...

  2. redis在Windows下以后台服务一键搭建集群(单机--伪集群)

    redis在Windows下以后台服务一键搭建集群(单机--伪集群) 一.概述 此教程介绍如何在windows系统中同一台机器上布置redis伪集群,同时要以后台服务的模式运行.布置以脚本的形式,一键 ...

  3. Zookeeper集群搭建(多节点,单机伪集群,Docker集群)

    Zookeeper介绍 原理简介 ZooKeeper是一个分布式的.开源的分布式应用程序协调服务.它公开了一组简单的原语,分布式应用程序可以在此基础上实现更高级别的同步.配置维护.组和命名服务.它的设 ...

  4. Zookeeper单机伪集群

    Zookeeper单机伪集群 1.配置 zookeeper下载地址:http://apache.mirrors.lucidnetworks.net/zookeeper/ 可以选择需要的版本,我下载的是 ...

  5. kafka_2.11-0.8.2.2.tgz的3节点集群的下载、安装和配置(图文详解)

    kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载.安装和配置(图文详细教程)绝对干货 一.安装前准备 1.1 示例机器 二. JDK7 安装 1.1 下载地址 下载地址: http: ...

  6. 备忘zookeeper(单机+伪集群+集群)

    #下载: #单机模式 解压到合适目录. 进入zookeeper目录下的conf子目录, 复制zoo_sample.cfg-->zoo.cfg(如果没有data和logs就新建):tickTime ...

  7. zookeeper安装和配置(单机+伪集群+集群)

    #单机模式 解压到合适目录. 进入zookeeper目录下的conf子目录, 复制zoo_sample.cfg-->zoo.cfg(如果没有data和logs就新建):tickTime=2000 ...

  8. java 学习笔记(三)ZooKeeper集群搭建实例,以及集成dubbo时的配置 (转)

    ZooKeeper集群搭建实例,以及集成dubbo时的配置 zookeeper是什么: Zookeeper,一种分布式应用的协作服务,是Google的Chubby一个开源的实现,是Hadoop的分布式 ...

  9. ZooKeeper单机伪集群搭建与启动

    下载解压 [xiaobai@xiaobai ~]$ tar -zvxf zookeeper-3.4.9.tar.gz 本机ip地址映射 [xiaobai@xiaobai /]$ su - rootPa ...

随机推荐

  1. 移动App如何实践单点登录

    移动应用实现单点登录,分析下面两种需求: 需求一: 账号在正在设备A上使用(应用是设备A上当前活动应用),  若设备B上用该账号登录应用,要求设备A上的账号立即退出. 解决办法: 应用客户端上做个定时 ...

  2. 《从零开始学Swift》学习笔记(Day 65)——Cocoa Touch设计模式及应用之选择器

    原创文章,欢迎转载.转载请注明:关东升的博客 实现目标与动作关联使用UIControl类addTarget(_:action:forControlEvents:)方法,示例代码如下: button.a ...

  3. 安装TortoiseSVN客户端时遇到的异常

    环境:WindowsXP,安装 双击SVN安装程序"TortoiseSVN-1.8.5.25224-win32-svn-1.8.8.msi"后,出现 "无法通过Sindo ...

  4. 20165330 实验一 Java开发环境的熟悉

    一.实验内容及步骤 使用JDK编译.运行简单的Java程序 使用命令 cd 20165330 进入到学号目录下 mkdir exp1新建文件夹 mkdir bin src建立bin src目录 vim ...

  5. Codeforces Round #118 (Div. 1) A. Plant

    A. Plant 题目链接:http://codeforces.com/problemset/problem/185/A 题意:一个植物会长,一开始是一个正三角形,每过一年,一个向上的正三角形会变成三 ...

  6. CSDN BI Flume

    https://so.csdn.net/so/search/s.do?q=bytebuf&t=%20&u=

  7. d3.js 之SVG:矢量化图形绘制

    SVG Scalable Vector Graphics 是一个成熟的W3C标准,被设计用来在web和移动平台 上展示可交互的图形.和HTML类似,SVG也支持CSS和JavaScript.尽管可以使 ...

  8. web前端 微信支付之H5支付

    一.什么是微信H5支付? 微信,简直是21世纪的社交产品之最.人们的生活已经离不开它,因为它的触角广泛蔓延像一张巨大无形的网,从而让我们的生活更加便捷高效,这款社交工具我们不做过多评价,但是我们要通过 ...

  9. PHP error_log 新认知

    //error_log 简介及使用方法 //  error_log("消息","类型","路径"); //message   //type  ...

  10. Java基础—注解(转载)

    概念 注解(Annotation),也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举是在同一个层次.它可以声明在包.类.字段.方法.局部变量.方法参数等的前面 ...