1. 程式人生 > >csredis-in-asp.net core理論實戰-主從配置、哨兵模式

csredis-in-asp.net core理論實戰-主從配置、哨兵模式

csredis

  • GitHub https://github.com/2881099/csredis

看了github上的開源專案,上面真的只是單純的使用文件,可能對於我這種人(菜鳥)就不太友好,

我知道他對標的是ServiceStack.Redis, 一開始csredis只支援. net 版本,但原作者沒有繼續維護,作者使用 . net core重寫後,逐漸演化的一個. net core 版本的redis 驅動,

使用這個類庫可以方便的地在 c#中訪問redis資料庫,官方介紹

低門檻、高效能,和分割槽高階玩法的redis-cli SDK;

我呢,就照著官方文件寫一些示例,大佬就別看了,只是整合方案與學習筆記。

  • https://github.com/luoyunchong/dotnetcore-examples/blob/master/dotnet-core-redis/

在學習之前,看到README.md上的內容不免陷入沉思,好多關鍵字我都不懂是什麼意思,所以還是從理論入手,搜尋資料,整合出入門資料,往後再講在asp .net core中整合與使用的示例。

哨兵模式

  • Redis哨兵(Sentinel)模式 https://www.jianshu.com/p/06ab9daf921d

上文介紹了Redis的哨兵是什麼:為了服務的高可用性,當一臺伺服器宕機時,可以自動地切換到另一個伺服器,不需要手動干預,Redis的哨兵用於監控Redis伺服器的狀態,當master宕機,會自動將其中的一個slave切換為master,然後再通過 釋出訂閱模式通知其他的從伺服器,自動修改配置檔案,自切換主機。

先在本地搭建好主從redis服務,我本地win10,已安裝好一個redis,部署在6379埠上、先把這些文件看看。

下載

windows安裝綠色版Redis

  • https://blog.csdn.net/ml863606/article/details/87456239

主從配置(Windows版)

本地Redis主從配置(Windows版),從github上下載zip壓縮包,解壓後,複製二份資料夾至某一目錄,配置二個從Redis伺服器,可參考如下

  • https://www.cnblogs.com/cang12138/p/9132288.html#_label0

簡單教程

D:\services\Redis-x64-3.2.100目錄 其實有 “Windows Service Documentation.docx ”,上面說的很清楚,這裡只說最簡單的配置多個服務的方式,使用文字編輯器開啟redis.windows-service.conf檔案,可修改啟用埠。

port 6380

cmd 到D:\services\Redis-x64-3.2.100-1,一定要管理員執行

#安裝服務
redis-server --service-install redis.windows-service.conf  --service-name redis6380
#開啟服務
net start redis6380  

如果無法開啟服務redis6380,就刪除此服務,再次執行,見下方參考命令 刪除服務。

本地安裝成了三個reids,他們執行在不同的埠,三個哨兵。

服務型別 IP port
master Redis服務 localhost 6379
slave Redis伺服器 localhost 6380
slave Redis伺服器 localhost 6381
sentinel localhost 26381
sentinel localhost 26379
sentinel localhost 26380
slaveof $host $port 作用是設定主從庫,在redis-cli命令中執行,即可將此redis設定為host下port埠的從庫,$開頭的為引數 

slaveof no one #取消同步

也可在windows-server.conf檔案中配置

6379那個redis是使用msi安裝包安裝的,所以redis-cli是可以在任意資料夾位置執行的,如未配置,請在D:\service\Redis-x64-3.2.100-1目錄下執行這些命令。

C:\Users\Computer>redis-cli -p 6380
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK
ctrl+c退出命令列狀態。
C:\Users\Computer>redis-cli -p 6381
127.0.0.1:6381> slaveof 127.0.0.1 6379
OK

另開一個終端

C:\Users\Computer>redis-cli -p 6379
127.0.0.1:6379> set a 1233
OK
127.0.0.1:6379> get a
"1233"

原本的終端得到a的值是"1233",已經被同步過來了。

127.0.0.1:6381> get a
"1233"

參考命令

右擊電腦 ->管理->服務和應用程式 ->服務->可選擇服務名進行管理。

#開啟服務
net start redis6380  
#關閉服務
net stop redis6380  
#刪除服務:當服務不正常時可根據名稱刪除
sc delete redis6380  

以管理員許可權cmd到目錄D:\services\Redis-x64-3.2.100中,可使用如下命令。

  • Installing the Service:--service-install
redis-server --service-install redis.windows-service.conf --loglevel verbose
redis-server --service-install redis.windows.conf  --service-name redis6380
  • Uninstalling the Service:--service-uninstall
redis-server --service-uninstall
  • Starting the Service:--service-start
redis-server --service-start
  • Stopping the Service:--service-stop
redis-server --service-stop
  • Naming the Service: --service-name name
redis-server --service-install --service-name redisService1 --port 10001
  • set port :--port 10001

檢視redis 版本、redis-cli版本

