" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

docker搭建redis哨兵集群并且整合springboot的實(shí)現(xiàn)

 更新時(shí)間:2022年07月11日 11:04:34   作者:何憶清風(fēng)  
本文主要介紹了docker搭建redis哨兵集群并且整合springboot的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

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)后,通過(guò)這里命令來(lái)指定主節(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)的信息,并且無(wú)法轉(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就失效,保證超過(guò)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對(duì)新的master進(jìn)行同步,值越小完成failover的時(shí)間就越長(zhǎng),設(shè)置為1就是每次只有一個(gè)slave處于不能處理命令的狀態(tài)
sentinel failover-timeout mymaster 180000?

sentinel deny-scripts-reconfig yes

4、spring boot整合redis哨兵

依賴(lài)

<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ī)才能訪問(wèn)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í)間超過(guò)了 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)
  • 如果沒(méi)有的哨兵同意Master主服務(wù)器下線,master的客觀下線狀態(tài)就會(huì)被移除

2、故障轉(zhuǎn)移(Raft算法):

  • 先選擇優(yōu)先級(jí)最高的(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ù)同步超過(guò)10秒,就拒絕其它的請(qǐng)求
  • 腦裂 (網(wǎng)絡(luò)分區(qū)變化時(shí),master和slave出現(xiàn)無(wú)法通信時(shí),sentinel會(huì)選擇新的master,那么此時(shí)client一直在向之前的master發(fā)送數(shù)據(jù),將原master進(jìn)行恢復(fù)成新master的slave時(shí),就會(huì)丟失后來(lái)發(fā)送的數(shù)據(jù))

6、Redis-Cluster集群

1、特點(diǎn):

  • 節(jié)點(diǎn)連接是使用二進(jìn)制連接的
  • 節(jié)點(diǎn)fail是超過(guò)半數(shù)的節(jié)點(diǎn)檢測(cè)時(shí)才會(huì)失效
  • 客戶(hù)端只需要連接集群中任何一個(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é)果對(duì)16384取余數(shù),這樣就每個(gè)key就會(huì)有對(duì)應(yīng)的編號(hào)在0-16383之間的哈希槽,通過(guò)這個(gè)值跳轉(zhuǎn)到對(duì)應(yīng)的節(jié)點(diǎn)中。
redis-cluster引入了主從模式,一個(gè)主節(jié)點(diǎn)對(duì)應(yīng)多個(gè)從節(jié)點(diǎn),當(dāng)超過(guò)半數(shù)的從節(jié)點(diǎn)ping主節(jié)點(diǎn)超時(shí)時(shí),就會(huì)認(rèn)為主節(jié)點(diǎn)宕機(jī)了。

3、缺點(diǎn):

  • 數(shù)據(jù)通過(guò)異步復(fù)制,不保證數(shù)據(jù)的強(qiáng)一致性
  • 不支持多數(shù)據(jù)庫(kù)空間,集群模式下只能使用1個(gè)數(shù)據(jù)庫(kù)空間 0

7、redis常見(jiàn)問(wèn)題

1、緩存雪崩
    描述:在同一時(shí)間段,緩存集中過(guò)期。所有的請(qǐng)求都去查詢(xún)數(shù)據(jù)庫(kù)
    解決方案:
        解鎖或者隊(duì)列的方式防止大量線程對(duì)數(shù)據(jù)庫(kù)的一次性獨(dú)寫(xiě)
        協(xié)調(diào)redis的過(guò)期時(shí)間,隨機(jī)時(shí)間
        做二級(jí)緩存,一級(jí)緩存為短期,二級(jí)緩存為長(zhǎng)期
        依賴(lài)隔離組件為后端限流并且降級(jí)

2、緩存穿透
    描述:在redis中沒(méi)有查詢(xún)到并且數(shù)據(jù)庫(kù)中也沒(méi)有查詢(xún)到,下一次進(jìn)來(lái)還是會(huì)到redis中查詢(xún),就沒(méi)有查詢(xún)的意義了
    解決方案:
        布隆過(guò)濾器
        將空對(duì)象記錄在緩存中

3、緩存擊穿
    描述:查詢(xún)的某個(gè)key恰好失效,剛好又有大量的并發(fā)過(guò)來(lái),造成DB壓力
    解決方案:
        通過(guò)加鎖或者隊(duì)列防止大量請(qǐng)求透過(guò)redis到DB中
        對(duì)于熱點(diǎn)key可以無(wú)限調(diào)長(zhǎng)
        也可以做二級(jí)緩存

4、緩存降級(jí)
    描述:訪問(wèn)量劇增、服務(wù)出現(xiàn)問(wèn)題,非核心的服務(wù)影響到核心流程的性能,但是仍需要服務(wù)還是可用

