Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式

Redis運維和開發學習筆記(5) 主從復制和sentinel哨兵模式

主從復制

將主節點的數據改變同步給從節點

  • 作用
    1. 備份數據
    2. 讀寫分離
  • 存在的問題:
    1. 手動干預切主等操作
    2. 主節點的寫能力受到單機限制
    3. 主節點的存儲能力受到單機限制

主從模式的故障恢復

  1. 當主節點發生故障時,客戶端連接主節點失敗,兩個從節點和主連接失敗
  2. (人工)選取一個從節點slaveof no one使其成為新的主節點
  3. 更新應用方信息,重啟
  4. 讓另一個從節點連接新主
  5. 原來的主恢復作為從,去連接新主

哨兵

blog

拓撲結構圖

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-qDHbOoMx-1572053628652)(media/15653345582593/%206.2%20%E6%8B%93%E6%89%91%EF%BC%88171%EF%BC%89.png)]

復制配置

復制過程

命令:slaveof slaveof 127.0.0.1:6379

  1. 保存主節點信息
    • 執行slaveof后會打印日志
id=38 addr=127.0.0.1:47458 fd=6 name= age=2700 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
參數	含義
id	客戶端連接的唯一標識,這個id是隨著Redis的連接自增的,重啟Redis后會重置為0。
addr	客戶端的地址和端口
fd	套接字所使用的文件描述符
age	以秒計算的已連接時長
idle	以秒計算的空閑時長看, age=idle時則此鏈接為空連接
flags	客戶端 flag
db	該客戶端正在使用的數據庫 ID
sub	已訂閱頻道的數量
psub	已訂閱模式的數量
multi	在事務中被執行的命令數量
qbuf	輸入緩沖區總量(字節為單位, 0 表示沒有分配查詢緩沖區)
qbuf-free	輸入緩沖區剩余容量(字節為單位, 0 表示沒有剩余空間)
obl	輸出緩沖區的長度(字節為單位, 0 表示沒有分配輸出緩沖區)
oll	輸出列表包含的對象數量(當輸出緩沖區沒有剩余空間時,命令回復會以字符串對象的形式被入隊到這個隊列里)
omem	輸出緩沖區和輸出列表占用的內存總量
events	文件描述符事件
cmd	最近一次執行的命令
  1. 主從建立socket連接
    • 每秒運行定時任務維護復制邏輯,直到成功;或者slaveof no one取消復制
    • 連接失敗:Error condition on socket for SYNC:{socket_error_reason}
  2. 發送pingmingling
    1. 檢查主從質檢網絡套接字是否可用
    2. 檢測主從節點當前是否可接收處理命令
    3. 日志:Master replied to PING, replication can continue...
  3. 權限驗證
    5. 主節點:如果配置了requirepass,就需要認證
    6. 從節點:配置相應的masterauth。
  4. 同步數據集
  5. 命令持續復制
    7. 上面的操作已經把數據同步完了,后面就持續把寫命令發送給從庫

數據同步

復制偏移量

  • 主節點在處理完畢寫入命令之后,會把命令的字節長度做累加記錄,統計信息在master_repl_offset
  • 對比主從節點的復制偏移量,判斷是否數據一致

復制積壓緩沖區(repl_backlog)

  • 保存在主節點上的一個固定長度的隊列,默認為1M

  • 保存最近已復制的數據,用于部分復制和復制命令丟失的數據補救

  • 參數含義

    repl_backlog_active:1開啟復制緩沖區
    repl_backlog_size:1048576緩沖區最大長度
    repl_backlog_first_byte_offset:2起始偏移量,計算當前緩沖區 可用范圍
    repl_backlog_histlen:969335已保存數據的有效長度

參數信息

主庫(info replication)

 127.0.0.1:7001> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=7004,state=online,offset=969336,lag=1
master_repl_offset:969336
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:969335

從庫(info replication)

127.0.0.1:7004> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:7001
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:969350
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

主節點運行id

節點啟動后動態分配的ID,用于唯一識別節點,ID變更后會發生全量復制

重啟后會改變,需要使用debug reload命令重啟并保持ID不變(命令會阻塞當前節點主線程),阻塞期間先生成rdb快照,并清空數據后再加載rdb文件。對于大數據量的主節點和無法容忍阻塞的應用場景慎用

  • 參數
127.0.0.1:7002> info server
# Server
redis_version:3.2.4
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:53849fee5fb41517
redis_mode:cluster
os:Linux 3.10.0-957.1.3.el7.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.8.5
process_id:24334
run_id:698e129042d03211b71e7c3117e37731a3bc5eca
tcp_port:7002
uptime_in_seconds:700399
uptime_in_days:8
hz:10
lru_clock:4879595
executable:/usr/local/redis/3.2/redis-server
config_file:/etc/redis.d/redistest_7002.conf

psync(178)

  • 從節點使用psync命令完成部分復制和全量復制功能。

總覽圖

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/382387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382387.shtml
英文地址,請注明出處:http://en.pswp.cn/news/382387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Effective C++學習第八天

條款26:盡可能延后變量定義式的出現時間當你定義了一個變量,如果在使用變量之前出現異常,那么你得承受一次構造成本和析構成本,而且你沒有使用該變量;本條款給出的建議是延遲變量的定義,直到非得使用該變量…

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令

Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令 文章目錄Redis運維和開發學習筆記(6) 監控Redis工作狀態-info命令info serverinfo clientinfo memoryinfo persistenceinfo statsinfo commandstatsinfo cpuinfo clusterinfo keyspaceinfo server Redis服務器相關的通用…

Effective C++學習第九天

條款32:確定你的public繼承塑模出is-a模型class D(derived)以public形式繼承class B(base),則每一個類型為D的對象同時也是一個類型為B的對象,反之不成立,因此B比D表現出更加一般化的…

