redis-主從複製

来源:https://www.cnblogs.com/shixiemayi/archive/2018/08/19/9498423.html
-Advertisement-
Play Games

1、主從複製簡而言之為將主redis的數據同步到從redis,達到主從數據一致。主從複製應用: 讀寫分離 容災備份 2、怎樣設置主從? 原則:配從不配主 方式: a、在從redis中使用執行命令 slaveof host port [slaveof no one命令表示禁止和主機的同步] b、在從r ...


1、主從複製簡而言之為將主redis的數據同步到從redis,達到主從數據一致。主從複製應用:

  • 讀寫分離
  • 容災備份

2、怎樣設置主從?

  • 原則:配從不配主
  • 方式:

       a、在從redis中使用執行命令 slaveof host port  [slaveof no one命令表示禁止和主機的同步]

     b、在從redis的配置文件中配置slaveof host port

  • 查詢主從信息:info replication

 3、主從複製原理

全量複製:slave連接上master時候,master將整個快照發給slave,slave載入快照的數據,此時為全量複製

增量複製:master每次接收到在自己資料庫的寫操作,同時會把寫命令傳給slave

  • 主從複製存在的問題:

由於所有的寫操作都是先在Master上操作,然後同步更新到Slave上,所以從Master同步到Slave機器有一定的延遲,當系統很繁忙的時候,延遲問題會更加嚴重,Slave機器數量的增加也會使這個問題更加嚴重。

4、常見問題

  • 切入點問題?slave1、slave2是從頭開始複製還是從切入點開始複製?比如從k4進來,那之前的123是否也可以複製

-->從頭開始複製,不是從切入點(創建從的時間),主從數據保持一致了

  • 從機是否可以寫?set可否?

-->從機一般配置為slave-read-only yes,即為不可set,只可以讀

  • 主機shutdown後情況如何?從機是上位還是原地待命

-->從機不上位,原地待命

  • 主機又回來了後,主機新增記錄,從機還能否順利複製?

-->主機回來後還是主機身份,主機新增,從機仍然順利複製

  • 其中一臺從機down後情況如何?依照原有它能跟上大部隊嗎?

-->如果通過命令slaveof設置的主從,從新啟動從機後身份會變成主機,需要從新用命令設置為原來主機的從機,那麼此時數據就同步了;

如果是通過當前從機的配置文件配置的,那麼啟動後仍然是從機,且數據是同步的

  • 如果從機中途變更主機,數據變化?

-->清空所有數據,並與新主機的數據同步

5、哨兵模式

  • 什麼是哨兵模式?

監控主機是否發生故障,如果發生了故障,根據投票數自動將從機切換為主機。一個哨兵可以同時監控多個主機。

  • 怎麼啟動哨兵?

新建配置sentinel.conf文件,並添加內容(這裡是最簡化的配置):

sentinel monitor 被監控主機名字(隨意) 127.0.0.1(主機的IP) 6379(主機redis的埠號) 1(至少1 個 Sentinel 同意才進行故障切換)

啟動哨兵:redis-sentinel sentinel.conf

  • 每個哨兵(sentinel)定期執行的任務

a、每個 Sentinel 以每秒鐘一次的頻率向它所知的主伺服器、從伺服器以及其他 Sentinel 實例發送一個 PING 命令。

b、如果一個實例(instance)距離最後一次有效回覆 PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那麼這個實例會被 Sentinel 標記為主觀下線。 一個有效回覆可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。

c、如果一個主伺服器被標記為主觀下線, 那麼正在監視這個主伺服器的所有 Sentinel 要以每秒一次的頻率確認主伺服器的確進入了主觀下線狀態。

d、如果一個主伺服器被標記為主觀下線, 並且有足夠數量的 Sentinel (至少要達到配置文件指定的數量)在指定的時間範圍內同意這一判斷, 那麼這個主伺服器被標記為客觀下線。

e、在一般情況下, 每個 Sentinel 會以每 10 秒一次的頻率向它已知的所有主伺服器和從伺服器發送 INFO 命令。 當一個主伺服器被 Sentinel 標記為客觀下線時, Sentinel 向下線主伺服器的所有從伺服器發送 INFO 命令的頻率會從 10 秒一次改為每秒一次。

f、當沒有足夠數量的 Sentinel 同意主伺服器已經下線, 主伺服器的客觀下線狀態就會被移除。 當主伺服器重新向 Sentinel 的 PING 命令返回有效回覆時, 主伺服器的主管下線狀態就會被移除。

  • 一個實例:

假設127.0.0.1 6379  6380 6381三個埠分別啟動了redis服務,6380為master,其它為slave,然後啟動哨兵(只監控一個master)

哨兵的日誌:

