Redis集群环境搭建

Redis集群环境搭建

Redis主从复制

概念

主从复制是指将一台Redis服务器的数据,复制到其他的Redis服务器,前者称为主节点(master/leader),后者称为从节点(slave/followe);数据的复制是单向的,只能从主节点到从节点,以Master写为主,Slave以读为主

默认情况下,每台Redis服务器都是主节点,且一个主节点可以有多个从节点,但是一个从节点只能有一个主节点。主从复制的作用主要包括:

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

一般来说,要将Redis运用于工程项目中,只使用一台Redis是万万不能的,原因如下:

  1. 从结构上,单个Redis服务器发生单点故障,并且一台服务器需要处理所有的请求负载,压力较大
  2. 从容量上,单个Redis服务器内存容量有限,就算一台Redis服务器内存容量256G,也不能将所有内存用做Redis的存储服务,一般来说,单台Redis最大使用内存不应该超过20G

一般类似于电商网站上的商品,都是一次上传,无数次浏览的,也就是读多写少。对于这种场景可以使用以下架构设计:

在这里插入图片描述

环境配置

# 只配置从库,不用配置主库,因为redis默认每个节点都是master
127.0.0.1:6379> info replication	#查看当前库的信息
# Replication
role:master	#角色master
connected_slaves:0	#从库数量为0
master_replid:d4486b0339829fff1d75d3b082083753834e3c55
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

复制三个配置文件,然后修改对应的信息

# 79 80 81 对应的是端口号(6379 6380 6381)
[root@VM-4-17-centos redisconfig]# cp redis.conf redis79.conf
[root@VM-4-17-centos redisconfig]# cp redis.conf redis80.conf
[root@VM-4-17-centos redisconfig]# cp redis.conf redis81.conf
[root@VM-4-17-centos redisconfig]# vim redis79.conf

#修改这些东西即可
dbfilename dump6381.rdb	#RDB文件名字
logfile "6381.log"	日志文件名
pidfile /var/run/redis_6381.pid pid文件名
port 6381	端口
# 依次启动三个服务后查看redis进程
[root@VM-4-17-centos bin]# redis-server redisconfig/redis81.conf
[root@VM-4-17-centos bin]# ps -ef | grep redis
root     29572     1  0 09:57 ?        00:00:00 redis-server 127.0.0.1:6379
root     29597     1  0 09:57 ?        00:00:00 redis-server 127.0.0.1:6380
root     29630     1  0 09:58 ?        00:00:00 redis-server 127.0.0.1:6381
root     29654 28611  0 09:58 pts/3    00:00:00 grep --color=auto redis

一主二从

默认情 况下,每台Redis服务器都是主节点,一般只要配置从节点即可

# 连接80客户端
[root@VM-4-17-centos bin]# redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> info replication
# Replication
role:master	#主节点
connected_slaves:0
master_replid:115cb18c414d42087891ba03ae8cb29f55c4af7a
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# 用slaveof命令进行配置
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave	#从节点
master_host:127.0.0.1
master_port:6379	#主节点端口
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:14
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1aa4607c8f616befc56059c548b59921c34b8eba
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14


# 在主节点中可以查看到从节点
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6380,state=online,offset=98,lag=0	#从节点的信息
master_replid:1aa4607c8f616befc56059c548b59921c34b8eba
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:98

在这里插入图片描述

这里的修改是通过命令进行主从节点的配置,服务器重启之后就会失效,一般在实际开发环境都是通过配置文件进行修改。

在这里插入图片描述

# 主机可以写,从机只能读不能写,主机中的所有信息和数据都会自动同步到从机
# 主机设置一个key
127.0.0.1:6379> set k1 v1
OK
# 在两个从机都能读到
127.0.0.1:6380> get k1
"v1"
127.0.0.1:6381> get k1
"v1"

# 尝试在从机设置一个key
127.0.0.1:6380> set k2 v2
(error) READONLY You can't write against a read only replica.
# 我们现在将主机断掉
127.0.0.1:6379> shutdown
not connected> exit

