redis主從配置
阿新 • • 發佈:2020-12-02
主從簡介
1、主從 – 用法
- 像MySQL一樣,redis是支援主從同步的,而且也支援一主多從以及多級從結構。
- 主從結構,一是為了純粹的冗餘備份,二是為了提升讀效能,比如很消耗效能的SORT就可以由從伺服器來承擔。
- redis的主從同步是非同步進行的,這意味著主從同步不會影響主邏輯,也不會降低redis的處理效能。
- **主從架構中,可以考慮關閉主伺服器的資料持久化功能,只讓從伺服器進行持久化,這樣可以提高主伺服器的處理效能。
2、主從同步原理
主從 – 同步原理 從伺服器會向主伺服器發出SYNC指令,當主伺服器接到此命令後,就會呼叫BGSAVE指令來建立一個子程序專門進行資料持久化工作,也就是將主伺服器的資料寫入RDB檔案中。在資料持久化期間,主伺服器將執行的寫指令都快取在記憶體中。 在BGSAVE指令執行完成後,主伺服器會將持久化好的RDB檔案傳送給從伺服器,從伺服器接到此檔案後會將其儲存到磁碟上,然後再將其讀取到記憶體中。這個動作完成後,主伺服器會將這段時間快取的寫指令再以redis協議的格式傳送給從伺服器。 另外,要說的一點是,即使有多個從伺服器同時發來SYNC指令,主伺服器也只會執行一次BGSAVE,然後把持久化好的RDB檔案發給多個從伺服器。 而在2.8版本之後,redis支援了效率更高的增量同步策略,這大大降低了連線斷開的恢復成本。主伺服器會在記憶體中維護一個緩衝區,緩衝區中儲存著將要發給從伺服器的內容。從伺服器在與主伺服器出現網路瞬斷之後,從伺服器會嘗試再次與主伺服器連線,一旦連線成功,主伺服器就會向從伺服器傳送增量內容。 增量同步功能,需要伺服器端支援全新的PSYNC指令。這個指令,只有在redis-2.8之後才具有。
瞭解
BGSAVE指令: 在後臺非同步(Asynchronously)儲存當前資料庫的資料到磁碟。 BGSAVE 命令執行之後立即返回 OK ,然後 Redis fork 出一個新子程序,原來的 Redis 程序(父程序)繼續處理客戶端請求,而子程序則負責將資料儲存到磁碟,然後退出。
3、部署三臺機器redis---主從同步
redis-master----192.168.246.202 redis-slave-1-----192.168.246.203 redis-slave-2-----192.168.246.204 1.首先三臺伺服器將redis部署完成。 2.編輯master的redis配置檔案: [root@redis-master ~]# cd /data/application/redis/ [root@redis-master redis]# vim redis.conf
關閉protected-mode模式,此時外部網路可以直接訪問
開啟protected-mode保護模式,需配置bind ip或者設定訪問密碼
3.啟動主節點redis服務 [root@redis-master src]# cd /data/application/redis/src [root@redis-master src]# ./redis-server ../redis.conf & 會載入此檔案中的配置資訊
4.修改slave1的配置檔案: [root@redis-slave-1 ~]# cd /data/application/redis/ [root@redis-slave-1 redis]# vim redis.conf ---修改如下:
7.啟動從節點2的redis服務 [root@ansible-web2 ~]# cd /data/application/redis/src/ [root@ansible-web2 src]# ./redis-server ../redis.conf &
或者,配置到了系統管理工具裡面直接可以以下操作 8.重啟三臺redis [root@redis-master redis]# systemctl restart redis.service [root@redis-slave-1 ~]# systemctl restart redis.service [root@redis-slave-2 ~]# systemctl restart redis.service
9.測試主從 1.在master上面執行 [root@redis-master redis]# cd src/ [root@redis-master src]# ./redis-cli 127.0.0.1:6379> INFO replication # Replication role:master connected_slaves:2 slave0:ip=192.168.154.132,port=6379,state=online,offset=238,lag=1 slave1:ip=192.168.154.130,port=6379,state=online,offset=238,lag=1 master_replid:bffa4e61b5570d9c97e9ce8918bdb81bd55f7ed4 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:238 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:238 127.0.0.1:6379> ping PONG 127.0.0.1:6379> set name jack OK 127.0.0.1:6379> get name "jack" 127.0.0.1:6379> 2.分別在slave-1和slave-2上面執行: [root@redis-slave-1 redis]# cd src/ [root@redis-slave-1 src]# ./redis-cli [root@redis-slave-1 redis]# src/redis-cli 127.0.0.1:6379> INFO replication # Replication role:slave master_host:192.168.154.128 master_port:6379 master_link_status:up master_last_io_seconds_ago:10 master_sync_in_progress:0 slave_repl_offset:154 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:bffa4e61b5570d9c97e9ce8918bdb81bd55f7ed4 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:154 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:43 repl_backlog_histlen:112 127.0.0.1:6379> ping PONG 127.0.0.1:6379> get name "jack" 127.0.0.1:6379> [root@redis-slave-2 src]# ./redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> get name "jack" 127.0.0.1:6379> 檢視複製狀態 master執行: 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=192.168.246.203,port=6379,state=online,offset=490,lag=0 slave1:ip=192.168.246.204,port=6379,state=online,offset=490,lag=1 ============================================================================== slave上面執行: 127.0.0.1:6379> info replication # Replication role:slave master_host:192.168.246.202 master_port:6379 master_link_status:up