PS D:\service\Redis-x64-3.2.100-1> redis-server -v
Redis server v=3.2.100 sha=00000000:0 malloc=jemalloc-3.6.0 bits=64 build=dd26f1f93c5130ee
PS D:\service\Redis-x64-3.2.100-1> redis-cli -v
redis-cli 3.2.100

哨兵配置

哨兵模式是Redis提供的一個命令,獨立程序,獨立執行,哨兵的作用是為了實現對redis伺服器狀態的監控,保證服務的可用性,實現故障切換,無須人為干預。

1.配置項

這個是通過 .msi檔案安裝的redis,與.zip解壓後啟動的服務無區別。開啟E:\Program Files\Redis\sentinel.conf,沒有就建立此檔案,另外二個redis,只用改port對應的值,改成26739、26740,配置內容如下:

#當前Sentinel服務執行的埠
port 26381
# 3s內mymaster無響應,則認為mymaster宕機了
sentinel monitor mymaster 127.0.0.1 6379 2
#如果10秒後,mysater仍沒啟動過來,則啟動failover
sentinel down-after-milliseconds mymaster 3000
# 執行故障轉移時, 最多有1個從伺服器同時對新的主伺服器進行同步
sentinel failover-timeout mymaster 10000

配置監聽的主伺服器,這裡sentinel monitor代表監控,mymaster代表伺服器的名稱,可以自定義,127.0.0.1代表監控的主伺服器,6379代表埠,2代表只有兩個或兩個以上的哨兵認為主伺服器不可用的時候,才會進行failover操作。

  1. 啟動哨兵

前提redis服務已啟動。

