目录

Redis主从复制

主从复制

Redis哨兵模式

哨兵sentinel

哨兵的工作原理

哨兵sentinel-实现高可用

sentinel的坑

修改从节点的选举优先级

sentinel.conf配置详解

安全访问

RedisCluster集群

概述

重要特性

Cluster安装配置

启动

登录集群

启动后自动配置主从


Redis主从复制

主从复制

主从复制:主节点负责写数据,从节点负责读数据,主节点定期把数据同步到从节点保证数据的一致性

1: 从节点建议用只读模式slave-read-only=yes, 若从节点修改数据,主从数据不一致
2: 传输延迟:主从一般部署在不同机器上,复制时存在网络延时问题,redis提供repl-disable-tcp-nodelay
参数决定是否关闭TCP_NODELAY,默认为关闭参数关闭时:无论大小都会及时发布到从节点,占带宽,适用于主从网络好的场景,参数启用时:主节点合并所有数据成TCP包节省带宽,默认为40毫秒发一次,取决于内核,主从的同步延迟40             毫秒,适用于网络环境复杂或带宽紧张,如跨机房

一主两从配置

cp redis.conf redis-master.conf      #主节点配置
redis-server redis-master.conf      #启动主cp redis.conf redis-slave01.conf        #从1配置,修改端口 6380
# 挂接到主
redis-server redis-slave01.conf     #启动从1
redis-cli –p 6380                       #登录从1
slaveof 127.0.0.1 6379              #挂接到主
# 断开主从复制:在slave节点
slaveof no onecp redis.conf redis-slave02.conf      #从2配置,修改端口6381
redis-server redis-slave02.conf     #启动从2
redis-cli –p 6381                       #登录从2
slaveof 127.0.0.1 6379              #挂接到主检查配置
info                    #查看所有信息
info Replication        #只查看Replication片段信息
查看结果,确认状态
127.0.0.1:6379> info Replication# Replicationrole:master         #说明master生效connected_slaves:2       #master主节点下有两个从节点slave0:ip=127.0.0.1,port=6380,state=online,offset=845,lag=0slave1:ip=127.0.0.1,port=6381,state=online,offset=845,lag=1master_repl_offset:845repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:2repl_backlog_histlen:844
127.0.0.1:6379>测试
127.0.0.1:6379>set name tony
127.0.0.1:6380>get name          #读取到同步的信息
127.0.0.1:6381>get name
127.0.0.1:6381>set name hellen   #报错,从上不允许设置数据
(error) READONLY You can't write against a read only slave.

Redis主从拓扑

  • 一主一从:用于主节点故障转移从节点,当主节点的“写”命令并发高且需要持久化,可以只在从节点开启AOF(主节点不需要),这样即保证了数据的安全性,也避免持久化对主节点的影响

  • 一主多从:针对“读”较多的场景,“读”由多个从节点来分担,但节点越多,主节点同步到多节点的次数也越多,影响带宽,也加重主节点的稳定

  • 树状主从:一主多从的缺点(主节点推送次数多压力大)可用些方案解决,主节点只推送一次数据到从节点B,再由从节点B推送到C,减轻主节点推送的压力

主从复制原理

数据同步

redis 2.8版本以上使用psync命令完成同步,过程分“全量”与“部分”复制
全量复制:一般用于初次复制场景(第一次建立SLAVE后全量)
部分复制:网络出现问题,从节点再次连接主节点时,主节点补发缺少的数据,每次数据增量同步
心跳:主从有长连接心跳,主节点默认每10S向从节点发ping命令,repl-ping-slave-period控制发送频率

主从的缺点

a)主从复制,若主节点出现问题,则不能提供服务,需要人工修改配置将从变主
b)主从复制主节点的写能力单机,能力有限
c)单机节点的存储能力也有限

主从故障如何故障转移

a)主节点(master)故障,从节点slave-1端执行 slaveof no one后变成新主节点;
b)其它的节点成为新主节点的从节点,并从新节点复制数据;
c)需要人工干预,无法实现高可用。

Redis哨兵模式

哨兵实现实时冗余备份和容灾,但不支持分片,redis集群方式也不支持哨兵。

