主從模式介紹
Redis雖然讀取寫入的速度都特別快,但是也會產生讀壓力特別大的情況。為了分擔讀壓力,Redis支持主從復制,Redis的主從結構可以采用一主多從或者級聯結構,Redis主從復制可以根據是否是全量分為全量同步和增量同步。下圖為級聯結構。
主從同步過程
Redis全量復制一般發生在Slave初始化階段,這時Slave需要將Master上的所有數據都復制一份。具體步驟如下:
- 從服務器連接主服務器,發送SYNC命令;
- 主服務器接收到SYNC命名后,開始執行BGSAVE命令生成RDB文件並使用緩沖區記錄此后執行的所有寫命令;
- 主服務器BGSAVE執行完后,向所有從服務器發送快照文件,並在發送期間繼續記錄被執行的寫命令;
- 從服務器收到快照文件后丟棄所有舊數據,載入收到的快照;
- 主服務器快照發送完畢后開始向從服務器發送緩沖區中的寫命令;
- 從服務器完成對快照的載入,開始接收命令請求,並執行來自主服務器緩沖區的寫命令;
主從模式搭建
本例采用單例的1主2從的搭建方式。
服務類型 | 角色 | IP地址 | 端口 |
---|---|---|---|
Redis | master | 127.0.0.1 | 17007 |
Redis | slave | 127.0.0.1 | 17008 |
Redis | slave | 127.0.0.1 | 17009 |
1、首先准備一個redis實例,參考【Redis】安裝及簡單使用
2、准備一份主配置文件,端口是17007
1 # 包含文件(redis-base.conf,文件從redis安裝目錄中拷貝的) 2 include /data/soft/redis-sentinel/redis-base.conf 3 4 # 將redis-base.conf文件中,bind注釋,需要在外網訪問,將protected-model改為no 5 protected-mode no
6 7 # 端口 8 port 17007 9 10 # 后台運行 11 daemonize yes 12 13 # pid文件 14 pidfile redis_17007.pid 15 16 # 日志文件 17 logfile "/data/log/redis-sentinel-log/redis-17007-log/redis-17007.log" 18 19 # 主認證密碼 20 masterauth 123456 21 22 # 認證密碼 23 requirepass 123456 24 25 # 最大內存10M,一般為機器內存的3/4 26 maxmemory 10mb 27 28 # 內存達到最大時策略,可選擇其他策略 29 maxmemory-policy volatile-lru 30 31 # 目錄 32 dir /data/soft/redis-sentinel/redis-17007/ 33 34 # 快照文件 35 dbfilename dump-17007.rdb
3、准備一份從配置文件,端口是17008,17009,在主配置文件的基礎上,修改相應配置,並加上以下2行
1 # 從節點要跟隨的主節點 2 slaveof 192.168.0.3 17007 3 4 # 主節點認證密碼,如果設置了密碼,就要設置 5 masterauth 123456
4、目錄結構如圖:
5、先啟動主節點,然后啟動從節點
主節點啟動命令:redis-5.0.5/src/redis-server redis-17007/redis-17007.conf
從節點啟動命令:redis-5.0.5/src/redis-server redis-17008/redis-17008.conf
6、redis客戶端鏈接主節點,查看信息
命令:redis-5.0.5/src/redis-cli -c -h 192.168.0.3 -p 17007 -a 123456
主節點信息:
1 192.168.0.3:17007> INFO Replication 2 # Replication 3 role:master 4 connected_slaves:2 5 slave0:ip=192.168.0.3,port=17008,state=online,offset=1373,lag=0 6 slave1:ip=192.168.0.3,port=17009,state=online,offset=1373,lag=1 7 master_replid:535c43ecbf009f8eae1930d52c2fc6149432b5ee 8 master_replid2:0000000000000000000000000000000000000000 9 master_repl_offset:1373 10 second_repl_offset:-1 11 repl_backlog_active:1 12 repl_backlog_size:1048576 13 repl_backlog_first_byte_offset:1 14 repl_backlog_histlen:1373
從節點信息:
1 192.168.0.3:17008> INFO Replication 2 # Replication 3 role:slave 4 master_host:192.168.0.3 5 master_port:17007 6 master_link_status:up 7 master_last_io_seconds_ago:5 8 master_sync_in_progress:0 9 slave_repl_offset:1261 10 slave_priority:100 11 slave_read_only:1 12 connected_slaves:0 13 master_replid:535c43ecbf009f8eae1930d52c2fc6149432b5ee 14 master_replid2:0000000000000000000000000000000000000000 15 master_repl_offset:1261 16 second_repl_offset:-1 17 repl_backlog_active:1 18 repl_backlog_size:1048576 19 repl_backlog_first_byte_offset:1 20 repl_backlog_histlen:1261
7、測試,在主節點存入緩存,在從節點取出緩存
1 192.168.0.3:17007> set foo bar 2 OK 3 192.168.0.3:17007> get foo 4 "bar" 5 192.168.0.3:17008> get foo 6 "bar" 7 192.168.0.3:17009> get foo 8 "bar"