Redis7.0.15 主从复制、哨兵模式搭建

news2024/11/16 15:44:01

主从复制:master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其他的slave数据库

1. Redis复制介绍:

https://redis.io/docs/latest/operate/oss_and_stack/management/replication/

  • 读写分离
  • 容灾恢复
  • 数据备份
  • 水平扩容支撑高并发

2. 下载

下载到自己指定的目录:

mkdir /opt/coisini/redis-cluster

cd /opt/coisini/redis-cluster

wget https://download.redis.io/releases/redis-7.0.15.tar.gz

3. 解压以及重命名

搭建3台,分别为redis6380、redis6381、redis6382

tar -zxvf redis-7.0.15.tar.gz 

进入redis目录:

cd redis-7.0.15/

4. 编译安装

安装 systemd-devel 和其他编译所需的依赖

yum -y install centos-release-scl devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutilsscl enable devtoolset-9 bash systemd-devel make gcc

配置并编译 Redis

make BUILD_WITH_SYSTEMD=yes

等待一会~
编译安装:

make install

如果报以下错误
解决办法:
make MALLOC=libc
报错解决

5. 编辑配置文件

vi /opt/coisini/redis-cluster/redis-7.0.15/redis.conf

(按Esc退出编辑模式下: /protected-mode 即可搜索,回车后按n可以跳转搜索下一个,:set number可以显示行号 )

# 关闭保护模式
protected-mode no
# 守护进程模式开启
daemonize yes
# 绑定IP按需修改,bind指定网段远程访问redis,注释就没有限制了,或者0.0.0.0。
bind 0.0.0.0 
# 端口(单机默认,集群按需修改)
port 6380
 # (搜/requirepass foobared)设置Redis密码
requirepass 123456
# 允许redis后台运行
daemonize yes
 # systemd接管服务
supervised systemd
# 指定当前工作目录,dir(大概在504行)
dir /opt/coisini/redis-cluster/redis6380/tmp
pidfile /opt/coisini/redis-cluster/redis6380/redis_6380.pid
# redis日志输出(可以配置为./6380.log)
logfile /opt/coisini/redis-cluster/redis6380/redis6380.log
# 校验master主机密码
masterauth 123456
# dump.rdb名字
dbfilename dump6380.rdb
# 配置主从(这个只要从机配置就行了,主机注释掉)
replicaof 192.168.31.16 6380
appendonly yes

#配置主从(这个只要从机配置就行了,主机注释掉)
replicaof 192.168.31.16 6380

:wq保存并退出

6. 拷贝三份

for port in 6380 6381 6382; do cp -r redis-7.0.15 redis$port; done

拷贝
继续修改6381、6382 两个文件的配置

vi /opt/coisini/redis-cluster/redis6381/redis.conf
vi /opt/coisini/redis-cluster/redis6382/redis.conf

分别修改以下配置:

(按Esc退出编辑模式下: /protected-mode 即可搜索,回车后按n可以跳转搜索下一个,:set number可以显示行号 )

# 端口(单机默认,集群按需修改)
port 6381
# 指定当前工作目录,dir(大概在504行)
dir /opt/coisini/redis-cluster/redis6381/
pidfile /opt/coisini/redis-cluster/redis6381/redis_6381.pid
# redis日志输出(可以配置为./6381.log)
logfile /opt/coisini/redis-cluster/redis6381/redis6381.log
# dump.rdb名字
dbfilename dump6381.rdb

:wq保存退出

7. 创建日志目录并赋权

useradd -r -s /bin/false redis

for port in 6380 6381 6382; do 
  mkdir -p /opt/coisini/redis-cluster/redis$port/tmp
  touch /opt/coisini/redis-cluster/redis$port/redis$port.log
  chown redis:redis /opt/coisini/redis-cluster/redis$port/redis$port.log
  chown -R redis:redis /opt/coisini/redis-cluster/redis$port
  chmod -R 770 /opt/coisini/redis-cluster/redis$port
done

8. 编辑启动脚本

vi redis-cluster.sh

添加:

#!/bin/bash

# Redis集群节点端口列表
ports=(6380 6381 6382)

# Redis的安装路径
redis_path="/opt/coisini/redis-cluster"

# Redis的密码
password="123456"

# 启动函数
start() {
    echo "Starting Redis cluster..."
    for port in "${ports[@]}"; do
        echo "Starting Redis instance on port $port..."
        $redis_path/redis$port/src/redis-server $redis_path/redis$port/redis.conf
    done
    echo "Redis cluster started."
}

# 停止函数
stop() {
    echo "Stopping Redis cluster..."
    for port in "${ports[@]}"; do
        echo "Stopping Redis instance on port $port..."
        $redis_path/redis$port/src/redis-cli -a $password -p $port shutdown
    done
    echo "Redis cluster stopped."
}

