Redis主從同步,讀寫分離設定 的相關操作

來源:互聯網
上載者:User
本文介紹使用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.confredis-server redis_slave1.confredis-server redis_slave2.conf

執行後查看是否啟動成功

ps aux|grep redisroot  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 6301127.0.0.1:6301> auth 123456OK127.0.0.1:6301> get abc"123"127.0.0.1:6301>

slave2:

redis-cli -p 6302127.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 --sentinelredis-server sentinel2.conf --sentinelps aux|grep redisroot  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不支援對象私人屬性的解決方案

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.