#然后再查看从机的信息
127.0.0.1:6380> info replication
# Replication
role:slave	#还是一个从节点(后面更新哨兵模式的时候会说到)
master_host:127.0.0.1
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1172
master_link_down_since_seconds:95
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:1aa4607c8f616befc56059c548b59921c34b8eba
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1172
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1172

# 将一个从机断掉再重启
127.0.0.1:6380> shutdown
not connected> exit
[root@VM-4-17-centos bin]# redis-server redisconfig/redis80.conf 
[root@VM-4-17-centos bin]# redis-cli -p 6380
127.0.0.1:6380> ping
PONG
127.0.0.1:6380> info replication
# Replication
role:master	#又变成了主机,这个是因为我们没有走配置文件
connected_slaves:0
master_replid:b70f9cbf316e5b4ab8e465794538f9051d6d8c56
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

# 这个时候我们在79这个台机器上设置一个key
127.0.0.1:6379> set k2 v2
OK
# 80上拿不到,因为这时候它已不是79的从机
127.0.0.1:6380> get k2
(nil)

# 再将80设置为79的从机
127.0.0.1:6380> SLAVEOF 127.0.0.1 6379
OK
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:192
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:fce6232ffa0779d9479f4b13d6ce60e1cb3bd46c
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:192
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:179
repl_backlog_histlen:14
127.0.0.1:6380> get k2	#顺利拿到k2的值
"v2"

复制原理

  1. Slave启动成功连接到Master后会发送一个sync命令
  2. Master接到命令,后台启动存盘进程,同时收集所有收到的用于修改数据集命令,在后台进程执行完毕之后,Master将传送整个数据文件到Slave,并完成一次全量同步

这里有个复制的概念,全量复制和增量复制

全量复制:slave重启之后将master发送的数据文件加载到内存中

增量复制:Master将新的所有收集到的修改命令依次传给slave(连接到master之后进行的命令传递)

只要是重新连接master,就会进行一次全量复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/360254.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Promethues+Grafana监控Elasticsearch

PromethuesGrafana监控Elasticsearch 监控选用说明指标上报流程说明实现监控的步骤搭建elasticsearch-exporter服务搭建promethues和grafana服务 监控选用说明 虽然用Kibana来监控ES,能展示一些关键指标,但ES本身收集的指标并不全面,还需要在…

【刷题】牛客网 NC132 环形链表的约瑟夫问题

NC132 环形链表的约瑟夫问题 题目描述思路一(链表直通版)思路二(数组巧解版)思路三(变态秒杀版)Thanks♪(・ω・)ノ谢谢阅读下一篇文章见!!&#xff…

【C语言】探索数据结构:单链表和双链表

目录 💡链表的概念和结构 💡链表的分类 💡无头单向非循环链表(单链表)的实现 定义节点结构 单链表的尾部插入 单链表的头部插入 单链表的尾部删除 单链表的头部删除 在指定位置插入前数据 在指定位置之后插入数…

TypeScript 学习笔记(Day3)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度,分享学习笔记,希望能对大家有所帮助。推荐先按顺序阅读往期内容: 1. TypeScript 学习笔记(Day1) 2. TypeScript 学习笔…

科技云报道:新趋势下,国产数据库或“春山可望”

科技云报道原创。 从540亿元到1286亿元——这是中国通信标准化协会大数据技术标准推进委员会针对中国数据库行业给出的一份预测报告。 报告指出,未来五年,中国数据库行业将从百亿级市场跨越成为千亿级市场。 最近两年,中国的数据库行业似乎…

用tar压缩一个文件夹下的所有文件,包括文件夹本身

当你使用tar命令压缩一个文件夹时,默认情况下会包含该文件夹本身及其下所有的文件和子目录。因此,之前的命令同样适用于包括文件夹本身在内的所有内容: tar -czvf archive_name.tar.gz directory_to_compress/ c 表示创建一个新的归档文件。…

使用Eclipse搞Android项目报错

相信现在都没什么人还会用Eclipse来开发的了。 不过安装完后,打开Eclipse会提示我的Jdk版本不符合 --------------------------- Incompatible JVM --------------------------- Version 1.8.0_391 of the JVM is not suitable for this product. Version: 17 or g…

