1. 程式人生 > >redis:詳解三種叢集策略

redis:詳解三種叢集策略

redis包含三種叢集策略

  • 主從複製
  • 哨兵
  • 叢集

主從複製

在主從複製中,資料庫分為倆類,主資料庫(master)和從資料庫(slave)。其中主從複製有如下特點:

  • 主資料庫可以進行讀寫操作,當讀寫操作導致資料變化時會自動將資料同步給從資料庫
  • 從資料庫一般都是隻讀的,並且結束主資料庫同步過來的資料
  • 一個master可以擁有多個slave,但是一個slave只能對應一個master

主從複製工作機制

當slave啟動後,主動向master傳送SYNC命令。master接收到SYNC命令後在後臺儲存快照(RDB持久化)和快取儲存快照這段時間的命令,然後將儲存的快照檔案和快取的命令傳送給slave。slave接收到快照檔案和命令後加載快照檔案和快取的執行命令。

複製初始化後,master每次接收到的寫命令都會同步傳送給slave,保證主從資料一致性。

主從配置

redis預設是主資料,所以master無需配置,我們只需要修改slave的配置即可。

設定需要連線的master的ip埠:

slaveof 192.168.0.107 6379

如果master設定了密碼。需要配置:

masterauth

連線成功進入命令列後,可以通過以下命令列檢視連線該資料庫的其他庫資訊:

info replication

哨兵

哨兵的作用是監控 redis系統的執行狀況,他的功能如下:
- 監控主從資料庫是否正常執行
- master出現故障時,自動將slave轉化為master
- 多哨兵配置的時候,哨兵之間也會自動監控
- 多個哨兵可以監控同一個redis

哨兵工作機制

哨兵程序啟動時會讀取配置檔案的內容,通過sentinel monitor master-name ip port quorum查詢到master的ip埠。一個哨兵可以監控多個master資料庫,只需要提供多個該配置項即可。

同事配置檔案還定義了與監控相關的引數,比如master多長時間無響應即即判定位為下線。

哨兵啟動後,會與要監控的master建立倆條連線:

  1. 一條連線用來訂閱master的_sentinel_:hello頻道與獲取其他監控該master的哨兵節點資訊
  2. 另一條連線定期向master傳送INFO等命令獲取master本身的資訊

與master建立連線後,哨兵會執行三個操作,這三個操作的傳送頻率都可以在配置檔案中配置:

  1. 定期向master和slave傳送INFO命令
  2. 定期向master個slave的sentinel:hello頻道傳送自己的資訊
  3. 定期向master、slave和其他哨兵傳送PING命令

這三個操作的意義非常重大,傳送INFO命令可以獲取當前資料庫的相關資訊從而實現新節點的自動發現。所以說哨兵只需要配置master資料庫資訊就可以自動發現其slave資訊。獲取到slave資訊後,哨兵也會與slave建立倆條連線執行監控。通過INFO命令,哨兵可以獲取主從資料庫的最新資訊,並進行相應的操作,比如角色變更等。

接下來哨兵向主從資料庫的sentinel:hello頻道傳送資訊與同樣監控這些資料庫的哨兵共享自己的資訊,傳送內容為哨兵的ip埠、執行id、配置版本、master名字、master的ip埠還有master的配置版本。這些資訊有以下用處:

  • 其他哨兵可以通過該資訊判斷髮送者是否是新發現的哨兵,如果是的話會建立一個到該哨兵的連線用於傳送PIN命令。
  • 其他哨兵通過該資訊可以判斷master的版本,如果該版本高於直接記錄的版本,將會更新

當實現了自動發現slave和其他哨兵節點後,哨兵就可以通過定期傳送PING命令定時監控這些資料庫和節點有沒有停止服務。傳送頻率可以配置,但是最長間隔時間為1s,可以通過sentinel down-after-milliseconds mymaster 600設定。

如果被ping的資料庫或者節點超時未回覆,哨兵任務其主觀下線。如果下線的是master,哨兵會向其他哨兵點發送命令詢問他們是否也認為該master主觀下線,如果達到一定數目(即配置檔案中的quorum)投票,哨兵會認為該master已經客觀下線,並選舉領頭的哨兵節點對主從系統發起故障恢復。

