主頁 > 後端開發 > Redis集群搭建(v6)

Redis集群搭建(v6)

2021-07-20 06:07:54 後端開發

Redis集群搭建

介紹

  • 使用6.2.4 搭建 主從、哨兵、集群模式,

準備

  • 準備三臺電腦

    IP地址 主機名稱
    172.16.241.2 linux1
    172.16.241.3 linux2
    172.16.241.4 linux3
    172.16.241.5 linux4
    172.16.241.6 linux5
    172.16.241.7 linux6
  • 機器配置

    1. linux 系統

      image-20210716100620011

    2. 關閉防火墻

      systemctl stop firewalld.service // 關閉

      systemctl disable firewalld.service // 禁止開啟自動

      systemctl status firewalld.service // 查看防火墻狀態

    3. 修改 linux配置

      net.core.somaxconn = 2048
      vm.overcommit_memory=1

  • 下載redis 包,解壓并make(如果make指令缺失,執行yum install -y gcc automake autoconf libtool make

    $ wget https://download.redis.io/releases/redis-6.2.4.tar.gz
    $ tar xzf redis-6.2.4.tar.gz
    $ cd redis-6.2.4
    $ make
    
  • 檔案目錄目錄如下:

    image-20210715154658452

主從模式

  • 修改三臺機器的redis.conf

    1. master(linux1)

      bind * //允許其他服務器訪問
      
    2. 其他兩個Salve(linux2, linux3)

      slaveof  linux1 6379  // 配置兩個slave屬于哪個master
      
  • 啟動

    啟動master,然后啟動兩個salve

    進入src目錄執行./redis-server ../redis.conf

  • 驗證主從模式是否搭建完畢

    訪問其中任意一個redis-cli: ./redis-cli 然后輸入./redis-server ../redis.conf

    a

    兩個salve已經存在,

  • Java呼叫

    1. pom引入

    2. <dependency>
          <groupId>redis.clients</groupId>
          <artifactId>jedis</artifactId>
          <version>3.6.1</version>
      </dependency>
      
    3. 核心代碼

      // 主從模式
      // 1. 向master寫
      Jedis jedis = new Jedis("linux1", 6379);
      jedis.set("a", "accccc");
      jedis.close();
      
      // 2.從slave讀取
      Jedis readJedis = new Jedis("linux2", 6379);
      String a = readJedis.get("a");
      System.out.println("獲取從master中寫入的資料a = " + a);
      readJedis.close();
      

Sentinel哨兵模式

  • 按照主從模式的配置,啟動三個節點

  • 修改sentinel.conf, 監控master主機

    sentinel monitor mymaster 172.16.241.2 6379 2

  • 啟動master(linux1)的sentinel

    image-20210716095204177

  • 啟動slave1, slave2, 查看master日志

    image-20210716111246583

  • 測驗

    1. 停止slave1,查看master的日志

    2. image-20210716112136530

    3. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
      jedisPoolConfig.setMaxIdle(5);
      jedisPoolConfig.setMaxTotal(10);
      jedisPoolConfig.setMinIdle(5);
      
      Set<String> sentinels = new HashSet<>();
      sentinels.add("linux1:26379");
      sentinels.add("linux2:26379");
      sentinels.add("linux3:26379");
      JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster", sentinels, jedisPoolConfig);
      Jedis pj = jedisSentinelPool.getResource();
      pj.set("a", "sentinel");
      String sentinelStored = pj.get("a");
      System.out.println("使用sentinel模式存盤的a=" + sentinelStored);
      
    4. 重啟master,sentinel會選擇其中一個slave升級為master,原master重啟后,會變為slave不會重新升級為master,

Cluster 集群

  • 跟著官網教程(https://redis.io/topics/cluster-tutorial)

  • 配置說明

    1. cluster-enabled<yes/no>:啟用集群支持
    2. cluster-config-file<filename>:該檔案無需用戶編輯,是Cluster集群節點變化后時自動持久化集群配置
    3. cluster-node-timeout<milliseconds>:Redis集群節點不可用的最長時間,如果主節點在指定的時間內無法訪問,那么由從節點進行故障轉移
    4. luster-slave-validity-factor<factor>:如果設定為0,那么從節點始終認為自己有效,將始終嘗試對主節點進行故障轉移
    5. cluster-migration-barrier<count>:一個主節點的將保持連接的最小從節點數量,以便另一個從節點遷移到不再被任何從站覆寫的主節點
    6. cluster-require-full-coverage<yes/no>:如果將其設定為 yes,默認情況下,如果任何節點未覆寫一定百分比的密鑰空間,則集群將停止接受寫入,如果該選項設定為 no,即使只能處理有關密鑰子集的請求,集群仍將提供查詢服務,
    7. luster-allow-reads-when-down<yes/no>:如果設定為 no,默認情況下,當集群被標記為失敗時,Redis 集群中的節點將停止服務所有流量,或者當節點無法訪問時達到法定人數或未達到完全覆寫時,這可以防止從不知道集群中的變化的節點讀取可能不一致的資料,可以將此選項設定為 yes 以允許在失敗狀態期間從節點讀取,這對于希望優先考慮讀取可用性但仍希望防止不一致寫入的應用程式非常有用,它也可以用于使用只有一個或兩個分片的 Redis Cluster 時,因為它允許節點在主節點發生故障但無法自動故障轉移時繼續提供寫入服務,
  • 配置和使用Redis集群(官網教程是在一個機器上啟動多個服務的偽集群,本文使用之前準備的三臺虛擬機)

    1. 在三臺節點上,解壓之前的壓縮包為redis-cluster, 并執行make指令,

    2. 三臺機器都配置redis.conf(因為我之前在這三臺機器上啟動了redis,我又不想改埠號,所以講之前的redis和sentinel都關閉)

      最小配置:

      cluster-enabled yes
      cluster-config-file nodes.conf
      cluster-node-timeout 5000
      appendonly yes
      
    3. 分別啟動redis

    4. 使用redis-cli啟動集群:./redis-cli --cluster create 172.16.241.2:6379 172.16.241.3:6379 172.16.241.4:6379 172.16.241.5:6379 172.16.241.6:6379 172.16.241.7:6379 --cluster-replicas 1

      日志資訊如下:

      Performing hash slots allocation on 6 nodes...
      Master[0] -> Slots 0 - 5460
      Master[1] -> Slots 5461 - 10922
      Master[2] -> Slots 10923 - 16383
      Adding replica 172.16.241.6:6379 to 172.16.241.2:6379
      Adding replica 172.16.241.7:6379 to 172.16.241.3:6379
      Adding replica 172.16.241.5:6379 to 172.16.241.4:6379
      M: b31d4478d5b521e289491a89da26976a85b1f3c9 172.16.241.2:6379
      slots:[0-5460] (5461 slots) master
      M: 2cdbe3aba12a65444a00a2170390d1dbf108a865 172.16.241.3:6379
      slots:[5461-10922] (5462 slots) master
      M: 31ac1ad83587697634bae2a363dfdcd58b15d63e 172.16.241.4:6379
      slots:[10923-16383] (5461 slots) master
      S: da22af2f724033b2e7cec8fd49d4e80aae4712f3 172.16.241.5:6379
      replicates 31ac1ad83587697634bae2a363dfdcd58b15d63e
      S: 732ce03d83245d0a0a9b002bbfa8bf959aeb7720 172.16.241.6:6379
      replicates b31d4478d5b521e289491a89da26976a85b1f3c9
      S: 546e7ed39dc7427bed062e5529e5831c9a35bdcb 172.16.241.7:6379
      replicates 2cdbe3aba12a65444a00a2170390d1dbf108a865
      Can I set the above configuration? (type 'yes' to accept): yes
      Nodes configuration updated
      Assign a different config epoch to each node
      Sending CLUSTER MEET messages to join the cluster
      Waiting for the cluster to join
      ..
      Performing Cluster Check (using node 172.16.241.2:6379)
      M: b31d4478d5b521e289491a89da26976a85b1f3c9 172.16.241.2:6379
      slots:[0-5460] (5461 slots) master
      1 additional replica(s)
      M: 2cdbe3aba12a65444a00a2170390d1dbf108a865 172.16.241.3:6379
      slots:[5461-10922] (5462 slots) master
      1 additional replica(s)
      S: 546e7ed39dc7427bed062e5529e5831c9a35bdcb 172.16.241.7:6379
      slots: (0 slots) slave
      replicates 2cdbe3aba12a65444a00a2170390d1dbf108a865
      S: 732ce03d83245d0a0a9b002bbfa8bf959aeb7720 172.16.241.6:6379
      slots: (0 slots) slave
      replicates b31d4478d5b521e289491a89da26976a85b1f3c9
      S: da22af2f724033b2e7cec8fd49d4e80aae4712f3 172.16.241.5:6379
      slots: (0 slots) slave
      replicates 31ac1ad83587697634bae2a363dfdcd58b15d63e
      M: 31ac1ad83587697634bae2a363dfdcd58b15d63e 172.16.241.4:6379
      slots:[10923-16383] (5461 slots) master
      1 additional replica(s)
      [OK] All nodes agree about slots configuration.
      Check for open slots...
      Check slots coverage...
      [OK] All 16384 slots covered.

      截圖:

      image-20210716144922752

      槽點分配圖

      看到上面的資訊,即代表集群搭建成功,

    5. 查看集群節點資訊

      image-20210716145043209

      綠色:master幾點,黃色代表slave節點

    6. 查看集群資訊

      image-20210716145315634

    7. Redis-cli 演示set操作

      image-20210716150202077

      這是什么意思? 原因是a的不會放到該節點上,使用cluster keyslot a ,結果是16475,通過上面創建集群啟動日志中我們看到,16475會放到linux3節點上,那么去linux3節點連接redis-cli,./redis-cli 執行set a b,發現沒有問題,如圖:

      image-20210716150930035

      那么問題來了,如何連接的時候讓其自動去查找槽位呢?./redist-cli -c 即可,打開linux1,進入src目錄執行./redis-cli -c ,輸入 set a b 執行結果如下:

      image-20210716151140213

      可以看到redis自動重定向到指定槽位的節點,

    8. java代碼示例

      image-20210716161640993

    9. 使用create-cluster腳本創建集群

    如果不想通過如上所述手動配置和執行單個實體來創建 Redis 集群,則有一個更簡單的方法,使用utils/create-cluster 這是個shell腳本,用于創建偽集群,

  • 幾種集群對比

  1. 主從模式:

    優點:Master能自動將資料同步到slave,可以進行讀寫分離,分擔master的壓力

    ? master、slave之間的同步是以非阻塞的方式進行的,同步期間,客戶端仍然可以提交查詢或更新請求

    缺點:不具備自動容錯與恢復功能,master和slave的宕機都可能導致客戶端請求失敗,需要等待機器重啟或手動切換客戶端ip才能恢復

  2. 哨兵(sentinel)模式

    優點:具有主從模式的所有優點,同時master掛掉可以自動切換,高可用,

    缺點:因為根本是在主從模式上增加了一層sentinel,擴容困難,

  3. cluster模式

    優點:無中心結構,資料通過計算分布到不同的slot,分布在不同的節點上,

    ? 集群的節點都是平等關系,每個節點保存各自的資料以及這個集群的狀態等資訊

    ? 擴容方便,節點可動態添加和洗掉

    ? 自動故障轉移,通過投票機制選舉master

    缺點: 比如客戶端實作復雜,資料異步復制(無法保證強制性)、但依然可解,不支持多資料庫等等,

  • 實際生產中,引數配置、容災處理等要求都是很高的,學海無涯,變禿了也變強了,加油吧!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/289146.html

標籤:Java

上一篇:Linux 運維必備 150 個命令,速度收藏~

下一篇:c++ vector用法詳解

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more