cluster例項運用

igcllq發表於2020-10-25

RDB和AOF的優缺點


RDB
優點:
1、RDB快照儲存了某個時間點的資料,可以通過指令碼執行redis指令bgsave(非阻塞,後臺執行)或者
save(會阻塞寫操作,不推薦)命令自定義時間點備份,可以保留多個備份,當出現問題可以恢復到不
同時間點的版本,很適合備份,並且此檔案格式也支援有不少第三方工具可以進行後續的資料分析
比如: 可以在最近的24小時內,每小時備份一次RDB檔案,並且在每個月的每一天,也備份一個

2、ROB檔案。這樣的話,即使遇上問題,也可以隨時將資料集還原到不同的版本。
RDB可以最大化Redis的效能,父程式在儲存 RDB檔案時唯一要做的就是fork出一個子程式,然後
這個子程式就會處理接下來的所有儲存工作,父程式無須執行任何磁碟工/0操作。

3、RDB在大量資料,比如幾個G的資料,恢復的速度比AOF的快

缺點:
1、不能實時儲存資料,可能會丟失自上一次執行RDB備份到當前的記憶體資料如果你需要儘量避免在伺服器故障時丟失資料,那麼RDB不適合你。雖然Redis允許你設定不同的儲存點(save point)來控制儲存RDB檔案的頻率,但是,因為ROB檔案需要儲存整個資料集的狀態,所以它並不是一個輕鬆的操作。因此你可能會至少5分鐘才儲存一次RDB檔案。在這種情況下,一旦發生故障停機,你就可能會丟失好幾分鐘的資料。

2、當資料量非常大的時候,從父程式fork子程式進行儲存至RDB檔案時需要一點時間,可能是毫秒或
者秒,取決於磁碟IO效能在資料集比較龐大時,fork()可能會非常耗時,造成伺服器在一定時間內停止處理客戶端﹔如果資料集非常巨大,並且CPU時間非常緊張的話,那麼這種停止時間甚至可能會長達整整一秒或更久。雖然 AOF重寫也需要進行fork(),但無論AOF重寫的執行間隔有多長,資料的永續性都不會有任何損失。

AOF
優點:
1、資料安全性相對較高,根據所使用的fsync策略(fsync是同步記憶體中redis所有已經修改的檔案到存
儲裝置),預設是appendfsync everysec,即每秒執行一次 fsync,在這種配置下,Redis 仍然可以
保持良好的效能,並且就算髮生故障停機,也最多隻會丟失一秒鐘的資料( fsync會在後臺執行緒執
行,所以主執行緒可以繼續努力地處理命令請求)

2、由於該機制對日誌檔案的寫入操作採用的是append模式,因此在寫入過程中不需要seek, 即使出
現當機現象,也不會破壞日誌檔案中已經存在的內容。然而如果本次操作只是寫入了一半資料就出
現了系統崩潰問題,不用擔心,在Redis下一次啟動之前,可以通過 redis-check-aof 工具來解決
資料一致性的問題

3、Redis可以在 AOF檔案體積變得過大時,自動地在後臺對AOF進行重寫,重寫後的新AOF檔案包含了
恢復當前資料集所需的最小命令集合。整個重寫操作是絕對安全的,因為Redis在建立新 AOF檔案
的過程中,append模式不斷的將修改資料追加到現有的 AOF檔案裡面,即使重寫過程中發生停
機,現有的 AOF檔案也不會丟失。而一旦新AOF檔案建立完畢,Redis就會從舊AOF檔案切換到新
AOF檔案,並開始對新AOF檔案進行追加操作。

4、AOF包含一個格式清晰、易於理解的日誌檔案用於記錄所有的修改操作。事實上,也可以通過該文
件完成資料的重建
AOF檔案有序地儲存了對資料庫執行的所有寫入操作,這些寫入操作以Redis協議的格式儲存,因
此 AOF檔案的內容非常容易被人讀懂,對檔案進行分析(parse)也很輕鬆。匯出(export)AOF檔案
也非常簡單:舉個例子,如果你不小心執行了FLUSHALL.命令,但只要AOF檔案未被重寫,那麼只
要停止伺服器,移除 AOF檔案末尾的FLUSHAL命令,並重啟Redis ,就可以將資料集恢復到
FLUSHALL執行之前的狀態。