5、緩存預(yù)熱
    描述:先將數(shù)據(jù)直接加載到redis中,防止用戶(hù)在請(qǐng)求時(shí)先查數(shù)據(jù)庫(kù)
    解決方案:
        定時(shí)刷新緩存

6、緩存更新
    描述:維護(hù)大量緩存,自定義緩存淘汰的策略
    解決方案:定時(shí)清理過(guò)期的緩存,先判斷緩存是否過(guò)期,如果過(guò)期就去數(shù)據(jù)庫(kù)獲取新的數(shù)據(jù)然后再更新

到此這篇關(guān)于docker搭建redis哨兵集群并且整合springboot的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)docker搭建redis哨兵集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker容器網(wǎng)絡(luò)互聯(lián)的項(xiàng)目實(shí)踐

    Docker容器網(wǎng)絡(luò)互聯(lián)的項(xiàng)目實(shí)踐

    docker中的容器都是連接到一個(gè)虛擬的網(wǎng)橋上的,這為獨(dú)立的容器提供了互聯(lián)的可能,本文主要介紹了Docker容器網(wǎng)絡(luò)互聯(lián)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 云服務(wù)器安裝docker環(huán)境的解決方案

    云服務(wù)器安裝docker環(huán)境的解決方案

    這篇文章主要介紹了云服務(wù)器安裝docker環(huán)境的解決方案,可以使用termins連接服務(wù)器,詳細(xì)介紹了docker安裝與Portainer安裝過(guò)程,需要的朋友可以參考下
    2024-04-04
  • 基于docker Desktop一鍵式搭建k8s環(huán)境的步驟

    基于docker Desktop一鍵式搭建k8s環(huán)境的步驟

    在docker desktop中一鍵啟動(dòng)k8s環(huán)境很簡(jiǎn)單,下面介紹如何啟動(dòng)dashboard,dashboard儀表盤(pán)是新手學(xué)習(xí)k8s至關(guān)重要的一個(gè)工具,本文給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2023-11-11
  • Docker swarm 簡(jiǎn)單使用教程

    Docker swarm 簡(jiǎn)單使用教程

    Swarm是Docker官方提供的一款集群管理工具,其主要作用是把若干臺(tái)Docker主機(jī)抽象為一個(gè)整體,并且通過(guò)一個(gè)入口統(tǒng)一管理這些Docker主機(jī)上的各種Docker資源,接下來(lái)通過(guò)本文給大家介紹Docker swarm 簡(jiǎn)單使用,感興趣的朋友一起看看吧
    2021-11-11
  • docker容器內(nèi)缺少命令的簡(jiǎn)單解決辦法

    docker容器內(nèi)缺少命令的簡(jiǎn)單解決辦法

    有時(shí)候在docker容器里面不僅沒(méi)有你期望的那些常用的命令,甚至沒(méi)有yum命令讓你去安裝那些常用的命令,下面這篇文章主要給大家介紹了關(guān)于docker容器內(nèi)缺少命令的簡(jiǎn)單解決辦法,需要的朋友可以參考下
    2023-03-03
  • docker中Dockerfile方式建立鏡像HelloWorld

    docker中Dockerfile方式建立鏡像HelloWorld

    這篇文章主要介紹了docker中Dockerfile方式建立鏡像HelloWorld,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • windows壞境下docker使用phpmyamin的權(quán)限問(wèn)題解決

    windows壞境下docker使用phpmyamin的權(quán)限問(wèn)題解決

    這篇文章主要為大家介紹了windows壞境下docker使用phpmyamin發(fā)生的權(quán)限問(wèn)題解決分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • docker安裝nginx之后無(wú)法訪問(wèn)的解決

    docker安裝nginx之后無(wú)法訪問(wèn)的解決

    這篇文章主要介紹了docker安裝nginx之后無(wú)法訪問(wèn)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • docker容器日志占滿(mǎn)硬盤(pán)空間的問(wèn)題解決

    docker容器日志占滿(mǎn)硬盤(pán)空間的問(wèn)題解決

    由于默認(rèn)情況下,docker使用json-file類(lèi)型的日志驅(qū)動(dòng),該日志驅(qū)動(dòng)默認(rèn)情況下,每個(gè)容器的日志會(huì)一直追加在文件名為 containerId-json.log文件中,因此在容器不重建的情況下,該日志文件會(huì)一直追加內(nèi)容,直到占滿(mǎn)整個(gè)服務(wù)器硬盤(pán)空間,本文就來(lái)介紹一下解決方法
    2023-09-09
  • Docker搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問(wèn)詳解

    Docker搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問(wèn)詳解

    這篇文章主要介紹了Docker搭建簡(jiǎn)單的應(yīng)用棧與容器Hello World訪問(wèn),結(jié)合實(shí)例形式詳細(xì)分析了Docker應(yīng)用容器棧的獲取、互聯(lián)、啟動(dòng)、配置以及應(yīng)用訪問(wèn)測(cè)試相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06

最新評(píng)論