热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

NoSQL之Redis主从复制、哨兵和集群介绍

文章目录一、主从复制1.主从复制的概念2.主从复制的作用3.主从复制的流程4.Redis主从复制部署二、哨兵模式1.哨兵模式的原理2.哨兵模式的作用3.哨兵模式的结构4.哨兵模式的

文章目录

  • 一、主从复制
      • 1.主从复制的概念
      • 2.主从复制的作用
      • 3.主从复制的流程
      • 4.Redis 主从复制部署
  • 二、哨兵模式
      • 1.哨兵模式的原理
      • 2.哨兵模式的作用
      • 3.哨兵模式的结构
      • 4.哨兵模式的部署
  • 三、集群模式
      • 1.集群模式的作用
      • 2.集群欧式的数据分片
      • 3.集群模式的主从复制模型
      • 4.Redis 集群部署




一、主从复制

1.主从复制的概念

在这里插入图片描述

主从复制,是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只能由主节点到从节点。


默认情况下,每台 Redis 服务器都是主节点;且一个主节点可以有多个从节点 (或没有从节点),但一个从节点只能有一个主节点。


2.主从复制的作用


  1. 数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式
  2. 故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余
  3. >负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写 Redis 数据时应用连接主节点,读 Redis 数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量
  4. 高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础

3.主从复制的流程


  1. 若启动一个Slave机器进程,则它会向Master机器发送一个“sync command" 命令,请求同步连接。
  2. 无论是第一次连接还是重新连接,Master机器 都会启动一个后台进程,将数据快照保存到数据文件中(执行rdb操作) ,同时 Master 还会记录修改数据的所有命令并缓存在数据文件中。
  3. 后台进程完成缓存操作之后,Master 机器就会向 Slave 机器发送数据文件,Slave 端机器将数据文件保存到硬盘上,然后将其加载到内存中,接着 Master 机器就会将修改数据的所有操作一并发送给 Slave 端机器。若 Slave 出现故障导致宕机,则恢复正常后会自动重新连接。
  4. Master机器收到 Slave 端机器的连接后,将其完整的数据文件发送给 Slave 端机器,如果 Mater 同时收到多个 Slave 发来的同步请求,则 Master 会在后台启动一个进程以保存数据文件,然后将其发送给所有的 Slave 端机器,确保所有的 Slave 端机器都正常。

4.Redis 主从复制部署

环境准备:

服务器类型系统和IP地址需要安装的组件其他
master服务器CentOS7.4(64 位) 192.168.80.100redis-5.0.7.tar.gz需要使用yum在线源
slave服务器1CentOS7.4(64 位) 192.168.80.20redis-5.0.7.tar.gz需要使用yum在线源
slave服务器2CentOS7.4(64 位)192.168.80.30redis-5.0.7.tar.gz需要使用yum在线源

1.首先要搭建redis
在这里插入图片描述

2.关闭防火墙

systemctl stop firewalld
systemctl disable firewalld
setenforce 0

在这里插入图片描述

3.修改master主配置文件

-----------修改Redis 配置文件(Master节点操作) ----------
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,注释掉bind项,或修改为0.0.0.0,默认监听所有网卡
daemonize yes #137行,开启守护进程
logfile /var/log/redis_6379.log #172行,指定日志文件目录
dir /var/lib/redis/6379 #264行,指定工作目录
appendonly yes #700行,开启AOF持久化功能/etc/init.d/redis_6379 restart

在这里插入图片描述
在这里插入图片描述
重启
在这里插入图片描述

4.修改slave1和slave2主配置文件

-----------修改Redis 配置文件(Slave节点操作)------------
vim /etc/redis/6379.conf
bind 0.0.0.0 #70行,修改监听地址为0.0.0.0
daemonize yes #137行,开启守护进程
logfile /var/log/redis_6379.log #172行,指定日志文件目录
dir /var/lib/redis/6379 #264行,指定工作目录
replicaof 192.168.80.10 6379 #287行,取消注释并指定要同步的Master节点IP和端口
appendonly yes #700行,开启AOF持久化功能/etc/init.d/redis_6379 restart

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重启

在这里插入图片描述
slave2一样
在这里插入图片描述

5.验证主从效果

-------------验证主从效果-------------
在Master节点上看日志:
tail -f /var/log/redis_6379.log在Master节点上验证从节点:
redis-cli
127.0.0.1:6379> info replication

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