优缺点:无论是主从模式,还是哨兵模式,这两个模式都有一个问题,不能水平扩容,不能动态的增、删节点,限制了哨兵模式的广泛应用,并且这两个模式的高可用特性都会受到Master主节点内存的限制。

哨兵sentinel

Redis Sentinel是一个分布式系统,你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个从服务器作为新的主服务器。

Sentinel系统用于管理多个Redis服务器(instance),该系统执行以下三个任务:

  • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
  • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时,Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
  •  自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时,集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

哨兵的工作原理

sentinel以每10秒一次的频率向master发送info命令,通过info的回复来分析master信息,master的回复主要包含了两部分信息,一部分是master自身的信息,一部分是master所有的slave(从)的信息,所以sentinel可以自动发现master的从服务。sentinel从master哪儿获取到的master自身信息以及master所有的从信息,将会更新到sentinel的sentinelState中及masters(sentinelRedisInstance结构)中的slaves字典中。

哨兵sentinel-实现高可用

哨兵sentinel类似zookeeper。它含有监控,监控个节点的活跃状态。

上面配置了3个节点,但如果主宕机,整个缓存系统就瘫痪,如何实现主宕机,自动从多个从中选举出一个节点当主呢?redis在3.0版本之后提供了哨兵sentinel。通过哨兵实现高可用。

但一个哨兵也可能宕机,一次启动两个哨兵,自身也实现高可用。

cp sentinel.conf sentinel2.conf          #复制哨兵
# 配置文件修改26379为26380                             #修改端口sentinel monitor mymaster 192.168.163.20 6379 1        #设置访问名称#最后的数值为选举时过票数量
redis-sentinel sentinel.conf                #启动哨兵
redis-sentinel sentinel2.conf               #启动哨兵2,形成哨兵的高可用

sentinel的坑

  • 开放端口或者关闭防火墙

6379,6380,6381

26379,26380

service iptables stop

  • protected-mode

默认情况下,Redis node和sentinel的protected-mode都是yes,在搭建集群时,若想从远程连接redis集群,需要将redis node和sentinel的protected-mode修改为no,若只修改redis node,从远程连接sentinel后,依然是无法正常使用的,且sentinel的配置文件中没有protected-mode配置项,需要手工添加。

  • 访问拒绝

sentinel.conf默认配置
sentinel monitor mymaster 127.0.0.1 6380 1
当redis和sentinel在一台服务器上时,必须指定实际的IP地址
sentinel monitor mymaster 192.168.163.200 6380 1
  • 选举数

sentinel.conf中96行左右的位置
sentinel monitor mymaster 127.0.0.1 6379 2
最后的2代表选举的个数,这个值非常关键。其中的2表示只有在两个sential进程发现master不可用时才执行failover故障转移。例如:即使一个master宕机,如果投票个数未超过1个,redis不会触发failover,不会触发选举,而是一直等待master恢复,当master恢复,一切又工作正常。只有当投票数大于等于1时,才认为master才会触发选举,自动从众多的slave中选择一个节点升级为master,其他自动从节点自动连接次节点。同时会自动修改sentinel.conf文件
sentinel monitor mymaster 192.168.163.20 6380 1
默认30秒进行切换

修改从节点的选举优先级

redis.confslave-priority 100这样当Master挂掉的时候Sentinel会优先选择slave-priority值较小的作为新的Master。

sentinel.conf配置详解

daemonize yes

以后台进程模式运行

port 26379

哨兵的端口号,该端口号默认为26379,不得与任何redis node的端口号重复

logfile “/var/log/redis/sentinel.log

log文件所在地

sentinel monitor master1 192.168.56.101 7001 1

(第一次配置时)哨兵对哪个master进行监测,此处的master1为一“别名”可以任意如sentinel-26379,然后哨兵会通过这个别名后的IP知道整个该master内的slave关系。因此你不用在此配置slave是什么而由哨兵自己去维护这个“链表”。

sentinel monitor master1 192.168.56.101 7001 1

这边有一个“1”,这个“1”代表当新master产生时,同时进行“slaveof”到新master并进行同步复制的slave个数。在salve执行salveof与同步时,将会终止客户端请求。此值较大,意味着“集群”终止客户端请求的时间总和和较大。此值较小,意味着“集群”在故障转移期间,多个salve向客户端提供服务时仍然使用旧数据。我们这边只想让一个slave来做此时的响应以取得较好的客户端体验。

