1. 程式人生 > 實用技巧 >Java程式設計:區域和檢索—陣列不可變(LeetCode:303)

Java程式設計:區域和檢索—陣列不可變(LeetCode:303)

主從簡介

1、主從 – 用法

  1. 像MySQL一樣,redis是支援主從同步的,而且也支援一主多從以及多級從結構。
  2. 主從結構,一是為了純粹的冗餘備份,二是為了提升讀效能,比如很消耗效能的SORT就可以由從伺服器來承擔。
  3. redis的主從同步是非同步進行的,這意味著主從同步不會影響主邏輯,也不會降低redis的處理效能。
  4. **主從架構中,可以考慮關閉主伺服器的資料持久化功能,只讓從伺服器進行持久化,這樣可以提高主伺服器的處理效能。

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

注意:從伺服器一般預設禁止寫入操作:slave-read-only yes

主從同步部署完成!