成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Redis Cluster集群,當Master宕機,主從切換,客戶端報錯 Timed Out

開發 前端
一個高并發系統肯定少不了緩存的身影,為了保證緩存服務的高可用,我們通常采用 Redis Cluster 集群模式。

大家好,我是Tom哥。

性能不夠,緩存來湊。

一個高并發系統肯定少不了緩存的身影,為了保證緩存服務的高可用,我們通常采用 Redis Cluster 集群模式。

描述:

集群部署采用了 3主3從 拓撲結構,數據讀寫訪問master節點, slave節點負責備份。

隨便登錄一臺 redis 節點,都可以看到集群的slot的槽位分步區間,以及對應的主從節點映射關系。

127.0.0.1:8001> cluster slots
1) 1) (integer) 10923
2) (integer) 16383
3) 1) "127.0.0.1"
2) (integer) 8003
3) "6c574c9d1323c69ebc73a5977bcbd3d4c073a4d4"
4) 1) "127.0.0.1"
2) (integer) 8006
3) "123d0b157078925743ac1deb96be8c3395d7d038"
2) 1) (integer) 0
2) (integer) 5460
3) 1) "127.0.0.1"
2) (integer) 8001
3) "99bc05e81ef0035a4ab2d13cbae2599425b7ed7d"
4) 1) "127.0.0.1"
2) (integer) 8004
3) "402e900ef364ce9382beddf92747cf28e3ea9c2f"
3) 1) (integer) 5461
2) (integer) 10922
3) 1) "127.0.0.1"
2) (integer) 8002
3) "fda6a9e49205a52418c0bca4c66c981066017a3c"
4) 1) "127.0.0.1"
2) (integer) 8005
3) "24a1e23f6cbfb761234970b66043d562e79e3d9c"

人為模擬,master-1 機器意外宕機。

docker stop c1dff012392d

此時,Redis Cluster 集群能自動感知,并自動完成主備切換,對應的slave會被選舉為新的master節點。

看下 redis cluster 集群最新的主從關系。

看似也沒什么問題,一切正常。

此時 Spring Boot 應用依然在線服務,當我們再嘗試操作緩存時,會報錯。

問題邊界還是非常清晰的。

Redis Cluster 集群已經完成了切換。

但是 Spring Boot 客戶端沒有動態感知到 Redis Cluster 的最新集群信息

原因分析:

SpringBoot 2.X 版本, Redis默認的連接池采用 Lettuce。

當Redis 集群節點發生變化后,Letture默認是不會刷新節點拓撲。

解決方案:

將 Letture 二方包仲裁掉。

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.3.12.RELEASE</version>
<exclusions>
<exclusion>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
</exclusion>
</exclusions>
</dependency>

然后,引入 Jedis 相關二方包。

<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.7.0</version>
</dependency>

編譯代碼,并重新啟動 SpringBoot 微服務,萬事俱備,只欠再次驗證。

重新模擬將 127.0.0.1:8001 master 節點宕機,看看系統的日志。

