`

redis-sentinel【收藏】

阅读更多

redis-sentinel:

redis作为一个存储系统,可靠性非常重要,为此redis提供了哨兵的功能来检测master状态,并在master实例异常的时 实现主从库的切换,被集成在2.4以上的版本。

 

首先 redis-sentinel 是redis官方自带的工具,用于管理多个Redis服务器实例,使用的时候只需要启动若干个sentinel实例即可

其次redis-sentinel 是暴露服务的,可以通过spring-data-redis 等现有的工具做切换。

 

过程以及效果:

 1. 监控(Monitoring)Sentinel 会不断地检查你的主服务器和从服务器是否运作正常
 2. 提醒(Notification) 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知
 3. 自动故障迁移(Automatic failover) 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。

 

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

 

 

 

1.集群环境

1.Linux服务器列表
使用4台CentOS Linux服务器搭建环境,其IP地址如下:
  1. 192.168.110.100
  2. 192.168.110.101
  3. 192.168.110.102
  4. 192.168.110.103
2.Redis服务部署环境
192.168.110.100
启动多个Redis sentinel服务,构成Redis sentinel集群
192.168.110.101
启动Redis服务,设置成主节点
192.168.110.102
启动Redis服务,设置成192.168.110.101的从节点
192.168.110.103
启动Redis服务,设置成192.168.110.101的从节点

2.配置并启动Redis主从集群

1.修改redis.conf配置文件
主节点的redis配置文件使用默认的配置文件就可以了,从节点的redis配置文件修改如下:
  1. # Master-Slave replication. Use slaveof to make a Redis instance a copy of
  2. # another Redis server. A few things to understand ASAP about Redis replication.
  3. #
  4. # 1) Redis replication is asynchronous, but you can configure a master to
  5. # stop accepting writes if it appears to be not connected with at least
  6. # a given number of slaves.
  7. # 2) Redis slaves are able to perform a partial resynchronization with the
  8. # master if the replication link is lost for a relatively small amount of
  9. # time. You may want to configure the replication backlog size (see the next
  10. # sections of this file) with a sensible value depending on your needs.
  11. # 3) Replication is automatic and does not need user intervention. After a
  12. # network partition slaves automatically try to reconnect to masters
  13. # and resynchronize with them.
  14. #
  15. # 主从同步。通过 slaveof 配置来实现Redis实例的备份。
  16. # 注意,这里是本地从远端复制数据。也就是说,本地可以有不同的数据库文件、绑定不同的IP、监听不同的端口。
  17. #
  18. # slaveof <masterip> <masterport>
  19. slaveof 192.168.110.1016379
注意:两台从节点都要改。
2.启动Redis主从集群
先启动192.168.110.101主节点,使用默认配置,脚本:
  1. [lizhiwei@localhost bin]$ ./redis-server
再启动192.168.110.102和192.168.110.103从节点,使用刚才的配置,脚本:
  1. ./redis-server redis.conf
3.查看集群
192.168.110.101主节点Replication信息
  1. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  2. # Replication
  3. role:master
  4. connected_slaves:2
  5. slave0:ip=192.168.110.102,port=6379,state=online,offset=659,lag=1
  6. slave1:ip=192.168.110.103,port=6379,state=online,offset=659,lag=0
  7. master_repl_offset:659
  8. repl_backlog_active:1
  9. repl_backlog_size:1048576
  10. repl_backlog_first_byte_offset:2
  11. repl_backlog_histlen:658
192.168.110.102从节点Replication信息
  1. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  2. # Replication
  3. role:slave
  4. master_host:192.168.110.101
  5. master_port:6379
  6. master_link_status:up
  7. master_last_io_seconds_ago:3
  8. master_sync_in_progress:0
  9. slave_repl_offset:701
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_repl_offset:0
  14. repl_backlog_active:0
  15. repl_backlog_size:1048576
  16. repl_backlog_first_byte_offset:0
  17. repl_backlog_histlen:0
192.168.110.103从节点Replication信息
  1. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  2. # Replication
  3. role:slave
  4. master_host:192.168.110.101
  5. master_port:6379
  6. master_link_status:up
  7. master_last_io_seconds_ago:9
  8. master_sync_in_progress:0
  9. slave_repl_offset:715
  10. slave_priority:100
  11. slave_read_only:1
  12. connected_slaves:0
  13. master_repl_offset:0
  14. repl_backlog_active:0
  15. repl_backlog_size:1048576
  16. repl_backlog_first_byte_offset:0
  17. repl_backlog_histlen:0
此时,存储到192.168.110.101主节点的数据,在从节点中都可以查询到。从节点会备份主节点的数据。

3.配置sentinel集群并启动

1.创建sentinel.conf配置文件
  1. port 26379
  2. # sentinel announce-ip <ip>
  3. # sentinel announce-port <port>
  4. dir /tmp
  5. ################################# master001 #################################
  6. sentinel monitor master001 192.168.110.10163792
  7. # sentinel auth-pass <master-name> <password>
  8. sentinel down-after-milliseconds master001 30000
  9. sentinel parallel-syncs master001 1
  10. sentinel failover-timeout master001 180000
  11. # sentinel notification-script <master-name> <script-path>
  12. # sentinel client-reconfig-script <master-name> <script-path>
  13. # 可以配置多个master节点
  14. ################################# master002 #################################
配置文件说明:
1. port :当前Sentinel服务运行的端口
 
2. dir : Sentinel服务运行时使用的临时文件夹
 
3.sentinel monitor master001 192.168.110.10163792:Sentinel去监视一个名为master001的主redis实例,这个主实例的IP地址为本机地址192.168.110.101,端口号为6379,而将这个主实例判断为失效至少需要2个 Sentinel进程的同意,只要同意Sentinel的数量不达标,自动failover就不会执行
 
4.sentinel down-after-milliseconds master001 30000:指定了Sentinel认为Redis实例已经失效所需的毫秒数。当实例超过该时间没有返回PING,或者直接返回错误,那么Sentinel将这个实例标记为主观下线。只有一个 Sentinel进程将实例标记为主观下线并不一定会引起实例的自动故障迁移:只有在足够数量的Sentinel都将一个实例标记为主观下线之后,实例才会被标记为客观下线,这时自动故障迁移才会执行
 
5.sentinel parallel-syncs master001 1指定了在执行故障转移时,最多可以有多少个从Redis实例在同步新的主实例,在从Redis实例较多的情况下这个数字越小,同步的时间越长,完成故障转移所需的时间就越长
 
6.sentinel failover-timeout master001 180000如果在该时间(ms)内未能完成failover操作,则认为该failover失败
 
7.sentinel notification-script <master-name> <script-path>指定sentinel检测到该监控的redis实例指向的实例异常时,调用的报警脚本。该配置项可选,但是很常用
2.启动sentinel集群
创建3个sentinel.conf配置文件:sentinel001.conf、sentinel002.conf、sentinel003.conf并修改端口号分别为:263793637946379,并启动服务:
  1. ./redis-sentinel sentinel001.conf
  2. ./redis-sentinel sentinel002.conf
  3. ./redis-sentinel sentinel003.conf
启动三个sentinel服务后会在其控制台看到如下信息:
./redis-sentinel sentinel001.conf,端口:26379
  1. [7743]01Oct06:20:38.162# Sentinel runid is ba6c42e1accc31290e11d5876275e1562564295d
  2. [7743]01Oct06:20:38.162# +monitor master master001 192.168.110.101 6379 quorum 2
  3. [7743]01Oct06:20:39.110*+slave slave 192.168.110.102:6379192.168.110.1026379@ master001 192.168.110.1016379
  4. [7743]01Oct06:20:39.111*+slave slave 192.168.110.103:6379192.168.110.1036379@ master001 192.168.110.1016379
  5. [7743]01Oct06:25:07.595*+sentinel sentinel 192.168.110.100:36379192.168.110.10036379@ master001 192.168.110.1016379
  6. [7743]01Oct06:26:11.170*+sentinel sentinel 192.168.110.100:46379192.168.110.10046379@ master001 192.168.110.1016379
./redis-sentinel sentinel002.conf,端口:36379
  1. [7795]01Oct06:25:05.538# Sentinel runid is 52c14768b15837fb601b26328acf150c6bd30682
  2. [7795]01Oct06:25:05.538# +monitor master master001 192.168.110.101 6379 quorum 2
  3. [7795]01Oct06:25:06.505*+slave slave 192.168.110.102:6379192.168.110.1026379@ master001 192.168.110.1016379
  4. [7795]01Oct06:25:06.515*+slave slave 192.168.110.103:6379192.168.110.1036379@ master001 192.168.110.1016379
  5. [7795]01Oct06:25:07.557*+sentinel sentinel 192.168.110.100:26379192.168.110.10026379@ master001 192.168.110.1016379
  6. [7795]01Oct06:26:11.168*+sentinel sentinel 192.168.110.100:46379192.168.110.10046379@ master001 192.168.110.1016379
./redis-sentinel sentinel003.conf,端口:46379
  1. [7828]01Oct06:26:09.076# Sentinel runid is c8509594be4a36660b2122b3b81f4f74060c9b04
  2. [7828]01Oct06:26:09.076# +monitor master master001 192.168.110.101 6379 quorum 2
  3. [7828]01Oct06:26:10.063*+slave slave 192.168.110.102:6379192.168.110.1026379@ master001 192.168.110.1016379
  4. [7828]01Oct06:26:10.071*+slave slave 192.168.110.103:6379192.168.110.1036379@ master001 192.168.110.1016379
  5. [7828]01Oct06:26:11.516*+sentinel sentinel 192.168.110.100:26379192.168.110.10026379@ master001 192.168.110.1016379
  6. [7828]01Oct06:26:11.674*+sentinel sentinel 192.168.110.100:36379192.168.110.10036379@ master001 192.168.110.1016379
每个sentinel服务能知道其他所有的服务!

4.测试sentinel集群

1.停止192.168.110.101主节点
停止192.168.110.101Redis主节点后,在查看Replication信息如下:
  1. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  2. Could not connect to Redis at 192.168.110.101:6379:Connection refused
  3. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  4. # Replication
  5. role:slave
  6. master_host:192.168.110.103
  7. master_port:6379
  8. master_link_status:up
  9. master_last_io_seconds_ago:1
  10. master_sync_in_progress:0
  11. slave_repl_offset:29128
  12. slave_priority:100
  13. slave_read_only:1
  14. connected_slaves:0
  15. master_repl_offset:0
  16. repl_backlog_active:0
  17. repl_backlog_size:1048576
  18. repl_backlog_first_byte_offset:0
  19. repl_backlog_histlen:0
  20. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  21. # Replication
  22. role:master
  23. connected_slaves:1
  24. slave0:ip=192.168.110.102,port=6379,state=online,offset=30456,lag=1
  25. master_repl_offset:30456
  26. repl_backlog_active:1
  27. repl_backlog_size:1048576
  28. repl_backlog_first_byte_offset:2
  29. repl_backlog_histlen:30455
  30. [lizhiwei@localhost bin]$
发现192.168.110.101Redis主节点已经不能连接,192.168.110.103成了主节点!
2.再启动192.168.110.101主节点
再启动192.168.110.101Redis主节点后,在查看Replication信息如下:
  1. ### 启动脚本,仍然使用默认配置
  2. [lizhiwei@localhost bin]$ ./redis-server
  3. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  4. # Replication
  5. role:slave
  6. master_host:192.168.110.103
  7. master_port:6379
  8. master_link_status:up
  9. master_last_io_seconds_ago:1
  10. master_sync_in_progress:0
  11. slave_repl_offset:57657
  12. slave_priority:100
  13. slave_read_only:1
  14. connected_slaves:0
  15. master_repl_offset:0
  16. repl_backlog_active:0
  17. repl_backlog_size:1048576
  18. repl_backlog_first_byte_offset:0
  19. repl_backlog_histlen:0
  20.  
  21. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  22. # Replication
  23. role:slave
  24. master_host:192.168.110.103
  25. master_port:6379
  26. master_link_status:up
  27. master_last_io_seconds_ago:0
  28. master_sync_in_progress:0
  29. slave_repl_offset:60751
  30. slave_priority:100
  31. slave_read_only:1
  32. connected_slaves:0
  33. master_repl_offset:0
  34. repl_backlog_active:0
  35. repl_backlog_size:1048576
  36. repl_backlog_first_byte_offset:0
  37. repl_backlog_histlen:0
  38.  
  39. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  40. # Replication
  41. role:master
  42. connected_slaves:2
  43. slave0:ip=192.168.110.102,port=6379,state=online,offset=63247,lag=1
  44. slave1:ip=192.168.110.101,port=6379,state=online,offset=63247,lag=1
  45. master_repl_offset:63393
  46. repl_backlog_active:1
  47. repl_backlog_size:1048576
  48. repl_backlog_first_byte_offset:2
  49. repl_backlog_histlen:63392
  50. [lizhiwei@localhost bin]$
发现192.168.110.101节点启动后还再集群中,只不过成了从节点,192.168.110.103仍然是主节点,但是现在又有两个从节点了!
3.只留下一个sentinel服务,再停止192.168.110.103主节点,查看Redis集群是否出现新的主节点
停止sentinel服务,只留下一个sentinel服务,再停止Redis主节点,查看Replication信息如下:
  1. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.101 info Replication
  2. # Replication
  3. role:slave
  4. master_host:192.168.110.103
  5. master_port:6379
  6. master_link_status:down
  7. master_last_io_seconds_ago:-1
  8. master_sync_in_progress:0
  9. slave_repl_offset:184231
  10. master_link_down_since_seconds:43
  11. slave_priority:100
  12. slave_read_only:1
  13. connected_slaves:0
  14. master_repl_offset:0
  15. repl_backlog_active:0
  16. repl_backlog_size:1048576
  17. repl_backlog_first_byte_offset:0
  18. repl_backlog_histlen:0
  19. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.102 info Replication
  20. # Replication
  21. role:slave
  22. master_host:192.168.110.103
  23. master_port:6379
  24. master_link_status:down
  25. master_last_io_seconds_ago:-1
  26. master_sync_in_progress:0
  27. slave_repl_offset:184231
  28. master_link_down_since_seconds:52
  29. slave_priority:100
  30. slave_read_only:1
  31. connected_slaves:0
  32. master_repl_offset:0
  33. repl_backlog_active:0
  34. repl_backlog_size:1048576
  35. repl_backlog_first_byte_offset:0
  36. repl_backlog_histlen:0
  37. [lizhiwei@localhost bin]$ ./redis-cli -h 192.168.110.103 info Replication
  38. Could not connect to Redis at 192.168.110.103:6379:Connection refused
发现192.168.110.103主节点已经不能连接了,也不存在Redis主节点,集群中无主节点了!!!分析原因是:sentinel.conf配置的sentinel monitor master001 192.168.110.10163792最后一个参数是2导致,若是但节点此配置的最后一个参数要使用是1。(此原因我已证实)
注意:在生产环境下建议sentinel节点的数量能在3个以上,并且最好不要在同一台机器上(使用同一网卡)。

 

结合spring

 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxTotal" value="${redis.pool.maxActive}"/>
        <property name="maxIdle" value="${redis.pool.maxIdle}"/>
        <property name="maxWaitMillis" value="${redis.pool.maxWait}"/>
        <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
    </bean>

    <bean id="redisSentinel" class="redis.clients.jedis.JedisSentinelPool">
        <constructor-arg index="0" value="mymaster"/>
        <constructor-arg index="1">
            <set>
                <value>10.88.140.113:26379</value>
                <value>10.88.140.112:26379</value>
            </set>
        </constructor-arg>
        <constructor-arg index="2" ref="jedisPoolConfig"/>
        <constructor-arg index="3" value="PassW0rd12"/>
    </bean>

    <bean id="dataBase" class="com.qunar.flight.inter.seo.job.DataBase"
          init-method="init"/>

 

 

 

 

 

分享到:
评论

相关推荐

    基于phpredis封装的redis-sentinel客户端redis-sentinel.zip

    示例:$sentinel = new \Jenner\RedisSentinel\Sentinel(); $sentinel-&gt;connect('127.0.0.1', 6379); $address = $sentinel-&gt;getMasterAddrByName('mymaster'); $redis = new Redis(); $redis-&gt;connect($...

    Windows环境Redis-Sentinel安装

    在Windows环境下安装Redis Sentinel是一个重要的步骤,因为它提供了高可用性(HA)解决方案,确保了主Redis服务器的故障能够被自动检测并切换到备选节点。Redis Sentinel系统是Redis集群中的监控、通知和故障转移...

    PyPI 官网下载 | django-redis-sentinel-plugin-1.0.0.tar.gz

    《PyPI上的django-redis-sentinel-plugin-1.0.0:构建高效稳定的Django Redis缓存系统》 在Python的世界里,PyPI(Python Package Index)是开发者们分享和获取开源软件包的主要平台。"django-redis-sentinel-...

    Redis-Sentinel高可用架构学习

    "Redis-Sentinel高可用架构学习" Redis-Sentinel高可用架构学习是Redis官方推荐的高可用性解决方案。当使用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动...

    redis集群:redis-sentinel(哨兵机制)集群

    Redis Sentinel(哨兵)是Redis集群中的一个重要组件,它提供了高可用性解决方案,确保当主节点发生故障时,能够自动将从节点提升为主节点,从而维持服务的连续性。哨兵系统通过监控、通知和自动故障转移来实现这一...

    redis-sentinel高可用一键配置工具

    该资源是本人在学习redis过程中积累总结的经验以分享给大家:redis-sentinel高可用一键配置工具就是一键帮你从下载-&gt;安装-&gt;配置 好 redis 高可用的服务环境,省去了很多弯路,节约了更多的时间花在自己项目的主要...

    Kubernetes(k8s)-nacos-sentinel-rocketmq-zipkin-elasticsearch-redis-mysql.zip

    Kubernetes(k8s)-nacos-sentinel-rocketmq-zipkin-elasticsearch-redis-mysqlk8s-nacos-sentinel-rocketmq-zipkin-elasticsearch-redis-mysqlKubernetes(k8s)-nacos-sentinel-rocketmq-zipkin-elasticsearch-...

    redis-sentinel.conf

    dir "/usr/local/etc/redis6370" # 修改启动端口,依次修改为,26371,26372,26373 port 26370 # 添加关闭保护模式 protected-mode no # 修改sentinel monitor,这个不需要改动,都一样就可以,注意顺序,这个...

    redis安装文件Redis-x64-3.2.10、Redis-x64-3.0.50

    8. Sentinel监控与故障转移:Redis Sentinel系统用于监控Redis实例,当检测到主服务器失效时,它能自动触发故障转移,将从服务器提升为主服务器。 9. Cluster集群:Redis 3.0及以上版本引入了Cluster特性,支持数据...

    Redis-6.2.4 windows编译版

    6. `redis-sentinel.exe`:Redis Sentinel是高可用性解决方案的一部分,它可以监控主从集群,自动处理主服务器故障切换。 在Windows环境下,启动Redis服务器一般通过运行`redis-server.exe`来完成,同时可以配置`...

    docker-compose安装redis-sentinel集群(1主+2副+2哨兵)

    docker-compose安装redis-sentinel集群(1主+2副+2哨兵)

    redis-windows-7.0.10.zip

    在高可用性架构中,还可以使用Sentinel或者Cluster来监控和管理多个Redis实例,自动处理故障转移。 为了保证Redis服务的安全性,还需要关注访问控制和密码认证。Redis 6.0开始引入了TLS/SSL加密支持,以保护数据...

    bitnami-docker-redis-sentinel-exporter

    $ docker run --name redis-sentinel-exporter bitnami/redis-sentinel-exporter:latest 为什么要使用Bitnami Images? Bitnami密切跟踪上游源代码变化,并使用我们的自动化系统及时发布该图像的新版本。 对于...

    bitnami-docker-redis-sentinel:Bitnami Redis前哨Docker映像

    Bitnami包装的Redis(TM)Sentinel是什么? 免责声明:REDIS(r)是Redis Labs Ltd.的注册商标。RedisLabs Ltd.保留任何权利。Bitnami的任何使用仅供参考,并不表示Redis Labs Ltd之间有任何赞助,认可或从属关系。 ...

    Redis-7.0.5-x64 for Windows 64位版 Redis 7.0.5

    7. **redis-sentinel.exe**: Redis Sentinel的可执行文件,用于启动Sentinel服务,监控和管理Redis集群的高可用性。 8. **redis-check-aof.exe**: 类似于redis-check-rdb,但专门用于检查AOF(Append Only File)...

    Redis-Windows-6.2.6.zip

    `sentinel.conf`是Redis Sentinel的配置文件,用于实现高可用性。Sentinel系统可以监控主从节点的状态,当主节点故障时自动进行故障转移。在Windows环境下,同样需要根据实际需求配置Sentinel的参数,如哨兵实例的...

    redis-stack-server-6.2.6-v7.rhel7.x86-64.tar.gz

    2. **Redis Sentinel**: 高可用性解决方案,监控、故障检测以及自动故障迁移,确保服务的连续性。 3. **Redis Cluster**: 分布式数据库系统,允许在多个节点之间分发数据,实现水平扩展。 4. **Redis Modules**: ...

    redis-7.2-x64-for-windows-bin.zip

    3. **run-sentinel.bat**: 这个批处理文件用于启动Redis Sentinel。Sentinel是Redis的一个组件,用于监控、故障转移和配置更新,以提供高可用性。启动此脚本可以管理和监控多个Redis实例。 4. **run-cluster.bat**:...

    redis-sentinel-bin.7z

    这个"redis-sentinel-bin.7z"压缩包包含了部署Redis Sentinel伪集群所需的基础组件和配置文件。下面将详细介绍Redis Sentinel、哨兵集群部署、Redis集群配置、RDB和AOF的相关知识点。 **Redis Sentinel** Redis ...

    Redis-7.0.0-x64 for Windows 64位版 Redis 7.0.0

    - `sentinel.conf`用于配置Redis Sentinel,这是一个高可用性解决方案,负责监控、故障检测和自动故障转移。 5. **工具**: - `redis-server.exe`是Redis服务器的执行文件,负责处理客户端的请求和数据存储。 - ...

Global site tag (gtag.js) - Google Analytics