搜尋
首頁後端開發php教程Redis主從同步,讀寫分離設定 的相關操作

本文介紹使用Redis的主從同步功能(master, slave),使程式實現讀寫分離,避免io瓶頸,提高資料讀寫效率。

Redis支援一個master伺服器對多個slave伺服器同步,同步使用發布/訂閱機制。
1個master對多個slave,也可以進行分層,每個slave下方可以再同步slave,擴充成樹狀結構。

Redis 主從同步設定

Redis預設的連接埠是6379,我們為了不影響原有Redis,使用新的連接埠

#master 設定redis_master.conf

port 6300requirepass 123456masterauth 123456daemonize yes

 
slave1 設定redis_slave1.conf# 設為master的slave

port 6301slaveof 127.0.0.1 6300requirepass 123456masterauth 123456daemonize yes

 
slave2 設定redis_slave2.conf 設為master的slave

port 6302slaveof 127.0.0.1 6300requirepass 123456masterauth 123456daemonize yes

daemonize 表示後台啟動。
requirepass 為主機認證密碼。
masterauth 為從機存取主機驗證密碼,需要與主機的requirepass一致。
因後面需要示範主從切換,因此三組conf的驗證密碼都一致。

Redis 主從同步測試

依序啟動master, slave1, slave2

redis-server redis_master.conf
redis-server redis_slave1.conf
redis-server redis_slave2.conf

執行後查看是否啟動成功

ps aux|grep redis
root  1858  Ss  3:55  0:00.01 redis-server *:6302 root  1849  Ss  3:54  0:00.01 redis-server *:6301 root  1842  Ss  3:54  0:00.02 redis-server *:6300

進入master,設定key abc的值為123

redis-cli -p 6300127.0.0.1:6300> auth 123456OK127.0.0.1:6300> set abc 123OK127.0.0.1:6300> get abc"123"

分別進入slave1, slave2檢查是否同步資料
slave1:

redis-cli -p 6301
127.0.0.1:6301> auth 123456OK127.0.0.1:6301> get abc"123"
127.0.0.1:6301>

slave2:

redis-cli -p 6302
127.0.0.1:6302> auth 123456OK127.0.0.1:6302> get abc"123"
127.0.0.1:6302>

進入master修改key abc的值為456

127.0.0.1:6300> set abc 456OK127.0.0.1:6300> get abc"456"

檢查slave1, slave2是否同步
slave1:

127.0.0.1:6301> get abc"456"

slave2:

127.0.0.1:6302> get abc"456"

Redis主從切換

在運行過程中,如果master出現問題,我們可以透過設置,把另一台slave機自動設為master使用。這裡主要用到Redis的sentinel功能來實現主從切換。

sentinel1.conf

port 26301sentinel monitor master 127.0.0.1 6300 2sentinel auth-pass master 123456logfile "/tmp/sentinel.log"daemonize yes

sentinel2.conf

port 26302sentinel monitor master 127.0.0.1 6300 2sentinel auth-pass master 123456logfile "/tmp/sentinel.log"daemonize yes

sentinel monitor master 127.0.0.1 6300 2 中的2 表示有2個以上的sentinel服務偵測到master失效,才會執行主從切換。
 
啟動兩個sentinel程序

redis-server sentinel1.conf --sentinel
redis-server sentinel2.conf --sentinel
ps aux|grep redis
root  2643  Ss  4:28 0:00.02 redis-server *:26302 [sentinel]  
root  2636  Ss  4:28 0:00.02 redis-server *:26301 [sentinel]

Redis日誌可以看到,啟動成功開始監控

Running mode=sentinel, port=26301.
Sentinel ID is 3a23343948cd7f26662ccba1d01b92955311ef52
+monitor master master 127.0.0.1 6300 quorum 2+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300Running mode=sentinel, port=26302.
Sentinel ID is ce0ee2af6b454205a3e475763945f505a10a7d6a
+monitor master master 127.0.0.1 6300 quorum 2+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+slave slave 127.0.0.1:6302 127.0.0.1 6302 @ master 127.0.0.1 6300+sentinel sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301 @ master 127.0.0.1 6300+sentinel sentinel ce0ee2af6b454205a3e475763945f505a10a7d6a 127.0.0.1 26302 @ master 127.0.0.1 6300

終止master,測試主從切換

kill master行程後,sentinel判斷master失效,執行主從切換處理。

日誌如下:

+failover-state-reconf-slaves master master 127.0.0.1 6300+slave-reconf-sent slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+config-update-from sentinel 3a23343948cd7f26662ccba1d01b92955311ef52 127.0.0.1 26301 +switch-master master 127.0.0.1 6300 127.0.0.1 6302+slave slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6302+slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302-odown master master 127.0.0.1 6300+slave-reconf-inprog slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+slave-reconf-done slave 127.0.0.1:6301 127.0.0.1 6301 @ master 127.0.0.1 6300+failover-end master master 127.0.0.1 6300+switch-master master 127.0.0.1 6300 127.0.0.1 6302+convert-to-slave slave 127.0.0.1:6300 127.0.0.1 6300 @ master 127.0.0.1 6302