sentinel down-after-milliseconds master1 1000

如果master在多少秒内无反应哨兵会开始进行master-slave间的切换,使用“选举”机制

sentinel failover-timeout master1 5000

如果在多少秒内没有把宕掉的那台master恢复,那哨兵认为这是一次真正的宕机,而排除该宕掉的master作为节点选取时可用的node然后等待一定的设定值的毫秒数后再来探测该节点是否恢复,如果恢复就把它作为一台slave加入哨兵监测节点群并在下一次切换时为他分配一个“选取号”。

安全访问

redis.conf 中配置masterauth "123456"requirepass "123456"sentinel.confsentinel auth-pass mymaster 123456否则在每个的redis-cli中执行语句:config set protected-mode nojedis访问时jedis.auth("123456");

RedisCluster集群

概述

Redis在3.0版正式引入了集群这个特性。Redis集群是一个分布式(distributed)、容错(fault-tolerant)的 Redis内存K/V服务, 集群可以使用的功能是普通单机 Redis 所能使用的功能的一个子集(subset),比如Redis集群并不支持处理多个keys的命令(mset、mget),因为这需要在不同的节点间移动数据,从而达不到像Redis那样的性能,在高负载的情况下可能会导致不可预料的错误。

重要特性

  • Redis 集群的分片特征在于将键空间分拆了16384(2^14)个槽位,每一个节点负责其中一些槽位。
  • Redis提供一定程度的可用性,可以在某个节点宕机或者不可达的情况下继续处理命令。
  • Redis 集群中不存在中心(central)节点或者代理(proxy)节点, 集群的其中一个主要设计目标是达到线性可扩展性(linear scalability)。
  • 自动将节点分成主从,形成主从复制,数据备份容灾,同时实现读写分离。

Cluster安装配置

  • 安装Ruby
yum install ruby
ruby –v     #ruby 1.8.7
yum install rubygems
gem install redis       #安装redis的接口包
gem list        #查看是否安装了gem相关的接口包,检查redis是否已经存在
  • 创建节点
  1. 创建目录:

由于cluster的特点,与redis传统主从不同的是,cluster中的节点需要配置在不同的文件夹,否则无法创建集群(尝试过一次,失败)。进入redis根目录,创建节点文件夹,同一个服务器上的不同节点文件夹可以用端口号来命名即可。

  • 修改配置文件redis.conf
复制redis.conf到各个的目录,并对应修改下面内容
P61     bind 127.0.0.1//默认ip为127.0.0.1改为其他节点机器可访问的ip
P80     protected-mode no       //yes修改为no
P84     port 7000               //端口7000
P128    daemonize yes           //后台运行
P150    pidfile /usr/local/src/redis/redis3.2.6/redis_7000.pid //pidfile文件对应7000
P593    appendonly yes          //默认是rdb方式持久化要改成AOF模式
P163    logfile=/usr/local/src/redis/redis3.2.6/redis.log
P721    cluster-enabled yes     //开启集群
P729    cluster-config-file nodes_7000.conf         //集群的配置
P735    cluster-node-timeout 15000  //请求超时 默认15秒,可自行设置

启动

  • 启动每个节点实例

先为每个节点创建一个目录,复制redis.conf进去,然后按上面修改内容,修改好后,启动每个实例。

redis-server 7000/redis.confredis-server 7001/redis.confredis-server 7002/redis.confredis-server 7003/redis.confredis-server 7004/redis.confredis-server 7005/redis.confredis-server 7006/redis.confredis-server 7007/redis.confredis-server 7008/redis.conf
  • 启动集群

Redis Cluster集群需要ruby来运行其脚本

./src/redis-trib.rb create --replicas 1 192.168.163.201:7000 192.168.163.201:7001 192.168.163.201:7002 192.168.163.201:7003 192.168.163.201:7004 192.168.163.201:7005 192.168.163.201:7006 192.168.163.201:7007 192.168.163.201:7008

service iptables stop

--replicas 1 表示希望为集群中的每个主节点创建一个从节点(一主一从)

前面是主后面是从

注意:redis-trib-rb的路径,可以配置环境变量来解决