二、哨兵模式

在这里插入图片描述
哨兵的核心功能:在主从复制的基础上,哨兵引入了主节点的自动故障转移。

1.哨兵模式的原理

哨兵(sentinel):是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的Master,并将所有Slave 连接到新的Master。所以整个运行哨兵的集群的数量不得少于3个节点。

2.哨兵模式的作用


  1. 监控:哨兵会不断地检查主节点和从节点是否运作正常。
  2. 自动故障转移:当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。
  3. 通知(提醒):哨兵可以将故障转移的结果发送给客户端。

3.哨兵模式的结构

哨兵结构由两部分组成:哨兵节点和数据节点

  1. 哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的 redis 节点,不存储数据。
  2. 数据节点:主节点和从节点都是数据节点

哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的Redis 工作节点是否正常,当Master 出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个 Master 的确出现问题,然后会通知哨兵间,然后从Slaves中选取一个作为新的 Master。

需要特别注意的是:客观下线是主节点才有的概念;如果从节点和哨兵节点发生故障,被哨兵主观下线后,不会再有后续的客观下线和故障转移操作。

4.哨兵模式的部署

1.所有节点修改哨兵模式的配置文件

--------修改Redis哨兵模式的配置文件(所有节点操作) --------
vim /opt/redis-5.0.7/sentinel.conf
protected-mode no #17行,关闭保护模式
port 26379 #21行,Redis哨兵默认的监听端口
daemonize yes #26行,指定sentinel为后台启动
logfile "/var/log/sentinel.log" #36行,指定日志存放路径
dir "/var/lib/redis/6379" #65行,指定数据库存放路径
sentinel monitor mymaster 192.168.80.10 6379 2 #84行, 修改
指定该哨兵节点监控192.168.80.10:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移
sentinel down-after-milliseconds mymaster 30000 #113,判定服务器down掉的时间周期,默认30000毫秒(30)
sentinel failover-timeout mymaster 180000 #146行,故障节点的最大超时时间为180000 (180)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.启动哨兵模式

----------启动哨兵模式-----------------
注意:先启master,再启slave
cd /opt/redis-5.0.7/
redis-sentinel sentinel.conf &

在这里插入图片描述

3.查看哨兵信息

-----------查看哨兵信息------------------
redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.80.10:6379,slaves=2,sentinels=3

4.故障模拟

---------故障模拟--------------
#查看redis-server进程号(在Master 上进行):
ps -ef | grep redis
root 16913 1 0 19:12 ? 00:00:20 /usr/local/redis/bin/redis-server 0.0.0.0:6379
root 18991 1 0 22:37 ? 00:00:02 redis-sentinel *:26379 [sentinel]
root 19141 16668 0 22:50 pts/1 00:00:00 grep --color=auto redis#杀死 Master 节点上redis-server的进程号
kill -9 57521 #Master节点上redis-server的进程号

在这里插入图片描述

5.验证master是否切换

#验证结果,查看master是转换至从服务器
tail -f /var/log/sentinel.log#在Slave1上查看是否转换成功
redis-cli -p 26379 INFO Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.80.20:6379,slaves=2,sentinels=3

在这里插入图片描述

在这里插入图片描述

三、集群模式

在这里插入图片描述
集群,即 Redis Cluster, 是Redis 3. 0开始引入的分布式存储方案。

集群由多个节点(Node) 组成,Redis 的数据分布在这些节点中。

集群中的节点分为主节点和从节点;只有主节点负责读写请求和集群信息的维护;从节点只进行主节点数据和状态信息的复制。

1.集群模式的作用


  1. 数据分区:数据分区(或称数据分片) 是集群最核心的功能。
    集群将数据分散到多个节点,一方面突破了 Redis 单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。
    Redis 单机内存大小受限问题,在介绍持久化和主从复制时都有提及;例如,如果单机内存太大,bgsave 和 bgrewriteaof的 fork 操作可能导致主进程阻塞,主从环境下主机切换时可能导致从节点长时间无法提供服务,全量复制阶段主节点的复制缓冲区可能溢出。
  2. 高可用:集群支持主从复制和主节点的自动故障转移(与哨兵类似) ;当任一节点发生故障时,集群仍然可以对外提供服务。

2.集群欧式的数据分片

. Redis集群引入了哈希槽的概念
. Redis集群有 16384 个哈希槽( 编号0-16383)
. 集群的每个节点负责一部分哈希槽
. 每个Key 通过 CRC16 校验后对16384取余来决定放置哪个哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作

