3 Redis主動同步設置方法 Redis主從同步 1.Redis主從同步特點 一個master可以擁有多個slave 多個slave可以連接同一個master,還可以連接到其他slave 主從複製不會阻塞master,在同步數據時,master可以繼續處理client請求。 提高系統的伸縮性 2. ...
3 Redis主動同步設置方法 Redis主從同步
1.Redis主從同步特點
一個master可以擁有多個slave
多個slave可以連接同一個master,還可以連接到其他slave
主從複製不會阻塞master,在同步數據時,master可以繼續處理client請求。
提高系統的伸縮性
2.Redis主從同步的過程
配置好slave伺服器連接master後,slave會建立和master的連接,然後發送sync命令。
無論是第一次同步建立的連接還是連接斷開後的重新連接,master都會啟動一個後臺進程,將資料庫快照保存到磁碟文件中,同時master主進程會開始收集新的寫命令並緩存起來。
當後臺進程完成寫磁碟文件後,master就將快照文件發送給slave,slave將文件保存到磁碟上,然後載入到記憶體將資料庫快照恢復到slave上。
slave完成快照文件的恢復後,master就會把緩存的命令都轉發給slave,slave更新記憶體資料庫。
後續master收到的寫命令都會通過開始建立的連接發送給slave。從master到slave的同步數據的命令和從client到master發送的命令使用相同的協議格式。當master和slave的連接斷開時,slave可以自動重新建立連接。如果master同時收到多個slave發來的同步連接命令,只會使用啟動一個進程來寫資料庫鏡像,然後發送給所有slave。
3 Redis主動同步設置方法
1 )在redis.conf配置文件中設置
通過簡單的配置slave(master端無需配置),用戶就能使用redis的主從複製
我們讓埠6379的redis做master;另一臺埠6379的redis做slave
我們修改slave主機的redis.conf的配置文件
vim redis.conf | sed -n '189,215p'
189 ################################# REPLICATION #################################
190
191 # Master-Slave replication. Use slaveof to make a Redis instance a copy of
192 # another Redis server. Note that the configuration is local to the slave
193 # so for example it is possible to configure the slave to save the DB with a
194 # different interval, or to listen to another port, and so on.
195 #
196 # slaveof <masterip> <masterport>
197 slaveof 172.16.1.2 6379 在此處添加本行內容,指定主master的IP和埠
198 # If the master is password protected (using the "requirepass" configuration
199 # directive below) it is possible to tell the slave to authenticate before
200 # starting the replication synchronization process, otherwise the master will
201 # refuse the slave request.
202 #
203 # masterauth <master-password>
204 masterauth 123456 在此處添加本行內容,指定驗證的密碼
205 # When a slave loses its connection with the master, or when the replication
206 # is still in progress, the slave can act in two different ways:
207 #
208 # 1) if slave-serve-stale-data is set to 'yes' (the default) the slave will
209 # still reply to client requests, possibly with out of date data, or the
210 # data set may just be empty if this is the first synchronization.
211 #
212 # 2) if slave-serve-stale-data is set to 'no' the slave will reply with
213 # an error "SYNC with master in progress" to all the kind of commands
214 # but to INFO and SLAVEOF.
215 #
2)進行redis主從同步測試
redis-cli -a 123456 get name #獲取master redis6379的鍵name的值
"benet"
[root@redis-master ~]# redis-cli -a 123456 set name xxxxx #向redis6379里存一個key=name,value=xxxxx的數據
OK
[root@redis-master ~]# redis-cli -a 123456 get name #獲取redis6379的鍵name的值
"xxxxx"
3.Append-Only File(追加式的操作日誌)
- 另外由於快照方式是在一定間隔時間做一次的,所以如果redis意外down掉的話,就會丟失最後一次快照後的所有修改。如果應用要求不能丟失任何修改的話,可以採用aof持久化方式。下麵介紹Append-only file。
- aof比快照方式有更好的持久化性,是由於在使用aof持久化方式時,redis會將每一個收到的寫命令都通過write函數追加到文件中(預設是appendonly.aof)。當redis重啟時會通過重新執行文件中保存的寫命令來在記憶體中重建整個資料庫的內容.當然由於os會在內核中緩存write做的修改,所以可能不是立即寫到磁碟上。這樣aof方式的持久化也還是有可能會丟失部分修改。不過我們可以通過配置文件告訴redis我們想要通過fsync函數強制os寫入到磁碟的時機。有三種方式如下(預設是:每秒fsync一次)
- appendonly yes #啟用aof持久化方式
- appendfsync always #收到寫命令就立即寫入磁碟,最慢,但是保證完全的持久化
- appendfsync everysec #美秒鐘寫入磁碟一次,在性能和持久化方面做了很好的折中
- appendfsync no #完全依賴os,性能最好,持久化沒保證
- redis還支持一種追加式的操作日誌記錄,叫append only file,其日誌文件以aof結尾,我們一般各為aof文件。要開啟aof日誌的記錄,你需要在配置文件中進行如下設置:
aof引發的問題:
aof的方式也同時帶來了另一個問題。持久化文件會變得越來越大.例如我們調用incr test命令100次,文件中必須保存全部的100條命令,其實有99條都是多餘的。因為要恢複數據庫的狀態其實文件中保存一條set test 100 就夠了。為了壓縮aof的持久化文件。redis提供了bgrewriteaof命令。收到此命令redis將使用與快照類似的方式將記憶體中的數據以命令的方式保存到臨時文件中,最後替換原來的文件。具體過程如下:
- redis調用fork,現在有父子兩個進程
- 子進程根據記憶體中的資料庫快照,往臨時文件中寫入重建資料庫狀態的命令。
- 父進程繼續處理client請求,除了把寫命令寫入到原來的aof文件中。同時把收到的寫命令緩存起來.這樣就能保證如果子進程重寫失敗的話並不會出問題。
- 當子進程把快照內容寫入已命令方式寫到臨時文件中後,子進程發信號通知父進程。然後父進程把緩存的寫命令也寫入到臨時文件。
- 現在父進程可以使用臨時文件替換老的aof文件,並重命令名,後面收到的寫命令也開始往新的aof文件中追加。
需要註意到是重寫aof文件的操作,並沒有讀取舊的aof文件,而是將整個記憶體中的資料庫內容用命令的方式重寫了一個新的aof文件,這點和快照有點類似。接下來我們看一下實際的例子。
開啟bgrewriteaof重寫的方式
##開啟AOF
vim /usr/local/redis/conf/redis.conf
449 appendonly yes #修改本行內容開啟AOF
#重啟redis服務
[root@redis-master redis]# redis-cli -a 123456 shutdown
[4022] 08 Oct 23:27:22.183 # User requested shutdown...
[4022] 08 Oct 23:27:22.183 * Saving the final RDB snapshot before exiting.
[4022] 08 Oct 23:27:22.195 * DB saved on disk
[4022] 08 Oct 23:27:22.195 # Redis is now ready to exit, bye bye...
[1]+ Done redis-server /usr/local/redis/conf/redis.conf
[root@redis-master redis]# redis-server /usr/local/redis/conf/redis.conf &
#關於bgrewriteaof重寫的配置文件代碼如下:
vim /usr/local/redis/conf/redis.conf
503 # Automatic rewrite of the append only file.
504 # Redis is able to automatically rewrite the log file implicitly calling
505 # BGREWRITEAOF when the AOF log size grows by the specified percentage.
506 #
507 # This is how it works: Redis remembers the size of the AOF file after the #它是如何工作的呢?redis會記住AOF文件的大小
508 # latest rewrite (if no rewrite has happened since the restart, the size of #當最後一次重寫的時候,如果在重啟時沒有重寫發生。
509 # the AOF at startup is used). #那麼AOF文件會在開始時被使用
510 #
511 # This base size is compared to the current size. If the current size is
512 # bigger than the specified percentage, the rewrite is triggered. Also
513 # you need to specify a minimal size for the AOF file to be rewritten, this
514 # is useful to avoid rewriting the AOF file even if the percentage increase
515 # is reached but it is still pretty small.
516 #
517 # Specify a percentage of zero in order to disable the automatic AOF
518 # rewrite feature.
519
520 auto-aof-rewrite-percentage 100 #當100%達到最小大小的時候才會執行重寫
521 auto-aof-rewrite-min-size 64mb #自動重寫aof文件的最小大小