# 脚本的主逻辑
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        stop
        start
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

文件赋权:

chmod +x redis-cluster.sh

9. 开放端口:

sudo firewall-cmd --permanent --add-port=6380/tcp --add-port=6381/tcp --add-port=6382/tcp
sudo firewall-cmd --reload

10. 先不着急启动,设置哨兵模式:

参数解析:
protected-model:安全保护模式
port:端口
daemonize:是否以后台daemon方式运行
pidfile:pid文件路径
logfile:日志文件路径
dir:工作目录
sentinel monitor mymaster 127.0.0.1 6379 2 设置要监控的master服务器
quorum表示最少有几个哨兵认可客观下线,同意故障迁移的法定票数
sentinel down-after-milliseconds mymaster 30000 指定多少毫秒之后,主节点没有应答哨兵,此时哨兵主观上认为主节点下线
sentinel auth-pass master设置了密码,连接master服务的密码
acllog-max-len 128 ACL日志的最大条目长度。
sentinel parallel-syncs mymaster 1 表示允许并行同步的slave个数,当Master挂了后,哨兵会选出新的Master,此时,剩余的slave会向新的master发起同步数据
sentinel failover-timeout mymaster 180000 故障转移的超时时间,进行故障转移时,如果超过设置的毫秒,表示故障转移失败

vi /opt/coisini/redis-cluster/redis6380/sentinel.conf

编辑以下选项:

(按Esc退出编辑模式下: /protected-mode 即可搜索,回车后按n可以跳转搜索下一个,:set number可以显示行号 )

# 哨兵sentinel实例运行的端口
protected-mode no
# 端口
port 26380
# 保护模式
daemonize yes
pidfile /opt/coisini/redis-cluster/redis6380/redis-sentinel6380.pid
logfile /opt/coisini/redis-cluster/redis6380/redis-sentinel6380.log
dir /opt/coisini/redis-cluster/redis6380/tmp
# 哨兵监听的主服务器,只需要2票就可以从机变主机
sentinel monitor mymaster 192.168.31.16 6380 2
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd 设置主机密码
sentinel auth-pass mymaster 123456
# 设置未得到主机响应时间,5秒未响应视为宕机
sentinel down-after-milliseconds mymaster 5000
# 设置等待主活动时间,10秒主机未活动,则重新选举主机
sentinel failover-timeout mymaster 10000
# 设置连接密码
sentinel auth-pass mymaster 123456

然后分别修改另外两个配置,注意修改端口

vi /opt/coisini/redis-cluster/redis6381/sentinel.conf
vi /opt/coisini/redis-cluster/redis6382/sentinel.conf

除了这个指定主机地址不变 sentinel monitor mymaster 192.168.31.16 6380 2

11. 编辑 Redis Sentinel 启动脚本:

vi redis-sentinel-cluster.sh
#!/bin/bash

# Redis集群节点端口列表
ports=(6380 6381 6382)

# Redis Sentinel节点的端口列表
sentinel_ports=(26380 26381 26382)

# Redis的安装路径
redis_path="/opt/coisini/redis-cluster"

# Redis的密码
password="123456"

# 启动函数
start() {
    echo "Starting Redis Sentinel cluster..."
    for port in "${sentinel_ports[@]}"; do
        echo "Starting Redis Sentinel on port $port..."
        $redis_path/redis$((port-20000))/src/redis-server $redis_path/redis$((port-20000))/sentinel.conf --sentinel --daemonize yes
    done
    echo "Redis Sentinel cluster started."
}

# 停止函数
stop() {
    echo "Stopping Redis Sentinel cluster..."
    for port in "${sentinel_ports[@]}"; do
        echo "Stopping Redis Sentinel on port $port..."
        $redis_path/redis$((port-20000))/src/redis-cli -a $password -p $port shutdown
    done
    echo "Redis Sentinel cluster stopped."
}

# 重启函数
restart() {
    stop
    start
}

# 脚本的主逻辑
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

文件赋权:

chmod +x redis-sentinel-cluster.sh

12. 先启动Redis

/opt/coisini/redis-cluster/redis-cluster.sh start

停止、重启命令:
/opt/coisini/redis-cluster/redis-cluster.sh stop
/opt/coisini/redis-cluster/redis-cluster.sh restart

13. 查看启动日志:

cat /opt/coisini/redis-cluster/redis6380/redis6380.log

从机连接成功
启动日志

cat /opt/coisini/redis-cluster/redis6380/redis6381.log

连接主机成功

14. 再启动Redis Sentinel监听主节点的状态

/opt/coisini/redis-cluster/redis-sentinel-cluster.sh start

停止、重启命令:
/opt/coisini/redis-cluster/redis-sentinel-cluster.sh stop
/opt/coisini/redis-cluster/redis-sentinel-cluster.sh restart

