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


csredis

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

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

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

低門檻、高性能,和分區高級玩法的redis-cli SDK;

我呢,就照着官方文檔寫一些示例,大佬就別看了,只是集成方案與學習筆記。

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

哨兵模式

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

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

下載

windows安裝綠色版Redis

主從配置(Windows版)

本地Redis主從配置(Windows版),從github上下載zip壓縮包,解壓后,復制二份文件夾至某一目錄,配置二個從Redis服務器,可參考如下

簡單教程

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
...

相關鏈接

linux版Redis主從搭建

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM