Redis進階:主從複製

Redis進階:主從複製

1簡介

1.1問題及需求

如下圖,當前的三個redis節點實例無法做到高可用,一旦有一臺redis服務器宕機之後,那麼緩存在這臺服務器上的數據就不能使用緩存來獲取,還會直接訪問數據庫,訪問請求達到一定數量就會產生雪崩。

對於當前的redis集羣架構,需要引入高可用的技術。

高可用架構引入主從複製和主從替換的技術,當某一個主節點宕機或通信不可達的時候,從節點自動頂替完成主節點的功能。架構結構如下圖:

1.2CAP理論

CAP理論(CAP theorem),又被稱作布魯爾定律(Brewer’s theorem),是分佈式集羣中的一個重要理論(面試題)。

  • C:consistency(一致性)
  • A:avalibility(可用性)
  • P:partition(分區)-tolenrence to partition(分區容忍度)

隨着數據量增長需求,業務的多元化,分佈式結構不可或缺。CAP理論是分佈式集羣中的基礎理論之一。

1.2.1分區

一個分佈式系統中,多個系統組成的網絡本來是互通的,但是可能因爲某種原因導致兩個或多個節點間的數據通信斷開,整個系統的整體被分割成了若干個區域的過程,叫做分佈式系統的分區(分區是常態)。一旦分區出現,數據的修改和查詢將受到影響,需要考慮數據一致性。

1.2.2一致性

數據在某個查看的時間點上保持整體一致。如果在數據修改時,對於查看數據的客戶端要求數據一致,則必須加鎖,實現整體一致性。在修改時,如果要求數據一致性,客戶端將在加鎖的時間段內不能訪問數據,會導致可用性的降低。

1.2.3可用性

客戶端的請求在一定時間段內都有迴應。

1.2.4分區容忍度

在分區出現的情況下,如果對數據的一致性要求較高,分區容忍度高。如果在分區出現的情況下,對數據的一致性要求低,分區容忍度低。

1.2.5CAP理論的結論

在分佈式集羣中,只可能同時滿足CAP理論中的2個條件

  • CA--無分區,數據一致性可達。
  • CP--數據一致性要求高的分區狀態。
  • AP--數據一致性要求低的分區狀態(不加鎖,可用性提高)。

分佈式集羣中的CAP理論可以理解爲:分區是常態,要求數據一致性會導致可以用性降低;可用性提高,數據一致性就會降低。

兩個CP 和 AP的現實場景:

  • 1.支付:需要第三方平臺的數據必須和銀行一致(支付寶,銀行)。
  • 2.搶票:前臺的訂單下發,但是後臺的數據庫數據未必立刻修改。

2主從複製結構

redis中可以提供主從複製的結構,master-slave,可以多級複製,如下圖:

根據企業的運維經驗:主從結構最多2級主從,每個主節點最多6個從節點,否則會導致主從結構不穩定。

3主從複製搭建步驟

3.1移動目錄

將redis主要的文件放入/usr/local/bin目錄下,這樣就可以在全局下使用redis的命令了,操作如下:

[root@lk7 bin]# cd /home/software/redis-6.2.6/src/
[root@lk7 src]# cp redis-server /usr/local/bin/
[root@lk7 src]# cp redis-cli /usr/local/bin/
[root@lk7 src]# cp redis-sentinel /usr/local/bin/
[root@lk7 src]# cp redis-check-aof /usr/local/bin/
[root@lk7 src]# cp redis-check-rdb /usr/local/bin/
[root@lk7 src]# cp redis-benchmark /usr/local/bin/
[root@lk7 src]# cd ..
[root@lk7 redis-6.2.6]# cp redis.conf /usr/local/bin/

3.2準備配置文件

準備主從節點的配置文件:複製redis.conf文件,並改名爲需要的文件名。

[root@lk7 redis-6.2.6]# cd /usr/local/bin/
[root@lk7 bin]# cp redis.conf masterslave01.conf
[root@lk7 bin]# cp redis.conf masterslave02.conf
[root@lk7 bin]# cp redis.conf masterslave03.conf
[root@lk7 bin]# ll
總用量 47176
-rw-r--r--. 1 root root   93738 2月   6 18:41 masterslave01.conf
-rw-r--r--. 1 root root   93738 2月   6 18:41 masterslave02.conf
-rw-r--r--. 1 root root   93738 2月   6 18:41 masterslave03.conf
-rwxr-xr-x. 1 root root 4830496 1月   2 14:10 redis-benchmark
-rwxr-xr-x. 1 root root 9521744 1月   2 14:09 redis-check-aof
-rwxr-xr-x. 1 root root 9521744 1月   2 14:09 redis-check-rdb
-rwxr-xr-x. 1 root root 5004832 1月   2 14:08 redis-cli
-rw-r--r--. 1 root root   93738 2月   6 18:39 redis.conf
-rwxr-xr-x. 1 root root 9521744 1月   2 14:08 redis-sentinel
-rwxr-xr-x. 1 root root 9521744 1月   2 14:08 redis-server

3.3編輯配置文件

配置文件需要修改的內容如下:

  • bind:註釋掉
  • port:分別將多個redis.conf文件中的端口修改成自己定義的端口號,這裏使用6381、6382、6383。
  • protected-mode no
  • daemonize yes
  • pid文件名稱根據端口修改。

例如:

  75 #bind 127.0.0.1 -::1

  94 protected-mode no

  98 port 6381

 257 daemonize yes

 289 pidfile /var/run/redis_6381.pid

另外兩個配置文件按照這個修改即可。

3.4啓動redis服務

分別啓動對應文件的redis服務,命令如下:

