redis主從同步與讀寫分離

一、原理

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,因此從節點處於只讀狀態,無法對數據庫進行操作和更改.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章