如上文所說,哨兵認為master客觀下線後,故障恢復的操作需要由選舉的領頭哨兵執行,選舉採用Raft演算法:
1. 發現master下線的哨兵節點(我們稱他為A)向每個哨兵傳送命令,要求對方選自己為領頭哨兵
2. 如果目標哨兵節點沒有選過其他人,則會同意選舉A為領頭哨兵
3. 如果有超過一半的哨兵同意選舉A為領頭,則A當選
4. 如果有多個哨兵節點同時參選領頭,此時有可能存在一輪投票無競選者勝出,此時每個參選的節點等待一個隨機時間後再次發起參選請求,進行下一輪投票精選,直至選舉出領頭哨兵

選出領頭哨兵後,領頭者開始對進行故障恢復,從出現故障的master的從資料庫中挑選一個來當選新的master,選擇規則如下:

  1. 所有線上的slave中選擇優先順序最高的,優先順序可以通過slave-priority配置
  2. 如果有多個最高優先順序的slave,則選取複製偏移量最大(即複製越完整)的當選
  3. 如果以上條件都一樣,選取id最小的slave

挑選出需要繼任的slaver後,領頭哨兵向該資料庫傳送命令使其升格為master,然後再向其他slave傳送命令接受新的master,最後更新資料。將已經停止的舊的master更新為新的master的從資料庫,使其恢復服務後以slave的身份繼續執行。

哨兵配置

哨兵配置的配置檔案為sentinel.conf,設定主機名稱,地址,埠,以及選舉票數即恢復時最少需要幾個哨兵節點同意。

sentinel monitor mymaster 192.168.0.107 6379 1

只要配置需要監控的master就可以了,哨兵會監控連線該master的slave。

啟動哨兵節點:

redis-server sentinel.conf –sentinel &

出現如下內容表示啟動成功

[root@buke110 redis]# bin/redis-server etc/sentinel.conf --sentinel &
[1] 3072
[root@buke110 redis]# 3072:X 12 Apr 22:40:02.503 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 2.9.102 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26379
 |    `-._   `._    /     _.-'    |     PID: 3072
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

3072:X 12 Apr 22:40:02.554 # Sentinel runid is e510bd95d4deba3261de72272130322b2ba650e7
3072:X 12 Apr 22:40:02.554 # +monitor master mymaster 192.168.0.107 6379 quorum 1
3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.108:6379 192.168.0.108 6379 @ mymaster 192.168.0.107 6379
3072:X 12 Apr 22:40:03.516 * +slave slave 192.168.0.109:6379 192.168.0.109 6379 @ mymaster 192.168.0.107 6379

可以在任何一臺伺服器上檢視指定哨兵節點資訊:

bin/redis-cli -h 192.168.0.110 -p 26379 info Sentinel

控制檯輸出哨兵資訊:

[[email protected] redis]# bin/redis-cli -h 192.168.0.110  -p 26379  info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=192.168.0.107:6379,slaves=2,sentinels=1

叢集

使用叢集,只需要將每個資料庫節點的cluster-enable配置開啟即可。每個叢集中至少需要三個主資料庫才能正常執行。

叢集配置

安裝依賴環境ruby,注意ruby版本必須高於2.2

yum install ruby
yum install rubygems
gem install redis

修改配置檔案:

bind 192.168.0.107

配置埠

port 6380

配置快照儲存路徑

dir /usr/local/redis-cluster/6380/

開啟叢集

cluster-enabled yes

為節點設定不同的工作目錄

cluster-config-file nodes-6380.conf

叢集失效時間

cluster-node-timeout 15000

開啟叢集中的節點:

reids-service ../6380/redis.conf

將節點加入叢集中

redis-trib.rb create –replicas 1 192.168.0.107:6380 192.168.0.107:6381 192.168.0.107:6382 192.168.0.107:6383 192.168.0.107:6384 192.168.0.107:6385

中途需要輸入yes確定建立叢集:

[[email protected] src]# redis-trib.rb create --replicas 1 192.168.0.107:6380 192.168.0.107:6381 192.168.0.107:6382 192.168.0.107:6383 192.168.0.107:6384 192.168.0.107:6385 
>>> Creating cluster
Connecting to node 192.168.0.107:6380: OK
Connecting to node 192.168.0.107:6381: OK
Connecting to node 192.168.0.107:6382: OK
Connecting to node 192.168.0.107:6383: OK
Connecting to node 192.168.0.107:6384: OK
Connecting to node 192.168.0.107:6385: OK
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.107:6380
192.168.0.107:6381
192.168.0.107:6382
Adding replica 192.168.0.107:6383 to 192.168.0.107:6380
Adding replica 192.168.0.107:6384 to 192.168.0.107:6381
Adding replica 192.168.0.107:6385 to 192.168.0.107:6382
M: 5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380
   slots:0-5460 (5461 slots) master
