• 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服务即可。

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

    @天才卧龙的博客

  • 相关阅读:
    iOS UITableViewCell中包含UICollectionView嵌套 解决UITableViewCell显示异常
    mac 终端创建podfile文件
    iOS UIScrollView弹性问题
    NSMutableParagraphStyle与NSParagraphStyle的使用
    iOS 单个控制器隐藏 导航栏下划线
    iOS UICollectionView reloadData后立即获取contentSize.height高度
    高德地图API开发二三事(一)如何判断点是否在折线上及引申思考
    Python-6
    Python-模块
    python-递归函数和内置函数笔记汇总
  • 原文地址:https://www.cnblogs.com/chenwolong/p/14566499.html
Copyright © 2020-2023  润新知