PS E:\Program Files\Redis> .\redis-server.exe .\sentinel.conf --sentinel
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 3.2.100 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                   
 (    '      ,       .-`  | `,    )     Running in sentinel mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 26381
 |    `-._   `._    /     _.-'    |     PID: 22452
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           http://redis.io        
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

[22452] 07 Jul 11:47:00.111 # Sentinel ID is fc076362c0a5cc71d3c72f71c00a15b2726b2bf8
[22452] 07 Jul 11:47:00.111 # +monitor master mymaster 127.0.0.1 6379 quorum 2
[22452] 07 Jul 11:47:00.114 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379

因為windows下不支援守護程序(一種可在後臺執行的程式),這樣命令列一關閉,哨兵也停止了(Windows does not support daemonize. Start Redis as service),在windows下叫服務(service),是可以後臺一直執行的。

  1. 在windows下以服務的形式啟動哨兵

管理員執行

E:\Program Files\Redis>redis-server --service-install --service-name sentinel sentinel.conf --sentinel

D:\service\Redis-x64-3.2.100-1>redis-server --service-install --service-name sentinel-1 sentinel.conf --sentinel
[20700] 07 Jul 12:01:21.297 # Granting read/write access to 'NT AUTHORITY\NetworkService' on: "D:\service\Redis-x64-3.2.100-1" "D:\service\Redis-x64-3.2.100-1\"
[20700] 07 Jul 12:01:21.300 # Redis successfully installed as a service.

D:\service\Redis-x64-3.2.100-2>redis-server --service-install --service-name sentinel-2 sentinel.conf --sentinel
[15772] 07 Jul 12:01:33.942 # Granting read/write access to 'NT AUTHORITY\NetworkService' on: "D:\service\Redis-x64-3.2.100-2" "D:\service\Redis-x64-3.2.100-2\"
[15772] 07 Jul 12:01:33.944 # Redis successfully installed as a service.

此時D:\service\Redis-x64-3.2.100-1\sentinel.conf,哨兵執行在26379埠 ,生成哨兵ID(Sentinel ID)

sentinel myid a2e75eedaf161357fe03df490a14b4158ad3ba88

也生成了如下內容,能監控到從slave服務6380的redis、slave6381的redis,也能監控到其他的哨兵,分別執行在26380、26381埠

# Generated by CONFIG REWRITE
dir "D:\\service\\Redis-x64-3.2.100-1"
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 127.0.0.1 6380
sentinel known-slave mymaster 127.0.0.1 6381
sentinel known-sentinel mymaster 127.0.0.1 26380 a2e75eedaf161357fe03df490a14b4158ad3ba88
sentinel known-sentinel mymaster 127.0.0.1 26381 fc076362c0a5cc71d3c72f71c00a15b2726b2bf8
sentinel current-epoch 0

在主master redis中檢視redis當前資訊

PS E:\Program Files\Redis> redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6381,state=online,offset=141627,lag=1
slave1:ip=127.0.0.1,port=6380,state=online,offset=141627,lag=0
...

ctrl+c退出,檢視redis6380資訊

PS E:\Program Files\Redis> redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:161451
slave_priority:100
slave_read_only:1
connected_slaves:0
...

高可用測試

1.主伺服器Master 掛掉

停止 6379服務

C:\WINDOWS\system32>redis-cli -p 6379
127.0.0.1:6379> shutdown
not connected> 
或
C:\WINDOWS\system32>net stop redis

6379中sentinel_log.log,可見,當6379redis服務掛 了後,此日誌表明,redis在failover後錯誤重試,switch-master切換為6380

[240] 07 Jul 12:16:15.015 # +sdown master mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.086 # +odown master mymaster 127.0.0.1 6379 #quorum 2/2
[240] 07 Jul 12:16:15.086 # +new-epoch 1
[240] 07 Jul 12:16:15.086 # +try-failover master mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.088 # +vote-for-leader 207bd9abfe9283e32b6e0de3635e126bfdbba3b4 1
[240] 07 Jul 12:16:15.090 # a2e75eedaf161357fe03df490a14b4158ad3ba88 voted for 207bd9abfe9283e32b6e0de3635e126bfdbba3b4 1
[240] 07 Jul 12:16:15.091 # 14c6428bae2afc1d92b5159b0788dbba753ee85b voted for 207bd9abfe9283e32b6e0de3635e126bfdbba3b4 1
[240] 07 Jul 12:16:15.188 # +elected-leader master mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.188 # +failover-state-select-slave master mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.255 # +selected-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.255 * +failover-state-send-slaveof-noone slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.338 * +failover-state-wait-promotion slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.718 # +promoted-slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.718 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:15.800 * +slave-reconf-sent slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:16.217 # -odown master mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:16.757 * +slave-reconf-inprog slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:16.758 * +slave-reconf-done slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:16.834 # +failover-end master mymaster 127.0.0.1 6379
[240] 07 Jul 12:16:16.834 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
[240] 07 Jul 12:16:16.835 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
[240] 07 Jul 12:16:16.835 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
[240] 07 Jul 12:16:19.853 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

6380redis 服務 日誌,當6379服務掛了後,6380成為主節點,其他節點(6379、6381)成為從節點,此時開啟D:\service\Redis-x64-3.2.100-1\redis.windows-service.conf,之前配置的slaveof 127.0.0.1 6379已經沒有了。

[9404] 07 Jul 12:16:15.037 # +sdown master mymaster 127.0.0.1 6379
[9404] 07 Jul 12:16:15.089 # +new-epoch 1
[9404] 07 Jul 12:16:15.090 # +vote-for-leader 207bd9abfe9283e32b6e0de3635e126bfdbba3b4 1
[9404] 07 Jul 12:16:15.104 # +odown master mymaster 127.0.0.1 6379 #quorum 3/2
[9404] 07 Jul 12:16:15.104 # Next failover delay: I will not start a failover before Sun Jul 07 12:16:35 2019
[9404] 07 Jul 12:16:15.801 # +config-update-from sentinel 207bd9abfe9283e32b6e0de3635e126bfdbba3b4 127.0.0.1 26381 @ mymaster 127.0.0.1 6379
[9404] 07 Jul 12:16:15.801 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6380
[9404] 07 Jul 12:16:15.802 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
[9404] 07 Jul 12:16:15.802 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
[9404] 07 Jul 12:16:18.812 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380

此時檢視 6380的資訊,可以看到此時只有一個slave線上,其配置為127.0.0.1的6381埠,

redis-cli -p 6380
127.0.0.1:6380> info replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=119281,lag=1
master_repl_offset:119547
...

2.6379服務再次啟動

當6379的服務啟動後,6379的服務將成為6380的從伺服器slave,再次通過 redis-cli -p 埠, 輸入 info replication檢視對應服務的節點資訊

PS E:\Program Files\Redis> redis-server --service-start
或
C:\WINDOWS\system32>net start redis

PS E:\Program Files\Redis> redis-cli -p 6380
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6379,state=online,offset=339593,lag=1
slave1:ip=127.0.0.1,port=6381,state=online,offset=339593,lag=1
...

3.slave 6381關閉

此時檢視6380的info,可見此時只有一個從節點6379

C:\WINDOWS\system32>net stop redis6381
role:master
connected_slaves:1

PS E:\Program Files\Redis> redis-cli -p 6380
127.0.0.1:6380> info replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6379,state=online,offset=329392,lag=1
master_repl_offset:329525
...

相關連結

  • Redis哨兵(Sentinel)模式 https://www.jianshu.com/p/06ab9daf921d
  • windows安裝綠色版Redis - https://blog.csdn.net/ml863606/article/details/87456239
  • 主從配置(Windows版) https://www.cnblogs.com/cang12138/p/9132288.html#_label0
  • csredis https://github.com/2881099/csredis
  • Cross-platform GUI management tool for Redis https://github.com/uglide/RedisDesktopManager
  • Redis in Windows的3.x版本 https://github.com/MicrosoftArchive/redis
  • Redis in Windows的4.x版本 https://github.com/tporadowski/redis
  • Redis in linux https://github.com/antirez/redis
  • Redis高可用叢集-哨兵模式(Redis-Sentinel)搭建配置教程【Windows環境】 https://aflyun.blog.csdn.net/article/details/79430105

linux版Redis主從搭建

建議大家看這個文章,我一開始參考了其他的,寫完windows版,才看到這個連結,關於深入剖析Redis系列