Redis主從架構和主從從架構
準備
修改pidfile 為下面做準備
關閉RDB持久化修改持久化檔案的儲存位置
啟動Redis
- redis-server /etc/redis.conf
使用客戶端連線Redis
- redis-cli
連線成功,接下來就可以愉快的玩耍啦~~~
主從複製(讀寫分離)
Redis的主從複製功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級伺服器叢集架構. 可以避免Redis單點故障,構建讀寫分離架構,滿足讀多寫少的應用場景.
Redis複製功能的幾個重要方面
1.
2. Redis使用非同步複製。從2.8開始,Slave會週期性(每秒一次)發起一個Ack確認複製流(replication stream)被處理進度;
3. 不僅主伺服器可以有從伺服器,從伺服器也可以有自己的從伺服器,多個從伺服器之間可以構成一個圖狀結構;
4. 複製在Master端是非阻塞模式的,這意味著即便是多個Slave執行首次同步時,Master依然可以提供查詢服務;
5. 複製在Slave端也是非阻塞模式的:如果你在redis.conf做了設定,Slave在執行首次同步的時候仍可以使用舊資料集提供查詢;你也可以配置為當Master與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檔案
- mv /etc/redis.conf /etc/redis.6379.conf
- cp /etc/redis.6379.conf /etc/redis.6380.conf
- cp /etc/redis.6379.conf /etc/redis.6381.conf
通過vi修改6380 和 6381 配置檔案
- vi /etc/redis.6380.conf
通過命令替換 6379 為 6380
- :%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問題,在這個複製過程可能就會出現瓶頸. Redis在2.8.18版本開始實現了無磁碟複製功能
Redis在與從庫進行復制初始化時將不會吧快照儲存到磁碟,而是直接通過網路傳送給從庫,避免了IO效能問題.
修改repl-diskless-sync 為 yes
宕機處理
在主從架構中出現了宕機的情況
① Slave 宕機
在Redis中,從庫重新啟動會自動加入到主從架構中,自動完成同步資料
Redis 2.8之後,在從庫有做持久化的前提下,如果從庫在斷開的期間,主庫的變化不大,從庫再次啟動後,主庫不會將或有的資料進行RDB操作,而是進行增量複製
② Master 宕機
一 : 在Slave中執行SLAVEOF NO ONE 命令,斷開主從關係並且提升為主庫繼續服務;
二 : 將主庫重新啟動後,執行 SLAVEOF命令,將其設定為其他Redis的從庫,這個時候資料就同步回來了;
這樣通過人工的方式來處理Redis的宕機情況步驟雖然少,但是還是容易出現異常的,下面我們通過Redis的哨兵(sentinel)功能來實現高可用的架構