本文主要目的是对Redis主从+哨兵的高可用方案进行实验,文中使用的技术不进行深入说明,想深入了解的可自行百度。
用到的软件和版本:
本示例使用Windows10搭建Redis环境,Windows下的Redis下载方式如下
打开网址 https://github.com/microsoftarchive/redis/releases,下载3.2.100的压缩包
将压缩包解压然后复制,总共3份,我们搭建1主2从模式,Redis6379(主),Redis6479(从),Redis6579(从)
主Redis配置,进入Redis6379目录中,配置 redis.windows.conf
#配置IP绑定
bind 0.0.0.0
#配置端口
port 6379
#是否保护模式
protected-mode no
为了方便运行,目录下加个run.bat文件
redis-server redis.windows.conf
从Redis配置,分别进入Redis6479和Redis6579目录,配置redis.windows.conf,并添加run.bat文件
#配置IP绑定
bind 0.0.0.0
#配置端口,分别配置6479和6579
port 6479
#是否保护模式
protected-mode no
#配置主redisd的IP和端口
slaveof 192.168.1.5 6379
现在Redis配置好了,运行3个Redis目录中的run.bat启动服务,运行后可以看到主从都成功连接。
实际使用中一般会使用多个哨兵进行监控,本文作了简化,只使用1个哨兵,多个哨兵都是相同的配置,仅区分端口。
将Redis目录复制一份命名为RedisSentinel,添加sentinel.conf文件,内容如下:
port 27000 #哨兵运行端口
protected-mode no #非保护模式运行
#监控的主Redis的IP和端口,1表示1个哨兵
sentinel monitor redis-master 192.168.1.5 6379 1
#主机掉线以后5s进行认证,如果无法连接则重新由哨兵从slave中选出新的master
sentinel down-after-milliseconds redis-master 5000
sentinel failover-timeout redis-master 60000
CMD中通过命令运行哨兵
redis-server sentinel.conf --sentinel
可以看到哨兵已经发现1主2从并开始监听了
也可通过命令查看哨兵状态
redis-cli -p 27000 info sentinel
我们使用CSRedisCore来访问Redis,CSRedisCore是国内大牛开发的一个.net core redis 组件,源码可读性很强非常干净,几乎无任何依赖。性能相比ServiceStack.Redis和StackExchange.Redis会快10%左右,支持Redis的高级特性:订阅/发布,Pipeline,MGet/MSet,集群,分区。
创建一个.net core 控制台程序,然后添加nuget包
nuget Install-Package CSRedisCore
Program.cs代码
using System;
using System.Threading;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//连接哨兵
var csredis = new CSRedis.CSRedisClient("redis-master", new[] {"127.0.0.1:27000" });
//初始化 RedisHelper
RedisHelper.Initialization(csredis);
while (true)
{
try
{
Test();
}
catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
Console.ReadLine();
}
Console.ReadKey();
}
static void Test()
{
RedisHelper.Set("name", "祝雷");//设置值。默认永不过期
Console.WriteLine(RedisHelper.Get("name"));
RedisHelper.Set("time", DateTime.Now, 1);
Console.WriteLine(RedisHelper.Get("time"));
Console.WriteLine(RedisHelper.Get("time"));
// 列表
RedisHelper.RPush("list", "第一个元素");
RedisHelper.RPush("list", "第二个元素");
RedisHelper.LInsertBefore("list", "第二个元素", "我是新插入的第二个元素!");
Console.WriteLine($"list的长度为{RedisHelper.LLen("list")}");
Console.WriteLine($"list的第二个元素为{RedisHelper.LIndex("list", 1)}");
}
}
}
模拟故障进行测试,启动程序后,杀死主Redis进程,.net core程序再次访问Redis会出现一次异常检查,然后能正常切换到新的master上。