redis的一主二从三哨兵(Windows)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35923749/article/details/85334933

redis的一主二从三哨兵(Windows)

一、一主二从配置

  1. redis官网下载最新版,然后复制三份,slave redis与master redis是一样的,只是配置不一样而已。如下,为了更好区分,可以将文件夹的命名加上master和slave标识,以及端口号。
    在这里插入图片描述
  2. 配置文件
    修改每个redis中的redis.conf配置文件,一主二从的模式,就是配置一个master redis与两个slave redis。
  • master需要修改redis.conf配置文件参数有:

. bind 10.112.11.186 127.0.0.1 (绑定redis访问地址,10.112.11.186是内网地址,即你cmd中ipconfig命令出来的ipv4ip地址,可以是公网ip,也可以是私网ip);
. port 6380(redis访问端口号)
. protected-mode no(如果不配置哨兵,并且没有设置连接密码,那么这个属性一定要设置no,这是redis的安全模式,默认是yes,即开启状态,如果你没有设置密码,那么你用redis的客户端(如jedis)是无法访问redis的)。报错信息如下:

Cannot get master address from sentinel running @ 10.112.11.186:26381

. 其他优化参数,自行配置

  • slave-6381 需要修改redis.conf配置文件参数有:

. bind 10.112.11.186 127.0.0.1 (绑定redis访问地址,10.112.11.186是内网地址,即你cmd中ipconfig命令出来的ipv4ip地址,可以是公网ip,也可以是私网ip);
. port 6381(redis访问端口号)
. protected-mode no(如果不配置哨兵,并且没有设置连接密码,那么这个属性一定要设置no,这是redis的安全模式,默认是yes,即开启状态,如果你没有设置密码,那么你用redis的客户端(如jedis)是无法访问redis的,报错信息如下:

Cannot get master address from sentinel running @ 10.112.11.186:26381)。

. slaveof 127.0.0.1 6380(设置master 的连接ip和port)
. 其他优化参数,自行配置

  • slave-6382 需要修改redis.conf配置文件参数有:

. bind 10.112.11.186 127.0.0.1 (绑定redis访问地址,10.112.11.186是内网地址,即你cmd中ipconfig命令出来的ipv4ip地址,可以是公网ip,也可以是私网ip);
. port 6382(redis访问端口号)
. protected-mode no(如果不配置哨兵,并且没有设置连接密码,那么这个属性一定要设置no,这是redis的安全模式,默认是yes,即开启状态,如果你没有设置密码,那么你用redis的客户端(如jedis)是无法访问redis的,报错信息如下:

Cannot get master address from sentinel running @ 10.112.11.186:26381)。

. slaveof 127.0.0.1 6380(设置master 的连接ip和port)
. 其他优化参数,自行配置

  1. 启动配置,为了不用每次从cmd中输入命令行启动redis,可以为每一个redis创建启动脚本。
    在这里插入图片描述
    startRedisServer.bat脚本如下:
@echo off
redis-server.exe redis.windows.conf
@pause
  1. 启动后,先启动master redis,然后启动slave redis
    在这里插入图片描述

  2. 查看redis信息
    在这里插入图片描述
    注:使用redis.exe -p 6380连接redis,如果使用的redis port不是默认的端口6379,则必须加上端口号。

二、redis哨兵的配置

  1. 在每个redis中创建一个哨兵的配置文件,sentinel.conf
    在这里插入图片描述
    sentinel.conf

# 虽然你前面配置主从模式的时候,已经关闭了保护模式,但由于再配置了哨兵后,客户端连接的是哨兵,而不是直接连接主节点(从而实现了客户端与master redis的解耦,这也是为什么哨兵模式能实现完全自动化进行故障转移的原因),所以需要在哨兵中关闭保护模式。
protected-mode no
#当前Sentinel服务运行的端口(其他两个sentinel.conf配置,只要这个地方端口改成26381,和26382就行)
port 26380
# 哨兵监听的主服务器
sentinel myid 41fff2d5fcefd3bd55ee99430ac53e07ec84a064
#
sentinel monitor master 127.0.0.1 6382 2
#如果10秒后,mysater仍没启动过来,则启动failover
sentinel down-after-milliseconds master 3000
# 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel failover-timeout master 10000

主要对第三行的配置参数解释一下:
sentinel monitor [master-name] [ip] [port] [quorum]
master-name:master名称,自定义。sentinel使用master name来标识哪个redis是master redis,为什么是用 name而不是用ip来标识master redis,是因为,哨兵模式下,master redis如果出现故障了,可以动态配置另外一台slave redis作为新的master redis,所以master ip是不固定的,也就没法使用固定ip来确定哪个是master
ip port : IP地址和端口号
quorun:票数,Sentinel需要协商同意master是否可到达的数量。

  1. 启动配置,为了不用每次从cmd中输入命令行启动sentinel,可以为每一个sentinel创建启动脚本startRedisSentinel.bat
    在这里插入图片描述
    配置文件只需要配置master的信息就好啦,不用配置slave的信息,因为slave能够被自动检测到(master节点中有关于slave的消息)。
@echo off
redis-server.exe sentinel.conf --sentinel
@pause
  1. 启动三个哨兵,无先后关系
    在这里插入图片描述

  2. 客户端jedis连接哨兵,代码

package com.redis;

import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisSentinelPool;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * 请填写类注释
 * @since 2018年12月27日 15:30
 */
public class RedisCluster {
    //key的过期时间
    private final static Integer EXPIRE_DATE = 1800;
    //过期单位
    private final static TimeUnit TIME_UNIT = TimeUnit.MILLISECONDS;

    public static void main(String[] args) {
        //master name,我们在哨兵上配置过的别名maserName
        String maserName = "master";
        Set<String> sentinels = new HashSet<>();
        //设置所有的哨兵ip和port,不需要
        sentinels.add("127.0.0.1:26380");
        sentinels.add("127.0.0.1:26381");
        sentinels.add("127.0.0.1:26382");

        GenericObjectPoolConfig gPoolConfig=new GenericObjectPoolConfig();
        //idle:在池中,处于空闲状态的最大连接数
        gPoolConfig.setMaxIdle(3);
        //Total:在池中,一共有多少连接数
        gPoolConfig.setMaxTotal(3);
        //MaxWaitMillis:从idle队列里面取对象时,若阻塞的话,则最大等待时长
        gPoolConfig.setMaxWaitMillis(10);
        //jmx是否开启监控
        gPoolConfig.setJmxEnabled(true);

        JedisSentinelPool sentinelPool = new JedisSentinelPool(maserName,sentinels,gPoolConfig);

        //一个while死循环,每隔一秒往master塞入一个值,并且日志打印
        Jedis jedis = null;
        while (true){
            try{
                jedis = sentinelPool.getResource();

                int index = new Random().nextInt(100000);
                String key = "k-" + index;
                String value = "v-" + index;
                jedis.set(key,value);
                jedis.expire(key,EXPIRE_DATE);
                System.out.printf("%s  value is %s\n",key,jedis.get(key));

                TimeUnit.MILLISECONDS.sleep(1000);
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                if(jedis != null){
                    jedis.close();
                }
            }
        }
        //sentinelPool.close();
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_35923749/article/details/85334933