現在說到使用快取中間件基本就是 Redis 了,通常開發環境或測驗環境部署一個單機版就可以運行了,但要上生產環境還需要進行高可用的方式來部署,本文說說在 CentOS7 中 Redis 高可用的部署以及在 dotNetCore 中怎樣呼叫,
環境
- CentOS:7.5
- Redis:5.0.7
- dotNetCore:3.0
- CSRedisCore:3.3.0
Redis部署的幾種方式
- 單機版:用于開發或測驗環境
- 主從模式:主從模式提供了一種備份的機制,主庫可以進行讀寫操作,從庫只能進行讀操作,當主庫掛了,需要手動將從庫設定為主庫,算不上真正的高可用
- 哨兵模式:哨兵模式基于主從模式,當主服務掛了后,哨兵服務可以從所有的從服務中選舉一個升級為主,可以繼續正常地對外提供服務
- 集群模式:主從(哨兵)模式的主庫和所有的從庫存盤的資料是一樣的,寫資料依然是只能從主庫寫,集群模式主要解決的是高并發的問題,可以橫向擴展,資料分攤在不同節點中,
CentOS 部署 Redis
單機部署
1、執行下面命令安裝 wget ,用于后面下載 Redis 安裝包
yum -y install wget
2、安裝 gcc ,編譯和安裝 Redis 時需要
yum -y install gcc
3、下載 Redis 并安裝
cd /usr/local #進入到usr/local目錄
tar xzf redis-5.0.7.tar.gz #解壓Redis
cd redis-5.0.7 #進入到解壓到Redis目錄
make MALLOC=libc #編譯
make install #安裝
4、修改 Redis 組態檔并啟動
cd /usr/local/redis-5.0.7 #進入redis目錄
vi redis.conf #編輯組態檔
編輯內容如下
daemonize yes #修改組態檔中的daemonize為yes,為后臺啟動
redis-server redis.conf #根據修改后到組態檔啟動redis
5、檢查并連接
ps -ef | grep redis #檢查是否啟動成功

redis-cli #連接到redis,默認會連接6379的默認埠
6、設定密碼
vi redis.conf #編輯組態檔進行密碼設定
修改檔案內容,去掉requirepass前面的#號
requirepass Aa123456
redis-server redis.conf #修改完組態檔,重啟redis
配置主從(哨兵模式)
正式的生產環境會使用多臺服務器來配置主從,本文為了演示,在一臺服務器上通過多埠的方式來配置主從,埠分配規則如下:
- master:6380
- slave1:6382
- slave2:6383
- slave3:6383
- sentinel1:26379
- sentinel2:26380
1、在 /usr/local/ 目錄中創建 config 目錄,在該目錄中創建相應的目錄存放組態檔和資料
cd /usr/local
mkdir config #創建config目錄
cd config
mkdir master-6380 #創建master-6380目錄
cd master-6380
mkdir data #創建data目錄用來存放資料
cp /usr/local/redis-5.0.7/redis.conf . #將組態檔復制到當前目錄
cd .. #回退到config目錄
cp -r master-6380/ slave-6381
cp -r master-6380/ slave-6382
cp -r master-6380/ slave-6383
mkdir sentinel-26379 #創建哨兵1配置目錄
cp /usr/local/redis-5.0.7/sentinel.conf /usr/local/redis-5.0.7/config/sentinel-26379/
cp -r sentinel-26379/ sentinel-26380
創建完成后目錄結構如下:

2、配置 master 的 redis.conf 檔案
bind 172.16.0.13 #修改成自己的IP地址
port 6380 #主服務器的埠號
daemonize yes #設定后臺啟動
pidfile /var/run/redis_6380.pid #redis 后臺啟動的時候會在/var/run/默認生成一個pid檔案
protected-mode no #保護模式關閉
dir /usr/local/config/master-6380/data #資料保存目錄
3、配置 slave 的 redis.conf 檔案
bind 172.16.0.13 #修改成自己的IP地址
port 6381 #從服務器的埠號
daemonize yes #設定后臺啟動
pidfile /var/run/redis_6381.pid
protected-mode no #保護模式關閉
dir /usr/local/config/slave-6381/data #資料保存目錄
slaveof 172.16.0.13 6380 #主服務器的IP 主服務器埠號
注意 :slaveof 默認再組態檔中是沒有的,需要新添加
4、將埠 6382、6383 對應的從服務器的組態檔對照第三步進行修改
5、配置哨兵1的組態檔
port 26379 #指定哨兵1埠號
daemonize yes #設定后臺啟動
protected-mode no #關閉保護模式
sentinel monitor mymaster 172.16.0.13 6380 2 #監聽主的埠,后面的數字2為哨兵的個數
logfile "/usr/local/config/sentinel-26379/sentinel-26379.log"
dir "/usr/local/config/sentinel-26379/data"
6、配置哨兵1的組態檔
port 26380 #指定哨兵2埠號
daemonize yes #設定后臺啟動
protected-mode no #關閉保護模式
sentinel monitor mymaster 172.16.0.13 6380 2 #監聽主的埠,后面的數字2為哨兵的個數
logfile "/usr/local/config/sentinel-26380/sentinel-26380.log"
dir "/usr/local/config/sentinel-26380/data"
注意 :mymaster為主的名稱,默認為mymaster,如果要修改,該組態檔中所有涉及的地方都需要調整,
7、啟動服務
cd /usr/local/config #進入到config目錄
redis-server ./master-6380/redis.conf
redis-server ./slave-6381/redis.conf
redis-server ./slave-6382/redis.conf
redis-server ./slave-6383/redis.conf
redis-sentinel ./sentinel-26379/sentinel.conf
redis-sentinel ./sentinel-26380/sentinel.conf
8、查看主從狀態
redis-cli -h 172.16.0.13 -p 6380 #連接到主庫
>info #使用info命令查看資訊,如下圖

9、測驗哨兵是否正常作業
redis-cli -h 172.16.0.13 -p 6380 #連接到主庫
>shutdown #停掉主庫
>quit #退出
redis-cli -h 172.16.0.13 -p 6381 #連接到其中一個從庫
>info #查看狀態,如下圖:

可以看出 6381 的從庫已經升級為主庫,這時將 6380 啟動起來,查看服務器狀態,可以發現 6380 已經變成從庫,說明哨兵在正常作業,

dotNET Core 中連接 Redis
1、在 VS 中創建示例專案,參考 CSRedisCore 的 NuGet 包,如下圖:

2、具體代碼如下:
static void Main(string[] args)
{
string redisServerIP = "172.16.0.13";
string redisServerPort = "6380";
string redisPassword = "";
bool isSentinelMode = false;
string connectionString = GetRedisConnectionString(redisServerIP, redisServerPort, redisPassword,0, "", isSentinelMode);
//哨兵模式
if (isSentinelMode)
{
redisServerIP = "172.16.0.13,172.16.0.13"; //哨兵IP串列
redisServerPort = "26379,26380";
List<string> connectionList = GetRedisConnectionList(redisServerIP, redisServerPort);
CSRedisClient csredis = new CSRedisClient(connectionString, connectionList.ToArray());
RedisHelper.Initialization(csredis);//初始化
}
else
{
//普通模式,連接主庫
CSRedisClient csredis = new CSRedisClient(connectionString);
RedisHelper.Initialization(csredis);//初始化
}
Console.WriteLine("Hello World!");
}
完整示例代碼請訪問 https://github.com/oec2003/StudySamples/tree/master/DotNetCoreRedisDemo/DotNetCoreRedisDemo 下載,
希望本文對您有所幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/75420.html
標籤:.NET Core
