Windows 下部署Redis 主从模式+哨兵模式+JAVA连接方式

news2025/1/15 6:54:55

前言

之前项目需求部署redis高可用,走了很多弯路以及相关配置来回折腾浪费了很多时间,特地记录下。

主从模式:实现多台redis实例进行服务运行,并且数据相互同步;
哨兵模式:实现主服务器和从服务器进行监听,当主服务器宕机,会立马进行主服务选举, 选出新的主服务器。


一、redis安装

链接:https://pan.baidu.com/s/1us7TeMD2xCF2Pxm-mu-nGw 
提取码:ae4u

1.下载redis

网盘提供的是windows下的5.0.10版本,若是想要其他版本的需要自行百度;

2.安装

 直接双击进行安装,全部就是next即可,全程都不需要更改的,就是注意安装位置,不要放在C盘就行。

 安装好就是这样的,我是放在E盘下:E:\\development\redisPool\redis下的

 3.再把redis文件复制一份

把redis先复制一份,并且修改两个文件,master_6379做主服务,salve_6380做从服务

 二、主从服务配置

1.修改配置文件

修改两个文件中的redis.windows.conf文件如下配置,其他不改,要删除如下配置前面的#符号,不然被注释不会采用新的配置信息。

master_6379 文件中redis.windows.conf修改配置如下:

     #是否开启保护模式,选择no

      protected-mode no

     # 配置redis从服务器密码

      requirepass 123456

     # 配置redis主服务器密码,requirepass和masterauth两个密码必须一样
      masterauth 123456

     #是否是集群模式的标志,这里改为no
      cluster-enabled no

     # 改为0.0.0.0 便于其他服务器可以访问到此redis服务
      bind 0.0.0.0 

salve_6380 文件中redis.windows.conf修改配置如下:

   # salve_6380 比master_6379多个端口的修改,master_6379端口默认6379

   port 6380
   protected-mode no

   # 主节点ip和端口,即master_6379服务的ip和端口
   slaveof 127.0.0.1 6379  
   requirepass 123456
   masterauth 123456
   cluster-enabled no
   bind 0.0.0.0 

2.启动两个主从服务

windows下进行cmd命令,打开终端,进入到redis根目录,输入如下命令:

redis-server.exe ./redis.windows.conf

启动主服务,一定要切换到主redis服务的根目录master_6379下执行命令否则会报错:

 启动从服务,一定要切换到主redis服务的根目录salve_6380下执行命令否则会报错:

如此,两个主从服务算是一直运行中,不能关闭命令窗口,关闭服务便停止了。 

3.验证服务是否正常运行

随便进入某个redis服务的根目录,通过终端连接redis,输入命令:

redis-cli -p 6379   # -p  指定连接redis的端口号

auth  123456       # 输入redis密码,在redis.windows.conf文件中设置的密码

get key                # 查询某个key的值

info replication    # 查询当前服务是主服务还是,从服务

 或者

从命令可以看出6380的服务role为slave,即从服务,而6379的服务是master,即主服务;

且6379服务下redis的connected_slaves为1,slave0:ip=20.20.0.219,port=6380,state=online

也指出从服务的端口,以及状态都是正常的。

4.测试从主服务写入数据从服务是否可以正常同步过来

 在主服务6379下输入命令,设置数据:

set test redis

在从服务6380下输入命令,获取数据:

set test

  如上可以看出两台redis正常工作,且一主一从模式,并且数据也能够达到同步效果。直接关闭窗口即可。

  现在配置的方式是只能在主服务器下进行写数据操作

  但是在某个条件下主服务宕机了,就无法实现业务正常运作了,因为从服务无法进行写数据,所以这时候我们要在主从模式基础上进行哨兵配置,便于监听主服务宕机,可以立马将从服务升级为主服务,保证业务可用。哨兵模式如下:

三、哨兵模式配置

1.增加sentinel.conf文件

分别在master_6379、salve_6380文件夹下新建文件sentinel.conf,文件内容如下:

