Redis哨兵(三台服务器)

由于已经搭好主从模式(参考-Redis主从复制(双服务器))

直接修改sentinel.conf(我是在服务器上面直接安的宝塔linux面板然后在软件商店安的redis,路径为/www/server/redis)

主机配置修改:

bind:0.0.0.0
port:6379
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:123
masterauth:123

从机配置修改(port尽量每个节点互不相同)

bind:0.0.0.0
port:6380/6381
protected-mode:no
daemonize:yes
logfile:./redis.log
requirepass:123
masterauth:123
replicaof 121.89.197.4 6379

sentinel.conf需要改的地方(仨节点都改,port尽量别重复,重复可能会引来莫名其妙的错误)

//端口默认为26379。
port:26379
//关闭保护模式,可以外部访问。
protected-mode:no
//设置为后台启动。
daemonize:yes
//日志文件。
logfile:./sentinel.log
//指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
sentinel monitor mymaster 121.89.197.4 6379 2
//当在Redis实例中开启了requirepass,这里就需要提供密码。
sentinel auth-pass mymaster 123
//这里设置了主机多少秒无响应,则认为挂了。
sentinel down-after-milliseconds mymaster 3000
//主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
snetinel parallel-syncs mymaster 1
//故障转移的超时时间,这里设置为三分钟。
sentinel failover-timeout mymaster 180000

配置完之后开一下防火墙

firewall-cmd --add-port=6379/tcp --permanent --zone=public
firewall-cmd --add-port=6380/tcp --permanent --zone=public
firewall-cmd --add-port=6381/tcp --permanent --zone=public
firewall-cmd --add-port=26379/tcp --permanent --zone=public
firewall-cmd --add-port=26380/tcp --permanent --zone=public
firewall-cmd --add-port=26381/tcp --permanent --zone=public
#重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload

然后终端进redis文件夹下面src文件夹重载配置(同样,为了避免莫名其妙的错误,我先开主机再开俩从机)

cd /www/server/redis/src
./redis-server ../redis.conf
./redis-sentinel ../sentinel.conf

jedis

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;

/**
 * 测试Redis哨兵模式
 */
public class TestSentinels {
    @SuppressWarnings("resource")
    @Test
    public void testSentinel() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setMaxTotal(10);
        jedisPoolConfig.setMaxIdle(5);
        jedisPoolConfig.setMinIdle(5);
        // 哨兵信息
        Set<String> sentinels = new HashSet<>(Arrays.asList("121.89.197.4:26379",
                "39.101.133.206:26380","81.70.135.23:26381"));
        // 创建连接池
        JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels,jedisPoolConfig,"123");
        // 获取客户端
        Jedis jedis = pool.getResource();
        // 执行两个命令
        jedis.set("mykey", "myvalue");
        String value = jedis.get("mykey");
        System.out.println(value);
    }
}

配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>redis3</artifactId>
    <version>1.0-SNAPSHOT</version>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.6.0</version>
        </dependency>
    </dependencies>

    <properties>
        <maven.compiler.source>15</maven.compiler.source>
        <maven.compiler.target>15</maven.compiler.target>
    </properties>

</project>

运行截图:

查看哨兵

redis-cli -p 6379
auth 123
info replication

redis-cli -p 26379
info sentinel

宕机一下试试

此时的从机1

此时的从机2

30秒之后从机2再次输入info replication提示NOAUTH Authentication required.我们auth 123之后再次输入info replication发现从机二变成主机了

然后再看从机1发现他还在苦苦等着曾经的主机回来

我们再让主机回来之后发现主机变从机了(老大变小弟了)

但是从机2还是跟着之前的主机走(还认之前的老大)

服务器有一点坏处就是不关机,加上我们前面配置的时候设置了后台运行,导致redis始终在后台挂着,再重复进行redis操作的时候就很容易因为忘了这事,而反复重启重加载配置导致redis的bug,所以这里演示完了我们把所有节点shutdown一下

cd /www/server/redis/src
./redis-server ../redis.conf
./redis-sentinel ../sentinel.conf
redis-cli -p 6379
auth 123
info replication
redis-cli -p 26379
info sentinel
最后修改:2021 年 05 月 11 日
如果觉得我的文章对你有用,请随意赞赏