【Redis从头学-12】Redis主从复制和读写分离的多种部署方式解析(普通方式、Docker搭建方式、Docker-Compose搭建方式)

🧑‍💻作者名称:DaenCode
🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:Redis从头学


在这里插入图片描述


🌟基础环境

应用版本/型号
服务器腾讯云轻量服务器
镜像Centos 7.6
Docker1.13.1
Redisredis-6.2.1
Docker-Compose1.29.2

文章目录

  • 🌟基础环境
  • 🌟概述
    • 为什么要搭建Redis主从复制、读写分离?
    • 主从复制架构图
    • 主从同步流程
  • 🌟普通搭建
    • Redis安装
    • 创建三个节点
    • 三个节点配置文件修改
    • 启动并查看主从配置信息
  • 🌟Docker搭建
    • Docker环境准备
    • 配置三个节点redis.conf
    • 启动三个节点容器并查看节点信息
  • 🌟Docker-Compose创建
    • Docker-Compose安装
    • docker-compose.yml文件编写
    • 启动容器
  • 🌟写在最后

🌟概述

为什么要搭建Redis主从复制、读写分离?

  • Redis发生故障会造成数据丢失,这里就需要从节点对其进行备份来保障数据的安全。
  • 开发中,涉及到写少读多的场景,使用主从架构更能减少单节点部署的压力。

主从复制架构图

在这里插入图片描述


主从同步流程

全量复制

  • 主从节点建立连接
  • 主节点fork子进程,备份从客户端写入的数据为rdb文件。(RDB持久化策略)
  • 从节点将加载rdb文件到磁盘进行同步。

增量复制

  • 主节点将新产生的写命令放入复制积压缓冲区,当从节点重新连接主节点时,可以从复制积压缓冲区中同步尚未复制的命令操作。

加速复制

  • ⽀持⽆磁盘的复制,⼦进程直接将RDB通过⽹络发送给从服务器,不使⽤磁盘作为中间存储
  • repl-diskless-sync yes (默认是no)

🌟普通搭建

Redis安装

这里我已经安装好了Redis环境,具体操作可以查看【Redis从头学 -1】17张图带你学会Redis多环境(Linux、Windows)安装与配置

创建三个节点

1.创建三个节点存放的目录,master、slave1、slave2。

mkdir -p /data/redis/master/
mkdir -p /data/redis/slave1/
mkdir -p /data/redis/slave2/

2.进入到每个节点文件夹,各自创建3个配置文件redis.conf、日志文件夹log以及持久化文件夹data。

cd /data/redis/master && touch redis.conf && mkdir log && mkdir data
cd /data/redis/slave1 && touch redis.conf && mkdir log && mkdir data
cd /data/redis/slave2 && touch redis.conf && mkdir log && mkdir data

三个节点配置文件修改

1.vim修改master主节点配置文件。vim redis.conf

#任何ip可以访问
bind 0.0.0.0
#端口号
port 6379
#守护进程
daemonize yes
#密码
requirepass "daencode@top"
#日志文件
logfile "/data/redis/master/log/redis_6379.log"
#持久化文件名称
dbfilename "redis_6379.rdb"
#持久化文件存储路径
dir "/data/redis/master/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"

2.vim修改slave1从节点配置文件

#任何ip可以访问
bind 0.0.0.0
#端口号
port 6380
#守护进程
daemonize yes
#密码
requirepass "daencode@top"
#日志文件
logfile "/data/redis/slave1/log/redis_6380.log"
#持久化文件名称
dbfilename "redis_6380.rdb"
#持久化文件存储路径
dir "/data/redis/slave1/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"
#指定从哪个主节点复制
replicaof 49.233.48.98 6379

3.vim修改从节点slave2配置文件

#任何ip可以访问
bind 0.0.0.0
#端口号
port 6381
#守护进程
daemonize yes
#密码
requirepass "daencode@top"
#日志文件
logfile "/data/redis/slave2/log/redis_6381.log"
#持久化文件名称
dbfilename "redis_6381.rdb"
#持久化文件存储路径
dir "/data/redis/slave2/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"
#指定从哪个主节点复制
replicaof 49.233.48.98 6379

启动并查看主从配置信息