2793:X 19 Aug 02:02:42.868 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
2793:X 19 Aug 02:02:42.883 # Sentinel ID is bfbd85c34ae2f4d8f0cd584dda8a90bb44ebe7af
2793:X 19 Aug 02:02:42.883 # +monitor master host6379 127.0.0.1 6380 quorum 1 【監視主機】
2793:X 19 Aug 02:02:42.884 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380 【sentinel識別到的從機6379】
2793:X 19 Aug 02:02:42.885 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6380 【sentinel識別到的從機6381】

關閉6380的服務,日誌:

2820:X 19 Aug 02:21:32.136 # +sdown master host6379 127.0.0.1 6380                  【主觀下線】
2820:X 19 Aug 02:21:32.136 # +odown master host6379 127.0.0.1 6380 #quorum 1/1    【客觀下線】
2820:X 19 Aug 02:21:32.136 # +new-epoch 2
2820:X 19 Aug 02:21:32.136 # +try-failover master host6379 127.0.0.1 6380
2820:X 19 Aug 02:21:32.147 # +vote-for-leader bfbd85c34ae2f4d8f0cd584dda8a90bb44ebe7af 2
2820:X 19 Aug 02:21:32.147 # +elected-leader master host6379 127.0.0.1 6380
2820:X 19 Aug 02:21:32.147 # +failover-state-select-slave master host6379 127.0.0.1 6380  【故障轉移操作現在處於select-slave狀態-sentinel選擇可以升級為主的從機】
2820:X 19 Aug 02:21:32.206 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6380 【已經找到可以升級為主的從機】
2820:X 19 Aug 02:21:32.207 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6380【故障轉移操作現在處於send-slaveof-noone狀態-執行slaveof no one命令將從升級為主】
2820:X 19 Aug 02:21:32.292 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6380【故障轉移操作現在處於wait-promotion狀態-等待從升級為主】
2820:X 19 Aug 02:21:32.853 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ host6379 127.0.0.1 6380
2820:X 19 Aug 02:21:32.853 # +failover-state-reconf-slaves master host6379 127.0.0.1 6380【故障轉移操作現在處於reconf-slaves狀態-重新配置院主機的所有從機】
2820:X 19 Aug 02:21:32.906 * +slave-reconf-sent slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380
2820:X 19 Aug 02:21:33.863 * +slave-reconf-inprog slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380
2820:X 19 Aug 02:21:33.863 * +slave-reconf-done slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6380
2820:X 19 Aug 02:21:33.939 # +failover-end master host6379 127.0.0.1 6380【故障轉移操作順利完成。所有從伺服器都開始複製新的主伺服器了】
2820:X 19 Aug 02:21:33.939 # +switch-master host6379 127.0.0.1 6380 127.0.0.1 6381【配置變更,主伺服器的 IP 和地址已經改變。 這是絕大多數外部用戶都關心的信息】
2820:X 19 Aug 02:21:33.940 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ host6379 127.0.0.1 6381
2820:X 19 Aug 02:21:33.940 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6381
2820:X 19 Aug 02:22:03.944 # +sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6381

從日誌可以看出,主機從6380切換到了6381。上面日誌也可以看成一次故障轉移的步驟。

此時,啟動6380埠的服務,日誌:

2820:X 19 Aug 02:30:57.570 # -sdown slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6381
2820:X 19 Aug 02:31:07.500 * +convert-to-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ host6379 127.0.0.1 6381

從日誌可以看出,原主機down機後,再恢復時候,哨兵會將其作為當前主機(6381)的從機使用

