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

csredis

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

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

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

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

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

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

哨兵模式

上文介紹了Redis的哨兵是什麼:爲了服務的高可用性,當一臺服務器宕機時,能夠自動地切換到另外一個服務器,不須要手動干預,Redis的哨兵用於監控Redis服務器的狀態,當master宕機,會自動將其中的一個slave切換爲master,而後再經過 發佈訂閱模式通知其餘的從服務器,自動修改配置文件,自切換主機。數據庫

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

下載

windows安裝綠色版Rediswindows

主從配置(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對應的值,改爲2673九、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成爲主節點,其餘節點(637九、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系列

原文出處:https://www.cnblogs.com/igeekfan/p/12115033.html

相關文章
相關標籤/搜索