從日誌可以看出,主從切換執行了以下操作:

1.將slave2切換為新的master,redis_slave2.conf 中的slaveof 127.0.0.1 6300 會自動刪除。

2.將redis_slave1.conf的 slaveof 127.0.0.1 6300 自動更新為 slaveof 127.0.0.1 6302,使用slave2作為新的master。

3.原master重啟動後,會作為slave使用,redis_master.conf會自動加入slaveof 127.0.0.1 6302。

 
原master重啟後進行主從同步測試

#原master更新key abc為888,因為現在已經是slave,所以更新失敗。

127.0.0.1:6300> set abc 888(error) READONLY You can't write against a read only slave.

slave2 更新key abc為888

127.0.0.1:6302> set abc 888OK127.0.0.1:6302> get abc"888"

原master,slave1檢查是否同步

原master

127.0.0.1:6300> get abc"888"

slave1

127.0.0.1:6301> get abc"888"

經過檢查,主從切換後,slave2作為新的master,其他伺服器作為slave,可正常使用。

本文說明了Redis主從同步,讀寫分離設定 的相關操作,更多相關內容親關注php中文網。

相關推薦:

介紹mysql重建表格分割區並保留資料的方法

PHP產生唯一RequestID類別的相關內容

php json_encode不支援物件私有屬性的解決方法

以上是Redis主從同步,讀寫分離設定 的相關操作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP如何識別用戶的會話?PHP如何識別用戶的會話?May 01, 2025 am 12:23 AM

phpIdentifiesauser'ssessionSessionSessionCookiesAndSessionId.1)whiwsession_start()被稱為,phpgeneratesainiquesesesessionIdStoredInacookInAcookInAcienamedInAcienamedphpsessIdontheuser'sbrowser'sbrowser.2)thisIdallowSphptpptpptpptpptpptpptpptoretoreteretrieetrieetrieetrieetrieetrieetreetrieetrieetrieetrieetremthafromtheserver。

確保PHP會議的一些最佳實踐是什麼?確保PHP會議的一些最佳實踐是什麼?May 01, 2025 am 12:22 AM

PHP會話的安全可以通過以下措施實現:1.使用session_regenerate_id()在用戶登錄或重要操作時重新生成會話ID。 2.通過HTTPS協議加密傳輸會話ID。 3.使用session_save_path()指定安全目錄存儲會話數據,並正確設置權限。

PHP會話文件默認存儲在哪裡?PHP會話文件默認存儲在哪裡?May 01, 2025 am 12:15 AM

phpsessionFilesArestoredIntheDirectorySpecifiedBysession.save_path,通常是/tmponunix-likesystemsorc:\ windows \ windows \ temponwindows.tocustomizethis:tocustomizEthis:1)useession_save_save_save_path_path()

您如何從PHP會話中檢索數據?您如何從PHP會話中檢索數據?May 01, 2025 am 12:11 AM

ToretrievedatafromaPHPsession,startthesessionwithsession_start()andaccessvariablesinthe$_SESSIONarray.Forexample:1)Startthesession:session_start().2)Retrievedata:$username=$_SESSION['username'];echo"Welcome,".$username;.Sessionsareserver-si

您如何使用會議來實施購物車?您如何使用會議來實施購物車?May 01, 2025 am 12:10 AM

利用會話構建高效購物車系統的步驟包括:1)理解會話的定義與作用,會話是服務器端的存儲機制,用於跨請求維護用戶狀態;2)實現基本的會話管理,如添加商品到購物車;3)擴展到高級用法,支持商品數量管理和刪除;4)優化性能和安全性,通過持久化會話數據和使用安全的會話標識符。

您如何在PHP中創建和使用接口?您如何在PHP中創建和使用接口?Apr 30, 2025 pm 03:40 PM

本文解釋瞭如何創建,實施和使用PHP中的接口,重點關注其對代碼組織和可維護性的好處。

crypt()和password_hash()有什麼區別?crypt()和password_hash()有什麼區別?Apr 30, 2025 pm 03:39 PM

本文討論了PHP中的crypt()和password_hash()的差異,以進行密碼哈希,重點介紹其實施,安全性和對現代Web應用程序的適用性。

如何防止PHP中的跨站點腳本(XSS)?如何防止PHP中的跨站點腳本(XSS)?Apr 30, 2025 pm 03:38 PM

文章討論了通過輸入驗證,輸出編碼以及使用OWASP ESAPI和HTML淨化器之類的工具來防止PHP中的跨站點腳本(XSS)。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境