註:在故障切換的時候各個實例的配置文件和sentinel.conf配置文件會自動做出相應的修改

  • 多哨兵模式(來源博客https://blog.csdn.net/enlyhua/article/details/80544135)

哨兵+主從複製保證了redis的高可用,通常為保證哨兵的健壯性,將哨兵部署為集群,至少3個節點

a、為什麼redis哨兵集群不能為2個節點?

 如果哨兵集群僅僅部署了個2個哨兵實例,Configuration: quorum = 1

+----+          +----+

| M1 |---------| R1 |

| S1 |            | S2 |

+----+         +----+

master宕機,s1(哨兵1)和s2中只要有1個哨兵認為master宕機就可以執行切換,同時s1和s2中會選舉出一個哨兵來執行故障轉移。同時這個時候,也就是大多數(majority)哨兵都是運行的,但是如果整個M1和S1運行的機器宕機了,那麼哨兵只有1個了,此時就沒有majority來允許執行故障轉移,雖然另外一臺機器還有一個R1,但是故障轉移不會執行。

b、經典的3節點哨兵模式:Configuration: quorum = 2,majority

  +----+    | M1 |    | S1 |   +----+

 +----+          +----+

 | R2 |            | R3 |

 | S2 |            | S3 |

+----+           +----+

如果M1所在機器宕機了,那麼三個哨兵還剩下2個,S2和S3可以一致認為master宕機,然後選舉出一個來執行故障轉移。同時3個哨兵的majority是2,所以還剩下的2個哨兵運行著,就可以允許執行故障轉移

c、小結:每次一個哨兵要做主備切換,首先需要quorum數量的哨兵認為odown,然後選舉出一個哨兵來做切換,這個哨兵還得得到majority哨兵的授權,才能正式執行切換。如果quorum < majority,比如5個哨兵,majority就是3,quorum設置為2,那麼就3個哨兵授權就可以執行切換。但是如果quorum >= majority,那麼必須quorum數量的哨兵都授權,比如5個哨兵,quorum是5,那麼必須5個哨兵都同意授權,才能執行切換

6、客戶端API連接使用redis

  • 直連redis

首先細讀redis.conf文件以下說明,正確配置redis.conf的bind、protect-mode並確認防火牆,否則會導致連接不上redis。

直連redis代碼:

package com;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

import java.util.HashSet;
import java.util.Set;

public class Main {

    public static void main(String[] args) {
        
        JedisPool jedisPool=new JedisPool("192.168.1.113", 6381);
        Jedis jedis=jedisPool.getResource();
        Set<String> out=jedis.keys("*");
        System.out.println(out);
        jedis.set("zhongguo","weida");

    }
} 
  • 通過哨兵連接redis

首先細讀sentinel.conf文件以下說明,正確配置redis.conf的bind、protect-mode並確認防火牆,否則會導致連接不上redis。

通過哨兵連接redis代碼

package com;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisSentinelPool;

import java.util.HashSet;
import java.util.Set;

public class Main {

    public static void main(String[] args) {

        Set<String> sentinels=new HashSet<String>();
        sentinels.add("192.168.1.113:26379");//如果有多個哨兵,可繼續添加
        JedisSentinelPool jedisSentinelPool=new JedisSentinelPool("host6379", sentinels);
        Jedis jedis=jedisSentinelPool.getResource();
        Set<String> out=jedis.keys("*");
        System.out.println(out);
        jedis.set("shoudu","beijing");
    }
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 應朋友要求,寫個存儲過程說明,本篇比較簡單,適合新接觸存儲過程的同學 先來個簡單的 如果使用的是PL/SQL,執行後會在output中列印my first execute,那麼這裡就有了第一個功能 dbms_output.put_line,在output裡面列印結果,另外還有dbms_output. ...
  • 1、下載安裝 1.1 下載: 1.2 解壓 1.3 初始化 1.4 啟動mysql服務 1.5 啟動MySQL客戶端並連接MySQL服務 由於初始化時使用的【mysqld --initialize-insecure】命令,其預設未給root賬戶設置密碼 輸入回車,見下圖表示安裝成功: 1.6 添加環 ...
  • 上周,以前公司的同事朋友找我幫忙,看看能否幫忙恢復一個MySQL 資料庫,具體情況為:資料庫版本為MySQL 5.6(具體版本不清楚),也不清楚具體的資料庫引擎; 沒有資料庫備份,只剩下資料庫下麵的一些文件(frm、idb),具體原因是因為出現問題的時候,重裝了MySQL,最要命的是ibdata1等... ...
  • 主要是常用的hbase shell命令,包括表的創建與刪除,表數據的增刪查【hbase沒有修改】;以及hbase的導出與導入。 參考教程:HBase教程 參考博客:hbase shell基礎和常用命令詳解 參考博客:hbase shell常用命令和filter 參考博客:hbase導入導出數據 1. ...
  • 恢復內容開始 1、MySQL概述 1.什麼是資料庫? 存儲數據的倉庫 2.都有哪些公司在用資料庫? 金融機構、游戲公司、購物網站、論壇網站... 3.提供資料庫服務的軟體? 1.軟體分類 MySQL、Oracle、SQL_Server、DB2、MongoDB、MariaDB 2.生產環境中,如何選擇 ...
  • MongoDB:NoSQL資料庫 MongoDB中的重要指示點 MongoDB中的三要素 資料庫 集合 文檔 MongoDB中的數據存儲是以Bson的形式存儲的,Bson是二進位的json,所以看上去記錄的形式類似於json數據 MongoDB中集合中的數據不同於關係型資料庫中的數據,MongoDB ...
  • 1.事務 在sql servce 中 事務是一個工作單元 可能包含查詢和修改數據以及修改數據定義等多個活動 也可以顯示或隱式定義事務邊界 顯示定義事務 BEGIN TRAN 開始 如果要提交事務 使用 COMMIT TRAN 撤銷事務(回滾) ROLLBACK TRAN 如下示例 一個簡單的顯示事務 ...
  • Redis簡介 Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。 Redis是 NoSQL技術陣營中的一員,它通過多種鍵值數據類型來適應不同場景下的存儲需求,藉助一些高層級的介面使用其可以勝任,如緩存、隊列系統 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...