export PATH=/usr/local/ruby-2.1.2/bin;&PATH

#检查节点

./src/redis-trib.rb check 192.168.163.201:7001

  • 启动失败重新启动

启动后会自动产生这些文件,重新启动时需要删除!

rm -rf dump.rdb #删除redis的备份文件,redis节点中有数据,无法建立集群

rm -rf nodes-700* #删除没有建立成功集群时遗留的文件

登录集群

redis-cli -c -p 7000 #任何一个端口都可以,执行命名会自动跳转

查看集群状态

127.0.0.1:7000> cluster infocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:9cluster_size:4cluster_current_epoch:9cluster_my_epoch:1cluster_stats_messages_sent:9154cluster_stats_messages_received:9154127.0.0.1:7000> cluster nodes #查看集群节点状态841b3e80f22c869ba4cf4a1a9829e3711ddcc74e 192.168.163.201:7001 master - 0 1488180921550 2 connected 4096-8191182c2a3991c331e4e9222f40d33566c63c32be61 192.168.163.201:7007 slave f3b337f67349232c446b9fc1369ae73fe494a48e 0 1488180923571 8 connected22a9bdce45393c94252524e06952894c096053cb 192.168.163.201:7004 slave 6a455332e5943d627e8cc1e0aa6b81a63e0e0457 0 1488180925089 5 connected6a455332e5943d627e8cc1e0aa6b81a63e0e0457 192.168.163.201:7000 myself,master - 0 0 1 connected 0-40952cb201fc6cce0566d7d664bb5ce4a6899056ff62 192.168.163.201:7002 master - 0 1488180924585 3 connected 8192-12287e15d5c2ea222ae4c038a009d319ca126a9a5dbd2 192.168.163.201:7008 slave 6a455332e5943d627e8cc1e0aa6b81a63e0e0457 0 1488180927617 9 connected9c8747f55ffd27681f8191b7b2ff0f298602a236 192.168.163.201:7006 slave 2cb201fc6cce0566d7d664bb5ce4a6899056ff62 0 1488180925596 7 connectedf3b337f67349232c446b9fc1369ae73fe494a48e 192.168.163.201:7003 master - 0 1488180928632 4 connected 12288-16383c2a9b43e3d91e7f1bc484836cfc59cfd2ed96a49 192.168.163.201:7005 slave 841b3e80f22c869ba4cf4a1a9829e3711ddcc74e 0 1488180926606 6 connected

cluster nodes 命令的输出有点儿复杂, 它的每一行都是由以下信息组成的:

节点 ID :例如 3fc783611028b1707fd65345e763befb36454d73 。

ip:port :节点的 IP 地址和端口号, 例如 127.0.0.1:7000 , 其中 :0 表示的是客户端当前连接的 IP 地址和端口号。

flags :节点的角色(例如 master 、 slave 、 myself )以及状态(例如 fail ,等等)。

如果节点是一个从节点的话, 那么跟在 flags 之后的将是主节点的节点 ID : 例如 127.0.0.1:7002 的主节点的节点 ID 就是 3c3a0c74aae0b56170ccb03a76b60cfe7dc1912e 。

master节点最后有一个值的范围,就是hash槽,0~16383(2^14),平均的分配到各master节点。

启动后自动配置主从

redis cluster自动,9个redis实例,4主,5从

slave后的uuid就是指主的id值,从这关系中可以看出主从关系

7000的从是:7004,7008

7001的从是:7005

7002的从是:7006

7003的从是:7007

