Redis集群搭建的三種方式

来源:https://www.cnblogs.com/a609251438/archive/2020/07/09/13275780.html
-Advertisement-
Play Games

一、單節點實例 單節點實例還是比較簡單的,平時做個測試,寫個小程式如果需要用到緩存的話,啟動一個 Redis 還是很輕鬆的,做為一個 key/value 資料庫也是可以勝任的 二、主從模式(master/slaver) redis 主從模式配置 主從模式: redis 的主從模式,使用非同步複製,sl ...


一、單節點實例

單節點實例還是比較簡單的,平時做個測試,寫個小程式如果需要用到緩存的話,啟動一個

Redis 還是很輕鬆的,做為一個 key/value 資料庫也是可以勝任的

二、主從模式(master/slaver)

redis 主從模式配置

主從模式:

redis 的主從模式,使用非同步複製,slave 節點非同步從 master 節點複製數據,master

節點提供讀寫服務,slave 節點只提供讀服務(這個是預設配置,可以通過修改配置文件

slave-read-only 控制)。master 節點可以有多個從節點。配置一個 slave 節點只需要在

redis.conf 文件中指定 slaveof master-ip master-port 即可。

從節點開啟主從複製,有 3 種方式:

配置文件

在從伺服器的配置文件中加入:slaveof<masterip><masterport>

啟動命令

redis-server 啟動命令後加入:slaveof<masterip><masterport>

客戶端命令

Redis 伺服器啟動後直接通過客戶端執行命令:slaveof<masterip><masterport>,則該 Redis

實例成為從節點。

上述 3 種方式是等效的,下麵以客戶端命令的方式為例,看一下當執行了 slaveof 後,Redis

主節點和從節點的變化。

本示例:一個 master 節點有兩個 slave 節點

配置:

1,cd /usr/local/redis/redis-4.0.2

切換到當前 redis 安裝路徑

2, mkdir config

新建一個文件夾,存放 redis 的配置文件

3,在 config 下,新建三個配置文件,如下:

cd config
vi master-6739.conf
bind 0.0.0.0
port 6379
logfile "6379.log"
dbfilename "dump-6379.rdb"
daemonize yes
rdbcompression yes
vi slave-6380.confbind 0.0.0.0
port 6380
logfile "6380.log"
dbfilename "dump-6380.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.81.135 6379
vi slave-6381.conf
bind 0.0.0.0
port 6381
logfile "6381.log"
dbfilename "dump-6381.rdb"
daemonize yes
rdbcompression yes
slaveof 192.168.81.135 6379

master-6739.conf,為主節點配置文件,slave-6380.conf,slave-6381.conf 為從節點配置文件

在從節點的配置文件中使用:slaveof 指定 master 節點

4,啟動三台 reids 服務

[root@localhost redis-4.0.2]# ./src/redis-server config/master-6379.conf  
[root@localhost redis-4.0.2]# ./src/redis-server config/slave-6380.conf  
[root@localhost redis-4.0.2]# ./src/redis-server config/slave-6381.conf

查看一下 redis 服務

測試主從模式:

a,先分別連上三台 Redis 服務,獲取 key 為 name 的值,通過-p 指定連接那個埠的 redis 服務

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379 
127.0.0.1:6379> get name 
(nil) 
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380 
127.0.0.1:6380> get name 
(nil) 
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6381 
127.0.0.1:6381> get name 
(nil) 
#獲取的值都為空

b,給 master 節點 set 一個 key

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379
127.0.0.1:6379> set name cmy
OK
127.0.0.1:6379> get name
"cmy"

c,slave 節點直接讀取 key 為 name 的值

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380
127.0.0.1:6380> get name
"cmy"
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6381
127.0.0.1:6381> get name
"cmy"

d,slave 節點只提供讀服務,不能進行寫入操作

127.0.0.1:6381> set age 23
(error) READONLY You can't write against a read only slave.

註意

使用主從模式時應註意 matser 節點的持久化操作,matser 節點在未使用持久化的情況詳情

下如果宕機,並自動重新拉起服務,從伺服器會出現丟失數據的情況。

首先,禁止 matser 服務持久化

127.0.0.1:6379> CONFIG SET save "" 

OK

在 master 節點 set 一個值

127.0.0.1:6379> set age 23 

OK

slave 節點可以 get 到 age 的值

127.0.0.1:6380> get age 
"23" 

關掉 master 節點服務

127.0.0.1:6379> shutdown 
not connected>  

slave 節點此時仍可以 get 到 age 的值

127.0.0.1:6380> get age 
"23" 

重啟 master 服務,此時獲取不到 age 的值

