網(wǎng)站首頁 編程語言 正文
1、創(chuàng)建兩個(gè)文件夾redis和sentinel文件夾用于存放docker-compose.yml文件
2、redis下的docker-compose.yml
version: "3"
services:
master:
image: redis:latest
container_name: my_redis_master
command: redis-server --requirepass root # 在連接容器時(shí)需要密碼
ports:
- 6379:6379
slave1:
image: redis:latest
depends_on: # 這里目的是需要先啟動(dòng)master,隨后再啟動(dòng)slave節(jié)點(diǎn)
- master
container_name: my_redis_slave1
command: redis-server --slaveof my_redis_master 6379 --requirepass root --masterauth root # 再容器啟動(dòng)后,通過這里命令來指定主節(jié)點(diǎn)ip地址
ports:
- 6380:6379
slave2:
image: redis:latest
depends_on:
- master
container_name: my_redis_slave2
ports:
- 6381:6379
command: redis-server --slaveof my_redis_master 6379 --requirepass root --masterauth root
networks: # 這里是配置網(wǎng)絡(luò)環(huán)境,目的是讓容器之間能夠相互連接,如果不配置,哨兵將獲取不到從節(jié)點(diǎn)的信息,并且無法轉(zhuǎn)換master節(jié)點(diǎn)
default:
external:
name: redis_net
3、sentinel下的docker-compose.yml文件以及sentinel.conf配置文件
version: '3'
services:
? sentinel1:
? ? image: redis
? ? container_name: redis-sentinel-1
? ? networks:
? ? ? - redis_net
? ? ports:
? ? ? - 26379:26379
? ? command: redis-sentinel /usr/local/etc/redis/sentinel.conf ?# 啟動(dòng)哨兵,并且指定配置文件
? ? volumes:
? ? ? - ./sentinel1.conf:/usr/local/etc/redis/sentinel.conf
? sentinel2:
? ? image: redis
? ? container_name: redis-sentinel-2
? ? networks:
? ? ? - redis_net
? ? ports:
? ? ? - 26380:26379
? ? command: redis-sentinel /usr/local/etc/redis/sentinel.conf
? ? volumes:
? ? ? - ./sentinel2.conf:/usr/local/etc/redis/sentinel.conf
? sentinel3:
? ? image: redis
? ? container_name: redis-sentinel-3
? ? networks:
? ? ? - redis_net
? ? ports:
? ? ? - 26381:26379
? ? command: redis-sentinel /usr/local/etc/redis/sentinel.conf
? ? volumes:
? ? ? - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
networks: ?# 這里指定網(wǎng)絡(luò)跟redis在同一個(gè)網(wǎng)絡(luò)環(huán)境下
? redis_net:
? ? external:
? ? ? name: redis_net
sentinel配置文件,將下面的配置文件 cp成三分就行
port 26379
dir /tmp
sentinel monitor mymaster 192.168.16.2 6379 2 ?#指定集群的名字以及集群中master的ip地址,這里是容器地址,如果是用的虛擬機(jī)地址我這邊會(huì)導(dǎo)致master轉(zhuǎn)換不了。2就是指哨兵有多少個(gè)哨兵認(rèn)為失效master就失效,保證超過50%就行
sentinel auth-pass mymaster root # 重點(diǎn):我就是在這里忘了配置master需要密碼登陸 導(dǎo)致一直獲取不到master節(jié)點(diǎn)下的從信息
sentinel down-after-milliseconds mymaster 30000 #這里是指定master在失效之后多久就認(rèn)為失效
sentinel parallel-syncs mymaster 1 # failover進(jìn)行主備切換時(shí)最多可以有多少個(gè)slave對新的master進(jìn)行同步,值越小完成failover的時(shí)間就越長,設(shè)置為1就是每次只有一個(gè)slave處于不能處理命令的狀態(tài)
sentinel failover-timeout mymaster 180000?
sentinel deny-scripts-reconfig yes
4、spring boot整合redis哨兵
依賴
<dependency> ? ? ? <groupId>org.springframework.boot</groupId> ? ? ? <artifactId>spring-boot-starter-data-redis</artifactId> ? ? ? <!-- 排除lettuce包,使用jedis代替--> ? ? ? <exclusions> ? ? ? ? <exclusion> ? ? ? ? ? <groupId>io.lettuce</groupId> ? ? ? ? ? <artifactId>lettuce-core</artifactId> ? ? ? ? </exclusion> ? ? ? </exclusions> ? ? </dependency> ? ? <dependency> ? ? ? <groupId>redis.clients</groupId> ? ? ? <artifactId>jedis</artifactId> ? ? ? <version>3.0.1</version> ? ? </dependency>
配置
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.16.5:26379,192.168.16.6:26380,192.168.16.7:26381 # 這里是連接的docker容器中哨兵的ip
jedis:
pool:
max-idle: 8
min-idle: 0
max-wait: -1
max-active: 8
password: root
如果使用的虛擬機(jī)中的docker ip地址 先配置路由表,這樣宿主機(jī)才能訪問docker容器中的哨兵
route add -p 容器的網(wǎng)絡(luò)地址 mask 子網(wǎng)掩碼 虛擬機(jī)ip地址 切記一定要關(guān)閉虛擬機(jī)的防火墻
配置bean
@Bean
? ? public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
? ? ? ? RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
? ? ? ? redisTemplate.setConnectionFactory(redisConnectionFactory);
? ? ? ? Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
? ? ? ? ObjectMapper om = new ObjectMapper();
? ? ? ? om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
? ? ? ? om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
? ? ? ? jackson2JsonRedisSerializer.setObjectMapper(om);
? ? ? ? StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
? ? ? ? // key采用String的序列化方式
? ? ? ? redisTemplate.setKeySerializer(stringRedisSerializer);
? ? ? ? // hash的key也采用String的序列化方式
? ? ? ? redisTemplate.setHashKeySerializer(stringRedisSerializer);
? ? ? ? // value序列化方式采用jackson
? ? ? ? redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
? ? ? ? // hash的value序列化方式采用jackson
? ? ? ? redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
? ? ? ? redisTemplate.afterPropertiesSet();
? ? ? ? return redisTemplate;
? ? }
5、哨兵工作方式
1、特點(diǎn):
- 每個(gè)哨兵進(jìn)程會(huì)每秒一次向集群中的所有redis發(fā)送ping命令
- 如果距離最近的一次ping命令的時(shí)間超過了 down-after-milliseconds設(shè)置的時(shí)間,那么當(dāng)前哨兵就會(huì)將起標(biāo)記為主觀下線(SDOWN)
- 如果Master被標(biāo)記為了主觀下線,那么其余的哨兵會(huì)以每秒一次的頻率確認(rèn)Master是否進(jìn)入了主觀下線狀態(tài)
- 如果有足夠的哨兵(配置文件中配置)進(jìn)程在指定的范圍內(nèi)確認(rèn)Master進(jìn)入主觀下線,則Master就會(huì)被改為客觀下線(ODWON)
- 如果沒有的哨兵同意Master主服務(wù)器下線,master的客觀下線狀態(tài)就會(huì)被移除
2、故障轉(zhuǎn)移(Raft算法):
- 先選擇優(yōu)先級最高的(slave-priority)
- 復(fù)制偏移量大的從節(jié)點(diǎn)(數(shù)據(jù)最新的)
- runid最小的
3、缺點(diǎn):
- redis較難支持在線擴(kuò)容,如果集群容量達(dá)到上限時(shí)在線擴(kuò)容會(huì)變的很復(fù)雜
- 每個(gè)節(jié)點(diǎn)存入的數(shù)據(jù)都是相同的,容器造成資源的浪費(fèi)
- 容易導(dǎo)致數(shù)據(jù)的丟失
- redis配置文件中
- min-slaves-to-write 1
- min-slaves-max-lag 10 表示至少要有1個(gè)salve節(jié)點(diǎn)與master數(shù)據(jù)同步超過10秒,就拒絕其它的請求
- 腦裂 (網(wǎng)絡(luò)分區(qū)變化時(shí),master和slave出現(xiàn)無法通信時(shí),sentinel會(huì)選擇新的master,那么此時(shí)client一直在向之前的master發(fā)送數(shù)據(jù),將原master進(jìn)行恢復(fù)成新master的slave時(shí),就會(huì)丟失后來發(fā)送的數(shù)據(jù))
6、Redis-Cluster集群
1、特點(diǎn):
- 節(jié)點(diǎn)連接是使用二進(jìn)制連接的
- 節(jié)點(diǎn)fail是超過半數(shù)的節(jié)點(diǎn)檢測時(shí)才會(huì)失效
- 客戶端只需要連接集群中任何一個(gè)節(jié)點(diǎn)即可
2、工作方式
每個(gè)節(jié)點(diǎn)上都有slot槽的概念,取值范圍是0-16383,還有一個(gè)就是cluster用于集群管理的插件。當(dāng)存取的key值到達(dá)時(shí) redis會(huì)根據(jù)crc16進(jìn)行計(jì)算,然后把計(jì)算的結(jié)果對16384取余數(shù),這樣就每個(gè)key就會(huì)有對應(yīng)的編號在0-16383之間的哈希槽,通過這個(gè)值跳轉(zhuǎn)到對應(yīng)的節(jié)點(diǎn)中。
redis-cluster引入了主從模式,一個(gè)主節(jié)點(diǎn)對應(yīng)多個(gè)從節(jié)點(diǎn),當(dāng)超過半數(shù)的從節(jié)點(diǎn)ping主節(jié)點(diǎn)超時(shí)時(shí),就會(huì)認(rèn)為主節(jié)點(diǎn)宕機(jī)了。
3、缺點(diǎn):
- 數(shù)據(jù)通過異步復(fù)制,不保證數(shù)據(jù)的強(qiáng)一致性
- 不支持多數(shù)據(jù)庫空間,集群模式下只能使用1個(gè)數(shù)據(jù)庫空間 0
7、redis常見問題
1、緩存雪崩
? ? 描述:在同一時(shí)間段,緩存集中過期。所有的請求都去查詢數(shù)據(jù)庫
? ? 解決方案:
? ? ? ? 解鎖或者隊(duì)列的方式防止大量線程對數(shù)據(jù)庫的一次性獨(dú)寫
? ? ? ? 協(xié)調(diào)redis的過期時(shí)間,隨機(jī)時(shí)間
? ? ? ? 做二級緩存,一級緩存為短期,二級緩存為長期
? ? ? ? 依賴隔離組件為后端限流并且降級
2、緩存穿透
? ? 描述:在redis中沒有查詢到并且數(shù)據(jù)庫中也沒有查詢到,下一次進(jìn)來還是會(huì)到redis中查詢,就沒有查詢的意義了
? ? 解決方案:
? ? ? ? 布隆過濾器
? ? ? ? 將空對象記錄在緩存中
3、緩存擊穿
? ? 描述:查詢的某個(gè)key恰好失效,剛好又有大量的并發(fā)過來,造成DB壓力
? ? 解決方案:
? ? ? ? 通過加鎖或者隊(duì)列防止大量請求透過redis到DB中
? ? ? ? 對于熱點(diǎn)key可以無限調(diào)長
? ? ? ? 也可以做二級緩存
4、緩存降級
? ? 描述:訪問量劇增、服務(wù)出現(xiàn)問題,非核心的服務(wù)影響到核心流程的性能,但是仍需要服務(wù)還是可用
5、緩存預(yù)熱
? ? 描述:先將數(shù)據(jù)直接加載到redis中,防止用戶在請求時(shí)先查數(shù)據(jù)庫
? ? 解決方案:
? ? ? ? 定時(shí)刷新緩存
6、緩存更新
? ? 描述:維護(hù)大量緩存,自定義緩存淘汰的策略
? ? 解決方案:定時(shí)清理過期的緩存,先判斷緩存是否過期,如果過期就去數(shù)據(jù)庫獲取新的數(shù)據(jù)然后再更新
原文鏈接:https://blog.csdn.net/weixin_43915643/article/details/107713781
相關(guān)推薦
- 2022-08-02 Python自動(dòng)化測試之異常處理機(jī)制實(shí)例詳解_python
- 2022-07-18 linux引導(dǎo)和計(jì)劃任務(wù)
- 2022-10-16 Qt實(shí)現(xiàn)TCP網(wǎng)絡(luò)編程_C 語言
- 2022-07-20 虛擬機(jī)下的/dev/sda1占用率為100%
- 2022-04-12 無法加載文件 ,因?yàn)樵诖讼到y(tǒng)中禁止執(zhí)行腳本。
- 2023-09-12 Spring Boot注解說明
- 2022-06-12 python?包之?re?正則匹配教程分享_python
- 2022-09-07 C語言函數(shù)調(diào)用堆棧詳情分析_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支