Effective C++學習第十天

條款36:絕不重新定義繼承而來的non-virtual函數non-virtual函數執行的是靜態綁定,在編譯器就已經決定,因此對象對用的函數只和指針的類型有關,而與指針所指的對象無關;記住non-virtual函數的性質:不變性凌駕…

Redis運維和開發學習筆記(7) 內存管理和過期策略

Redis運維和開發學習筆記(7) 內存管理和過期策略 文章目錄Redis運維和開發學習筆記(7) 內存管理和過期策略內存回收策略惰性刪除定時任務刪除maxmemory過期策略allkeys-lru主從搭建測試搭建完畢主從測試結果volatile-lru測試結果volatile-ttl測試結果allkeys-lru內存回收策略 …

Effective C++學習第十一天

條款41:了解隱式接口和編譯期多態面向對象編程世界總是以顯式接口(源碼可見的接口)和運行期多態(virtual)解決問題;對于templates及泛型編程的世界,隱式接口和編譯期多態顯得更加重要&#xff1…

Redis源碼分析(零)學習路徑筆記

文章目錄第一階段第二階段 熟悉Redis的內存編碼結構第三階段 熟悉Redis數據類型的實現第四階段 熟悉Redis數據庫的實現第五階段 熟悉客戶端和服務器端的代碼實現第六階段 這一階段主要是熟悉Redis多機部分的代碼實現關于測試方面的文件有一些工具類的文件如下SORT命令的實現一些…

Effective C++學習第十二天

條款47:請使用traits classes表現類型信息STL有五類迭代器分類,input迭代器(只讀,一次,向前)、output迭代器(可寫,一次,向前)、forward迭代器(讀/…

Redis源碼分析(一)redis.c //redis-server.c

Redis源碼分析(一)redis.c //redis-server.c 入口函數 int main() 4450 int main(int argc, char **argv) {4451 initServerConfig();4452 if (argc 2) {4453 ResetServerSaveParams();4454 loadServerConfig(argv[1]);4455 …

Linux 學習

1.linux文本命令行語言環境設置命令 查看當前語言環境: echo ¥LANG 修改: LANG選擇的語言環境’ 引申:https://blog.csdn.net/huoyunshen88/article/details/41113633 2.linux中的硬鏈接和軟連接 linux中文件的儲存方式&#xf…

vivo C/C++工程師視頻面試總結 20180802

1.自我介紹:有點兒緊張了,直接把自己簡歷上的一些信息信息說了一遍,說完之后在介紹了一下自己的平時的愛好和興趣,感覺面試官沒有理我,直接進入下一環節了。 2.項目詳情:主要是自己最近的一個項目和自己負…

Redis源碼分析(二)redis-cli.c

文章目錄1. int main()2. parseOptions(int argc, char **argv) 進行ip和port的改變3. lookupCommand(char *name) 查找命令,判斷命令合法3.2 strcasecmp(name,cmdTable[j].name)3.1 redisCommand cmdTable[]4. cliSendCommand(int argc, char **argv)4.1 cliConnec…

C語言中有bool變量嗎?

1.C/C中定義的數據類型: C語言中定義了6種基本數據類型:short,int,long,float,double,char 4種構造類型:數組,結構體(struct),共用類型(union),枚舉類型(enum) 指針類型和空類型 C語…

redis源碼剖析(三)——基礎數據結構

文章目錄SDS鏈表字典這篇文章關于 Redis 的基礎數據:SDS SDS (Simple Dynamic String)是 Redis 最基礎的數據結構。直譯過來就是”簡單的動態字符串“。Redis 自己實現了一個動態的字符串,而不是直接使用了 C 語言中的字符串。 sds 的數據結…

C++迭代器使用錯誤總結

指針和迭代器的區別: 迭代器: (1)迭代器不是指針,是類模板,表現的像指針。他只是模擬了指針的一些功能,通過重載了指針的一些操作符,->,*, --等封裝了指針,是一…

redis源碼剖析(四)跳表

文章目錄整數集合跳躍表壓縮列表總結整數集合 當一個集合只包含整數,且這個集合的元素不多的時候,Redis 就會使用整數集合 intset 。首先看 intset 的數據結構: typedef struct intset {// 編碼方式uint32_t encoding;// 集合包含的元素數量…

vivo C/C++工程師 HR視頻面試問題總結20180807

一開始沒想到這次視頻面是HR面試,還以為是技術面試,畢竟上次面試的時候技術問題問的相對比較少,所以面試準備方向有點兒錯了,不過還是總結一下具體問題。 1)自我介紹:吸取了上次自我介紹的經驗,…

在Redis客戶端設置連接密碼 并演示密碼登錄

我們先連接到Redis服務 然后 我們要輸入 CONFIG SET requirepass “新密碼” 例如 CONFIG SET requirepass "A15167"這樣 密碼就被設置成立 A15167 我們 輸入 AUTH 密碼 例如 AUTH A15167這里 返回OK說明成功了 然后 我們退出在登錄就真的需要 redis-cli -h IP地…

redis源碼剖析(五)—— 字符串,列表,哈希,集合,有序集合

文章目錄對象REDIS_STRING (字符串)REDIS_LIST 列表REDIS_SET (集合)REDIS_ZSET (有序集合)REDIS_HASH (hash表)int refcount(引用計數器)unsigned lru:REDIS_LRU_BITS對象 對于 Re…

函數sscanf小結

1.sscanf用于處理固定格式的字符串&#xff0c;包含在頭文件<cstdio>中&#xff0c;函數原型為&#xff1a; int sscanf(const char *buffer,const char*format,[]argument ]...); 其中:buffer代表著要存儲的數據&#xff0c;format 代表格式控制字符串&#xff0c;arg…