[root@localhost redis-4.0.2]# ./src/redis-server config/master-6379.conf  
[root@localhost redis-4.0.2]# ./src/redis-cli -p 6379 
127.0.0.1:6379> get age 
(nil) 

slave 節點此時在獲取 age 的值為空,數據丟失

[root@localhost redis-4.0.2]# ./src/redis-cli -p 6380 
127.0.0.1:6380> get age 
(nil) 

數據丟失的原因:因為 master 服務掛了之後,重啟服務後,slave 節點會與 master 節點進行

一次完整的重同步操作,所以由於 master 節點沒有持久化,就導致 slave 節點上的數據也會

丟失掉。所以在配置了 Redis 的主從模式的時候,應該打開主伺服器的持久化功能。

到這,redis 的主從模式就已經完成了

談談我認為主從模式的必要性:

主從模式的一個作用是備份數據,這樣當一個節點損壞(指不可恢復的硬體損壞)時,數據

因為有備份,可以方便恢復。

另一個作用是負載均衡,所有客戶端都訪問一個節點肯定會影響 Redis 工作效率,有了主從

以後,查詢操作就可以通過查詢從節點來完成。

對主從模式必須的理解(結論已經驗證過,可以自行驗證):

一個 Master 可以有多個 Slaves

預設配置下,master 節點可以進行讀和寫,slave 節點只能進行讀操作,寫操作被禁止

不要修改配置讓 slave 節點支持寫操作,沒有意義,原因一,寫入的數據不會被同步到其他

節點;原因二,當 master 節點修改同一條數據後,slave 節點的數據會被覆蓋掉

slave 節點掛了不影響其他 slave 節點的讀和 master 節點的讀和寫,重新啟動後會將數據從

master 節點同步過來

master 節點掛了以後,不影響 slave 節點的讀,Redis 將不再提供寫服務,master 節點啟動

後 Redis 將重新對外提供寫服務。

master 節點掛了以後,不會 slave 節點重新選一個 master

對有密碼的情況說明一下,當 master 節點設置密碼時:

客戶端訪問 master 需要密碼

啟動 slave 需要密碼,在配置中進行配置即可

客戶端訪問 slave 不需要密碼

主從節點的缺點

主從模式的缺點其實從上面的描述中可以得出:

master 節點掛了以後,redis 就不能對外提供寫服務了,因為剩下的 slave 不能成為 master

這個缺點影響是很大的,尤其是對生產環境來說,是一刻都不能停止服務的,所以一般的生

產壞境是不會單單隻有主從模式的。所以有了下麵的 sentinel 模式。三、sentinel 模式

Redis 哨兵模式,用現在流行的話可以說就是一個“哨兵機器人”,給“哨兵機器人”進行相

應的配置之後,這個"機器人"可以 7*24 小時工作,它能能夠自動幫助你做一些事情,如監

控,提醒,自動處理故障等。

Redis-sentinel 簡介

Redis-sentinel 是 Redis 的作者 antirez,因為 Redis 集群的被各大公司使用,每個公司要寫自 己的集群管理工具,於是 antirez 花了幾個星期寫出了 Redis-sentinel。

Redis 的 Sentinel 系統用於管理多個 Redis 伺服器(instance),Redis 的 Sentinel 為 Redis 提供了高可用性。使用哨兵模式創建一個可以不用人為干預而應對各種故障的 Redis 部署。

該系統執行以下三個任務:

監控(Monitoring):Sentinel 會不斷地檢查你的主伺服器和從伺服器是否允許正常。

提醒(Notification):當被監控的某個 Redis 伺服器出現問題時,Sentinel 可以通過 API 向管 理員或者其他應用程式發送通知。

自動故障遷移(Automatic failover): (1)當一個主伺服器不能正常工作時,Sentinel 會開

始一次自動故障遷移操作,他會將失效主伺服器的其中一個從伺服器升級為新的主伺服器,

並讓失效主伺服器的其他從伺服器改為複製新的主伺服器;(2)客戶端試圖連接失敗的主服

務器時,集群也會向客服端返回新主伺服器的地址,是的集群可以使用新主伺服器代替失效

伺服器。

sentinel 的分散式特性

Redis Sentinel 是一個分散式系統,

你可以在一個架構中運行多個 Sentinel 進程(progress), 這些進程使用流言協議(gossip protocols)來接收關於主伺服器是否下線的信息, 並使用投 票協議(agreement protocols)來決定是否執行自動故障遷移, 以及選擇哪個從伺服器作為 新的主伺服器。

單個 sentinel 進程來監控 redis 集群是不可靠的,當 sentinel 進程宕掉後(sentinel 本身也有單 點問題,single-point-of-failure)整個集群系統將無法按照預期的方式運行。所以有必要將