3.集群模式的主从复制模型

集群中具有A、B、C三个节点,如果节点B失败了,整个集群就会因缺少5461-10922这个范围的槽而不可以用。
为每个节点添加一个从节点A1、B1、C1整个集群便有三个Master节点和三个slave节点组成,在节点B失败后,集群选举B1位为主节点继续服务。当B和B1都失败后,集群将不可用。

4.Redis 集群部署

环境准备工作:

服务器类型系统和IP地址需要安装的组件节点端口
master服务器CentOS7.4(64 位) 192.168.80.10redis-5.0.7.tar.gz6001
master服务器CentOS7.4(64 位) 192.168.80.20redis-5.0.7.tar.gz6002
master服务器CentOS7.4(64 位) 192.168.80.30redis-5.0.7.tar.gz6003
slave服务器CentOS7.4(64 位) 192.168.80.40redis-5.0.7.tar.gz6004
slave服务器CentOS7.4(64 位) 192.168.80.50redis-5.0.7.tar.gz6005
slave服务器CentOS7.4(64 位)192.168.80.60redis-5.0.7.tar.gz

1.创建目录复制配置文件到对应的节点上

redis的集群一般需要6个节点, 33从。方便起见,这里所有节点在同一台服务器上模拟:
以端口号进行区分: 3个主节点端口号: 6001/6002/6003, 对应的从节点端口号: 6004/6005/6006cd /etc/redis/
mkdir -p redis-cluster/redis600{1..6}for i in {1. .6}
do
cp /opt/redis-5.0.7/redis.conf /etc/redis/redis-cluster/redis600$i
cp /opt/redis-5.0.7/src/redis-cli /opt/redis-5.0.7/src/redis-server /etc/redis/redis-cluster/redis600$i
done

在这里插入图片描述
在这里插入图片描述

2.修改主配置文件,设置开启群集功能

#其他5个文件夹的配置文件以此类推修改,注意6个端口都要不一样。
cd /etc/redis/redis-cluster/redis6001
vim redis.conf
#bind 127.0.0.1 #69行,注释掉bind项,默认监听所有网卡
protected-mode no #88行,修改,关闭保护模式
port 6001 #92行,修改,redis监听端口
daemonize yes #136行,开启守护进程,以独立进程启动
appendonly yes #699行,修改,开启AOF持久化
cluster-enabled yes #832行,取消注释,开启群集功能
cluster-config-file nodes-6001.conf #840行,取消注释,群集名称文件设置
cluster-node-timeout 15000 #846行,取消注释群集超时时间设置#可以写一个for循环将6001的文件复制给6002~6006,这样就不需要全部一个一个文件进行修改了
for i in {2..6}
do
/usr/bin/cp -f /etc/redis/redis-cluster/redis6001/redis.conf /etc/redis/redis-cluster/redis600$i/redis.conf
done#之后稍微修改文件即可(修改以下两个配置项):
92行,修改,redis监听端口
840行,取消注释,群集名称文件设置

3.启动redis节点

# 启动redis节点(方法一)
分别进入那六个文件夹,执行命令: redis-server redis.conf,来启动redis节点
cd /etc/redis/redis-cluster/redis6001
redis-server redis.conf## 使用for循环一键启动所有节点(方法二)
for d in {1..6}
do
cd /etc/redis/redis-cluster/redis600$d
redis-server redis.conf
doneps -ef | grep redis

4.启动集群

#启动集群
redis-cli --cluster create 127.0.0.1:6001 127.0.0.1:6002 127.0.0.1:6003 127.0.0.1:6004 127.0.0.1:6005 127.0.0.1:6006 --cluster-replicas 1#六个实例分为三组,每组一主一从,前面的做主节点,后面的做从节点。下面交互的时候需要输入yes 才可以创建。
-replicas 1 #表示每个主节点有1个从节点。

5.测试集群