15. 查询主从关系

info replication

主机视角,两个从机
两个从机
从机视角,一个主机
从机

16. 进入主机:

/opt/coisini/redis-cluster/redis6380/src/redis-cli -p 6380 -a 123456

set k1 coisini

其它从机会同步数据
同步数据

17. 我们假设主机宕机:

查看

ps aux | grep redis

8360
结束掉6380进程,

kill 8362

查看主从情况:

info replication

选举 已经从8360转到8362了
info replication
接下来我们重启6380机器:

 /opt/coisini/redis-cluster/redis6380/src/redis-server /opt/coisini/redis-cluster/redis6380/redis.conf

查看主从情况:

info replication

6380已经变为从机
6382

18. 设置服务开机自启

sudo vi /etc/systemd/system/redis-cluster.service

添加以下内容:

[Unit]
Description=Redis Cluster Service
After=network.target

[Service]
Type=forking
ExecStart=/opt/coisini/redis-cluster/redis-cluster.sh start
ExecStop=/opt/coisini/redis-cluster/redis-cluster.sh stop
ExecReload=/opt/coisini/redis-cluster/redis-cluster.sh restart
User=redis
Group=redis
Restart=on-failure

[Install]
WantedBy=multi-user.target
sudo vi /etc/systemd/system/redis-sentinel-cluster.service

添加以下内容:

redis-sentinel-cluster.service 服务在redis-cluster.service启动完成之后才启动

[Unit]
Description=Redis Sentinel Cluster Service
After=redis-cluster.service

[Service]
Type=forking
ExecStart=/opt/coisini/redis-cluster/redis-sentinel-cluster.sh start
ExecStop=/opt/coisini/redis-cluster/redis-sentinel-cluster.sh stop
ExecReload=/opt/coisini/redis-cluster/redis-sentinel-cluster.sh restart
User=redis
Group=redis
Restart=on-failure

[Install]
WantedBy=multi-user.target

重新加载 systemd 配置

sudo systemctl daemon-reload

设置 redis-cluster.service 和 redis-sentinel-cluster.service 开机自启

sudo systemctl enable redis-cluster.service
sudo systemctl enable redis-sentinel-cluster.service

可以 reboot 重启验证

相关命令:
启动 Redis Cluster:sudo systemctl start redis-cluster.service
启动 Redis Sentinel Cluster(会在 Redis Cluster 启动成功后运行)
sudo systemctl start redis-sentinel-cluster.service
查看服务状态
sudo systemctl status redis-cluster.service
sudo systemctl status redis-sentinel-cluster.service

19. 项目集成:TODO

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity游戏开发001

Unity游戏开发 系列文章的目录: 第一章:Hello,Unity! “好读书,不求甚解;每有会意,便欣然忘食。” 本文目录: Unity游戏开发 Unity游戏开发前言今天我们来体验一下unity开发创建第一…

基于MMIO的Virtio流程分析——QEMU平台

目录 一、相关概念 1、Virtio 2、QEMU 3、KVM 4、MMIO 5、小结 二、QEMU中Virtio的实现方法 1、virtio_blk 2、virtio_net 三、Virtio Driver和Virtio Device 的初始化流程 1、Virtio Driver Init 2、Virtio Mmio Driver Init 3、Virtio Device Init (1) get dev…

培训第二十九天(python脚本使数据库读写分离,mysql主从开机自动同步,python操作数据库,MyCat插件的学习)

上午 1、python脚本实现数据库主从分离 # 引入模块 python链接mysql工具,驱动包,连接器import pymysql# python 类 类名 rwsplit,名字可以和文件名不一致# 三个函数,函数的标识 def 函数名 (self,参数列表):# __init__ 初始化函数&#xff…

详解最大比合并算法(Maximum Ratio Combining)

目录 一. 空间分集(space diversity) 二. 系统模型 三. 尝试性译码 3.1 选择性合并算法(selection combining) 3.2 简单相加 四. 最大比合并算法 4.1 合并信号 4.2 设计权重值w 五. 波束赋形 5.1 小结 5.2 与波束赋形的…

牛客小白月赛98

牛客小白月赛98 A 骰子魔术 链接:https://ac.nowcoder.com/acm/contest/85598/A 来源:牛客网 题目描述 jackle 正在给他的朋友表演一个关于骰子的魔术: jackle 会拿出一枚骰子,骰子的表面分别写上了从 1∽500 的数字&#xff0c…

Hadoop环境安装及HDFS初步使用