1.服务器防火墙允许6379、6380、6381端口
在这里插入图片描述
2.进入到bin目录,启动各个节点。

./redis-server /data/redis/master/redis.conf
./redis-server /data/redis/slave1/redis.conf
./redis-server /data/redis/slave2/redis.conf

3.查看是否启动成功。

ps -ef|grep redis

在这里插入图片描述
4.进入redis客户端。

./redis-cli -h 49.233.48.98 -p 6379 -a daencode@top
参数解释:
-h redis连接ip地址
-p 端口号
-a redis密码

5.查看redis主从复制信息。info replication
在这里插入图片描述


🌟Docker搭建

Docker环境准备

1.Docker安装

yum install docker-io -y

2.启动Docker

systemctl start docker

3.修改Docker镜像仓库。

vim /etc/docker/daemon.json

{
"debug":true,"experimental":true,
"registry-mirrors":
["https://pb5bklzr.mirror.aliyuncs.com"]
}

4.重启查看镜像是否配置成功。

systemctl restart docker
docker info

在这里插入图片描述
5.拉取redis镜像。

docker pull redis

配置三个节点redis.conf

1.master节点配置文件。

#任何ip可以访问
bind 0.0.0.0
#端口号
port 6379
#守护进程
daemonize no
#密码
requirepass daencode@top
#日志文件,这里注意是docker容器中的日志目录
logfile /usr/local/etc/redis/log/redis_6379.log
#持久化文件名称
dbfilename redis_6379.rdb
#持久化文件存储路径,这里注意是docker容器中的数据目录
dir /usr/local/etc/redis/data
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth daencode@top

2.slave1节点配置文件。

#任何ip可以访问
bind 0.0.0.0
#端口号
port 6380
#守护进程
daemonize no
#密码
requirepass daencode@top
#日志文件这里注意是docker容器中的日志目录
logfile /usr/local/etc/redis/log/redis_6380.log
#持久化文件名称
dbfilename "redis_6380.rdb"
#持久化文件存储路径这里注意是docker容器中的数据目录
dir /usr/local/etc/redis/data
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth daencode@top
#指定从哪个主节点复制
replicaof 49.233.48.98 6379

3.slave2节点配置文件。

#任何ip可以访问
bind 0.0.0.0
#端口号
port 6381
#守护进程
daemonize no
#密码
requirepass "daencode@top"
#日志文件
logfile "/usr/local/etc/redis/log/redis_6381.log"
#持久化文件名称
dbfilename "redis_6381.rdb"
#持久化文件存储路径
dir "/usr/local/etc/redis/data"
#持久化策略, 10秒内有个1个key改动,执⾏快照
save 10 1
#访问主节点的密码
masterauth "daencode@top"
#指定从哪个主节点复制
replicaof 49.233.48.98 6379

启动三个节点容器并查看节点信息

1.为日志文件目录以及持久化目录赋权。这里很重要!!!否则docker容器启动报错'logfile /usr/local/etc/redis/log/redis_6379.log' Can't open the log file: Permission denied

chmod 777 /data/redis/master/log/redis_6379.log && chmod 777 /data/redis/master/data
chmod 777 /data/redis/slave1/log/redis_6380.log && chmod 777 /data/redis/slave1/data
chmod 777 /data/redis/slave1/log/redis_6380.log && chmod 777 /data/redis/slave1/data

2.指定配置文件的方式启动redis节点容器。这里注意挂载文件时配置文件中的路径映射到宿主机时,宿主机要存在相关路径。

#master节点
docker run -itd --privileged=true --name redis-master -v /data/redis/master/redis.conf:/usr/local/etc/redis/redis.conf -v /data/redis/master/log/redis_6379.log:/usr/local/etc/redis/log/redis_6379.log -v /data/redis/master/data:/usr/local/etc/redis/data -p 6379:6379 redis redis-server /usr/local/etc/redis/redis.conf
#slave1节点
docker run -itd --privileged=true --name redis-slave1 -v /data/redis/slave1/redis.conf:/usr/local/etc/redis/redis.conf -v /data/redis/slave1/log/redis_6380.log:/usr/local/etc/redis/log/redis_6380.log -v /data/redis/slave1/data:/usr/local/etc/redis/data -p 6380:6380 redis redis-server /usr/local/etc/redis/redis.conf
#slave2节点
docker run -itd --privileged=true --name redis-slave2 -v /data/redis/slave2/redis.conf:/usr/local/etc/redis/redis.conf -v /data/redis/slave2/log/redis_6381.log:/usr/local/etc/redis/log/redis_6381.log -v /data/redis/slave2/data:/usr/local/etc/redis/data -p 6381:6381 redis redis-server /usr/local/etc/redis/redis.conf

