redis-sentinel哨兵模式搭建

环境配置

系统:centos7
redis版本:5.0.1
三台机器

ip 主机名 服务
10.1.24.127 bd127 redis master,sentinel1
10.1.24.128 bd128 redis slave,sentinel2
10.1.24.129 bd129 redis slave,sentinel3

搭建redis

cd /home
mkdir redis
cd redis
# 我这里选择的5.0.1版本,如有需要可以进入官网选择合适的版本https://redis.io/download
wget http://download.redis.io/releases/redis-5.0.1.tar.gz
tar -zxvf redis-5.0.1.tar.gz
cd redis-5.0.1
make
# 到这里就安装好了,下面就可以启动测试了
# 启动
redis-server 
# 进入命令行
redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

因为搭建的redis需要线上环境使用,所以必须设置密码,那么修改配置文件redis.conf就可以了
同时因为搭建的是sentinel模式的,所以需要首先搭建主从模式的redis,那么就设置10.1.24.127为初始主redis

# 修改bind配置,根据自己的机器ip配置,也可以设置为0.0.0.0
bind 10.1.24.127
# 修改daemonize为yes,可以后台启动
daemonize yes
# 根据需要去设置密码
requirepass 123456
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 10.1.24.127 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
masterauth 123456

修改完配置重新启动即可。
其他两台服务器也按照这种配置启动即可。

搭建sentinel服务

修改sentinel.conf配置文件

# 禁止保护模式
protected-mode no
# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,10.1.24.127代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
# 其他关于mymaster的配置一定要写在这个声明的下面,否则会报错,错误信息如下:
# *** FATAL CONFIG FILE ERROR ***
# Reading the configuration file, at line 113
# >>> 'sentinel down-after-milliseconds mymaster 10000'
# No such master with specified name.

sentinel monitor mymaster 10.1.24.127 6379 2
# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass  
sentinel auth-pass mymaster 123456
# sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒,默认30秒。
sentinel down-after-milliseconds mymaster 10000
# failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。默认180秒,即3分钟。
sentinel failover-timeout mymaster 120000

然后依次启动sentinel服务redis-sentinel sentinel.conf即可。

测试用例

import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

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

public class TestSentinels {
     
    @Test
    public void testSentinel() {
     
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10);
        jedisPoolConfig.setMaxIdle(5);
        jedisPoolConfig.setMinIdle(5);
        // 哨兵信息
        Set<String> sentinels = new HashSet<>(Arrays.asList("10.1.24.127:26379", "10.1.24.128:26379", "10.1.24.129:26379"));
        /* 创建连接池 */
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123456");
        // 获取客户端
        Jedis jedis = pool.getResource();
        // 执行两个命令
        jedis.set("key", "value");
        String value = jedis.get("key");
        System.out.println(value);
    }
    
}

参考博客:
Redis哨兵(Sentinel)模式
Redis哨兵机制(sentinel)

你可能感兴趣的:(redis,redis,运维,centos)