7.3 Redis哨兵之客户端连接
1.客户端实现基本原理(1).step1获取所有Sentinel节点和masterName,遍历Sentinel集合得到一个可用(即可以ping通)的Sentinel节点。(2).step2向可用的Sentinel节点发送Sentinel的get-master-addr-by-name的请求(参数masterName)来获取master节点信息。(3).step3客户端获取master节点后,会执
·
1.客户端实现基本原理
(1).step1
获取所有Sentinel节点和masterName,遍历Sentinel集合得到一个可用(即可以ping通)的Sentinel节点。
(2).step2
向可用的Sentinel节点发送Sentinel的get-master-addr-by-name的请求(参数masterName)来获取master节点信息。
(3).step3
客户端获取master节点后,会执行一次role或者role replication来验证其是否是master节点。
(4).master节点发生变化,Sentinel是感知的(所有的故障发现、转移是由sentinel做的)。那么Sentinel怎么通知client的呢?内部是一个发布订阅的模式,client订阅Sentinel的某一个频道,该频道里有谁是master的信息,假如变化的Sentinel就在频道里publish一条消息,client就可以获取到信息,通过新的master信息进行连接。
(5).客户端实现基本原理
2.客户端介入
(1).流程
- Sentinel地址集合
- masterName
- 不是代理模式
(2).代码示例
public class JedisSentinelDemo {
public static void main(String[] args) {
//设置连接池信息
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(50);
jedisPoolConfig.setMaxWaitMillis(1000);
//设置Sentinel所有节点信息
Set<String> sentinelSet = new HashSet<>();
sentinelSet.add("47.***.***.140:26379");//172.17.31.46
sentinelSet.add("39.***.***.47:26379");
sentinelSet.add("39.***.***.3:26379");//172.24.6.215
JedisSentinelPool sentinelPool = new JedisSentinelPool("mymaster", sentinelSet, jedisPoolConfig, 10 * 1000);
int counter = 0;
while (true) {
counter++;
Jedis jedis = null;
try {
jedis = sentinelPool.getResource();
//将key的值设置为10000以内的数
Random random = new Random();
int index = random.nextInt(10000) + 1;
String key = "k-" + index;
String value = "v-" + index;
jedis.set(key, value);
if (counter % 100 == 0) {
System.out.println("key:" + key + ",value" + jedis.get(key));
}
TimeUnit.MILLISECONDS.sleep(10);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
}
成功运行后,会输入如下信息。
19:04:57.824 [main] INFO redis.clients.jedis.JedisSentinelPool - Trying to find master from available Sentinels...
19:04:57.827 [main] DEBUG redis.clients.jedis.JedisSentinelPool - Connecting to Sentinel 47.***.***.140:26379
19:04:57.892 [main] DEBUG redis.clients.jedis.JedisSentinelPool - Found Redis master at 47.***.***.140:6379
19:04:57.892 [main] INFO redis.clients.jedis.JedisSentinelPool - Redis master running at 47.***.***.140:6379, starting Sentinel listeners...
19:04:57.996 [main] INFO redis.clients.jedis.JedisSentinelPool - Created JedisPool to master at 47.***.***.140:6379
key:k-7504,valuev-7504
key:k-6910,valuev-6910
......
更多推荐
已为社区贡献2条内容
所有评论(0)