redis-server 文件名

啓動服務如下:

[root@lk7 bin]# redis-server masterslave01.conf 
[root@lk7 bin]# redis-server masterslave02.conf 
[root@lk7 bin]# redis-server masterslave03.conf 
[root@lk7 bin]# 

3.5查看狀態信息

首先進入redis客戶端,進入客戶端的命令如下:

# 查看幫助信息
redis-cli --help
# 使用端口登錄
redis-cli -p port

登錄操作如下:

[root@lk7 bin]# redis-cli -p 6381
127.0.0.1:6381> exit
[root@lk7 bin]# redis-cli -p 6382
127.0.0.1:6382> exit
[root@lk7 bin]# redis-cli -p 6383
127.0.0.1:6383> 

使用info命令查看當前客戶端信息,此命令查看的是所有信息。

想要單獨查看replication信息,可使用如下命令:

128.127.0.0.1:6383> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:399d90db2653e317cd69c504b326a870c2e1fb57
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

3.6配置主從結構

調用客戶端命令啓動一主兩從結構:

主從節點分配:

  • 主節點:6381。
  • 從節點:6382、6383。

主節點不需要配置,只需要配置從節點即可,在從節點客戶端執行如下命令:

slaveof host port(雲主機的主節點ip需要使用內網地址)

執行當前節點掛接的主節點ip和端口。

操作如下:

127.0.0.1:6383> slaveof 192.168.106.171 6381
OK
127.0.0.1:6383> exit
[root@lk7 bin]# redis-cli -p 6382
127.0.0.1:6382> slaveof 192.168.106.171 6381
OK
127.0.0.1:6382> 

3.7查看配置信息

掛接完成返回ok查看主節點和從節點的replication變化內容。

6381主節點內容:

[root@lk7 ~]# redis-cli -p 6381
127.0.0.1:6381> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.106.171,port=6382,state=online,offset=182,lag=0
slave1:ip=192.168.106.171,port=6383,state=online,offset=182,lag=0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:182
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:182
127.0.0.1:6381>

6382、6383從節點內容:

[root@lk7 bin]# redis-cli -p 6382
127.0.0.1:6382> slaveof 192.168.106.171 6381
OK
127.0.0.1:6382> info replication
# Replication
role:slave
master_host:192.168.106.171
master_port:6381
master_link_status:up
master_last_io_seconds_ago:10
master_sync_in_progress:0
slave_read_repl_offset:280
slave_repl_offset:280
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:280
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:280
127.0.0.1:6382>

[root@lk7 bin]# redis-cli -p 6383
127.0.0.1:6383> info replication
# Replication
role:slave
master_host:192.168.106.171
master_port:6381
master_link_status:up
master_last_io_seconds_ago:4
master_sync_in_progress:0
slave_read_repl_offset:126
slave_repl_offset:126
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:126
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:99
repl_backlog_histlen:28
127.0.0.1:6383> 

4主從複製測試

4.1同步數據測試

首先登錄主節點,然後進行如下測試:

[root@lk7 bin]# redis-cli -p 6381
127.0.0.1:6381> auth 123
OK
127.0.0.1:6381> keys *
(empty array)
127.0.0.1:6381> set name xujd
OK
127.0.0.1:6381> keys *
1) "name"
127.0.0.1:6381> get name
"xujd"
127.0.0.1:6381> flushall
OK
127.0.0.1:6381>

127.0.0.1:6382> keys * 
1) "name"
127.0.0.1:6382> get name
"xujd"
127.0.0.1:6382> 

127.0.0.1:6383> keys *
1) "name"
127.0.0.1:6383> get name
"xujd"
127.0.0.1:6383>

4.2測試從節點寫數據

在兩個從節點都寫入東西,操作如下:

127.0.0.1:6382> set age 18
(error) READONLY You can't write against a read only replica.
127.0.0.1:6382> 

127.0.0.1:6383> set age 18
(error) READONLY You can't write against a read only replica.
127.0.0.1:6383> 

寫入都是失敗的。

4.3測試主從結構的高可用HA

將主節點宕機查看從節點的狀態。操作如下:

[root@lk7 ~]# ps -ef | grep redis
root       7091      1  0 20:23 ?        00:00:00 redis-server *:6381
root       7101      1  0 20:23 ?        00:00:00 redis-server *:6382
root       7109      1  0 20:23 ?        00:00:00 redis-server *:6383
root       7185   1691  0 20:24 pts/1    00:00:00 redis-cli -p 6382
root       7277   7238  0 20:26 pts/2    00:00:00 redis-cli -p 6383
root       7605   7331  0 20:32 pts/3    00:00:00 grep --color=auto redis
[root@lk7 ~]# kill -9 7091
[root@lk7 ~]# ps -ef | grep redis
root       7101      1  0 20:23 ?        00:00:00 redis-server *:6382
root       7109      1  0 20:23 ?        00:00:00 redis-server *:6383
root       7185   1691  0 20:24 pts/1    00:00:00 redis-cli -p 6382
root       7277   7238  0 20:26 pts/2    00:00:00 redis-cli -p 6383
root       7629   7331  0 20:32 pts/3    00:00:00 grep --color=auto redis
[root@lk7 ~]# 

127.0.0.1:6382> info replication
# Replication
role:slave
master_host:192.168.106.171
master_port:6381
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:658
slave_repl_offset:658
master_link_down_since_seconds:30
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:869898c1c73e200eeca0bcb41666811836fdf2e5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:658
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:658
127.0.0.1:6382>

經過觀察發現,主節點宕機,從節點並不會自動頂替主節點工作,高可用測試失敗。

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