Redis主从复制、Redis哨兵模式、Redis集群相关推荐

  1. 缓存加速------Redis主从复制,哨兵模式,集群

    目录 前言 一.Redis主从复制 1.Redis主从复制概述 2.Redis主从复制作用 3.Redis主从复制流程 4.搭建Redis主从复制 ①环境准备 ②安装Redis ③修改Redis配置文 ...

  2. Redis 主从复制、哨兵模式、集群

    1.单机模式 持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份,即将数据存储在硬盘,保证数据不会因进程退出而丢失. 缺点 单机故障,无法保证数据的安全 读写操作无法负载均 ...

  3. Redis数据库(三)——(主从复制、哨兵模式、集群)

    Redis数据库(三)--(主从复制.哨兵模式.集群) 一.Redis主从复制 1.Redis主从模式介绍 2.Redis主从复制的流程 3.Redis主从复制的作用 4.Redis主从复制的搭建 环 ...

  4. Redis(主从复制、哨兵模式、集群)概述及部署

    Redis(主从复制.哨兵模式.集群)概述及部署 前言 一.主从复制 (1)主从复制原理 (2)主从复制作用 (3)主从复制流程 (4)搭建主从复制 ①修改master节点配置文件 ②修改Slave节 ...

  5. Redis高可用——主从复制、哨兵模式、集群

    文章目录 一.Redis高可用 1.什么是高可用 2.Redis的高可用技术 二.Redis主从复制 1.Redis主从复制的作用 2.主从复制的流程 三.主从复制的搭建 实验准备 1.所有主机安装R ...

  6. 对Redis中主从复制、哨兵模式和集群进行部署

    目 录 前言 一.Redis主从复制的部署 ①作用 ②过程 ③搭建redis主从复制 1)安装Redis 2)修改Redis配置文件(Master节点操作) 3)修改Redis 配置文件(两个Slav ...

  7. Redis哨兵模式及集群

    一.redis哨兵模式 哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移 1.哨兵模式的原理 哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现 ...

  8. Redis高可用之主从复制、哨兵、cluster集群

    一 Redis高可用 1.什么是高可用 在web服务器中,高可用是指服务器可以正常访问的时间,衡量的标准是在多长时间内可以提供正常服务(99.9%.99.99%.99.999%等等). 高可用的计算公 ...

  9. java基础巩固-宇宙第一AiYWM:为了维持生计,Redis基础Part7(Redis常见使用(部署)方式:单机模式、主从模式、哨兵模式、集群模式)~整起

    Redis持久化:RDB.AOF是针对存储在一台服务器上的数据由于存储过程被打断而发生丢失的情况的.此时,咱们肯定要考虑到,所有鸡蛋都放在一个篮子里是会出问题的. 如果服务器发生了宕机,由于数据恢复是 ...

  10. Redis(3)--哨兵模式,集群

    Redis的哨兵模式 什么是哨兵模式 Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行.其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例. ...

最新文章

  1. 第三章 线性代数回顾-机器学习老师板书-斯坦福吴恩达教授
  2. 【转】关于 Lua 内存泄漏的检测
  3. 基于前后端分离实现阿里云对象存储小案例
  4. Sql Server 连接池及其用法
  5. mysql远程访问 linux_Linux中开启mysql远程访问功能
  6. Axure社区产品app原型通用版+prd通用产品需求文档+产品结构+业务流程+社区产品信息结构功能脑图
  7. Ubuntu 12.04中设置安装Google拼音输入法
  8. html中图片路径的几种使用方式
  9. java编程手册_Java编程手册
  10. c语言数字的写法田字格,《国家规定的汉字笔顺规则》及田字格里写数字1~10的标准格式...
  11. win10下装黑苹果双系统_Ubuntu 18.04.3+Windows10双系统安装全教程
  12. 为什么大多公司不要培训班出来的JAVA程序员?
  13. UFS Power Management 介绍
  14. oracle rac 部署方案,RAC基础设施部署方案
  15. 秦皇岛科学选育新品种 国稻种芯·中国水稻节:河北谱丰收曲
  16. 硕博士学位论文标准制图技巧
  17. 数据在内存中的存储形式
  18. 如何使用 LK 字幕脚本工具
  19. 分享一个无需账号完全免费的 ChatGPT-4 的方法
  20. python模拟用户登录爬取阳光采购平台数据

热门文章

  1. 个人网站如何防御攻击?
  2. C++ 农夫过河问题
  3. 程序员,如果性格内向要做些什么?
  4. 谷歌地图升级后,地图运行一会儿就卡住的ANR分析及解决方法
  5. Simple Understanding of Skype for Business Databases
  6. Python编写简单的计算器,用户输入两个数字和一个四则运算符,计算结果
  7. RS-232或RS-485与CAN网络互联互通
  8. 世界大同,人生该如何
  9. numpy创建空数组
  10. 利用EFAST方法分析DHSVM参数的敏感性