redis原理和使用-安裝和分佈式配置

在之前的blog中,介紹過redis分佈式鎖實現。在日程的工作中,redis也使用得非常頻繁,包括緩存,分佈式鎖,消息隊列等。本系列將系統性地對redis做一個完整的介紹和總結。


Redis服務安裝和遠程訪問

Redis安裝網上教程很多,這裏就不介紹了。

安裝好之後可通過redis-server啓動,通過客戶端redis-cli進行訪問,默認使用6379端口(本文環境爲ubuntu+redis3.0.6)。

如果要在遠程訪問redis服務器,則需要在啓動的時候指定redis.conf配置文件,並修改redis配置文件參數。將下行註釋掉:
# bind 127.0.0.1
如果不註釋,從遠程訪問時會報錯:
Could not connect to Redis at ip:6379: Connection refused
從而只能在本地訪問。

註釋掉綁定ip後,通過ps -ef | grep redis找到服務進程,通過kill -9 [pid]殺死服務進程並重啓服務(如果開啓了守護進程,則殺死之後就會重啓,可通過/etc/init.d/redis-server stop來停止)。此時可遠程訪問redis服務器了。
可通過info命令來查看redis服務器相關信息,如下圖所示:
在這裏插入圖片描述
輸入config get requirepass可看到結果爲:
在這裏插入圖片描述
此時,redis服務器是沒有密碼的。這種情況存在着安全隱患,即未授權登錄。無需認證即可訪問到內部數據,可導致敏感信息泄露,也可以惡意執行flushall來清空所有數據。
因此爲了保證安全,通常會設置登錄密碼:
通過config set requirepass [password]可以設置臨時密碼。設置成功後再進行任何操作都會提示:

(error) NOAUTH Authentication required.

可通過auth [password]進行認證。
但這種設置方式在服務器重啓之後無效,要想使密碼認證一直有效,同樣需要修改redis.conf配置文件:
在這裏插入圖片描述
並重啓服務。

Redis集羣

Redis有三種集羣模式,分別是主從模式,哨兵(Sentinel)模式和集羣(Cluster)模式。

主從模式(Master-Slave)

主從模式比較簡單,跟mysql的主從模式類似,由一個主節點和多個從節點組成。主節點提供寫能力,從節點提供讀能力。主從模式的問題在於:master節點在主從模式中唯一,若master掛掉,則redis無法對外提供寫服務。

部署

主節點ip:10.241.149.44,端口6379。
從節點ip:本機。端口分別爲6381和6382。

現有本機目錄/usr/local/redis-node/6381和/usr/local/redis-node/6382。將redis.conf分別拷貝到這兩個目錄。修改6381下的配置文件:

port 6381
...
masterauth xxx # 主節點開啓了密碼,則需要配置。見上文
...
slaveof 10.241.149.44 6379  # 配置主從模式

類似地修改6382下的配置文件。

最後,啓動兩個從節點:

redis-server /usr/local/redis-node/6381/redis.conf
redis-server /usr/local/redis-node/6382/redis.conf

連接上主節點:
redis-cli -h 10.241.149.44 -p 6379
寫入:10.241.149.44:6379> set user howe成功
連接上從節點:redis-cli -p 6381
讀取user:

127.0.0.1:6381> get user
"howe"

說明主節點上的數據同步到了從節點。
如果此時在從節點上寫入,就會提示:
(error) READONLY You can't write against a read only slave.

哨兵模式(Sentinel)

主從模式的弊端就是不具備高可用性,當master掛掉以後,Redis將不能再對外提供寫入操作,因此sentinel應運而生。

Sentinel中文含義爲哨兵,顧名思義,它的作用就是監控redis集羣的運行狀況。當發現主節點掛掉以後,它會選舉一個從節點升級爲主節點,並讓其他從節點從這個新的主節點進行數據同步。

sentinel因爲也是一個進程,有掛掉的可能,所以sentinel也會啓動多個形成一個sentinel集羣。

當使用sentinel模式的時候,客戶端不要直接連接Redis,而是連接sentinel,由sentinel來提供具體的可提供服務的Redis實現,這樣當master節點掛掉以後,sentinel就會感知並將新的master節點提供給使用者。

部署

在主從模式已搭建的基礎上,可以進一步搭建哨兵模式。
redis主節點爲10.241.149.44:6379,兩個從節點爲本機:10.234.209.24:6381, 10.234.209.24:6382。
將兩個從節點的配置文件中的bind 127.0.0.1改成bind 0.0.0.0,以便遠程客戶端能夠訪問。
同時,哨兵模式下從節點可能會切換爲主節點,因此從節點和主節點地位同等,配置需要保持一致,將兩個從節點的requirepass打開。

假設現有本地目錄:
/usr/local/redis-sentinel。在該目錄下創建s1,s2,s3,然後將sentinel.conf分別拷貝至s1,s2,s3下。Sentinel.conf初始內容如下:

port 26379
dir /tmp
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
# 主節點別名,ip,端口,確認master失效的哨兵數
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000

修改s1的sentinel配置文件:
添加:

daemonize yes
logfile “/usr/local/redis-sentinel/s1.log” 

修改監聽的主節點爲:

sentinel monitor mymaster 10.241.149.44 6379 2

如果主節點開啓了密碼,則還需添加密碼認證:

sentinel auth-pass mymaster <password>

其餘參數保持不變。
同理修改s2,s3的sentinel配置文件。

以指定配置文件的方式啓動三個哨兵:

redis-sentinel /usr/local/redis-sentinel/s1/sentinel.conf
redis-sentinel /usr/local/redis-sentinel/s2/sentinel.conf
redis-sentinel /usr/local/redis-sentinel/s3/sentinel.conf

這裏將三個哨兵放到同一臺機器上,實際上爲了避免單點故障,通常哨兵是部署在不同的機器上的。

現在kill掉主節點的redis服務進程。打開s1.log,可以看到進行了故障遷移:
在這裏插入圖片描述
說明如下:

*****s1節點哨兵端口爲26379,監聽另外兩個哨兵節點26380和26381,監聽主節點10.241.149.44 6379*****
10343:X 23 Apr 16:08:38.511 * +sentinel sentinel 10.234.209.24:26380 10.234.209.24 26380 @ mymaster 10.241.149.44 6379
10343:X 23 Apr 16:08:41.549 * +sentinel sentinel 10.234.209.24:26381 10.234.209.24 26381 @ mymaster 10.241.149.44 6379
*****監聽到redis主節點下線*****
10343:X 23 Apr 16:10:40.093 # +sdown master mymaster 10.241.149.44 6379
*****選舉一個新的redis主節點*****
10343:X 23 Apr 16:10:40.236 # +new-epoch 1
10343:X 23 Apr 16:10:40.242 # +vote-for-leader 9528d63b865c3fb8773c8ac6cfb52cb0a702f3e5 1
*****三個哨兵投票,滿足2個確認的條件,認爲redis主節點確實已下線*****
10343:X 23 Apr 16:10:41.186 # +odown master mymaster 10.241.149.44 6379 #quorum 3/2
10343:X 23 Apr 16:10:41.186 # Next failover delay: I will not start a failover before Thu Apr 23 16:16:40 2020
*****更新哨兵配置文件*****
10343:X 23 Apr 16:10:41.337 # +config-update-from sentinel 10.234.209.24:26380 10.234.209.24 26380 @ mymaster 10.241.149.44 6379
*****切換redis主節點爲6382節點(原來的兩個從節點之一)*****
10343:X 23 Apr 16:10:41.338 # +switch-master mymaster 10.241.149.44 6379 10.234.209.24 6382
10343:X 23 Apr 16:10:41.338 * +slave slave 10.234.209.24:6381 10.234.209.24 6381 @ mymaster 10.234.209.24 6382
10343:X 23 Apr 16:10:41.338 * +slave slave 10.241.149.44:6379 10.241.149.44 6379 @ mymaster 10.234.209.24 6382
*****此時,原redis主節點切換成了從節點,並且是下線狀態*****
10343:X 23 Apr 16:11:11.397 # +sdown slave 10.241.149.44:6379 10.241.149.44 6379 @ mymaster 10.234.209.24 6382

查看s2.log和s3.log,大體過程都差不多。

此時打開s1節點的sentinel.conf配置文件可以發現,監聽的主節點自動更新爲:

sentinel monitor mymaster 10.234.209.24 6382 2

s2和s3的配置文件也是一樣的被自動更新了。

再啓動原來的主節點10.241.149.44:6379,發現s1.log多了一行日誌:

10343:X 23 Apr 16:55:53.487 # -sdown slave 10.241.149.44:6379 10.241.149.44 6379 @ mymaster 10.234.209.24 6382

說明此時這個節點是作爲從節點重新上線。

sentinel操作
連接上任意一個哨兵:
redis-cli -p 26379

查看主節點狀態:
在這裏插入圖片描述
查看從節點狀態:sentinel slaves mymaster
在這裏插入圖片描述

代碼連接

在哨兵模式下,主節點和從節點是動態變化的,其狀態有哨兵羣管理。因此客戶端連接redis服務器時,需要通過哨兵進行連接。

配置如下:

[redis]
host = 10.234.209.24:26379,10.234.209.24:26380,10.234.209.24:26381
pass = root
timeout = 100

代碼示例:

import settings
from redis.sentinel import Sentinel

sentinels = []
host_list = settings.get('redis', 'host').split(",")
for host in host_list:
    ip = host.split(":")[0]
    port = host.split(":")[1]
    sentinels.append((ip, port))
sentinel = Sentinel(sentinels=sentinels)


service_name = "mymaster"

redis_master = sentinel.master_for(service_name=service_name, password=settings.get('redis', 'pass'))
redis_slave = sentinel.slave_for(service_name=service_name, password=settings.get('redis', 'pass'))

redis_master.set("user", "test")  # 主節點寫入
print redis_slave.get("user")  # 從節點讀取

分片集羣模式(Cluster)

Redis的sentinel哨兵模式雖然可以解決Redis單點故障的問題,但是一主多從的結構必然會導致客戶端寫入數據只能在Master節點上操作,當寫入量特別大的時候主節點壓力就會很大。

Redis從3.0版本之後提供了cluster集羣模式,解決了這個問題。但是集羣分佈式不一定好,分佈式集羣的客戶端性能一般會低一些,flush、mget、keys等命令也不能跨節點使用,客戶端的維護也更復雜,所以業務能在哨兵下滿足需求儘量用哨兵模式。

這裏就不詳細介紹分片集羣模式了,可自行在網上搜索。

下一篇將介紹redis支持的數據結構,持久化方式和過期策略。

參考資料

[1].https://www.jianshu.com/p/897dcc654613
[2].https://blog.csdn.net/truelove12358/article/details/79612954

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