哨兵模式是基于主从复制的,假如你还没有搭建主从模式,请移步到
哨兵模式解决的是:主从模式下主节点挂掉后从节点无法主动成为主节点的问题
解决的问题是,主从模式下,master节点挂掉以后,从节点无法自动升级为主节点的问题。
环境搭建:
在 /opt/installs/redis/bin下面:
mkdir sentinel-zc
复制外面的sentinel.conf 到 sentinel-zc 文件夹下面
cp /opt/modules/redis-8.0.1/sentinel.conf sentinel-zc
修改sentinel.conf配置:
修改bind
bind bigdata01
修改端口号:
port 26379 第一次不需要修改
daemonize yes 表示将来的sentinel服务,后台启动

sentinel monitor mymaster 192.168.233.128 6379 2
注意:此处的ip不能写成主机名,比如bigdata01 否则启动报错!
假如主节点server 配置了密码,需要在sentinel.conf 文件中也配置密码:大约94行左右
sentinel auth-pass mymaster 123456
谨记: 以上这个语句必须写在 sentinel monitor mymaster 192.168.233.128 6379 2
的下方,否则启动报错。
关于配置文件中,正式环境修改一下,咱们这里就不修改了
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
将配置文件拷贝三份,修改端口号:
cp sentinel.conf sentinel2.conf
cp sentinel.conf sentinel3.conf
修改端口:
将sentinel2.conf 端口修改为 26380
另一个sentinel3.conf 修改为 26381 .
启动三台sentinel 服务:
先启动 redis-server 服务
./redis-server redis.conf
./redis-server mastersalves/redis.conf
再次启动 redis-sentinel服务:
./redis-sentinel sentinel-zc/sentinel.conf
./redis-sentinel sentinel-zc/sentinel2.conf
./redis-sentinel sentinel-zc/sentinel3.conf

接着在主节点的 redis.conf 下,配置从节点的 redis 的密码:

测试哨兵模式:将主节点杀死,从节点自动变为主节点:


哨兵模式可以自动将从节点变为主节点(重点是:自动)

假如这个时候主节点又启动起来了,会自动变为从节点,并且从主节点中同步数据。
相当于以前的主节点变从节点,从节点自动变主节点,而且两边数据会同步。记得不要忘记设置主节点密码。
从节点也可以重新变为从节点,主节点变为主节点,需要手动修改。
SLAVEOF bigdata01 6379
主节点输入命令:slaveof NO ONE 变为主节点
主节点的redis的数据默认是存储在 ./的文件夹下
启动的时候在哪里启动,数据就保存在哪里,很不方便,可以通过配置文件指定数据的位置
cd /usr/local/bin
mkdir masterdata
修改 redis.conf
dir /usr/local/bin/masterdata
如果是哨兵模式,jedis代码做稍微的调整,当然以前的也可以使用(但是假如主节点发生了变化,代码会连接不上)。
java
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisSentinelPool;
import java.util.HashSet;
public class JedisSentinalPoolTest {
Jedis jedis = null;
@Before
public void initDB(){
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
// idle 空闲的 最大空闲
poolConfig.setMaxIdle(200);
// 最大的连接数量
poolConfig.setMaxTotal(1000);
// 最小空闲
poolConfig.setMinIdle(5);
HashSet<String> hashSet = new HashSet<>();
hashSet.add("bigdata01:26379");
hashSet.add("bigdata01:26380");
hashSet.add("bigdata01:26381");
JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster",hashSet,poolConfig,"123456");
jedis = sentinelPool.getResource();
}
@After
public void destroyDB(){
// 数据库关闭
jedis.close();
}
/**
* 常见的数据库连接池有:c3p0 dbcp druid HikariCP等
*/
@Test
public void testPool(){
System.out.println(jedis.get("age"));
}
}