缺點:
1、即使有些操作是重複的也會全部記錄,AOF 的檔案大小要大於 RDB 格式的檔案

2、AOF 在恢復大資料集時的速度比 RDB 的恢復速度要慢

3、根據fsync策略不同,AOF速度可能會慢於RDB

4、bug 出現的可能性更多


master和slave同步過程


redis主從同步
實驗準備三臺主機
10.0.0.7
10.0.0.17
10.0.0.27

實驗可以不用設定(生產環境一定要設定,密碼要相同)
檢視三臺主機狀態(一樣的)

127.0.0.1:6379> replication
(error) ERR unknown command 'replication'
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

配置檔案(密碼也可以再配置檔案修改)
修改

bind 0.0.0.0
從節點修改(修改為master節點ip 加埠號:wq)
centos7
slaveof <masterip> <masterport>

centos8
replcaof <masterip> <masterport>

masterauth <master-password> #修改密碼的

啟動三臺主機的redis,再master節點(10.0.0.7)建立一個key在slave節點檢視

10.0.0.7:6379> set key1 master
OK
10.0.0.7:6379> 

10.0.0.17:6379> get key1
"master"
10.0.0.17:6379> 

哨兵的使用和實現機制

Sentinel 程式是用於監控redis叢集中Master主伺服器工作的狀態,在Master主伺服器發生故障的時
候,可以實現Master和Slave伺服器的切換,保證系統的高可用,

哨兵(Sentinel) 是一個分散式系統,可以在一個架構中執行多個哨兵(sentinel) 程式,這些程式使用流言
協議(gossip protocols)來接收關於Master主伺服器是否下線的資訊,並使用投票協議(Agreement
Protocols)來決定是否執行自動故障遷移,以及選擇哪個Slave作為新的Master

哨兵前提是建立主從
配置哨兵檔案
檢視檔案下的配置

grep -vE "^#|^$" /etc/redis-sentinel.conf


port 26379
daemonize no
pidfile "/var/run/redis-sentinel.pid"
logfile "/var/log/redis/sentinel.log"
dir "/tmp"
sentinel monitor mymaster 10.0.0.8 6379 2   #修改此行
sentinel auth-pass mymaster 123456 #增加此行
sentinel down-after-milliseconds mymaster 3000   #修改此行
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

#自動生成不需要建立
sentinel myid 50547f34ed71fd48c197924969937e738a39975b  #此行每個哨兵主機自動生成,且必須唯

把配置好的檔案發給其餘兩個slave主機

scp /etc/redis-sentinel.conf 10.0.0.18:/etc/
scp /etc/redis-sentinel.conf 10.0.0.28:/etc/

啟動哨兵

[root@redis-master ~]#systemctl enable --now redis-sentinel.service
[root@redis-slave1 ~]#systemctl enable --now redis-sentinel.service
[root@redis-slave2 ~]#systemctl enable --now redis-sentinel.service

編譯安裝可以在所有哨兵伺服器執行下面操作啟動哨兵

#vim /apps/redis/etc/sentinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-sentinel.pid"
Logfile "sentinel_26379.log"
dir "/apps/redis/data"
sentinel monitor mymaster 10.0.0.8 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 15000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes

#/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf

驗證哨兵埠

[root@master ~]# ss -ntl
State                          Recv-Q                          Send-Q                                                    Local Address:Port                                                     Peer Address:Port                          
LISTEN                         0                               128                                                             0.0.0.0:6379                                                          0.0.0.0:*                             
LISTEN                         0                               128                                                             0.0.0.0:26379                                                         0.0.0.0:*                             
LISTEN                         0                               128                                                             0.0.0.0:22                                                            0.0.0.0:*                             
LISTEN                         0                               128                                                                [::]:26379                                                            [::]:*                             
LISTEN                         0                               128                                                                [::]:22                                                               [::]:*                             