M: 90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381
   slots:5461-10922 (5462 slots) master
M: 868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382
   slots:10923-16383 (5461 slots) master
S: b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383
   replicates 5cd3ed3a84ead41a765abd3781b98950d452c958
S: 68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384
   replicates 90b4b326d579f9b5e181e3df95578bceba29b204
S: d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385
   replicates 868456121fa4e6c8e7abe235a88b51d354a944b5
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 192.168.0.107:6380)
M: 5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380
   slots:0-5460 (5461 slots) master
M: 90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381
   slots:5461-10922 (5462 slots) master
M: 868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382
   slots:10923-16383 (5461 slots) master
M: b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383
   slots: (0 slots) master
   replicates 5cd3ed3a84ead41a765abd3781b98950d452c958
M: 68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384
   slots: (0 slots) master
   replicates 90b4b326d579f9b5e181e3df95578bceba29b204
M: d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385
   slots: (0 slots) master
   replicates 868456121fa4e6c8e7abe235a88b51d354a944b5
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

進入任何一個叢集中的節點:

redis-cli -c -h 192.168.0.107 -p 6381

檢視叢集中的節點:

[[email protected] src]# redis-cli -c -h 192.168.0.107 -p 6381
192.168.0.107:6381> cluster nodes
868456121fa4e6c8e7abe235a88b51d354a944b5 192.168.0.107:6382 master - 0 1523609792598 3 connected 10923-16383
d6d01fd8f1e5b9f8fc0c748e08248a358da3638d 192.168.0.107:6385 slave 868456121fa4e6c8e7abe235a88b51d354a944b5 0 1523609795616 6 connected
5cd3ed3a84ead41a765abd3781b98950d452c958 192.168.0.107:6380 master - 0 1523609794610 1 connected 0-5460
b8e047aeacb9398c3f58f96d0602efbbea2078e2 192.168.0.107:6383 slave 5cd3ed3a84ead41a765abd3781b98950d452c958 0 1523609797629 1 connected
68cf66359318b26df16ebf95ba0c00d9f6b2c63e 192.168.0.107:6384 slave 90b4b326d579f9b5e181e3df95578bceba29b204 0 1523609796622 5 connected
90b4b326d579f9b5e181e3df95578bceba29b204 192.168.0.107:6381 myself,master - 0 0 2 connected 5461-10922

如上圖所示,已經建立起三主三從的叢集。

增加叢集節點

cluster meet ip port

相關推薦

redis叢集策略

redis包含三種叢集策略 主從複製 哨兵 叢集 主從複製 在主從複製中,資料庫分為倆類,主資料庫(master)和從資料庫(slave)。其中主從複製有如下特點: 主資料庫可以進行讀寫操作,當讀寫操作導致資料變化時會自動將資料同步給從資料庫

【JAVA】java中實現map集合的資料存取方法。Android程式設計師也是要會寫的

長期維護的Android專案,裡面包括常用功能實現,以及知識點詳解, 當然還有java中的知識點。具體請看github: https://github.com/QQ986945193/DavidAndroidProjectTools 好了,說正題

網路電話使用和資費

數年來,人們都以常規 電話完成遠端通訊,但隨著行動通訊市場的開放,消費者獲得了更多的選擇。這裡列舉了一些基於網路的通訊解決方案,通常被稱為網際網路語音協議( VoIP ) ,即賦予消費者更多。 Skype 使用Skype ,您可以從您的電腦上實現PC與PC之間以及陸上線路和行

mongo學習筆記四Mongodb的叢集(Replica Set)

cfg是可以任意的名字,當然最好不要是mongodb的關鍵字,conf,config都可以。最外層的_id表示replica set的名字,members裡包含的是所有節點的地址以及優先順序。優先順序最高的即成為主節點,即這裡的192.168.1.131:27017。特別注意的是,對於仲裁節點,需要有個特別的

Redis基礎篇——五資料型別及分別對應的命令

Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。 String(字串) string 是 redis 最基本的型別。 特徵:一個 key 對應一個 value。   &nb

HTTPS協議()PKI 體系

客戶 判斷 節點 無法 三方 證書無效 進行 證書 roo 1、RSA身份驗證的隱患 身份驗證和密鑰協商是TLS的基礎功能,要求的前提是合法的服務器掌握著對應的私鑰。但RSA算法無法確保服務器身份的合法性,因為公鑰並不包含服務器的信息,存在安全隱患: 客戶端C和