参数详解:
--privileged=true 容器操作授权root
run:启动容器固定写法
--name:自定义启动容器名称
 -v 主机redis.conf 和redis容器做映射。:号左边为宿主机路径地址,右边为容器内的挂载路径地址。
 -d 后台启动
 -i 交互模式运行容器
 -t 为容器分配一个伪终端
 -p 端口映射 6379是redis端口
redis 镜像名称
redis-server /usr/local/etc/redis/redis.conf 指定容器内的配置文件启动redis,对应会映射到宿主机地址。

3.查看容器启动情况,若没有启动成功,使用docker logs redis-master查看日志。

docker ps

在这里插入图片描述

4.进入到redis-master容器,查看节点信息。

[root@VM-16-11-centos slave1]# docker exec -it redis-master /bin/bash
root@0adc35ea26c4:/data# redis-cli -h 49.233.48.98 -p 6379 -a daencode@top
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
49.233.48.98:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=49.233.48.98,port=6380,state=online,offset=1568,lag=1
slave1:ip=49.233.48.98,port=6381,state=online,offset=1568,lag=1
master_failover_state:no-failover
master_replid:58d7ab187b3d6ee990ff6f416d6123caca7adc11
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1568
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:1568
49.233.48.98:6379> 

🌟Docker-Compose创建

Docker-Compose安装

1.前往官网下载压缩包,并上传到服务器的/usr/local/bin路径下。
在这里插入图片描述
2.重命名文件为docker-compose。

mv docker-compose-Linux-x86_64 docker-compose

3.进行可执行授权。

chmod +x /usr/local/bin/docker-compose

4.检验是否安装成功。

[root@VM-16-11-centos bin]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c

docker-compose.yml文件编写

1.创建redis主从复制存放目录。

mkdir -p /docker/redis

2.进入到目录,编写docker-compose.yml文件。

cd /docker/redis

3.vim编写docker-compose.yml文件编写如下
docker-compose规范与docker对应版本

Compose 文件格式Docker 引擎发布版本
3.819.03.0+
3.718.06.0+
3.618.02.0+
3.517.12.0+
3.417.09.0+
3.317.06.0+
3.217.04.0+
3.11.13.1+
3.01.13.0+
2.417.12.0+
2.317.06.0+
2.21.13.0+
2.11.12.0+
2.01.10.0+
# 指定了Docker Compose 配置文件的版本
version: '3'
# services:服务定义
services:
# 主节点配置
  master:
   # redis镜像
    image: redis
   #设置容器的名称为 redis-master
    container_name: redis-master
   #restart 设置容器的重启策略为始终重启。
    restart: always
   # 指定容器启动时要执行的命令,这里我们通过 redis-server 启动 Redis 服务器,并设置端口为 6379,设置访问密码为 daencode@top,以及启用 AOF 持久化。
    command: redis-server --port 6379 --requirepass daencode@top  --appendonly yes
   # 将容器内的 6379 端口映射到主机的 6379 端口
    ports:
      - 6379:6379
   # volumes 将容器内的 /data 目录挂载到主机当前目录下的 ./data/master 目录。
    volumes:
      - ./data/master:/data
#从节点配置
  slave1:
    image: redis
    #从节点容器名称
    container_name: redis-slave-1
    restart: always
    #指定主节点
    command: redis-server --slaveof master 6379 --port 6380  --requirepass daencode@top --masterauth daencode@top  --appendonly yes
    ports:
      - 6380:6380
    volumes:
      - ./data/slave1:/data
# 从节点配置
  slave2:
    image: redis
    #从节点容器名称
    container_name: redis-slave-2
    restart: always
    # 指定主节点
    command: redis-server --slaveof master 6379 --port 6381  --requirepass daencode@top --masterauth daencode@top  --appendonly yes
    ports:
      - 6381:6381
    volumes:
      - ./data/slave2:/data