一、Hadoop原理 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。Hadoop实现了一个分布式文件系统( Distributed File System),其中一个组件是HDFS(Hadoop Distr…

【深度学习】【语音TTS】GPT-SoVITS v2 实战,训练一个人的音色,Docker镜像

文章目录 原理Dockerdocker push训练教程: https://www.yuque.com/baicaigongchang1145haoyuangong/ib3g1e/xyyqrfwiu3e2bgyk 原理 Docker 不用docker不行,不好分配显卡, 做个docker镜像: docker pull pytorch/pytorch:2.1.2

【数据结构与算法 | 图篇】Dijkstra算法(单源最短路径算法)

1. 前言 由图: 如果我们想要求得节点1到节点5(也可以是其他节点)的最短路径,我们可以使用Dijkstra算法。 2. 步骤与思路 1. 将所有顶点标记为未访问(顶点类的visited属性设置为false)。创建一个未访问顶点的集合。 2. 为每个顶…

Web开发:使用Abp.AutoMapper进行实体映射的demo

控制台程序为例&#xff0c;展示该demo 一、安装Nuget包 二、文件结构 三、AutoMapperProfile.cs&#xff08;映射规则&#xff09; using AutoMapper;namespace ConsoleApp1 {public class AutoMapperProfile : Profile{public AutoMapperProfile(){CreateMap<Student, T…

面向新人的 Java 面试问题(1-50)

1. Java 是否独立于平台&#xff1f;如果是&#xff0c;那么如何独立&#xff1f; 是的&#xff0c;Java 是一种独立于平台的语言。与许多编程语言不同&#xff0c;javac 将程序编译为字节码或 .class 文件。此文件独立于正在运行的软件或硬件&#xff0c;但需要在操作系统中预…

--- java 包装类 泛型 ---

包装类 因为在java中基本类型&#xff08;int char...&#xff09;不是继承值Object类&#xff0c;为了满足泛型的需要&#xff0c;于是给每种基本类型都设计了对应的包装类 基本类型包装类intInteger char CharacterbyteByteShortShortfloatFloatdoubleDoublelongLongboolea…

mars3D引用模型库以及图标配置

文章目录 一、icon总结 一、icon 引入基本场景后 还差几个样式引入 mars3D图标用的 https://fontawesome.dashgame.com/ 引入对应的 <link rel"stylesheet" href"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css"&…

WebGIS开发中一些常见的概念

0. 坐标系投影 地理坐标系和投影坐标系是两种常用的坐标系统&#xff0c;它们各自有着独特的特性和应用场景。 0.1 地理坐标系 地理坐标系(Geographic Coordinate System&#xff0c; 简称 GCS)是以地球椭球体面为参考面&#xff0c;以法线为依据&#xff0c;用经纬度表示地…

双指针| Java | (hot100) 力扣283, 11, 15, 42做题总结

leetcode 11 盛最多水的容器 双层for循环暴力 超出时间限制 class Solution {public int maxArea(int[] height) {int h0;int v0;for(int i0; i<height.length; i) {for(int ji1; j<height.length; j) {h Math.min(height[i],height[j]);v Math.max(v, h*(j-i));}}…

【原创公式】【完全二叉树】叶结点的计算【数据结构】

完全二叉树叶结点的计算 【铺垫】1叶结点即度为0的结点 2完全二叉树中度为1的结点只可能有0或1个 3完全二叉树的设叶结点仅可能出现在最后2层 设有完全二叉树T 【区分】第k层有a个叶结点≠第k层有a个结点 &#xff08;1&#xff09;第k层有a个叶结点&#xff1a;T的形态不唯一&…

Mac电脑虚拟机安装win11教程

Mac分享吧 文章目录 效果一、准备工作二、安装步骤方法1&#xff1a;使用虚拟机自带的win11系统&#xff0c;选中系统软件--继续--安装&#xff0c;即可完成win11安装方法2&#xff1a;通过下载好的镜像安装Windows11系统。选择镜像文件位置&#xff0c;安装&#xff0c;配置1…

MySQL进阶-MySQL管理

系统数据库 常用工具 mysql mysqladmin mysqlbinlog mysqlshow mysqldump mysqlimport/source

数据预处理和探索性数据分析(上)

目录 数据预处理 数据清洗 处理缺失值&#xff1a; 异常值检测与处理&#xff1a; 类别特征编码&#xff1a; 特征工程 创建新特征&#xff1a; 特征缩放&#xff1a; 探索性数据分析 (EDA) 使用Matplotlib进行可视化 绘制直方图&#xff1a; 绘制箱线图&#xff1…

this内存原理,成员变量和局部变量的区别

this的作用&#xff1a;区分局部变量和成员变量 this的本质&#xff1a;所在方法调用者的地址值 内存分布&#xff0c;this会保存地址 this.name name 等号的右边触发就近原则接收形参 把接收到的形参赋值给成员变量的name 成员变量&#xff0c;类方法外的变量&#xff0c…

一刷代码随想录(DP10)

115.不同的子序列 题意&#xff1a;给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符串。&#xff08;…