windows环境下配置Redis主从复制-一主二仆,薪火相传、反客为主、哨兵模式

十年河东,十年河西,莫欺少年穷

首先说下,我的 Redis 系列博客如下:

[置顶] 高并发时,使用Redis应注意的问题【缓存穿透、缓存击穿.、缓存雪崩】

windows环境下配置Redis主从复制-一主二仆,薪火相传、反客为主、哨兵模式

Redis 持久化技术 ,大名鼎鼎的Rdb和Aof,你会选谁呢?

简单介绍下Redis消息队列,实际生产环境中,大数据高并发时,不建议使用Redis做消息队列中间件

Redis 事务,和传统的关系型数据库ACID并不同,别搞混了

Redis常用配置redis.conf介绍,别把默认配置部署到到服务器,否则,会被领导骂的

C# Nuget程序集StackExchange.Redis操作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:\Users\chenwolong>cd C:\Program Files\Redis6380

C:\Program Files\Redis6380>redis-server redis.windows.conf

4.2、6381启动指令如下:

C:\Users\chenwolong>cd  C:\Program Files\Redis6381

C:\Program Files\Redis6381>redis-server redis.windows.conf

启动成功后,报文如下:

C:\Users\chenwolong>cd  C:\Program Files\Redis6381

C:\Program Files\Redis6381>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
View Code

从启动成功的指令中,我们能读到从机会连接主机,并备份主机的Rdb和Aof文件。

截止到这儿,我们的三台服务启动成功,默认的6379我一直都在运行。

然后,我们就可以针对这三台Redis服务器做一些测试了,如下:

5、配置结果查看

5.1、开三个CMD窗口,连接服务器,并查看主从关系,指令: info replication

主机6379

C:\Users\chenwolong>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>
View Code

从机6380

C:\Users\chenwolong>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>
View Code

从机6381

C:\Users\chenwolong>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>
View Code

看到上面的信息,是不是倍感亲切,因为从显示的结果说明,我们的 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:\Users\chenwolong>cd C:\Program Files\Redis6381

C:\Program Files\Redis6381>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:\Users\chenwolong>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:\Users\chenwolong>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:\Users\chenwolong>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:\Users\chenwolong>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 Files\Redis 和 C:\Program Files\Redis6380 和 C:\Program Files\Redis6381下面创建 sentinel.conf ,其配置如下:

C:\Program Files\Redis 

# 这个是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 Files\Redis6380

 

# 这个是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 Files\Redis6381

# 这个是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:\Users\chenwolong>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:\Users\chenwolong>cd C:\Program Files\Redis

C:\Program Files\Redis>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!!!: 拒绝访问。
View Code

上述脚本中的警告,拒绝访问,我们先不管他,不影响使用。

到此,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
View Code

由输出的内容,我们得知,目前新的主机已经选出来了,他是6381Redis服务,我们看下6381的主从关系:

C:\Users\chenwolong>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 Files\Redis 和 C:\Program Files\Redis6380 和 C:\Program Files\Redis6381文件夹下面

启动代码如下:【建议将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 Files\Redis6380", "Redis.bat"); });
            Task.Run(delegate { StartProcess(@"C:\Program Files\Redis6381", "Redis.bat"); });
            //60秒的时间  ZooKeeper 启动完成  如果30秒都不能启动完成,要么出问题了,要么您该换服务器了
            Thread.Sleep(3000);
            //启动kafka
            Task.Run(delegate { StartProcess(@"C:\Program Files\Redis", "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();
        }
    }
}
View Code

我写的exe程序,修改为windows服务即可。

程序运行后,会分别启动各个服务,截图如下:

 

 

@天才卧龙的博客

posted @ 2021-03-25 14:33  天才卧龙  阅读(743)  评论(0编辑  收藏  举报