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