Redis主从复制+哨兵简单配置
项目中考虑到容灾、性能以及容量,一般会使用集群方式搭建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);
}
}
}
}