【三维重建】运动恢复结构(SfM)

运动恢复结构是通过三维场景的多张图像,恢复出该场景的三维结构信息以及每张图片对应的摄像机参数。 欧式结构恢复(内参已知,外参未知) 欧式结构恢复问题: 已知:1、n个三维点在m张图像中的对应点的像素坐标 2、相机内参 求解&…

mysql入门到精通003-基础篇-SQL

1、目录 2、SQL通用语法及分类 2.1 SQL通用语法 2.2 SQL分类 3、SQL DDL数据库操作 3.1 SQL DDL表操作-创建&查询 3.1.1 表操作-查询 3.1.2 表操作-创建 create table tb_user(id int comment 编号,name varchar(50) comment 用户名,age int comment 用户名,gender varch…

mysql .ibd 文件过大清理方法

问题 有一个 info_track 表用来临时存储告警推送数据,逻辑处理完成后,会执行 Delete 语句删除对应的记录。 问题:项目现场运行了几个月后,发现磁盘空间莫名占用了过多的存储,> 100GB,且无法释放。 生…

Halcon 拟合

文章目录 算子更多xld算子更多区域算子 Blob 分析案例预处理图像增强降噪图像降噪 图像增强Halcon 基于圆的拟合 Halcon 共线联合案例Halcon 拟合动画案例Halcon 拟合椭圆 算子 二值化算子 (二值化后获取的都是区域) 二值化算子 clip_region_rel 剪切区域…

【总线接口】3.常见总线、接口GPIO、I2C、SPI、I2S、Modbus

初接触硬件,五花八门的总线、接口一定会让你有些疑惑,我尝试用一系列文章来解开你的疑惑。 系列文章 【总线接口】1.以Xilinx开发板为例,直观的认识硬件接口 【总线接口】2.学习硬件这些年接触过的硬件接口、总线 大汇总 【总线接口】3.常见…

单片机开发通用功能组件

mcu_reuse_development_module 单片机可复用、可通用开发组件,是以中间件思想开发的一套功能模块,将具有代表性或使用次数较多的功能和协议栈封装为独立的组件供开发者使用,开发者仅需通过组件提供的接口对接驱动层和应用层即可使用组件功能…

【PyTorch实战演练】Fast R-CNN中的RoI(Region of Interest)池化详解

文章目录 0. 前言1. ROI池化的提出背景2. RoI池化的结构与工作原理3. RoI池化的作用及意义4. RoI使用示例 0. 前言 按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方…

Kaggle竞赛系列_SpaceshipTitanic金牌方案分析_数据分析

文章目录 【文章系列】【前言】【比赛简介】【正文】(一)数据获取(二)数据分析1. 缺失值2. 重复值3. 属性类型分析4. 类别分析5. 分析目标数值占比 (三)属性分析1. 对年龄Age分析(1)…

Activiti工作流引擎

一、工作流介绍: 1.1 概念: 工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或…

【golang】22、functional options | 函数式编程、闭包

文章目录 一、配置 Option1.1 options1.2 funcitonal options 一、配置 Option 1.1 options https://commandcenter.blogspot.com/2014/01/self-referential-functions-and-design.html I’ve been trying on and off to find a nice way to deal with setting options in a…

Flink中StateBackend(工作状态)与Checkpoint(状态快照)的关系

State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储,每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。另外,Operator state 也保存在机器节点本地。Flink 定期获取所有状态的快照,并将这些快照复制到持…

Python面向对象编程:探索代码的结构之美

文章目录 一、引言二、为什么学习面向对象编程2.1 提高代码的可维护性:通过封装、继承和多态实现模块化设计2.2 提升代码的复用性:通过类和对象的创建实现代码的重用 三、类和对象的基本概念3.1 类和对象的定义和关系:类是对象的模板&#xf…

通过Nacos权重配置,实现微服务金丝雀发布效果(不停机部署)

在微服务项目迭代的过程中,不可避免需要上线;上线对应着部署,或者升级部署;部署对应着修改,修改则意味着风险。 传统的部署都需要先停止旧系统,然后部署新系统,之后需要对新系统进行全面的功能测试&#xf…