驗證時候成功
停止master節點,master自動轉移到其他slave節點

[root@master ~]# redis-cli -h 10.0.0.18
10.0.0.18:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.28,port=6379,state=online,offset=460072,lag=1
slave1:ip=10.0.0.8,port=6379,state=online,offset=460072,lag=1
master_replid:7d337f59b297cebee92d682a49911eddd6979f82
master_replid2:758cca9443d71103241bd51236d4066c7aa3c234
master_repl_offset:460205
second_repl_offset:236496
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:460205

[root@master ~]# killall redis-server

10.0.0.8:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.28,port=6379,state=online,offset=548703,lag=1
master_replid:252b4cde6c43a4c0a8967f3fd7510219696cee9b
master_replid2:7d337f59b297cebee92d682a49911eddd6979f82
master_repl_offset:548835
second_repl_offset:533558
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:297314
repl_backlog_histlen:251522
10.0.0.8:6379> 

redis cluster叢集建立和使用


環境:
centos8
準備6臺主機
10.0.0.8
10.0.0.18
10.0.0.28
10.0.0.38
10.0.0.48
10.0.0.58

在六個節點安裝cluster並且配置檔案

yum -y install redis

sed -i.bak -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e '/masterauth/a masterauth 123456' -e '/# requirepass/a requirepass 123456' -e '/# cluster-enabled yes/a cluster-enabled yes' -e '/# cluster-config-file nodes- 6379.conf/a cluster-config-file nodes-6379.conf' -e '/cluster-require-full coverage yes/c cluster-require-full-coverage no' /etc/redis.conf

重啟
systemctl enable --now redis

在任意一個節點meet與各個節點進行通訊

redis-cli -h 10.0.0.8 -a --no-auth-warning cluster meet 10.0.0.18 6379
redis-cli -h 10.0.0.8 -a --no-auth-warning cluster meet 10.0.0.28 6379
redis-cli -h 10.0.0.8 -a --no-auth-warning cluster meet 10.0.0.38 6379
redis-cli -h 10.0.0.8 -a --no-auth-warning cluster meet 10.0.0.48 6379
redis-cli -h 10.0.0.8 -a --no-auth-warning cluster meet 10.0.0.58 6379

檢視所有節點之間可以相互連線通訊(這是完成後的樣子)

[root@CentOS8 ~]# redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning cluster nodes
bb30f71d89d32b17f8ce6eaeecd8a7c42cab6217 10.0.0.58:6379@16379 slave a7aac8b92a426fd7349fb27b5592f217eeb76207 0 1603622704000 5 connected
a7aac8b92a426fd7349fb27b5592f217eeb76207 10.0.0.28:6379@16379 master - 0 1603622702000 5 connected 10923-16383
3ea3c7f47b9aa1320b1267b4fc441f9ee7dc08ea 10.0.0.18:6379@16379 myself,master - 0 1603622703000 2 connected 5462-10922
0ddd2cf81b2f4a20e9333d7a03f8627e65b9bdfc 10.0.0.8:6379@16379 master - 0 1603622704476 1 connected 0-5461
63771e87fff03ac56a5431c117d0684102e25da5 10.0.0.48:6379@16379 slave 3ea3c7f47b9aa1320b1267b4fc441f9ee7dc08ea 0 1603622702000 4 connected
3e4feff12354c90dd29539ad133059a1afc1f324 10.0.0.38:6379@16379 slave 0ddd2cf81b2f4a20e9333d7a03f8627e65b9bdfc 0 1603622705484 3 connected

為各個節點建立分配指派槽位範圍
建立指令碼分配

vi redis.sh

#!/bin/bash
host=$1
port=$2
start=$3
end=$4
pass=123456
for slot in `seq ${start} ${end}`;do
        echo slot:$slot
        redis-cli -h ${host} -p $port -a ${pass} --no-auth-warning cluster addslots ${slot}
