1、原理redis
Redis的主從複製功能很是強大,一個master能夠擁有多個slave,而一個slave又能夠擁有多個slave,如此下去,造成了強大的多級服務器集羣架構。下面是關於redis主從複製的一些特色:數據庫
1.master能夠有多個slave。vim
2.除了多個slave連到相同的master外,slave也能夠鏈接其餘slave造成圖狀結構。緩存
3.主從複製不會阻塞master。也就是說當一個或多個slave與master進行初次同步數據時,master能夠繼續處理client發來的請求。相反slave在初次同步數據時則會阻塞不能處理client的請求。bash
4.主從複製能夠用來提升系統的可伸縮性,咱們能夠用多個slave 專門用於client的讀請求,好比sort操做可使用slave來處理。也能夠用來作簡單的數據冗餘。服務器
5.能夠在master禁用數據持久化,只須要註釋掉master 配置文件中的全部save配置,而後只在slave上配置數據持久化。架構
2、主從複製過程
app
當設置好slave服務器後,slave會創建和master的鏈接,而後發送sync命令。不管是第一次同步創建的鏈接仍是鏈接斷開後的從新連 接,master都會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存起來。後臺進程完成寫文件 後,master就發送文件給slave,slave將文件保存到磁盤上,而後加載到內存恢復數據庫快照到slave上。接着master就會把緩存的命 令轉發給slave。並且後續master收到的寫命令都會經過開始創建的鏈接發送給slave。從master到slave的同步數據的命令和從 client發送的命令使用相同的協議格式。當master和slave的鏈接斷開時slave能夠自動從新創建鏈接。若是master同時收到多個 slave發來的同步鏈接命令,只會使用啓動一個進程來寫數據庫鏡像,而後發送給全部slave。ide
3、配置與應用lua
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,所以從節點處於只讀狀態,沒法對數據庫進行操做和更改.