十年河东,十年河西,莫欺少年穷
首先说下,我的 Redis 系列博客如下:
[置顶] 高并发时,使用Redis应注意的问题【缓存穿透、缓存击穿.、缓存雪崩】
windows环境下配置Redis主从复制-一主二仆,薪火相传、反客为主、哨兵模式
Redis 持久化技术 ,大名鼎鼎的Rdb和Aof,你会选谁呢?
简单介绍下Redis消息队列,实际生产环境中,大数据高并发时,不建议使用Redis做消息队列中间件
Redis 事务,和传统的关系型数据库ACID并不同,别搞混了
Redis常用配置redis.conf介绍,别把默认配置部署到到服务器,否则,会被领导骂的
C# Nuget程序集StackExchange.Redis操作Redis 及 Redis 视频资源 及 相关入门指令 牛逼不,全都有
Window环境下安装Redis 并 自启动Redis 及 Redis Desktop Manager
进入正文
学无止境,精益求精
一主二仆简介及配置
开篇之前,先说下Redis一主二仆主从复制的用处:
读写分离,容灾恢复,记住:Master主库负责写,Slave从库负责读,在主库上可以同时读写,但从库上不能进行写操作,否则会报错。
另外:当主库挂了后,从库不会抢班夺权,而是等待主库恢复,言下之意就是:主库挂了,从库还是从库,不会变成主库,因此:主库挂了,Redis的读操作不受影响,但写操作就不可以了,只能等到主库恢复后,方可以写操作。
最后,如果从库挂了,主库和另外剩余的从库不受影响,但,当挂了的从库恢复后,执行:info replication 后,他的角色就变成了Master,之前约定的主从关系消失了,这是,需要显式指定主从关系,需要执行:slaveof 127.0.0.1 6379,除非你在conf中进行主从说明。
以上理论,现在看不懂,没关系,我将会以具体示例的方式和大家探讨,
首先说下我的一主二仆分别为:
主:127.0.0.1:6379
从:127.0.0.1:6380
从:127.0.0.1:6381
1、说明
1.1、首先将Redis安装目录下的文件复制出来,并放在 Redis6380 、Redis6381 文件夹下,修改Redis6380、Redis6381 文件夹下的配置文件:redis.windows.conf 、redis.windows-service.conf
这里需要说明的是,之前针对配置文件做的修改可以保留,比如你之前做了内存淘汰策略,最大加载内存限制,开启了Aof模式,设置了TimeOut的时间,客户端连接限制数量【limits--maxclients 512,默认为10000】等等
2、修改Redis6380 文件夹的配置如下【redis.windows.conf 、redis.windows-service.conf 两个最好都改,保持一致】:
2.1、端口号
# If port 0 is specified Redis will not listen on a TCP socket. port 6380
2.2、绑定主从关系【该设置说明端口6380的服务为从机,它的主机为:6379】
# slaveof <masterip> <masterport> slaveof 127.0.0.1 6379
3、修改Redis6381 文件夹的配置如下【redis.windows.conf 、redis.windows-service.conf 两个最好都改,保持一致】:
3.1、端口号
# If port 0 is specified Redis will not listen on a TCP socket.
port 6381
3.2、绑定主从关系【该设置说明端口6381的服务为从机,它的主机为:6379】
# slaveof <masterip> <masterport>
slaveof 127.0.0.1 6379
4、启动Redis6380和Redis6381服务【此时应保证主服务6379是正常运行的】
4.1、6380启动指令如下
C:Userschenwolong>cd C:Program FilesRedis6380
C:Program FilesRedis6380>redis-server redis.windows.conf
4.2、6381启动指令如下:
C:Userschenwolong>cd C:Program FilesRedis6381
C:Program FilesRedis6381>redis-server redis.windows.conf
启动成功后,报文如下:
C:Userschenwolong>cd C:Program FilesRedis6381 C:Program FilesRedis6381>redis-server redis.windows.conf [3432] 23 Mar 16:40:59.089 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo [3432] 23 Mar 16:40:59.089 # Redis version=5.0.10, bits=64, commit=1c047b68, modified=0, pid=3432, just started [3432] 23 Mar 16:40:59.089 # Configuration loaded _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.10 (1c047b68/0) 64 bit .-`` .-```. ```/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6381 | `-._ `._ / _.-' | PID: 3432 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [3432] 23 Mar 16:40:59.093 # Server initialized [3432] 23 Mar 16:40:59.094 * Reading RDB preamble from AOF file... [3432] 23 Mar 16:40:59.094 * Reading the remaining AOF tail... [3432] 23 Mar 16:40:59.094 * DB loaded from append only file: 0.001 seconds [3432] 23 Mar 16:40:59.094 * Ready to accept connections [3432] 23 Mar 16:40:59.095 * Connecting to MASTER 127.0.0.1:6379 [3432] 23 Mar 16:40:59.095 * MASTER <-> REPLICA sync started [3432] 23 Mar 16:40:59.096 * Non blocking connect for SYNC fired the event. [3432] 23 Mar 16:40:59.096 * Master replied to PING, replication can continue... [3432] 23 Mar 16:40:59.098 * Partial resynchronization not possible (no cached master) [3432] 23 Mar 16:40:59.159 * Full resync from master: 90669aadc5baa6107cb7168fc50c03676e368917:4452 [3432] 23 Mar 16:40:59.371 * MASTER <-> REPLICA sync: receiving 174 bytes from master [3432] 23 Mar 16:40:59.373 * MASTER <-> REPLICA sync: Flushing old data [3432] 23 Mar 16:40:59.374 * MASTER <-> REPLICA sync: Loading DB in memory [3432] 23 Mar 16:40:59.374 * MASTER <-> REPLICA sync: Finished with success [3432] 23 Mar 16:40:59.406 * Background append only file rewriting started by pid 18276 [3432] 23 Mar 16:40:59.507 * AOF rewrite child asks to stop sending diffs. [3432] 23 Mar 16:40:59.608 # fork operation complete [3432] 23 Mar 16:40:59.620 * Background AOF rewrite terminated with success [3432] 23 Mar 16:40:59.620 * Residual parent diff successfully flushed to the rewritten AOF (0.00 MB) [3432] 23 Mar 16:40:59.623 * Background AOF rewrite finished successfully
从启动成功的指令中,我们能读到从机会连接主机,并备份主机的Rdb和Aof文件。
截止到这儿,我们的三台服务启动成功,默认的6379我一直都在运行。
然后,我们就可以针对这三台Redis服务器做一些测试了,如下:
5、配置结果查看
5.1、开三个CMD窗口,连接服务器,并查看主从关系,指令: info replication
主机6379
C:Userschenwolong>redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=5152,lag=0 slave1:ip=127.0.0.1,port=6381,state=online,offset=5152,lag=1 master_replid:90669aadc5baa6107cb7168fc50c03676e368917 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:5152 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:5152 127.0.0.1:6379>
从机6380
C:Userschenwolong>redis-cli -p 6380 127.0.0.1:6380> ping PONG 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:7 master_sync_in_progress:0 slave_repl_offset:5054 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:90669aadc5baa6107cb7168fc50c03676e368917 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:5054 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:4257 repl_backlog_histlen:798 127.0.0.1:6380>
从机6381
C:Userschenwolong>redis-cli -p 6381 127.0.0.1:6381> ping PONG 127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:up master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:5124 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:90669aadc5baa6107cb7168fc50c03676e368917 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:5124 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:4453 repl_backlog_histlen:672 127.0.0.1:6381>
看到上面的信息,是不是倍感亲切,因为从显示的结果说明,我们的 Redis 一主【6379】二仆【6380,6381】主从复制配置成功了,success,happy,so easy 。
6、相关测试
6.1、主写从读【在6379主服务写了5个键值对】
127.0.0.1:6379> set k1 v1 OK 127.0.0.1:6379> set k2 v2 OK 127.0.0.1:6379> set k3 v3 OK 127.0.0.1:6379> set k4 v4 OK 127.0.0.1:6379> set k5 v54 OK 127.0.0.1:6379>
读【主服务器写入成功后,从服务立马可以读读取到】
127.0.0.1:6381> get k3 "v3" 127.0.0.1:6381> get k4 "v4" 127.0.0.1:6381>
那么,从服务器上能进行写入吗?这边就不做演示了,从服务器是不支持写入的。
薪火相传配置及简介
首先说明下什么是薪火相传呢?
1、上一个slave可以是下一个slave的Master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。
2、用 slaveof <ip> <port>
3、中途变更转向:会清除之前的数据,重新建立拷贝最新的
4、风险是一旦某个slave宕机,后面的slave都没法备份
5、按照我们现有的三个端口,6379(-----6380(-----6381,也就是说6379是6380的主机,6380是6381的主机,那么,按照上述的一主二仆的关系,我们只需修改6381,将6381的主机指向6380。
首先,停止6381的服务,修改6381的配置文件【redis.windows.conf 、redis.windows-service.conf 两个最好都改,保持一致】:
# slaveof <masterip> <masterport> slaveof 127.0.0.1 6380
修改完毕后,重启6381服务,如下:
C:Userschenwolong>cd C:Program FilesRedis6381
C:Program FilesRedis6381>redis-server redis.windows.conf
查看6379的主从关系: info replication 【此时6379只有一个6380从机】
127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=8639,lag=1 master_replid:90669aadc5baa6107cb7168fc50c03676e368917 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:8653 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:8653 127.0.0.1:6379>
查看6380的主从关系:【需要说明的是,6380的角色是从机,他的主机为6379,他的从机为6381】
C:Userschenwolong>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:7 master_sync_in_progress:0 slave_repl_offset:8793 slave_priority:100 slave_read_only:1 connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=8793,lag=0 master_replid:90669aadc5baa6107cb7168fc50c03676e368917 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:8793 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:4257 repl_backlog_histlen:4537 127.0.0.1:6380>
查看6381的主从关系:【他的主机为6380,无从机,角色为从机】
C:Userschenwolong>redis-cli -p 6381 127.0.0.1:6381> info replication # Replication role:slave master_host:127.0.0.1 master_port:6380 master_link_status:up master_last_io_seconds_ago:8 master_sync_in_progress:0 slave_repl_offset:8611 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:90669aadc5baa6107cb7168fc50c03676e368917 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:8611 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:8584 repl_backlog_histlen:28
反客为主配置及简介
首先说明下什么是反客为主?
当master宕机后,后面的slave通过手动指令可以升为master ,设置的指令为: slaveof no one ,意思是说,在从机中去掉一个,变为主机。
反客为主的模式是在一主二仆的基础上变更过来的,因此,我们需要先将薪火传递模式修改为一主二仆。
修改6381配置文件,【redis.windows.conf 、redis.windows-service.conf 两个最好都改,保持一致】:
# slaveof <masterip> <masterport> slaveof 127.0.0.1 6379
此时,6379位主机,6380和6381分别为小弟从机。
突然有一天,主机挂了,Redis服务无法进行写操作了,这时运维人员执行了一条简单的指令,使整个服务体系又能正常运行了,那么运维人员执行的神马指令呢?
反客为主的指令介绍
1、首先将Redis6379服务停止
这就意味着主机挂了,然后在6381或6380中执行脚本: slaveof no one
脚本如下:
C:Userschenwolong>redis-cli -p 6381 --连接6381 127.0.0.1:6381> info replication --查看角色,此时角色为从机 # Replication role:slave master_host:127.0.0.1 master_port:6379 master_link_status:down master_last_io_seconds_ago:-1 master_sync_in_progress:0 slave_repl_offset:1 master_link_down_since_seconds:1616494552 slave_priority:100 slave_read_only:1 connected_slaves:0 master_replid:4eca8ce3998481be9070e20204fa7b7097a59de4 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:0 second_repl_offset:-1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6381> slaveof no one --执行反客为主指令 OK127.0.0.1:6381> info replication --看到角色,此时角色由从机变成了主机 # Replication role:master --主机角色 connected_slaves:0 master_replid:998f885399f6bcf3da404d8d332653d6c4137eff master_replid2:4eca8ce3998481be9070e20204fa7b7097a59de4 master_repl_offset:0 second_repl_offset:1 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0 127.0.0.1:6381>
那么,问题来了,如果此时主机又活过来了,活过来的6379还能继续当6380和6381的主机吗?
现在我们来验证,将6379Redis服务重启,然后查看6379的角色信息
重启redis服务,
C:Userschenwolong>redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=28,lag=0 master_replid:e4cfb6e402d7d8d650724a45473c1597f7af053a master_replid2:0000000000000000000000000000000000000000 master_repl_offset:28 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:28 127.0.0.1:6379>
由此可知,当6379活过来后,他什么都不是了,成了一个光杆司令,除非我们手动修改配置文件,重启服务、
哨兵模式配置及简介
哨兵模式其实是反客为主的升级版,在反客为主模式中,我们需要执行指令 slaveof no one 来进行主机的选举,在哨兵模式中这个动作是自动完成了。哨兵哨兵,用于巡逻,当发现主机挂了后,他会立即在从机中选举一个充当主机。
但是,当死去的主机又回来后,哨兵会检测到,但是主机的地位将不再是它,它会充当从机。
哨兵模式目前是最受欢迎的主从复制模式,它工作在一主二仆基础之上。切记。
1、Redis默认是没有哨兵模式配置文件的,因此,我们需要手动创建哨兵配置文件:sentinel.conf
2、分别在C:Program FilesRedis 和 C:Program FilesRedis6380 和 C:Program FilesRedis6381下面创建 sentinel.conf ,其配置如下:
C:Program FilesRedis
# 这个是Redis6379配置内容,其他文件同理新增然后改一下端口即可,26380,和 26381。 #当前Sentinel服务运行的端口 port 26379 # 哨兵监听的主服务器 端口号 和 投票票数 sentinel monitor mymaster 127.0.0.1 6379 1 # 3s内mymaster无响应,则认为mymaster宕机了 sentinel down-after-milliseconds mymaster 3000 #如果10秒后,mysater仍没启动过来,则启动failover sentinel failover-timeout mymaster 10000 # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步 sentinel parallel-syncs mymaster 1
C:Program FilesRedis6380
# 这个是Redis6379配置内容,其他文件同理新增然后改一下端口即可,26380,和 26381。 #当前Sentinel服务运行的端口 port 26379 # 哨兵监听的主服务器 sentinel monitor mymaster 127.0.0.1 6379 1 # 3s内mymaster无响应,则认为mymaster宕机了 sentinel down-after-milliseconds mymaster 3000 #如果10秒后,mysater仍没启动过来,则启动failover sentinel failover-timeout mymaster 10000 # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步 sentinel parallel-syncs mymaster 1
C:Program FilesRedis6381
# 这个是Redis6379配置内容,其他文件同理新增然后改一下端口即可,26380,和 26381。 #当前Sentinel服务运行的端口 port 26381 # 哨兵监听的主服务器 sentinel monitor mymaster 127.0.0.1 6381 1 # 3s内mymaster无响应,则认为mymaster宕机了 sentinel down-after-milliseconds mymaster 3000 #如果10秒后,mysater仍没启动过来,则启动failover sentinel failover-timeout mymaster 10000 # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步 sentinel parallel-syncs mymaster 1
三个配置文件保存后,我们就可以启动哨兵模式了,使用命令:redis-server sentinel.conf --sentinel 来启动哨兵模式。
在启动哨兵模式之前,我们先看下Redis 6379 的主从关系
C:Userschenwolong>redis-cli 127.0.0.1:6379> ping PONG 127.0.0.1:6379> info replication # Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=56,lag=0 slave1:ip=127.0.0.1,port=6381,state=online,offset=56,lag=0 master_replid:14e7fa5c97a668fbde7cccb90b43be389f540e71 master_replid2:0000000000000000000000000000000000000000 master_repl_offset:56 second_repl_offset:-1 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:56 127.0.0.1:6379>
有上述脚本可知,6379下有两个从机,分别是6380和6381,符合哨兵模式的条件,我们来启动哨兵
C:Userschenwolong>cd C:Program FilesRedis C:Program FilesRedis>redis-server sentinel.conf --sentinel [16636] 24 Mar 16:02:09.387 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo [16636] 24 Mar 16:02:09.387 # Redis version=5.0.10, bits=64, commit=1c047b68, modified=0, pid=16636, just started [16636] 24 Mar 16:02:09.388 # Configuration loaded _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 5.0.10 (1c047b68/0) 64 bit .-`` .-```. ```/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 16636 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [16636] 24 Mar 16:02:09.392 # WARNING: Sentinel was not able to save the new configuration on disk!!!: 拒绝访问。 [16636] 24 Mar 16:02:09.392 # Sentinel ID is 745d188ceceddd8becfd013e83e4fd2b1c3329cf [16636] 24 Mar 16:02:09.392 # +monitor master mymaster 127.0.0.1 6379 quorum 1 [16636] 24 Mar 16:02:09.394 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:02:09.394 # WARNING: Sentinel was not able to save the new configuration on disk!!!: 拒绝访问。 [16636] 24 Mar 16:02:09.395 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:02:09.395 # WARNING: Sentinel was not able to save the new configuration on disk!!!: 拒绝访问。
上述脚本中的警告,拒绝访问,我们先不管他,不影响使用。
到此,Redis的哨兵启动成功。那么,我们人为的将Redis主机搞挂机,看看哨兵的反应,如下:
搞坏主机【关闭6379Redis服务】:
127.0.0.1:6379> shutdown not connected> exit
主机挂机后,哨兵输出了这些东西,如下:
[16636] 24 Mar 16:03:47.791 # +sdown master mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:47.791 # +odown master mymaster 127.0.0.1 6379 #quorum 1/1 [16636] 24 Mar 16:03:47.793 # +new-epoch 1 [16636] 24 Mar 16:03:47.793 # +try-failover master mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:47.794 # WARNING: Sentinel was not able to save the new configuration on disk!!!: 拒绝访问。 [16636] 24 Mar 16:03:47.794 # +vote-for-leader 745d188ceceddd8becfd013e83e4fd2b1c3329cf 1 [16636] 24 Mar 16:03:47.794 # +elected-leader master mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:47.794 # +failover-state-select-slave master mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:47.895 # +selected-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:47.895 * +failover-state-send-slaveof-noone slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:47.958 * +failover-state-wait-promotion slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:48.804 # WARNING: Sentinel was not able to save the new configuration on disk!!!: 拒绝访问。 [16636] 24 Mar 16:03:48.804 # +promoted-slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:48.805 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:48.865 * +slave-reconf-sent slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:49.880 * +slave-reconf-inprog slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:49.880 * +slave-reconf-done slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:49.970 # +failover-end master mymaster 127.0.0.1 6379 [16636] 24 Mar 16:03:49.970 # +switch-master mymaster 127.0.0.1 6379 127.0.0.1 6381 [16636] 24 Mar 16:03:49.970 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381 [16636] 24 Mar 16:03:49.970 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
由输出的内容,我们得知,目前新的主机已经选出来了,他是6381Redis服务,我们看下6381的主从关系:
C:Userschenwolong>redis-cli -p 6381 127.0.0.1:6381> slaveof 127.0.0.1 6379 OK 127.0.0.1:6381> info replication # Replication role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=15250,lag=1 master_replid:eabd60916330b221b23b93f74b42b1b59c1a0f16 master_replid2:14e7fa5c97a668fbde7cccb90b43be389f540e71 master_repl_offset:15250 second_repl_offset:6548 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:1 repl_backlog_histlen:15250 127.0.0.1:6381>
现在6381的角色为master,他有一个从机6380,6380的角色为slave 。
那么现在问题来了,如果主机6379经过修复后,又回来了,它将会是什么角色,哨兵有什么反应?
[16636] 24 Mar 16:03:52.984 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 [16636] 24 Mar 16:09:08.932 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381 [16636] 24 Mar 16:09:18.973 * +convert-to-slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
从输出脚本来看,6379回来后,主机依旧是6381,他充当了6381的从机。
OK,以上便是哨兵模式的简单介绍。
最后,通过C#结合bat文件,我们写个windows 服务来启动我们的两个从机服务和哨兵服务。
新建Redis.bat 和 sentinel.bat 文件,编辑内容为:
Redis.bat
redis-server redis.windows.conf
sentinel.bat
redis-server sentinel.conf --sentinel
保存后,分别粘贴在:C:Program FilesRedis 和 C:Program FilesRedis6380 和 C:Program FilesRedis6381文件夹下面
启动代码如下:【建议将exe设置为管理员运行】
using Iot.Dal; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace LocationExe { class Program { static void Main(string[] args) { //启动6380 和 6381 Redis服务 Task.Run(delegate { StartProcess(@"C:Program FilesRedis6380", "Redis.bat"); }); Task.Run(delegate { StartProcess(@"C:Program FilesRedis6381", "Redis.bat"); }); //60秒的时间 ZooKeeper 启动完成 如果30秒都不能启动完成,要么出问题了,要么您该换服务器了 Thread.Sleep(3000); //启动kafka Task.Run(delegate { StartProcess(@"C:Program FilesRedis", "sentinel.bat"); }); Console.Read(); } private static void StartProcess(string path ,string fileName) { Process proc = new Process(); string targetDir = string.Format(path); proc.StartInfo.WorkingDirectory = targetDir; proc.StartInfo.FileName = fileName; proc.StartInfo.Arguments = string.Format("10"); proc.Start(); proc.WaitForExit(); } } }
我写的exe程序,修改为windows服务即可。
程序运行后,会分别启动各个服务,截图如下:
@天才卧龙的博客