首页 > 数据库 >Redis集群

Redis集群

时间:2023-08-27 16:56:16浏览次数:40  
标签:slave Redis redis 集群 conf 7001 7003 7002

Redis主从集群

主从复制模式就是,部署多台redis节点,其中只有一台节点是主节点(master),其他的节点都是从节点(slave),也叫备份节点(replica)。只有master节点提供数据的事务性操作(增删改),slave节点只提供读操作。所有slave节点的数据都是从master节点同步过来的。该模式的架构图如下:
image
共包含三个节点,一个主节点,两个从节点。

这里我们会在同一台虚拟机中开启3个redis实例,模拟主从集群,信息如下:

IP PORT 角色
192.168.78.129 7001 master
192.168.78.129 7002 slave
192.168.78.129 7003 slave

准备实例和配置

要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。

1)创建目录

我们创建三个文件夹,名字分别叫7001、7002、7003:

# 进入/tmp目录
cd /tmp
# 创建目录
mkdir 7001 7002 7003

如图:
image

2)拷贝配置文件到每个实例目录

然后将redis-6.2.4/redis.conf文件拷贝到三个目录中(在/tmp目录执行下列命令):

 方式一:逐个拷贝
cp redis-6.2.4/redis.conf 7001
cp redis-6.2.4/redis.conf 7002
cp redis-6.2.4/redis.conf 7003

 方式二:管道组合命令,一键拷贝
echo 7001 7002 7003 | xargs -t -n 1 cp redis-6.2.4/redis.conf

3)修改每个实例的端口、工作目录

修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置都修改为自己所在目录(在/tmp目录执行下列命令):

sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/tmp\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/tmp\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/tmp\/7003\//g' 7003/redis.conf

4)修改每个实例的声明IP

虚拟机本身有多个IP,为了避免将来混乱,我们需要在redis.conf文件中指定每一个实例的绑定ip信息,格式如下:
每个目录都要改,我们一键完成修改(在/tmp目录执行下列命令):

# 逐一执行
sed -i '1a replica-announce-ip 192.168.78.129' 7001/redis.conf
sed -i '1a replica-announce-ip 192.168.78.129' 7002/redis.conf
sed -i '1a replica-announce-ip 192.168.78.129' 7003/redis.conf

# 或者一键修改
printf '%s\n' 7001 7002 7003 | xargs -I{} -t sed -i '1a replica-announce-ip 192.168.78.129' {}/redis.conf

启动

为了方便查看日志,我们打开3个ssh窗口,分别启动3个redis实例,启动命令:

# 第1个
redis-server 7001/redis.conf
# 第2个
redis-server 7002/redis.conf
# 第3个
redis-server 7003/redis.conf

image

如果要一键停止,可以运行下面命令:

printf '%s\n' 7001 7002 7003 | xargs -I{} -t redis-cli -p {} shutdown

开启主从关系

现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。

有临时和永久两种模式:

  • 修改配置文件(永久生效)

    • 在redis.conf中添加一行配置:slaveof <masterip> <masterport>
  • 使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效)

slaveof <masterip> <masterport>

注意:在5.0以后新增命令replicaof,与salveof效果一致。
这里我们为了演示方便,使用方式二。

通过redis-cli命令连接7002,执行下面命令:

# 连接 7002
redis-cli -p 7002
# 执行slaveof
slaveof 192.168.150.101 7001

通过redis-cli命令连接7003,执行下面命令:

# 连接 7003
redis-cli -p 7003
# 执行slaveof
slaveof 192.168.150.101 7001

然后连接 7001节点,查看集群状态:

# 连接 7001
redis-cli -p 7001
# 查看状态
info replication

结果:
image

测试

执行下列操作以测试:

  • 利用redis-cli连接7001,执行set num 123

  • 利用redis-cli连接7002,执行get num,再执行set num 666

  • 利用redis-cli连接7003,执行get num,再执行set num 888

可以发现,只有在7001这个master节点上可以执行写操作,7002和7003这两个slave节点只能执行读操作。

127.0.0.1:7001> set k1 v1
OK
127.0.0.1:7002> get k1
"v1"
127.0.0.1:7003> get k1
"v1"
127.0.0.1:7003> set k2 v2
(error) READONLY You can't write against a read only replica.

数据同步原理

image

master如何判断slave是不是第一次来同步数据?

  • Replication ID:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid
  • offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新

image