启动容器

1.启动容器

[root@VM-16-11-centos redis]# docker-compose up -d
Creating redis-slave-1 ... done
Creating redis-slave-2 ... done
Creating redis-master  ... done

2.进入到主节点容器,查看节点信息。

[root@VM-16-11-centos redis]# docker exec -it redis-master /bin/bash
root@3f5fef440d59:/data# redis-cli -a daencode@top
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=6381,state=online,offset=280,lag=1
slave1:ip=172.18.0.2,port=6380,state=online,offset=280,lag=1
master_failover_state:no-failover
master_replid:76142f6c4c262771e034421a1f9be364819637ed
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280

🌟写在最后

有关于Redis搭建主从复制+读写分离的三种方式(普通搭建、Docker搭建、Docker-Compose搭建)到此就结束了。感谢大家的阅读,安装中出现问题,可以在评论区留言。


请添加图片描述

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

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

相关文章

Unity 之 Time.deltaTime 的详细介绍以及用法

文章目录 Time.deltaTime 是什么?Time.deltaTime 有什么用?移动游戏对象:控制动画播放速度:实现平滑的计时器和延时: Time.deltaTime 是什么? “DeltaTime”(也被称为 “Delta Time”&#xff…

日常踩坑记录

本篇文章主要介绍一下最近的开发中用到的些小问题。问题不大,但有些小细节,记录一下,有遇到的朋友可以看一下,有更好的解决方法欢迎分享。 浏览器记住密码自动填充表单 这个问题我在火狐浏览器遇到了。我登录系统时选择了浏览器…

NC65 树表型参照 搜索全部 按钮点击事件后获取sql的方法

NC65 树表型参照 搜索全部 按钮点击事件后获取sql的方法。 /*** 返回 UIbtnLocQuery 特性值。* * return nc.ui.pub.beans.UIButton*/ /* 警告:此方法将重新生成。 */ private nc.ui.pub.beans.UIButton getUIbtnLocQuery() {// 搜索全部 按钮return getButtonPan…

x86的内存寻址方式

文章目录 一、实模式寻址二、保护模式寻址三、段页式内存管理四、Linux的内存寻址五、进程与内存1、内核空间和用户空间2、内存映射3、进程内存分配与回收 一、实模式寻址 在16位的8086时代,CPU为了能寻址超过16位地址能表示的最大空间(因为 8086 的地址…

使用Python写入数据到Excel:实战指南

在数据科学领域,Excel是一种广泛使用的电子表格工具,可以方便地进行数据管理和分析。然而,当数据规模较大或需要自动化处理时,手动操作Excel可能会变得繁琐。此时,使用Python编写程序将数据写入Excel文件是一个高效且便…

【SpringBoot】第二篇:RocketMq使用

背景: 本文会介绍多种案例,教大家如何使用rocketmq。 一般rocketmq使用在微服务项目中,属于分模块使用。这里使用springboot单体项目来模拟使用。 本文以windows系统来做案例。 下载rocketmq和启动: RocketMQ 在 windows 上运行…

微信小程序开发教学系列(4)- 数据绑定与事件处理

4. 数据绑定与事件处理 在微信小程序中,数据绑定和事件处理是非常重要的部分。数据绑定可以将数据和页面元素进行关联,实现数据的动态渲染;事件处理则是响应用户的操作,实现交互功能。本章节将详细介绍数据绑定和事件处理的基本原…

R-Meta分析核心技术教程

详情点击链接:全流程R-Meta分析核心技术教程 一,Meta分析的选题与检索 1、Meta分析的选题与文献检索 1)什么是Meta分析 2)Meta分析的选题策略 3)精确检索策略,如何检索全、检索准 4)文献的管理与清洗,如何制定文献纳入排除标准 …

腾讯云服务器地域有什么区别?怎么选择合适?

腾讯云服务器地域有什么区别?怎么选择比较好?地域选择就近原则,距离地域越近网络延迟越低,速度越快。关于地域的选择还有很多因素,地域节点选择还要考虑到网络延迟速度方面、内网连接、是否需要备案、不同地域价格因素…