【master_6379】主服务的sentinel.conf内容

  # 当前Sentinel服务运行的端口
   port 26379
  # 禁止保护模式
   protected-mode no
  # 哨兵监听的主服务器 后面的1表示主机挂掉以后进行投票,只需要1票就可以从机变主机
   sentinel monitor mymaster 127.0.0.1 6379 1
  # 3s内mymaster无响应,则认为mymaster宕机了
   sentinel down-after-milliseconds mymaster 3000
  #如果10秒后,mysater仍没启动过来,则启动failover
   sentinel failover-timeout mymaster 10000
  # 设置哨兵sentinel连接主从的密码,主从必须设置一样密码,没有的话不用设置
   sentinel auth-pass mymaster 123456
  # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
   sentinel config-epoch mymaster 21

【salve_6380】从服务的sentinel.conf内容

  # 当前Sentinel服务运行的端口
   port 26380
  # 禁止保护模式
   protected-mode no
  # 哨兵监听的主服务器 后面的1表示主机挂掉以后进行投票,只需要1票就可以从机变主机
   sentinel monitor mymaster 127.0.0.1 6379 1
  # 3s内mymaster无响应,则认为mymaster宕机了
   sentinel down-after-milliseconds mymaster 3000
  #如果10秒后,mysater仍没启动过来,则启动failover
   sentinel failover-timeout mymaster 10000
  # 设置哨兵sentinel连接主从的密码,主从必须设置一样密码,没有的话不用设置
   sentinel auth-pass mymaster 123456
  # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
   sentinel config-epoch mymaster 21

2.增加哨兵sentinel启动脚本

分别在master_6379、salve_6380文件夹下新建文件startSentinel.bat,文件内容如下:  

redis-server.exe sentinel.conf --sentinel

 3.增加redis启动脚本

分别在master_6379、salve_6380文件夹下新建文件startup.bat,不然每次都得在终端下输入命令,文件内容如下:  

redis-server.exe ./redis.windows.conf

创建好的文件如下:

 4.验证哨兵模式

先分别双击执行主从服务redis、再执行主从两个哨兵,顺序如下:

     1.master_6379下:startup.bat

     2.slave_6380下:startup.bat

     3.master_6379下:startSentinel.bat

     4.slave_6380下:startSentinel.bat

按照2.3步骤方式进行验证redis主从服务是否正常,如下:都是正常的;

 关闭主服务6379,shutdown,两个哨兵均不能关闭,再验证6380是否可以成为主服务

 可见6380成为主服务了

 再把6379,启动,验证是不是应该成为从服务

 从信息上面看,把6379启动之后,6380依然是主服务,只是新增一个从节点的连接,也就是说6379被重启之后就会成为从节点。

至此主从模式+哨兵模式部署完成。

四、Springboot 访问主从哨兵模式的redis

1.增加一个配置文件RedisClusterConfig

import com.chinamobile.zj.util.Constant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * redis主从模式,避免单节点redis宕机引发服务不可用问题
 */
@Configuration
@EnableAutoConfiguration
@Slf4j
public class RedisClusterConfig{

    @Bean
    public JedisSentinelPool testSentinel() {

            JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
            // 最大空闲连接数, 默认8个
            jedisPoolConfig.setMaxIdle(10);
            // 最大连接数, 默认8个
            jedisPoolConfig.setMaxTotal(16);
            //最小空闲连接数, 默认0
            jedisPoolConfig.setMinIdle(8);
            // 获取连接时的最大等待毫秒数,10s(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间,  默认-1
            jedisPoolConfig.setMaxWaitMillis(10000);
            //对拿到的connection进行validateObject校验;如果为true,则得到的jedis实例均是可用的;
            jedisPoolConfig.setTestOnBorrow(true);
            jedisPoolConfig.setTestOnReturn(true);
            //Idle时进行连接扫描
            jedisPoolConfig.setTestWhileIdle(true);
            //表示idle object evitor两次扫描之间要sleep的毫秒数
            jedisPoolConfig.setTimeBetweenEvictionRunsMillis(30000);
            //表示idle object evitor每次扫描的最多的对象数
            jedisPoolConfig.setNumTestsPerEvictionRun(10);
            //表示一个对象至少停留在idle状态的最短时间,才能被idle object evitor扫描并驱逐;只有在timeBetweenEvictionRunsMillis大于0时才有意义
            jedisPoolConfig.setMinEvictableIdleTimeMillis(60000);
            // 创建连接池
            Set<String> sentinels = new HashSet<>(Arrays.asList("127.0.0.1:26379","127.0.0.1:26380")); 
            JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456");
            return pool;
    }
}

