一、原理
Redis的主從複製功能非常強大,一個master可以擁有多個slave,而一個slave又可以擁有多個slave,如此下去,形成了強大的多級服務器集羣架構。下面是關於redis主從複製的一些特點:
1.master可以有多個slave。
2.除了多個slave連到相同的master外,slave也可以連接其他slave形成圖狀結構。
3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步數據時,master可以繼續處理client發來的請求。相反slave在初次同步數據時則會阻塞不能處理client的請求。
4.主從複製可以用來提高系統的可伸縮性,我們可以用多個slave 專門用於client的讀請求,比如sort操作可以使用slave來處理。也可以用來做簡單的數據冗餘。
5.可以在master禁用數據持久化,只需要註釋掉master 配置文件中的所有save配置,然後只在slave上配置數據持久化。
二、主從複製過程
當設置好slave服務器後,slave會建立和master的連接,然後發送sync命令。無論是第一次同步建立的連接還是連接斷開後的重新連 接,master都會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存起來。後臺進程完成寫文件 後,master就發送文件給slave,slave將文件保存到磁盤上,然後加載到內存恢復數據庫快照到slave上。接着master就會把緩存的命 令轉發給slave。而且後續master收到的寫命令都會通過開始建立的連接發送給slave。從master到slave的同步數據的命令和從 client發送的命令使用相同的協議格式。當master和slave的連接斷開時slave可以自動重新建立連接。如果master同時收到多個 slave發來的同步連接命令,只會使用啓動一個進程來寫數據庫鏡像,然後發送給所有slave。
三、配置與應用
1)redis安裝
(1)下載redis
# wget http://download.redis.io/releases/redis-3.0.7.tar.gz
(2)解壓安裝
# tar zxvf redis-3.0.7.tar.gz # cd redis-3.0.7 # make PREFIX=/data/server/redis install
(3)配置redis
①:創建redis配置文件目錄並拷貝配置文件至此目錄
# mkdir -p /data/server/redis/etc # cp redis.conf /data/server/redis/etc
②:設置redis運行方式爲後臺運行
# sed -i 's/daemonize no/daemonize yes/g' /data/server/redis/etc/redis.conf
③:下載redis init 啓動文件至 init.d 目錄下,並賦予權限.
# wget -c http://soft.vpser.net/lnmp/ext/init.d.redis -O /etc/init.d/redis # chmod 755 /etc/init.d/redis
④:創建redis日誌目錄及日誌存放文件
# mkdir /data/server/redis/logs # touch /data/server/redis/logs/redis.log
⑤:創建pid目錄與數據存儲目錄
# mkdir /data/server/redis/run # mkdir /data/server/redis/db
⑥:修改 vim /etc/init.d/redis 啓動文件中文件path
2)redis主從同步配置
(1)Master服務器端:
# grep -v '^#' redis.conf |grep -v '^$' daemonize yes pidfile /data/server/redis/run/redis.pid #定義端口 port 1234 #綁定IP bind 10.10.10.2 timeout 300 loglevel notice #指定日誌目錄 logfile /data/server/redis/logs/redis.log databases 16 #配置持久化(rdb模式) save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes #定義數據文件和目錄 dbfilename master.rdb dir /data/server/redis/db slave-serve-stale-data yes slave-read-only yes slave-priority 100 appendonly no appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb60 client-output-buffer-limit pubsub 32mb 8mb 60
(2)slave服務器端
# grep -v '^#' redis.conf |grep -v '^$' daemonize yes pidfile /data/server/redis/run/redis.pid port 1234 bind 10.10.10.3 timeout 300 loglevel notice logfile /data/server/redis/logs/redis.log databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes rdbchecksum yes dbfilename slave.rdb dir /data/server/redis/db slaveof 10.10.10.2 1234 #指定master的地址 slave-serve-stale-data yes slave-read-only yes slave-priority 100 appendonly no appendfsync everysec no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-entries 512 list-max-ziplist-value 64 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb60 client-output-buffer-limit pubsub 32mb 8mb 60
(3)啓動redis服務
Master:
# /data/server/redis/bin/redis-server /data/server/redis/etc/redis.conf # tail -fn100 /data/server/redis/logs/redis.log //檢查日誌是否有報錯
Slave:
# /data/server/redis/bin/redis-server /data/server/redis/etc/redis.conf # tail -fn100 /data/server/redis/logs/redis.log //檢查日誌是否有報錯
(4)檢查redis主從同步
master:
redis-m > set data zhangsan redis-m > get data
slave:
redis-s > get data
注:由於在配置文件中配置了slave-read-only yes,因此從節點處於只讀狀態,無法對數據庫進行操作和更改.