1. 程式人生 > >redis搭建主從複製讀寫分離

redis搭建主從複製讀寫分離

準備
關閉RDB持久化修改持久化檔案的儲存位置
啟動Redis redis-server /etc/redis.conf   使用客戶端連線Redis 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在執行首次同步的時候仍可以使用舊資料集提供查詢;你也可以配置為當Master與Slave失去聯絡時,讓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 :%s/6379/6380/g   最底下出現  表示修改成功, wq退出並儲存 用一樣的方式修改6381 的配置檔案 注意: 配置檔案在前面已經修改pidfile 引數,如果沒有修改一定要修改該引數為不同的值 通過配置檔案啟動3個Redis例項
如果看不到,就去看redis.log錯誤檔案 通過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)功能來實現高可用的架構 詳解看筆記http://note.youdao.com/noteshare?id=e7a7fb3506012f331c0c0aaa6ddee99c&sub=6DD42153CA0E407CBD51ABFC32B77769