[2022-03-17 18:03:34:595] - master /127.0.0.1:8001 used as slave
[2022-03-17 18:03:34:596] - slave redis://127.0.0.1:8004 removed for slot ranges: [[0-5460]]
[2022-03-17 18:03:34:611] - 1 connections initialized for /127.0.0.1:8004
[2022-03-17 18:03:34:639] - /127.0.0.1:8001 master and related slaves: [addr=redis://127.0.0.1:8004] removed
[2022-03-17 18:03:34:641] - 24 connections initialized for /127.0.0.1:8004
[2022-03-17 18:03:34:655] - 1 connections initialized for /127.0.0.1:8004
[2022-03-17 18:03:34:678] - master: redis://127.0.0.1:8004 added for slot ranges: [[0-5460]]
[2022-03-17 18:03:34:678] - 24 connections initialized for /127.0.0.1:8004

從打印的日志來看,客戶端已經感知到了主備切換,并與最新的主節點 127.0.0.1:8004 初始化了 24 個連接。

然后,回歸業務功能,讀寫緩存 數據也都是操作最新的主節點。

還有一種方案:刷新節點拓撲視圖。

Lettuce 官方描述:

https://github.com/lettuce-io/lettuce-core/wiki/Redis-Cluster#user-content-refreshing-the-cluster-topology-view。

Lettuce 處理 Moved 和 Ask 永久重定向,由于命令重定向,必須刷新節點拓撲視圖。而自適應拓撲刷新(Adaptive updates)與定時拓撲刷新(Periodic updates)默認關閉。

解決方案:

  • 調用 RedisClusterClient.reloadPartitions。
  • 后臺基于時間間隔的周期刷新。
  • 后臺基于持續的斷開 和 移動、重定向 的自適應更新。

編寫代碼

@Bean(destroyMethod = "destroy")
public LettuceConnectionFactory lettuceConnectionFactory() {
//
ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
// ,Redis
.enableAllAdaptiveRefreshTriggers()
// (認30)
.adaptiveRefreshTriggersTimeout(Duration.ofSeconds(30))
//
.enablePeriodicRefresh(Duration.ofSeconds(20))
.build();
ClientOptions clientOptions = ClusterClientOptions.builder()
.topologyRefreshOptions(clusterTopologyRefreshOptions)
.build();
LettuceClientConfiguration clientConfig = LettucePoolingClientConfiguration.builder()
.poolConfig(genericObjectPoolConfig(redisProperties.getJedis().getPool()))
.clientOptions(clientOptions)
.commandTimeout(redisProperties.getTimeout()) //認RedisURI.DEFAULT_TIMEOUT 60
.build();
List<String> clusterNodes = redisProperties.getCluster().getNodes();
Set<RedisNode> nodes = new HashSet<RedisNode>();
clusterNodes.forEach(address -> nodes.add(new RedisNode(address.split(":")[0].trim(), Integer.valueOf(address.split(":")[1]))));
RedisClusterConfiguration clusterConfiguration = new RedisClusterConfiguration();
clusterConfiguration.setClusterNodes(nodes);
clusterConfiguration.setPassword(RedisPassword.of(redisProperties.getPassword()));
clusterConfiguration.setMaxRedirects(redisProperties.getCluster().getMaxRedirects());
LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(clusterConfiguration, clientConfig);
// 認true,false
// lettuceConnectionFactory.setShareNativeConnection(false);
// ,
// lettuceConnectionFactory.resetConnection();
return lettuceConnectionFactory;
}
責任編輯:姜華 來源: 微觀技術
相關推薦

2024-01-17 19:05:44

mget優化數據庫

2011-06-08 14:30:54

SkypeWindows微軟

2024-09-11 09:50:22

2023-09-27 06:26:07

2010-12-30 12:13:03

Skype宕機Windows客戶端漏

2011-08-17 10:10:59

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2023-10-26 07:47:53

Redis哨兵集群

2011-10-26 13:17:05

2011-03-24 13:00:31

配置nagios客戶端

2011-03-02 14:36:24

Filezilla客戶端

2010-12-21 11:03:15

獲取客戶端證書

2010-05-31 10:11:32

瘦客戶端

2024-03-07 16:03:56

RedisDocker

2011-03-21 14:53:36

Nagios監控Linux

2011-04-06 14:24:20

Nagios監控Linux

2013-05-09 09:33:59

2009-03-04 10:27:50

客戶端組件桌面虛擬化Xendesktop

2013-03-20 11:01:37

Redis客戶端連接

2021-08-01 23:18:21

Redis Golang命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频一区二区三区 | 国产精品久久久久久 | 黄色成人免费在线观看 | 欧美日韩三区 | 紧缚调教一区二区三区视频 | 国产精品18久久久久久白浆动漫 | 欧美一级免费看 | 国产精品美女久久久久久不卡 | 午夜一级大片 | 亚洲免费在线视频 | 欧美日一区二区 | 人人草天天草 | 欧美日一区二区 | 亚洲最新在线 | 国产精品欧美一区二区三区 | 国产一级免费视频 | 91香蕉| 91 在线| 亚洲综合无码一区二区 | 91在线精品播放 | 亚洲精品久久久蜜桃 | 亚洲另类春色偷拍在线观看 | 久久精品国产精品青草 | 天天操天天射综合网 | 日本成人三级电影 | av网站免费| 国产精品3区 | 亚洲精品久久久一区二区三区 | 午夜免费视频 | 久久一级免费视频 | 精品永久 | 爱草在线 | 狠狠综合久久av一区二区小说 | 国产精品美女久久久久 | 国产资源在线播放 | 中文在线a在线 | 亚洲欧美视频一区 | 国产免费拔擦拔擦8x高清 | 日韩在线成人 | 亚洲一区二区久久 | 伊人狠狠干|