#测试群集
redis-cli -p 6001 -c #加-c参数,节点之间就可以互相跳转
127.0.0.1:6001> cluster slots #查看节点的哈希槽编号范围
1) 1) (integer) 54612) (integer) 10922 #哈希槽编号范围3) 1) "127.0.0.1" .2) (integer) 6003 #主节点IP和端口号3) " fdca661922216dd69a 63a7c9d3c4540cd6baef44"4) 1) "127.0.0.1"2) (integer) 6004 #从节点IP和端口号3) "a2c0c32aff0f38980accd2b63d6d952812e44740"
2) 1) (integer) 02) (integer) 54603) 1) "127.0.0.1"2) (integer) 60013) "0e5873747a2e2 6bdc935bc76c2ba fb19d0a54b11"4) 1) "127.0.0.1"2) (integer) 60063) "8842ef5584a85005e135fd0ee59e5a0d67b0cf8e"
3) 1) (integer) 10923 2) (integer) 163833) 1) "127.0.0.1"2) (integer) 60023) "81 6ddaa3d14 69540b2f fbcaaf9aa867646846b30"4) 1) "127.0.0.1"2) (integer) 60053) "f847077bfe6722466e96178ae8cbb09dc8b4d5eb"127.0.0.1:6001> set name zhangsan
-> Redirected to slot [5798] located at 127.0.0.1: 6003
OK127.0.0.1:6001> cluster keyslot name #查看name键的槽编号
(integer) 5798


推荐阅读
  • 第二章:Kafka基础入门与核心概念解析
    本章节主要介绍了Kafka的基本概念及其核心特性。Kafka是一种分布式消息发布和订阅系统,以其卓越的性能和高吞吐量而著称。最初,Kafka被设计用于LinkedIn的活动流和运营数据处理,旨在高效地管理和传输大规模的数据流。这些数据主要包括用户活动记录、系统日志和其他实时信息。通过深入解析Kafka的设计原理和应用场景,读者将能够更好地理解其在现代大数据架构中的重要地位。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
  • centos 7.0 lnmp成功安装过程(很乱)
    下载nginx[rootlocalhostsrc]#wgethttp:nginx.orgdownloadnginx-1.7.9.tar.gz--2015-01-2412:55:2 ... [详细]
  • 检查 Kubernetes 系统命名空间中的 Pod 状态时,发现 Metric Server Pod 虽然处于运行状态,但存在异常:日志显示 'it doesn’t contain any IP SANs'。 ... [详细]
  • 基于iSCSI的SQL Server 2012群集测试(一)SQL群集安装
    一、测试需求介绍与准备公司计划服务器迁移过程计划同时上线SQLServer2012,引入SQLServer2012群集提高高可用性,需要对SQLServ ... [详细]
  • Spark与HBase结合处理大规模流量数据结构设计
    本文将详细介绍如何利用Spark和HBase进行大规模流量数据的分析与处理,包括数据结构的设计和优化方法。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 2021年Java开发实战:当前时间戳转换方法详解与实用网址推荐
    在当前的就业市场中,金九银十过后,金三银四也即将到来。本文将分享一些实用的面试技巧和题目,特别是针对正在寻找新工作机会的Java开发者。作者在准备字节跳动的面试过程中积累了丰富的经验,并成功获得了Offer。文中详细介绍了如何将当前时间戳进行转换的方法,并推荐了一些实用的在线资源,帮助读者更好地应对技术面试。 ... [详细]
  • 在JavaWeb项目架构中,NFS(网络文件系统)的实现与优化是关键环节。NFS允许不同主机系统通过局域网共享文件和目录,提高资源利用率和数据访问效率。本文详细探讨了NFS在JavaWeb项目中的应用,包括配置、性能优化及常见问题的解决方案,旨在为开发者提供实用的技术参考。 ... [详细]
  • 本文详细介绍了如何将Spring框架与Hibernate ORM框架进行集成,包括配置文件的设置和数据持久化操作的实现。 ... [详细]
  • java解析json转Map前段时间在做json报文处理的时候,写了一个针对不同格式json转map的处理工具方法,总结记录如下:1、单节点单层级、单节点多层级json转mapim ... [详细]
  • 本文详细介绍如何使用Netzob工具逆向未知通信协议,涵盖从基本安装到高级模糊测试的全过程。通过实例演示,帮助读者掌握Netzob的核心功能。 ... [详细]
  • 一、Tomcat安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat8.0\webapps二、Tomcat8.0配置多个端口,其实也就是给T ... [详细]
  • 为什么多数程序员难以成为架构师?
    探讨80%的程序员为何难以晋升为架构师,涉及技术深度、经验积累和综合能力等方面。本文将详细解析Tomcat的配置和服务组件,帮助读者理解其内部机制。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
author-avatar
天边的云YEAH_988
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有