Memcached學習筆記之MemCached原理

memcached是一個高效能的分散式記憶體快取伺服器,memcached在Linux上可以通過yum命令安裝,這樣方便很多,在生產環境下建議用Linux系統,memcached使用libevent這個庫在Linux系統上才能發揮它的高效能。它的分散式其實在服務端是不具有分散式的特徵的,是依靠客戶端

mysql系列mysql中各類日誌-技術流ken

1.前言 日誌檔案記錄了MySQL資料庫的各種型別的活動,MySQL資料庫中常見的日誌檔案有 查詢日誌,慢查詢日誌,錯誤日誌,二進位制日誌,中繼日誌 。下面分別對他們進行介紹。   2.查詢日誌   1.檢視查詢日誌變數 查詢日誌即檢視日誌記錄了所有對 My

Redis底層) 記憶體管理

一、記憶體分配概述         redis 的記憶體分配,實質上是對 tcmalloc / jemalloc 的封裝。記憶體分配本質就是給定需要分配的大小,以位元組為單位,然後返回一個指向一段分配好的連續的記憶體空間的首指標。   &n

docker容器第一個docker程式

新建一個docker 下面來通過命令成功執行一個容器 通過docker images/image ls/docker list/等命令來檢視映象。 命令顯示的分別是: 映象名 標籤(在映象名

Redis預設配置檔案redis.conf

# Redis配置檔案樣例 # Note on units: when memory size is needed, it is possible to specifiy # it in the usual form of 1k 5GB 4M and so forth: # # 1k =&g

Zookeeper,SolrCloud,Redis Cluster叢集(偽叢集)的搭建

1.什麼是叢集 1.叢集概念 叢集是一種計算機系統, 它通過一組鬆散整合的計算機軟體和/或硬體連線起來高度緊密地協作完成計算工作。在某種意義上,他們可以被看作是一臺計算機。集群系統中的單個計算機通常稱為節點,通常通過區域網連線,但也有其它的可能連線方

redis叢集方式

redis有三種叢集方式:主從複製,哨兵模式和叢集。 1.主從複製 主從複製原理: 從伺服器連線主伺服器,傳送SYNC命令;  主伺服器接收到SYNC命名後,開始執行BGSAVE命令生成RDB檔案並使用緩衝區記錄此後執行的所有寫命令;  主伺服器BGSAVE執行完後,向

java io位元組輸入輸出流

這篇部落格我們講的是位元組輸入輸出流:InputStream、OutputSteam(下圖紅色長方形框內),紅色橢圓框內是其典型實現(FileInputSteam、FileOutStream)       1、位元組輸出流:OutputStream

kafka開發Kafka應用

問題導讀1.Kafka系統由什麼組成?2.Kafka中和producer相關的API是什麼?一、整體看一下Kafka我們知道,Kafka系統有三大元件:Producer、Consumer、broker 。 file:///C:/Users/ADMINI~1/AppData/

二分鐘快速掌握Caffeine 填充策略手動、同步和非同步

 一、簡介 Caffeine — 一個高效能的 Java 快取庫。快取和 Map 之間的一個根本區別在於快取可以回收儲存的 item。回收策略為在指定時間刪除哪些物件。此策略直接影響快取的命中率 — 快取庫的一個重要特徵。Caffeine 因使用 Window TinyLf

spice協議()spice架構和通訊

一.相關概念 Channel(通道): Client和server通過通道進行互動。每個通道型別專用於一種特殊資料型別傳輸。每個通道用一個專用的TCP套接字,可能是安全的(用SSL加密)或不安全的

ES6class

class是es6引入的最重要特性之一。在沒有class之前,我們只能通過原型鏈來模擬類。 基本用法 如果你用過java這樣的純面嚮物件語言,那麼你會對class的語法非常熟悉。 class People { constructor(name)

Netty4Netty概要講解,全面瞭解Netty,做到胸有成竹

讀完這一章,我們基本上可以瞭解到Netty所有重要的元件,對Netty有一個全面的認識,這對下一步深入學習Netty是十分重要的,而學完這一章,我們其實已經可以用Netty解決一些常規的問題了。一、先縱覽一下Netty,看看Netty都有哪些元件? 為了更好的理解和進一步深

Java開發中的23設計模式()

 本章是關於設計模式的最後一講,會講到第三種設計模式——行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 先來張圖,看看這11中模式的關係: 第一類:通過父類與子類的關