zoukankan      html  css  js  c++  java
  • 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: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
    View Code

    从启动成功的指令中,我们能读到从机会连接主机,并备份主机的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>
    View Code

    从机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>
    View Code

    从机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>
    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: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!!!: 拒绝访问。
    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: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();
            }
        }
    }
    View Code

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

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

    @天才卧龙的博客

  • 相关阅读:
    155. 最小栈
    160. 相交链表
    PAT 1057 Stack
    PAT 1026 Table Tennis
    PAT 1017 Queueing at Bank
    PAT 1014 Waiting in Line
    PAT 1029 Median
    PAT 1016 Phone Bills
    PAT 1010 Radix
    PAT 1122 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/chenwolong/p/14566499.html
Copyright © 2011-2022 走看看