標籤:redis主從 sentinel
一、什麼是redis主從複製?
主從複製,當使用者往Master端寫入資料時,通過Redis Sync機制將資料檔案發送至Slave,Slave也會執行相同的操作確保資料一致;且實現Redis的主從複製非常簡單。
二、redis主從複製特點
1、同一個Master可以擁有多個Slaves。
2、Master下的Slave還可以接受同一架構中其它slave的連結與同步請求,實現資料的級聯複製,即Master->Slave->Slave模式;
3、Master以非阻塞的方式同步資料至slave,這將意味著Master會繼續處理一個或多個slave的讀寫請求;
4、Slave端同步資料也可以修改為非阻塞是的方式,當slave在執行新的同步時,它仍可以用舊的資料資訊來提供查詢;否則,當slave與master失去聯絡時,slave會返回一個錯誤給用戶端;
5、主從複製具有可擴充性,即多個slave專門提供唯讀查詢與資料的冗餘,Master端專門提供寫操作;
6、通過配置禁用Master資料持久化機制,將其資料持久化操作交給Slaves完成,避免在Master中要有獨立的進程來完成此操作。
三、redis主從複製原理
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/38/6A/wKiom1Ozz5OThc6NAAGUIzDDlQs366.jpg" title="13.png" alt="wKiom1Ozz5OThc6NAAGUIzDDlQs366.jpg" width="650" style="padding:0px;margin:0px;vertical-align:top;border:none;" /> 當啟動一個Slave進程後,它會向Master發送一個SYNC Command,請求同步串連。無論是第一次串連還是重新串連,Master都會啟動一個後台進程,將資料快照儲存到資料檔案中,同時Master會記錄所有修改資料的命令並緩衝在資料檔案中。後台進程完成快取作業後,Master就發送資料檔案給Slave,Slave端將資料檔案儲存到硬碟上,然後將其在載入到記憶體中,接著Master就會所有修改資料的操作,將其發送給Slave端。若Slave出現故障導致宕機,恢複正常後會自動重新串連,Master收到Slave的串連後,將其完整的資料檔案發送給Slave,如果Mater同時收到多個Slave發來的同步請求,Master只會在後台啟動一個進程儲存資料檔案,然後將其發送給所有的Slave,確保Slave正常。
四、配置過程
Jemalloc安裝
#yum install -y tcl gcc gcc-c++ make bzip2
#wgethttp://www.canonware.com/download/jemalloc/jemalloc-4.2.0.tar.bz2
#tar -xjf jemalloc-4.2.0.tar.bz2
#cd jemalloc-4.2.0
#./configure --prefix=/usr/local/jemalloc --libdir=/usr/local/lib
#make && make install
#make clean
#echo "/usr/local/lib" >/etc/ld.so.conf.d/usr_local_lib.conf
#/sbin/ldconfig
Redis安裝
#cd ../
#wget http://download.redis.io/releases/redis-3.2.0.tar.gz
#cd redis-3.2.0
#make MALLOC=jemalloc
#make install
#cd utils/
#./install_server.sh
安裝配置和資料路徑可以定義:
Selected config:
Port :6379
Config file : /etc/redis/6379.conf
Log file :/var/log/redis_6379.log
Data dir : /data/redis
Executable : /usr/local/bin/redis-server
Cli Executable : /usr/local/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf =>/etc/init.d/redis_6379
Redis設定記憶體大小
開啟redis設定檔
#vim /etc/redis/6379.conf
增加如下兩行
maxmemory 12g
maxmemory-policy volatile-lru
第一行:Redis設定最大佔用記憶體,一般推薦Redis設定記憶體為最大實體記憶體的四分之三。
第二行:如果設定了maxmemory,一般都要設定到期策略。
Redis有六種到期策略:
1、volatile-lru -> 根據LRU演算法產生的到期時間來刪除。
2、allkeys-lru -> 根據LRU演算法刪除任何key。
3、volatile-random-> 根據到期設定來隨機刪除key。
4、allkeys->random-> 無差別隨機刪。
5、volatile-ttl -> 根據最近到期時間來刪除(輔以TTL)
6、noeviction -> 誰也不刪,直接在寫操作時返回錯誤。
配置完成重啟redis
查看配置是否生效
#redis-cli info
主從:
192.168.1.76 主
192.168.1.77 從
兩台分別安裝redis
安裝好之後,在從192.168.1.77的redis設定檔修改bind並增加一行參數
#vim /etc/redis/6379.conf
bind 0.0.0.0
slaveof 192.168.1.76 6379
啟動兩台redis
在主192.168.1.76執行
#redis-cli
>set name ceshi
>get name
在從192.168.1.77執行
#redis-cli
>get name
如果可以get到ceshi,代表主從成功
Sentinel哨兵:
在其中一台redis上或者隨便找一台伺服器安裝,如果只安裝一個sentinel並要安裝在redis伺服器上,建議在從上搭建sentinel,這樣保證了主宕機之後不會影響主從切換,從宕機不會影響主的運行
#vim /etc/redis/sentinel.conf
port 26379
daemonize yes
sentinel monitor mymaster 192.168.1.76 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 900000
logfile "/var/log/sentinel.log"
注釋:
第一行:指定sentinel連接埠號碼
第二行:指定sentinel為後台啟動
第三行:指定sentinel去監視一個名為mymaster的Master,Master的IP地址為192.168.1.76,
連接埠為6379,最後的1表示當有1個Sentinel檢測到Master異常時會判定其失效,如果為2,即只有當2個Sentinel都判定Master失效了才會自動遷移,如果Sentinel的數量不達標,則不會執行自動故障遷移。
第四行:指定Sentinel判定Master斷線的時間。(單位為毫秒,判定為主觀下線SDOWN)
第五行:指定在執行容錯移轉時,最多可以有多少個Slave同時對新的Master進行同步。這個數字設定為1,雖然完成容錯移轉所需的時間會變長,但是可以保證每次只有1個Slave處於不能處理命令請求的狀態。
第六行:如果在該時間(ms)內未能完成failover(即故障時master/slave自動切換
)操作,則認為該failover失敗。
第七行:指定Sentinel記錄檔。
啟動
#redis-sentinel /etc/redis/sentinel.conf
測試:
使用如下命令查看
#redis-cli -h 192.168.1.76 -p 6379 info
將主192.168.1.76的redis停掉,會發現從192.168.1.77切換為主了
將主192.168.1.76的redis啟動,會發現自動添加為從伺服器了
Redis資料移轉
1、在舊redis執行redis-clisave將資料儲存到磁碟檔案dump.rdb
2、停止新redis
3、將舊的redis儲存後的磁碟檔案dump.rdb拷貝到新的redis資料目錄下
4、啟動新的redis
Redis主從、sentinel故障自動切換