Redis主從配置和底層實現原理解析(實戰記錄)
我們使用Redis的時候往往都是主從模式或者集群架構,不會使用單臺Redis服務。
一、Redis主從配置實戰
我們使用master節點寫輸入,然後將數據同步到slave節點,從節點可以提供讀取或者備份的功能,分擔master節點壓力。
redis主從架構搭建,配置從節點步驟
1、 復制一份redis.conf文件為redis-6380.conf
cp ./redis.conf ./conf/redis-6380.conf
2、打開redis-6380.conf配置文件,將相關配置修改為如下值:
port 6380 pidfile /var/run/redis_6380.pid # 把pid進程號寫入pidfile配置的文件 logfile "6380.log" dir /usr/local/redis‐5.0.3/data/6380 # 指定數據存放目錄 # 需要註釋掉bind # bind 127.0.0.1(bind綁定的是自己機器網卡的ip,如果有多塊網卡可以配多個ip,代表允許客戶端通過機器的哪些網卡ip去訪問,內網一般可以不配置bind,註釋掉即可)
3、在redis-6380.conf中配置主從復制
replicaof 192.168.0.60 6379 # 從本機6379的redis實例復制數據,Redis 5.0之前使用slaveof. 這裡的IP是redis服務IP replica‐read‐only yes # 配置從節點隻讀
註意: 如果的時候發現從節點中始終是空,即沒有同步到主節點的數據,可能是192.168.0.60的設置問題,如果是主從都在一臺服務器上,可以試試改成127.0.0.1.
4、啟動從節點
註意一下命令,我這裡是相對路徑。
./src/redis-server ./conf/redis-6380.conf
然後我們查看redis服務實例,發現6379和6380都已經啟動瞭。
5、連接從節點
[root@localhost redis-6.2.3]# ./src/redis-cli -p 6380 127.0.0.1:6380>
查看是否同步瞭數據:
127.0.0.1:6380> keys * 1) "test3" 2) "tul2" 3) "tul" 4) "tul3" 5) "test1" 6) "yaolao" 7) "test2" 127.0.0.1:6380>
註意: 如果的時候發現從節點中始終是空,即沒有同步到主節點的數據,可能是192.168.0.60的設置問題,如果是主從都在一臺服務器上,可以試試改成127.0.0.1試試。、
6、測試在6379實例上寫數據,6380實例是否能及時同步新修改數據
7、可以自己再配置一個6381的從節點
至此。,我們的主從配置就完成瞭。我們可以自己去配置多個從節點。
二、主從實現原理
如果你為master配置瞭一個slave,不管這個slave是否是第一次連接上Master,它都會發送一個PSYNC命令給master請求復制數據。
master收到PSYNC命令後,會在後臺進行數據持久化通過bgsave生成最新的rdb快照文件,持久化期間,master會繼續接收客戶端的請求,它會把這些可能修改數據集的請求緩存在內存中。當持久化進行完畢以後,master會把這份rdb文件數據集發送給slave,slave會把接收到的數據進行持久化生成rdb,然後再加載到內存中。然後,master再將之前緩存在內存中的命令發送給slave。
當master與slave之間的連接由於某些原因而斷開時,slave能夠自動重連Master,如果master收到瞭多
個slave並發連接請求,它隻會進行一次持久化,而不是一個連接一次,然後再把這一份持久化的數據發送
給多個並發連接的slave。
主從復制(全量復制)流程圖
psync命令是redis底層的C語言實現的。
數據部分復制
當master和slave斷開重連後,一般都會對整份數據進行復制。但從redis2.8版本開始,redis改用可以支持部分數據復制的命令PSYNC去master同步數據,slave與master能夠在網絡連接斷開重連後隻進行部分數據復制(斷點續傳)。
master會在其內存中創建一個復制數據用的緩存隊列,緩存最近一段時間的數據,master和它所有的slave都維護瞭復制的數據下標offset和master的進程id,因此,當網絡連接斷開後,slave會請求master繼續進行未完成的復制,從所記錄的數據下標開始。如果master進程id變化瞭,或者從節點數據下標offset太舊,已經不在master的緩存隊列裡瞭,那麼將會進行一次全量數據的復制。
主從復制(部分復制,斷點續傳)流程圖:
如果slave節點掛瞭之後,隻想同步新增的數據(不需要同步全部)。
最新的命令redis會寫到repl backlog buffer(默認大小是1MB)這個緩沖區中。
offset是偏移量,即上次復制產生的偏移量,再一次復制新的數據的時候隻需要從這個偏移量後面開始復制即可。註意,這種隻適合幾分鐘之內的。
如果從緩沖區沒有找到傳過來的這個偏移量,說明從節點可能掛瞭非常久的時間,這時候需要做全量復制,而不是斷點續傳瞭。
緩解主從復制風暴
如果有很多從節點,為瞭緩解主從復制風暴(多個從節點同時復制主節點導致主節點壓力過大),可以做如下架構,讓部分從節點與從節點(與主節點同步)同步數據,即配置主從的ip地址可以寫某個從節點的,而不是都寫mast節點的IP.
到此這篇關於Redis主從配置和底層實現原理解析(實戰記錄)的文章就介紹到這瞭,更多相關Redis主從配置內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Redis實現主從復制方式(Master&Slave)
- 使用docker搭建redis主從的方法步驟
- Redis 單機安裝和哨兵模式集群安裝的實現
- 詳解Redis集群搭建的三種方式
- 一文掌握Redis的三種集群方案(小結)