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建立倆條連線:
- 一條連線用來訂閱master的
_sentinel_:hello
頻道與獲取其他監控該master的哨兵節點資訊 - 另一條連線定期向master傳送INFO等命令獲取master本身的資訊
與master建立連線後,哨兵會執行三個操作,這三個操作的傳送頻率都可以在配置檔案中配置:
- 定期向master和slave傳送INFO命令
- 定期向master個slave的sentinel:hello頻道傳送自己的資訊
- 定期向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,選擇規則如下:
- 所有線上的slave中選擇優先順序最高的,優先順序可以通過
slave-priority
配置 - 如果有多個最高優先順序的slave,則選取複製偏移量最大(即複製越完整)的當選
- 如果以上條件都一樣,選取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加密)或不安全的
ES6詳解三:class
class是es6引入的最重要特性之一。在沒有class之前,我們只能通過原型鏈來模擬類。 基本用法 如果你用過java這樣的純面嚮物件語言,那麼你會對class的語法非常熟悉。 class People { constructor(name)
Netty4詳解三:Netty概要講解,全面瞭解Netty,做到胸有成竹
讀完這一章,我們基本上可以瞭解到Netty所有重要的元件,對Netty有一個全面的認識,這對下一步深入學習Netty是十分重要的,而學完這一章,我們其實已經可以用Netty解決一些常規的問題了。一、先縱覽一下Netty,看看Netty都有哪些元件? 為了更好的理解和進一步深
Java開發中的23種設計模式詳解(三)
本章是關於設計模式的最後一講,會講到第三種設計模式——行為型模式,共11種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、直譯器模式。 先來張圖,看看這11中模式的關係: 第一類:通過父類與子類的關