done

分配槽位(共16364/3=5,461.333333333333,平均每個master分配5461個槽位)

bash redis.sh 10.0.0.8 6379 0 5461
bash redis.sh 10.0.0.18 6379 5462 10922
bash redis.sh 10.0.0.28 6379 10923 16383

檢視master分配完槽位後的資訊

[root@CentOS8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:10286
cluster_stats_messages_pong_sent:10736
cluster_stats_messages_meet_sent:12
cluster_stats_messages_sent:21034
cluster_stats_messages_ping_received:10734
cluster_stats_messages_pong_received:10298
cluster_stats_messages_meet_received:2
cluster_stats_messages_received:21034

檢視master分配完槽位後的資訊

[root@CentOS8 ~]# redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning cluster nodes
bb30f71d89d32b17f8ce6eaeecd8a7c42cab6217 10.0.0.58:6379@16379 slave a7aac8b92a426fd7349fb27b5592f217eeb76207 0 1603622704000 5 connected
a7aac8b92a426fd7349fb27b5592f217eeb76207 10.0.0.28:6379@16379 master - 0 1603622702000 5 connected 10923-16383
3ea3c7f47b9aa1320b1267b4fc441f9ee7dc08ea 10.0.0.18:6379@16379 myself,master - 0 1603622703000 2 connected 5462-10922
0ddd2cf81b2f4a20e9333d7a03f8627e65b9bdfc 10.0.0.8:6379@16379 master - 0 1603622704476 1 connected 0-5461
63771e87fff03ac56a5431c117d0684102e25da5 10.0.0.48:6379@16379 slave 3ea3c7f47b9aa1320b1267b4fc441f9ee7dc08ea 0 1603622702000 4 connected
3e4feff12354c90dd29539ad133059a1afc1f324 10.0.0.38:6379@16379 slave 0ddd2cf81b2f4a20e9333d7a03f8627e65b9bdfc 0 1603622705484 3 connected

指定主從關係
通過上面cluster nodes 檢視master的ID資訊,執行下面操作,將對應的slave 指定相應的master節點,實現三對主從節點

redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning cluster nodes 可以檢視id
#3e4feff12354c90dd29539ad133059a1afc1f324 為10.0.0.38的id
redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster replicate 3e4feff12354c90dd29539ad133059a1afc1f324
redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning cluster replicate 63771e87fff03ac56a5431c117d0684102e25da5
redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster replicate bb30f71d89d32b17f8ce6eaeecd8a7c42cab6217

檢視關係

[root@CentOS8 ~]# redis-cli -h 10.0.0.8 -a 123456 --no-auth-warning cluster slots
1) 1) (integer) 0
   2) (integer) 5461
   3) 1) "10.0.0.8"
      2) (integer) 6379
      3) "0ddd2cf81b2f4a20e9333d7a03f8627e65b9bdfc"
   4) 1) "10.0.0.38"
      2) (integer) 6379
      3) "3e4feff12354c90dd29539ad133059a1afc1f324"
2) 1) (integer) 5462
   2) (integer) 10922
   3) 1) "10.0.0.18"
      2) (integer) 6379
      3) "3ea3c7f47b9aa1320b1267b4fc441f9ee7dc08ea"
   4) 1) "10.0.0.48"
      2) (integer) 6379
      3) "63771e87fff03ac56a5431c117d0684102e25da5"
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "10.0.0.28"
      2) (integer) 6379
      3) "a7aac8b92a426fd7349fb27b5592f217eeb76207"
   4) 1) "10.0.0.58"
      2) (integer) 6379
      3) "bb30f71d89d32b17f8ce6eaeecd8a7c42cab6217"

驗證(在18建立的key)#-c 表示以叢集方式連線

[root@centos8 ~]# redis-cli -h 10.0.0.18 -a 123456 --no-auth-warning  get name
"zhao"
[root@centos8 ~]# redis-cli -h 10.0.0.48 -c -a 123456 --no-auth-warning get name 
"zhao"

相關文章