• redis-sentinel部署手册及Java代码实现


    安装与配置

    1、环境准备

    **环境:**192.168.1.25~27

    **Redis****版本:**redis-6.2.5

    **节点分部:**一主二从三哨兵

    数据节点实例**😗* 192.168.1.25:5379, 192.168.1.26:5379, 192.168.1.27:5379

    哨兵**(sentinel)****实例:**192.168.1.25:25379, 192.168.1.26:25379, 192.168.1.27:25379

    Redis-Sentinel官方文档:REDIS sentinel-old – Redis中国用户组(CRUG)

    2、redis主从复制

    2.1、redis安装

    192.168.1.25~27

    cd /home/asap/wbh/redis-6.2.5

    make PREFIX=/home/asap/redis install

    cp /home/asap/wbh/redis-6.2.5/redis.conf /home/asap/redis/5379/redis.conf

    cp /home/asap/wbh/redis-6.2.5/sentinel.conf /home/asap/redis/25379/sentinel.conf

    redis启停脚本

    #!/bin/sh
    #
    # Simple Redis init.d script conceived to work on Linux systems
    # as it does use of the /proc filesystem.
    HOST=192.168.1.25
    REDISPORT=5379
    password=admin
    HOME=/home/asap/redis
    EXEC=${HOME}/bin/redis-server
    CLIEXEC=${HOME}/bin/redis-cli
    
    PIDFILE=${HOME}/redis_${REDISPORT}.pid
    CONF="${HOME}/${REDISPORT}/redis.conf"
    
    case "$1" in
        start)
            if [ -f $PIDFILE ]
            then
                    echo "$PIDFILE exists, process is already running or crashed"
            else
                    echo "Starting Redis server..."
                    $EXEC $CONF
            fi
            ;;
        stop)
            if [ ! -f $PIDFILE ]
            then
                    echo "$PIDFILE does not exist, process is not running"
            else
                    PID=$(cat $PIDFILE)
                    echo "Stopping ..."
                    $CLIEXEC -a $password -h $HOST -p $REDISPORT shutdown
                    while [ -x /proc/${PID} ]
                    do
                        echo "Waiting for Redis to shutdown ..."
                        sleep 1
                    done
                    echo "Redis stopped"
            fi
            ;;
        *)
            echo "Please use start or stop as first argument"
            ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    redis-sentinel启停脚本

    #!/bin/sh
    #
    # Simple Redis init.d script conceived to work on Linux systems
    # as it does use of the /proc filesystem.
    HOST=192.168.1.25
    REDISPORT=25379
    password=admin
    HOME=/home/asap/redis
    EXEC=${HOME}/bin/redis-sentinel
    CLIEXEC=${HOME}/bin/redis-cli
    
    PIDFILE=${HOME}/redis-sentinel-${REDISPORT}.pid
    CONF="${HOME}/${REDISPORT}/sentinel.conf"
    
    case "$1" in
        start)
            if [ -f $PIDFILE ]
            then
                    echo "$PIDFILE exists, process is already running or crashed"
            else
                    echo "Starting Redis server..."
                    $EXEC $CONF
            fi
            ;;
        stop)
            if [ ! -f $PIDFILE ]
            then
                    echo "$PIDFILE does not exist, process is not running"
            else
                    PID=$(cat $PIDFILE)
                    echo "Stopping ..."
                    $CLIEXEC -h $HOST -p $REDISPORT shutdown
                    while [ -x /proc/${PID} ]
                    do
                        echo "Waiting for Redis to shutdown ..."
                        sleep 1
                    done
                    echo "Redis stopped"
            fi
            ;;
        *)
            echo "Please use start or stop as first argument"
            ;;
    esac
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    将redis和redis-sentinel脚本拷贝到/home/asap/redis 并修改host

    2.2、数据节点配置文件

    **master****配置文件:**redis.conf(192.168.1.25:5379)

    port 5379
    bind 192.168.1.25
    requirepass “admin”
    daemonize yes
    logfile “/home/asap/redis/5379/5379.log”
    dbfilename “dump-5379.rdb”
    dir “/home/asap/redis/5379”
    pidfile /home/asap/redis/redis_5379.pid
    #如若master设置了认证密码,那么所有redis数据节点都配置上masterauth属性
    masterauth “admin”
    **slave-1****配置文件:**redis.conf(192.168.1.26:5379)

    port 5379
    bind 192.168.1.26
    requirepass “admin”
    daemonize yes
    logfile “/home/asap/redis/5379/5379.log”
    dbfilename “dump-5379.rdb”
    dir “/home/asap/redis/5379”
    pidfile /home/asap/redis/redis_5379.pid
    #如若master设置了认证密码,那么所有redis数据节点都配置上masterauth属性
    masterauth “admin”
    slaveof 192.168.1.25 5379
    **slave-2****配置文件:**redis.conf(192.168.1.27:5379)

    port 5379
    bind 192.168.1.27
    requirepass “admin”
    daemonize yes
    logfile “/home/asap/redis/5379/5379.log”
    dbfilename “dump-5379.rdb”
    dir “/home/asap/redis/5379”
    pidfile /home/asap/redis/redis_5379.pid
    #如若master设置了认证密码,那么所有redis数据节点都配置上masterauth属性
    masterauth “admin”
    slaveof 192.168.1.25 5379

    2.3、节点启动

    192.168.1.25~27

    cd /home/asap/redis

    ./redis start

    ./redis stop

    3、redis sentinel部署

    3.1、3个sentinel节点的配置文件基本一致,区别的只是主机

    192.168.1.25 sentinel.conf

    bind 192.168.1.25
    port 25379
    daemonize yes
    logfile “/home/asap/redis/25379/25379.log”
    dir “/home/asap/redis/25379/”
    pidfile /home/asap/redis/redis-sentinel-25379.pid
    #sentinel monitor
    #告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效。master-name只能包含英文字母,数字,和“.-_”这三个字符需要注意的是master-ip 要写真实的ip地址而不要用回环地址(127.0.0.1)。
    sentinel monitor mymaster 192.168.1.25 5379 2

    #redis数据master节点设置了认证,则需要如下配置
    sentinel auth-pass mymaster admin

    # sentinel down-after-milliseconds
    #这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可#用的。 单位是毫秒,默认为30秒
    sentinel down-after-milliseconds mymaster 30000

    # sentinel parallel-syncs
    #这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进#行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意
    #味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
    sentinel parallel-syncs mymaster 1

    #sentinel failover-timeout
    #failover-timeout 可以用在以下这些方面:
    # 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
    # 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
    # 3.当想要取消一个正在进行的failover所需要的时间。
    # 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
    sentinel failover-timeout mymaster 180000
    192.168.1.26 sentinel.conf

    bind 192.168.1.27
    port 25379
    daemonize yes
    logfile “/home/asap/redis/25379/25379.log”
    dir “/home/asap/redis/25379/”
    pidfile /home/asap/redis/redis-sentinel-25379.pid
    #sentinel monitor
    #告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效。master-name只能包含英文字母,数字,和“.-_”这三个字符需要注意的是master-ip 要写真实的ip地址而不要用回环地址(127.0.0.1)。
    sentinel monitor mymaster 192.168.1.25 5379 2

    #redis数据master节点设置了认证,则需要如下配置
    sentinel auth-pass mymaster admin

    # sentinel down-after-milliseconds
    #这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可#用的。 单位是毫秒,默认为30秒
    sentinel down-after-milliseconds mymaster 30000

    # sentinel parallel-syncs
    #这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进#行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意
    #味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
    sentinel parallel-syncs mymaster 1

    #sentinel failover-timeout
    #failover-timeout 可以用在以下这些方面:
    # 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
    # 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
    # 3.当想要取消一个正在进行的failover所需要的时间。
    # 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
    sentinel failover-timeout mymaster 180000

    192.168.1.27 sentinel.conf

    bind 192.168.1.27
    port 25379
    daemonize yes
    logfile “/home/asap/redis/25379/25379.log”
    dir “/home/asap/redis/25379/”
    pidfile /home/asap/redis/redis-sentinel-25379.pid
    #sentinel monitor
    #告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效。master-name只能包含英文字母,数字,和“.-_”这三个字符需要注意的是master-ip 要写真实的ip地址而不要用回环地址(127.0.0.1)。
    sentinel monitor mymaster 192.168.1.25 5379 2

    #redis数据master节点设置了认证,则需要如下配置
    sentinel auth-pass mymaster admin

    # sentinel down-after-milliseconds
    #这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可#用的。 单位是毫秒,默认为30秒
    sentinel down-after-milliseconds mymaster 30000

    # sentinel parallel-syncs
    #这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进#行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意
    #味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
    sentinel parallel-syncs mymaster 1

    #sentinel failover-timeout
    #failover-timeout 可以用在以下这些方面:
    # 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
    # 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
    # 3.当想要取消一个正在进行的failover所需要的时间。
    # 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
    sentinel failover-timeout mymaster 180000

    3.2、启动sentinel

    192.168.1.25~27

    cd /home/asap/redis

    ./ redis-sentinel start

    ./ redis-sentinel stop

    4、测试

    redis-cli -h 192.168.1.26 -p 25379 -a admin

    5、JAVA连接redis

    代码实现:

    
        redis.clients
        jedis
        2.9.0
        jar
        compile
    
    package com.asap.core;
    
    
    import redis.clients.jedis.Jedis;
    import redis.clients.jedis.JedisPoolConfig;
    import redis.clients.jedis.JedisSentinelPool;
    import redis.clients.jedis.exceptions.JedisConnectionException;
    
    
    import java.util.*;
    
    /**
     * Created by wbh
     * On 2021/09/09.
     *
     * @description
     */
    public class RedisService {
        public static void main(String[] args) {
            JedisPoolConfig poolConfig = new JedisPoolConfig();
            poolConfig.setMaxIdle(10);
            poolConfig.setMaxTotal(50);
            poolConfig.setMaxWaitMillis(60000);
            poolConfig.setTestOnBorrow(true);
            String password="admin";
            //哨兵列表
            Set sentinels = new HashSet();
            sentinels.add("192.168.1.25:25379");
            sentinels.add("192.168.1.26:25379");
            sentinels.add("192.168.1.27:25379");
            //在sentinel.conf配置的master-name
            String clusterName = "mymaster";
            JedisSentinelPool redisSentinelJedisPool = new JedisSentinelPool(clusterName, sentinels, poolConfig,password);
            Jedis jedis = null;
            while (true) {
                try {
                    //活跃线程数
                    System.out.println("getNumActive:" + redisSentinelJedisPool.getNumActive());
                    //当前master信息
                    System.out.println("CurrentHostMaster:" + redisSentinelJedisPool.getCurrentHostMaster().toString());
                    jedis = redisSentinelJedisPool.getResource();
                    jedis.select(2);
                    String uuid = UUID.randomUUID().toString();
                    jedis.set(uuid, uuid);
                    jedis.expire(uuid, 500);
                    System.out.println(jedis.get(uuid));
                    Thread.sleep(1);
                    // break;
                } catch (JedisConnectionException e) {
                    //master 挂了,重新获取master
                    System.out.println("try to connect master....");
                    continue;
                } catch (Exception e) {
                    System.out.println("error...." + e);
                    break;
                } finally {
                    try {
                        if (jedis != null) {
                            jedis.close();
                        }
                    } catch (Exception e) {
                        //忽略close异常
                        System.out.println("jedis.close() fail...");
                    }
                }
            }
            redisSentinelJedisPool.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
  • 相关阅读:
    数字政府!3DCAT实时云渲染助推上海湾区数字孪生平台
    极限多标签学习之-FastXML运行和评价EUR-Lex4k数据集
    使用html+css实现一个静态页面【传统文化茶带音乐6页】HTML学生个人网站作业设计
    面向大规模向量搜索引擎的内存-硬盘优化的近似最近邻搜索算法(GRIP)
    uni-app编程checkbox-group获取选中的每个checkbox的value值
    范围求和 II
    “元宇宙”最权威的解释来了!全国科技名词委研讨会达成共识
    Maven CheckStyle Plugin集成
    leetcode第311场周赛题解
    微信小程序开发 开启
  • 原文地址:https://blog.csdn.net/m0_67391870/article/details/126489880