1. 程式人生 > >Redis主從架構和主從從架構

Redis主從架構和主從從架構

準備

修改pidfile 為下面做準備

關閉RDB持久化修改持久化檔案的儲存位置

啟動Redis

  1. redis-server /etc/redis.conf  


使用客戶端連線Redis

  1. redis-cli  

連線成功,接下來就可以愉快的玩耍啦~~~

主從複製(讀寫分離)

Redis的主從複製功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級伺服器叢集架構可以避免Redis單點故障,構建讀寫分離架構,滿足讀多寫少的應用場景.

Redis複製功能的幾個重要方面

1. 

一個Master可以有多個Slave
2. Redis使用非同步複製。從2.8開始,Slave會週期性(每秒一次)發起一個Ack確認複製流(replication stream)被處理進度;
3. 不僅主伺服器可以有從伺服器,從伺服器也可以有自己的從伺服器,多個從伺服器之間可以構成一個圖狀結構;
4. 複製在Master端是非阻塞模式的,這意味著即便是多個Slave執行首次同步時,Master依然可以提供查詢服務;
5. 複製在Slave端也是非阻塞模式的:如果你在redis.conf做了設定,Slave在執行首次同步的時候仍可以使用舊資料集提供查詢;你也可以配置為當MasterSlave失去聯絡時,讓
Slave返回客戶端一個錯誤提示;
6. Slave要刪掉舊的資料集,並重新載入新版資料時,Slave會阻塞連線請求(一般發生在與Master斷開重連後的恢復階段);
7. 複製功能可以單純地用於資料冗餘(dataredundancy),也可以通過讓多個從伺服器處理只讀命令請求來提升擴充套件性(scalability):比如說,繁重的 SORT 命令可以交給附屬節點去執行。
8. 可以通過修改Master端的redis.config來避免在Master端執行持久化操作(Save),由Slave端來執行持久化。

主從架構

準備3個配置檔案埠分別為

6379 (Master)

6380 (Slave

)

6381 (Slave)

修改原來的redis.conf檔案 ,拷貝出2個redis.conf檔案

  1. mv /etc/redis.conf /etc/redis.6379.conf  
  2. cp /etc/redis.6379.conf /etc/redis.6380.conf  
  3. cp /etc/redis.6379.conf /etc/redis.6381.conf  

通過vi修改6380 和 6381 配置檔案

  1. vi /etc/redis.6380.conf  

通過命令替換 6379 為 6380

  1. :%s/6379/6380/g  

最底下出現 表示修改成功, wq退出並儲存

用一樣的方式修改6381 的配置檔案

注意配置檔案在前面已經修改pidfile 引數,如果沒有修改一定要修改該引數為不同的值

通過配置檔案啟動3個Redis例項

通過ps 命令檢視Redis程序

主從的配置有2種方法:

在redis.conf中設定 slaveof

使用redis-cli客戶端連線到Redis服務中,執行slaveof命令

這種方式在重啟之後就會失去主從複製關係

修改6381的配置檔案 ,然後重啟6381 .

通過redis-cli進入6379這個服務

檢視主從資訊:INFO replication

從庫顯示的資訊

測試主從關係

在主庫寫入資料 ,然後在從庫讀取資料

主從從結構

主從從架構就是

Master下面有個 Slave , 而Slave下面還有一個Slave

我們吧 6381 重啟一下

此時的主從資訊

只剩下一主一從了

然後使用redis-cli客戶端連線到Redis服務,執行slaveof命令

檢視此時的主從資訊

6379:

6379只有一個從庫 6380

6380:

6380有一個主庫 6379 還有一個從庫 6381

6381:

6381只有一個主庫 6380

這樣主從從架構就搭建好了

測試 , 先清空key

在主庫中設定資料

在從庫中獲取資料

6380 和 6381都已經獲取到資料了

好了,主從從架構搭建完成!

從庫只讀

預設情況下redis資料庫充當slave角色時是隻讀的不能進行寫操作。

如果進行寫操作就會報錯

我們可以修改Redis的配置檔案的配置引數slave-read-only, 修改為no

資料同步的過程

①  當從庫和主庫建立MS關係後,會向主資料庫傳送SYNC命令(同步命令);

②  主庫接收到SYNC命令後會開始在後臺儲存快照(RDB持久化過程),並將期間接收到的寫命令快取起來;所以就算關掉了RDB持久化方式,在他們同步的時候也會產生RDB檔案

以上主庫只做了2件事情

           將接收的命令進行RDB持久化

           在RDB持久化中,將接收的命令快取起來

①  當快照完成後,主Redis會將快照檔案和所有快取的寫命令傳送給從Redis;

②  從Redis接收到後,會載入快照檔案並且執行收到的快取的命令;

③  之後,主Redis每當接收到寫命令時就會將命令傳送從Redis,從而保證資料的一致;

在這個過程中主從同步是通過RDB來同步資料即使禁用了RDB也沒有用,那麼就會產生IO問題,在這個複製過程可能就會出現瓶頸. Redis2.8.18版本開始實現了無磁碟複製功能

Redis在與從庫進行復制初始化時將不會吧快照儲存到磁碟,而是直接通過網路傳送給從庫,避免了IO效能問題.

修改repl-diskless-sync 為 yes

宕機處理

在主從架構中出現了宕機的情況

①  Slave 宕機

在Redis中,從庫重新啟動會自動加入到主從架構中,自動完成同步資料

Redis 2.8之後,在從庫有做持久化的前提下,如果從庫在斷開的期間,主庫的變化不大,從庫再次啟動後,主庫不會將或有的資料進行RDB操作,而是進行增量複製

②  Master 宕機

一 : 在Slave中執行SLAVEOF NO ONE 命令,斷開主從關係並且提升為主庫繼續服務;

二 : 將主庫重新啟動後,執行 SLAVEOF命令,將其設定為其他Redis的從庫,這個時候資料就同步回來了;

這樣通過人工的方式來處理Redis的宕機情況步驟雖然少,但是還是容易出現異常的,下面我們通過Redis的哨兵(sentinel)功能來實現高可用的架構