【PHP】echo 输出数组报Array to string conversion解决办法

代码&#xff1a; <?PHP echo "Hello World!";$demoName array("kexuexiong","xiong");echo "<pre>";var_dump($demoName);echo $demoName; print_r($demoName);echo "</pre>"; ?>输出结果&#xff1…

Docker的革命:容器技术如何重塑软件部署之路

引言 在过去的几年中&#xff0c;容器技术已经从一个小众的概念发展成为软件开发和部署的主流方法。Docker&#xff0c;作为这一变革的先驱&#xff0c;已经深深地影响了我们如何构建、部署和运行应用程序。本文将探讨容器技术的起源&#xff0c;Docker如何崛起并改变了软件部…

Dreamweaver软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 Dreamweaver软件是一款专业的网页开发工具&#xff0c;由Adobe公司开发并广泛应用于Web开发领域。它提供了一站式的网页开发解决方案&#xff0c;包括网页设计、网页编程、网站管理和移动应用开发等功能。 Dreamweaver软件具有…

【Linux-Day8- 进程替换和信号】

进程替换和信号 问题引入 我们发现 终端输入的任意命令的父进程都是bash,这是因为Linux系统是用fork()复制出子进程&#xff0c;然后在子进程中调用替换函数进行进程替换&#xff0c;实现相关命令。 &#xff08;1&#xff09; exec 系列替换过程&#xff1a;pcb 使用以前的只…

响应式web-PC端web与移动端web(H5)兼容适配 选型方案

背景 项目需要&#xff0c;公司已经有一套PC端web&#xff0c;需要做一套手机端浏览器可用的&#xff0c;但是又想兼容pc端&#xff0c;适配的web项目。 以下是查阅到响应布局现成的开源模版。根据自己技术栈&#xff0c;vue2,js来搜索相关的开源项目。 RuoYi 使用若依快速…

网络编程套接字(2): 简单的UDP网络程序

文章目录 网络编程套接字(2): 简单的UDP网络程序3. 简单的UDP网络程序3.1 服务端创建(1) 创建套接字(2) 绑定端口号(3) sockaddr_in结构体(4) 数据的接收与发送接收发送 3.2 客户端创建3.3 代码编写(1) v1_简单发送消息(2) v2_小写转大写(3) v3_模拟命令行解释器(4) v4_多线程版…

「MySQL-01」MySQL基础

目录 一、数据库概念 1. 什么是数据库 2. 为什么要有数据库&#xff1f; 3. 数据库将数据存在哪里&#xff1f; 二、知名数据库介绍 1.知名数据库介绍 2.为什么要学习MySQL 三、MySQL的基本使用 0. 安装MySQL 1. 数据库客户端链接服务端 2. Windows下的MySQL服务端管理 3. 数据…

TMS FlexCel Studio for VCL and FireMonkey Crack

TMS FlexCel Studio for VCL and FireMonkey Crack FlexCel for VCL/FireMonkey是一套允许操作Excel文件的Delphi组件。它包括一个广泛的API&#xff0c;允许本机读取/写入Excel文件。如果您需要在没有安装Excel的Windows或macOS机器上阅读或创建复杂的电子表格&#xff0c;Fle…

基于JSP+Servlet+Mysql员工信息管理系统

基于JSPServletMysql员工信息管理系统 一、系统介绍二、功能展示三.其他系统实现五.获取源码 一、系统介绍 项目类型&#xff1a;Java web项目 项目名称&#xff1a;基于JSPServlet的员工/客户/人员信息管理系统 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言…

行业追踪,2023-08-23

自动复盘 2023-08-23 凡所有相&#xff0c;皆是虚妄。若见诸相非相&#xff0c;即见如来。 k 线图是最好的老师&#xff0c;每天持续发布板块的rps排名&#xff0c;追踪板块&#xff0c;板块来开仓&#xff0c;板块去清仓&#xff0c;丢弃自以为是的想法&#xff0c;板块去留让…

Python3 元组

Python3 元组 Python 的元组与列表类似&#xff0c;不同之处在于元组的元素不能修改。 元组使用小括号 ( )&#xff0c;列表使用方括号 [ ]。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c;并使用逗号隔开即可。 实例(Python 3.0) >>> tup1 (Go…