sentinel 集群,這樣有幾個好處:

  • 有一些 sentinel 進程宕掉了,依然可以進行 redis 集群的主備切換;
  • 如果只有一個 sentinel 進程,如果這個進程運行出錯,或者是網路堵塞,那麼將無法實現 redis

集群的主備切換(單點問題);

如果有多個 sentinel,redis 的客戶端可以隨意地連接任意一個 sentinel 來獲得關於 redis 集群 中的信息

一個健壯的部署至少需要三個哨兵實例。

三個哨兵實例應該放置在客戶使用獨立方式確認故障的電腦或虛擬機中。例如不同的物理

機或不同可用區域的虛擬機。【本次講解是一個機器上進行搭建,和多級是一個道理背景

最近項目需求,接觸到了 Redis 的搭建,簡單記錄下搭建過程中遇到的坑

總體配置

192.168.1.100:6379 -> master 
192.168.1.101:6379 -> slave 
192.168.1.102:6379 -> slave 
192.168.1.100:26379 -> sentinel 
192.168.1.101:26379 -> sentinel 
192.168.1.102:26379 -> sentinel 

搭建步驟

1.安裝 redis

# 解壓 
tar -xvf /usr/local/redis-3.2.11.tar.gz 
mkdir -p /usr/local/redis/bin 
cp  
/usr/local/redis/src/{redis-benchmark,redis-check-aof,redis-check-rdb,redis-cli,redis-sentinel,redi 
s-server,redis-trib.rb} /usr/local/redis/bin 
mkdir -p /u01/redis/{6379/{log,data,pid,conf},26379/{log,data,pid,conf} 
# 添加環境變數 
echo "export PATH=/usr/local/redis/bin:$PATH" >> /etc/profile 
source /etc/profile 

2.redis-6379 配置

redis 節 點 配 置 基 本 如 下 , 把 如 下 配 置 分 別 cp 到 三 台 虛 擬 機 的

/u01/redis/6379/conf/redis_6379.conf 
bind 0.0.0.0 
protected-mode no 
daemonize yes 
pidfile "/u01/redis/6379/pid/redis_6379.pid" 
port 6379 
tcp-backlog 511 
timeout 0tcp-keepalive 0 
loglevel notice 
logfile "/u01/redis/6379/log/redis_6379.log" 
databases 16 
stop-writes-on-bgsave-error yes 
rdbcompression yes 
rdbchecksum yes 
dbfilename "dump.rdb" 
dir "/u01/redis/6379/data" 
slave-serve-stale-data yes 
slave-read-only yes 
repl-diskless-sync no 
repl-diskless-sync-delay 5 
repl-disable-tcp-nodelay no 
slave-priority 100 
min-slaves-to-write 1 
min-slaves-max-lag 10 
appendonly no 
appendfilename "appendonly.aof" 
appendfsync everysec 
no-appendfsync-on-rewrite no 
auto-aof-rewrite-percentage 100 
auto-aof-rewrite-min-size 64mb 
aof-load-truncated yes 
lua-time-limit 5000 
slowlog-log-slower-than 10000 
slowlog-max-len 128 
latency-monitor-threshold 0 
notify-keyspace-events "" 
hash-max-ziplist-entries 512 
hash-max-ziplist-value 64 
list-max-ziplist-entries 512 

啟動服務

# 在三台虛擬機上分別執行 
redis-server /u01/redis/6379/conf/redis_6379.conf 

建立主從關係

# 在 192.168.1.101 
redis-cli -p 6379 SLAVEOF 192.168.1.100 6379 
# 在 192.168.1.102 
redis-cli -p 6379 SLAVEOF 192.168.1.100 6379查看 Replication 
192.168.1.101:6379> info replication 
# Replication 
role:master 
connected_slaves:2 
min_slaves_good_slaves:2 
slave0:ip=192.168.1.102,port=6379,state=online,offset=9577826,lag=1 
slave1:ip=192.168.1.103,port=6379,state=online,offset=9577965,lag=0 
master_repl_offset:9577965 
repl_backlog_active:1 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:8529390 
repl_backlog_histlen:1048576 
192.168.1.102:6379> info replication 
# Replication 
role:slave 
master_host:192.168.1.101 
master_port:6379 
master_link_status:up 
master_last_io_seconds_ago:0 
master_sync_in_progress:0 
slave_repl_offset:9600220 
slave_priority:100 
slave_read_only:1 
connected_slaves:0 
min_slaves_good_slaves:0 
master_repl_offset:0 
repl_backlog_active:0 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:0 
repl_backlog_histlen:0 
192.168.1.103:6379> info replication 
# Replication 
role:slave 
master_host:192.168.1.101 
master_port:6379 
master_link_status:up 
master_last_io_seconds_ago:0 
master_sync_in_progress:0 
slave_repl_offset:9612675slave_priority:100 
slave_read_only:1 
connected_slaves:0 
min_slaves_good_slaves:0 
master_repl_offset:0 
repl_backlog_active:0 
repl_backlog_size:1048576 
repl_backlog_first_byte_offset:0 
repl_backlog_histlen:0 

3.sentinel-6379 配置

sentinel 節 點 配 置 基 本 如 下 , 把 如 下 配 置 分 別 cp 到 三 台 虛 擬 機 的

/u01/redis/26379/conf/sentinel_26379.conf 

sentinel monitor mymaster 後監控的是 redis 中的 master 節點,也就是 192.168.1.100,所以

這個文件在三台機器上是相同的

port 26379 
bind 0.0.0.0 
daemonize yes 
protected-mode no 
dir "/u01/redis/26379/tmp" 
logfile "/u01/redis/26379/log/sentinel_26379.log" 
sentinel monitor mymaster 192.168.1.100 6379 1 

等待啟動完畢後觀察/u01/redis/26379/conf/sentinel_26379.conf 文件變化

查看 sentinel 狀態用 info sentinel

redis-cli -h 192.168.1.100 -p 26379 info sentinel 
# Sentinel 
sentinel_masters:1 
sentinel_tilt:0 
sentinel_running_scripts:0 
sentinel_scripts_queue_length:0 
sentinel_simulate_failure_flags:0 
master0:name=zhuanche01,status=ok,address=192.168.1.100:6379,slaves=2,sentinels=3 

總結

我搭建的時候遇到了 192.168.1.101、192.168.1.102 上的 sentinel 啟動後一段時間出錯的問題,

後來發現是沒有監控 master

再就是出問題了多看 log

四、cluster 模式cluster 的出現是為瞭解決單機 Redis 容量有限的問題,將 Redis 的數據根據一定的規則分配

到多台機器。對 cluster 的一些理解:

cluster 可以說是 sentinel 和主從模式的結合體,通過 cluster 可以實現主從和 master 重選功

能,所以如果配置兩個副本三個分片的話,就需要六個 Redis 實例。

因為 Redis 的數據是根據一定規則分配到 cluster 的不同機器的,當數據量過大時,可以新增

機器進行擴容

這種模式適合數據量巨大的緩存要求,當數據量不是很大使用 sentinel 即可。

 


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

-Advertisement-
Play Games
更多相關文章
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:嚴小樣兒 分佈分析法,一般是根據分析目的,將數據進行分組,研究各組別分佈規律的一種分析方法。數據分組方式有兩種:等距或不等距分組。 分佈分析在實際的數據分析實踐中應用非 ...
  • 裝飾流也稱為處理流 1.緩衝流: 1、提升性能 2、任何處理流底層都是節點流 3、釋放外層流,內層流自動釋放,手動釋放則是從裡到外層層釋放 1.位元組緩衝流 1.BufferedInputStream 2.BufferedOutputStream 2.字元緩衝流 1.BufferedReader 2. ...
  • 對於 Java 數組的初始化,有以下兩種方式: 靜態初始化:初始化時由程式員顯式指定每個數組元素的初始值,由系統決定數組長度,如: //只是指定初始值,並沒有指定數組的長度,但是系統為自動決定該數組的長度為4 String[] computers = {"Dell", "Lenovo", "Appl ...
  • sleep 的源碼: pub1ic class Thread imp1 ements Runnable { //native 表示調用操作系統底層實現的方法 pub1ic static native void sleep(1ong millis) throws InterruptedExceptio ...
  • 老孟導讀:在 Flutter 1.17 發佈大會上,Flutter 團隊還發佈了新的 Animations 軟體包,該軟體包提供了實現新的 Material motion 規範的預構建動畫。 軟體包 pub 地址:https://pub.dev/packages/animations Materia ...
  • Cloneable介面是Java開發中常用的一個介面, 它的作用是使一個類的實例能夠將自身拷貝到另一個新的實例中,註意,這裡所說的“拷貝”拷的是對象實例,而不是類的定義,進一步說,拷貝的是一個類的實例中各欄位的值。 在開發過程中,拷貝實例是常見的一種操作,如果一個類中的欄位較多,而我們又採用在客戶端 ...
  • Collection和Collections區別 java.util.Collection 是一個集合介面。它提供了對集合對象進行基本操作的通用介面方法。 java.util.Collections 是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全等操作。 然後還有 ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:Python進階者 現在在疫情階段,想找一份不錯的工作變得更為困難,很多人會選擇去網上看招聘信息。可是招聘信息有一些是錯綜複雜的。而且不能把全部的信息全部羅列出來,以外 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...