2.redis读写数据

// 作为静态工具方法方式的访问
@Component
@Slf4j
public class RedisUtils{
    private static JedisSentinelPool jedisSentinelPool;
    @Autowired
    public void setRedisTemplate(JedisSentinelPool jedisSentinelPool) {
        RedisUtils.jedisSentinelPool = jedisSentinelPool;
    }
    public static String hSet(String key,String value) {
        String result = jedisSentinelPool.getResource().set(key,value);
        return result;
    }
    public static Object hGet(String key) {
        String o = jedisSentinelPool.getResource().get(key);
        return o;
    }
}


// service 层的访问
@Service
@Transactional
@Slf4j
public class SSOLoginSv {
    @Autowired
    private JedisSentinelPool jedisSentinelPool;
    
    public String getValue(){
        return jedisSentinelPool.getResource().get("test");
    }

    public String setValue(){
        return jedisSentinelPool.getResource().set("test","demo");
    }
}

3.完毕

欢迎各位大神有什么错误地方指出

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

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

相关文章

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用

工业电子中的安森美深力科AMIS30660CANH2RG CAN收发器 面向工业自动化和汽车电源应用 AMIS30660CANH2RG CAN 收发器是控制器区域网络 (CAN) 协议控制器和物理总线之间的接口&#xff0c;可在 12 V 和 24 V 系统中使用。该收发器为总线提供差分发射功能&#xff0c;向 CAN 控制…

Spark编程基础-RDD

目录 1.何为RDD 2.RDD的五大特性 3.RDD常用算子 3.1.Transformation算子 1.map() 2.flatMap() 3.reduceByKey() 4 . mapValues() 5. groupBy() 6.filter() 7.distinct() 8.union() 9.join() 10.intersection() 11.glom() 12.gruopBykey() 13.sortBy() 14.sortByKey …

docker+docker-compose+nginx前后端分离项目部署

文章目录1.安装docker1.1 基于centos的安装1.2 基于ubuntu2.配置国内加速器2.1 配置阿里云加速器&#x1f340; 找到相应页面&#x1f340; 创建 docker 目录&#x1f340; 创建 daemon.json 文件&#x1f340; 重新加载服务配置文件&#x1f340; 重启 docker 引擎2.2 配置网易…

OJ系统刷题 第八篇

13415 - 津津的储蓄计划 时间限制 : 1 秒 内存限制 : 128 MB 津津的零花钱一直都是自己管理。每个月的月初妈妈给津津300元钱&#xff0c;津津会预算这个月的花销&#xff0c;并且总能做到实际花销和预算的相同。 为了让津津学习如何储蓄&#xff0c;妈妈提出&#xff0c;津…

计算机组成原理---第四章 指令系统

一、指令系统的发展与性能要求 指令系统的概述 指令就是要计算机执行某种操作的命令。可分为&#xff1a;①微指令&#xff0c;属于硬件&#xff1b;②机器指令&#xff0c;简称指令&#xff0c;完成算术逻辑操作&#xff1b;③宏指令&#xff0c;由若干条机器指令组成&#xf…

[Java]JSTL标签库

EL表达式https://blog.csdn.net/m0_71229255/article/details/130173486?spm1001.2014.3001.5501 JSTL标签的使用 Java Server Pages Standard Tag Libray(JSTL): JSP标准标签库&#xff0c;是一个定制标签类库的集合&#xff0c;用于解决一些常见的问题&#xff0c;例如迭代…

【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 建模方案及代码实现

更新信息&#xff1a;2023-4-15 更新了代码 【2023 年第十三届 MathorCup 高校数学建模挑战赛】C 题 电商物流网络包裹应急调运与结构优化问题 1 题目 电商物流网络由物流场地&#xff08;接货仓、分拣中心、营业部等&#xff09;和物流场 地之间的运输线路组成&#xff0c;如…

Java项目架构分层改造-项目亮点

服务分层改造 时间操作人员2023年04月12日23:04:00创建文档Cheems 原始项目结构 所有文件糅杂在一起&#xff08;大多数公司如此&#xff09;&#xff0c;没有分层开&#xff0c;功能增加代码复杂不清晰 分层改造后 先确定思路&#xff0c;后续把功能搬过来即可&#xff01;&…

关于GNSS技术介绍(一)