image

简述全量同步和增量同步区别?

  • 全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave.
  • 增量同步: slave提交自己的offset到master,master获取repl baklog中从offset之后的命令给slave

什么时候执行全量同步?

  • slave节点第一次连接master节点时
  • slave节点断开时间太久,repl_baklog中的offset已经被覆盖时

什么时候执行增量同步?

  • slave节点断开又恢复,并且在repl baklog中能找到ofset时

标签:slave,Redis,redis,集群,conf,7001,7003,7002
From: https://www.cnblogs.com/zgf123/p/17660472.html

相关文章

  • 架构师必读:揭秘Redis五大数据类型及超实用应用场景!
    大家好,我是你们的小米!今天我们要来聊聊一个在面试中经常被问到的话题:Redis的五种数据类型及其应用场景。作为一名热爱技术的小伙伴,对于这个话题,我们可是要深入挖掘一下哦!String(字符串)String(字符串)类型是Redis最简单的数据类型之一,它不仅可以存储字符串,还可以存储整数和浮点数。在......
  • Redis持久化机制
    Redis的持久化指的是将内存中的数据持久化到磁盘上,以便在Redis服务器重启或宕机时能够恢复数据。Redis支持两种持久化方式:RDB和AOF。RDB持久化RDB全称RedisDatabaseBackupfile(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘......
  • redis 基础
    随着互联网+大数据时代的来临,传统的关系型数据库已经不能满足中大型网站日益增长的访问量和数据量。这个时候就需要一种能够快速存取数据的组件来缓解数据库服务I/O的压力,来解决系统性能上的瓶颈与其他内存型数据库相比,Redis具有以下特点:Redis不仅可以将数据完全保存在内存......
  • Linux下安装Redis
    Linux安装Redis首先,在官网上下载安装包接着使用xftp上传安装包到home目录接着解压缩安装包到opt目录使用tar-zxvfredis-5.0.14(2).tar.gz命令解压解压完成接着我们安装C++的编译器yuminstallgcc-c++安装完成检查版本gcc-v接着执行make命令make执行完成之......
  • Redis.js用法
    Redis.js是一个用于连接和操作Redis数据库的JavaScript库。以下是一些常用的方法及其详细参数说明: 1.创建Redis客户端实例: ```javascriptconstredis=require('redis');constclient=redis.createClient({ host:'localhost',//Redis服务器地址 port:6379,......
  • Python分享之redis(2)
    Hash操作redis中的Hash在内存中类似于一个name对应一个dic来存储hset(name,key,value)#name对应的hash中设置一个键值对(不存在,则创建,否则,修改)r.hset("dic_name","a1","aa")hget(name,key)r.hset("dic_name","a1","aa")#在name对应的hash中根据key获取val......
  • mall:redis项目源码解析
    目录一、mall开源项目1.1来源1.2项目转移1.3项目克隆二、Redis非关系型数据库2.1Redis简介2.2分布式后端项目的使用流程2.3分布式后端项目的使用场景2.4常见的缓存问题三、源码解析3.1集成与配置3.1.1导入依赖3.1.2添加配置3.1.3全局跨域配置3.2Redis测试3.2.1Redis......
  • 优化Redis缓存淘汰机制解决性能测试中报错率逐渐攀升问题
    在某个查询场景的性能测试过程中,遇到了一个问题:测试过程中报错率逐渐攀升。进一步检查后发现,在查询业务所在应用的后台日志和平台应用的后台日志中,都出现了用户登录相关的报错信息。经过排查分析,发现了问题的根源,并做出了解决方案。问题描述在测试过程中,发现报错率逐渐增加,并且......
  • IPV6配置redis
    一、全局单播地址(2000::/3)redis.conf配置IPV6bind::正常启动即可redis-cli--clustercreate--cluster-replicas0ipv6地址:6379ipv6地址:6389ipv6地址:6399二、链路本地地址(FE80::/10)redis.conf可以配置链路本地地址bindipv6链路本地地址%eth0但是创建集群的时候就会......
  • ubuntu安装go和redis
    ubuntu系统怎么安装go的redis 要在Ubuntu系统上安装Go语言的Redis驱动,可以按照以下步骤进行操作:首先,确保已经安装了Go语言和Redis。可以使用以下命令检查是否已经安装了Go语言:Copygoversion如果未安装Go语言,请使用以下命令安装:Copysudoaptupdates......