项目中考虑到容灾、性能以及容量,一般会使用集群方式搭建redis。而当redis主服务器存在故障,为了redis仍能正常运行,可以搭建redis哨兵,通过选举方式重新建立主从关系。本文简单讲述主从建立和哨兵的配置。本机测试redis为Redis-x64-3.2.100(Windows下载地址:https://github.com/MicrosoftArchive/redis/releases),使用一台机器运行测试。
1.1 下载解压
下载完成后进行解压,然后复制两份作为从成员,构成一主二从。
1.2 主从配置
主redis配置:编辑文件夹下redis.windows.conf文件,设置bind和port,因为我是本机测试,默认设置bind 127.0.0.1,port 6379
从redis配置:同样编辑文件夹下redis.windows.conf文件,设置bind和port。由于我是一台机器设置两个从redis,所以bind都是127.0.0.1,port分别是6380和6381。做完以上操作,如何标志这两redis是从关系呢?所以,还需要在配置文件中加上一行配置。注意:两个从redis都是相同的配置语句,因为都从属于同一个主redis。
slaveof 127.0.0.1 6379
1.3 主从redis启动
在文件加中使用cmd进入命令窗口,输入redis-server redis.windows.conf即可启动(redis-server.exe和redis.windows.conf文件在相同文件夹下),依次启动主和从redis。
redis-server redis.windows.conf
2.1 哨兵配置
在三个redis文件加中创建redis.windows.sentinel.conf文件,设置绑定的port为26379、26380和26381,设置哨兵监视的主服务器(注意:3个哨兵都只配置监视的主redis的IP和端口,也就是127.0.0.1:6379这一个,不是分别写其所在redis的IP和端口)
哨兵1配置
#哨兵1端口 port 26379 #mymaster 即命名的主redis,后续客户端连接哨兵的时候将会使用, #主服务器IP:127.0.0.1 端口 6379 ##2表示在sentinel集群中最少需要有两个节点检测到redis主节点出故障就进行主从切换 sentinel monitor mymaster 127.0.0.1 6379 2
哨兵2配置
#哨兵2端口 port 26380 #mymaster 即命名的主redis,后续客户端连接哨兵的时候将会使用, #主服务器IP:127.0.0.1 端口 6379 ##2表示在sentinel集群中最少需要有两个节点检测到redis主节点出故障就进行主从切换 sentinel monitor mymaster 127.0.0.1 6379 2
哨兵3配置
#哨兵3端口 port 26381 #mymaster 即命名的主redis,后续客户端连接哨兵的时候将会使用, #主服务器IP:127.0.0.1 端口 6379 ##2表示在sentinel集群中最少需要有两个节点检测到redis主节点出故障就进行主从切换 sentinel monitor mymaster 127.0.0.1 6379 2
2.2 启动哨兵
在文件加中使用cmd进入命令窗口,输入redis-server redis.windows.sentinel.conf --sentinel即可启动(redis-server.exe和redis.windows.sentinel.conf文件在相同文件夹下),依次启动3个哨兵。
redis-server redis.windows.sentinel.conf --sentine
启动后会显示从成员和主成员
3 测试功能
将主redis关闭,可发现哨兵会重新选举主服务器,然后继续保持主从关系,重新启动关闭的redis,该redis将变成从成员。
4 代码连接redis
在.net core环境下,使用进行连接测试,采用哨兵的连接方式。
class Program { static void Main(string[] args) { var csredis = new CSRedis.CSRedisClient("mymaster", new string[] { "127.0.0.1:26379", "127.0.0.1:26380", "127.0.0.1:26381" }); RedisHelper.Initialization(csredis); while (true) { try { RedisHelper.Set("time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));//设置值。默认永不过期 Console.WriteLine(RedisHelper.Get<String>("time")); System.Threading.Thread.Sleep(1000); } catch(Exception e) { Console.WriteLine(e.Message); } } } }
来源:https://www.cnblogs.com/gengr/p/12029070.html