什么是GNSS&#xff1f; GNSS的全称是全球导航卫星系统&#xff08;Global Navigation Satellite System&#xff09;&#xff0c;它是泛指所有的卫星导航系统&#xff0c;包括全球的、区域的和增强的。GNSS是覆盖全球的自主地利空间定位的卫星系统&#xff0c;用于导航与定位…

Stable Diffusion成为生产力工具(四):制作食品安全PPT所用的相关图片png、图标icon

S&#xff1a;你安装stable diffusion就是为了看小姐姐么&#xff1f; I &#xff1a;当然不是&#xff0c;当然是为了公司的发展谋出路~~ 预先学习&#xff1a; 安装webui《Windows安装Stable Diffusion WebUI及问题解决记录》。运行使用时问题《Windows使用Stable Diffusion时…

【C语言】 数据的存储 -- 数据类型介绍 -- 存储 -- 浮点型在内存中的存储,很详细也很重要,不明白的一定要看

目录 1、数据类型介绍 1.1 类型的基本归类 2、整型在内存中的存储 2.1 原码、反码、补码 2.2 大小端介绍 2.3 练习 3、浮点型在内存中的存储 3.1 举一个例子 3.2 浮点数存储规则 *************************************************正文开始*************************…

一文了解MongoDB的各种部署模式

单节点模式&#xff08;Standalone&#xff0c;不推荐用于生产环境&#xff09; standalone模式即单节点模式&#xff0c;指在服务器上只部署一个 mongod 进程用于读写数据。优点是部署简单&#xff0c;可以快速完成部署&#xff0c;缺点是无容灾。只推荐用于日常的开发、测试…

线程(Thread)的三种等待唤醒机制详解

1、为什么需要线程的等待和唤醒 线程的等待唤醒机制是一种经典的“生产者和消费者”模型。例如食品加工厂&#xff0c;食品加工人员和原料补给人员&#xff0c;在有充足原料时&#xff0c;补给人员是在等待&#xff0c;等到原料不够时&#xff0c;食品加工人员通知补给人员&am…

linux实时性分析

什么是实时操作系统 操作系统的实时性是指执行一个特定任务的时间是确定的和可预测的&#xff0c;这个任务执行时限需要考虑任何的情况&#xff0c;包括最恶劣的情况。或者说操作系统能够在规定的时间点内完成指定的任务操作&#xff0c;一旦超过这个时间点会对整个系统带来不…

【探花交友】day01—项目介绍与环境搭建

目录 1、项目介绍 1.1、功能列表 1.2、项目背景 1.3、功能概述 1.4、技术方案 1.5、技术解决方案 2、前后端分离 2.1、前后端分离的概述 2.2、YAPI介绍 3、开发工具 3.1、虚拟机配置 3.2、Android模拟器 3.3、调试工具PostMan 4、环境搭建 4.1、MYSQL数据库 4.…

【JAVA程序设计】(C00127)基于SSM+vue开发的音乐播放管理系统-有文档

基于SSMvue开发的音乐管理系统-有文档项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架vue以及html前台的开发的音乐管理系统共分为二个角色&#xff1a;管理员、用户 管理员角色包含以下功能&#xff1a; 登录、个人中心&#xff08;修改密码、个人信息修改&am…

溯源取证-内存取证 高难度篇

今天的场景依然是windows场景&#xff0c;只不过此次场景分为两个镜像&#xff0c;本次学习主要学习如何晒别钓鱼邮件、如何提取钓鱼邮件、如何修复损坏的恶意文件、如何提取DLL动态链接库文件 本次需要使用的工具&#xff1a; volatility_2.6_lin64_standalone readpst clams…

c++11 标准模板(STL)(std::unordered_multimap)(十三)

定义于头文件 <unordered_map> template< class Key, class T, class Hash std::hash<Key>, class KeyEqual std::equal_to<Key>, class Allocator std::allocator< std::pair<const Key, T> > > class unordered…

交互式电子沙盘数字沙盘大数据系统开发第8课

交互式电子沙盘数字沙盘大数据系统开发第8课 这次我们完成的功能为拖动一个外部的UI对象到球球上&#xff1a; private void Button_PreviewMouseMove(object sender, MouseEventArgs e) { if(e.LeftButton MouseButtonState.Pressed) DragDr…

Vue简易便签实现

Vue简易便签实现 html部分 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…