この投稿は自分のブログ記事からRedis Sentinel関連の項目だけ抜粋したものです。追記事項があればブログの方に書いていきます。
「Redisの監視/分析系ツールまとめ」 http://rest-term.com/archives/3045/
Redis Sentinel
Redis本家プロジェクトで開発されている、Redisサーバの死活監視/通知および自動フェイルオーバー機能を提供する管理サーバ(redis-sentinel)です。v2.4.16または2.6.0-rc6以降のバージョンから利用可能になりました。公式ドキュメントを参考にしつつ動作確認をします。
- 環境: CentOS 5.9 (x86_64), Redis 2.6.10
構成
ここでは2つのホストでSlaveを2プロセス、Sentinelを3プロセスの構成で試します。
- Master db0:6379
- Slave db0:6380, db1:6379
- Sentinel db0:26379, db0:23680, db1:26379
設定
# port <sentinel-port>
port 26379
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster db0 6379 2
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 5000
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 900000
# sentinel can-failover <master-name> <yes|no>
sentinel can-failover mymaster yes
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
各設定項目について表にしています。Sentinelによるクラスタ監視はいわゆるQuorumベース投票の方式を採ります。複数のSentinelがMasterを監視していて、その内しきい値数以上のSentinelがMasterのダウンを検知したらフェイルオーバー処理を開始します。
設定項目 | 概要 |
monitor | Masterのホストとポートおよび状態が**ODOWN(objectively down)**に移行するための定足数(quorum) |
down-after-milliseconds | Master/Slaveのダウン検知後、状態が**SDOWN(subjectively down)**に移行するまでの時間(ms) |
failover-timeout | フェイルオーバー処理のタイムアウト(ms) |
can-failover | フェイルオーバー処理が実行可能か(yes/no) |
parallel-syncs | SlaveをMasterに昇格させた後、いくつのSlaveと同期させるか |
SentinelはMasterとSlave両方の死活監視をしてくれますが、状態がODOWNに遷移するのはMasterのみなので注意してください。can-failover を no にして起動したSentinelプロセスはフェイルオーバー処理自体は行わず(他のSentinelに任せる)、自身はダウン検知と投票処理のみを行います。
起動
Sentinel起動前にレプリケーションが動作していることを確認しておきます。
redis db0:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:db0,6380,online
slave1:db1,6379,online
続けて3つのSentinelプロセスを立ち上げます。
$ redis-sentinel /etc/redis/sentinel.conf
## または redis-server をsentinelモードで起動する
$ redis-server /etc/redis/sentinel.conf --sentinel
ログにて各SlaveおよびSentinelと接続したことを確認できます。
[19069] 14 May 16:30:31.909 * +slave slave db1:6379 db1 6379 @ mymaster db0 6379
[19069] 14 May 16:30:31.909 * +slave slave db0:6380 db0 6380 @ mymaster db0 6379
[19069] 14 May 16:30:38.320 * +sentinel sentinel db0:26380 db0 26380 @ mymaster db0 6379
[19069] 14 May 16:30:39.655 * +sentinel sentinel db1:26379 db1 26379 @ mymaster db0 6379
また、Sentinel起動後はINFOコマンドでSentinel関連の情報を確認ができます。
redis db0:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=db0:6379,slaves=2,sentinels=3
Sentinelプロセス自体の監視は一番下の項目を見るようにすれば良いかと思います。
フェイルオーバー処理の動作確認の為、ここでMasterを落とします。
redis db0:6379> shutdown
ログにてフェイルオーバー処理の進捗を確認できます。
[19069] 14 May 16:30:51.170 # +sdown master mymaster db0 6379
[19069] 14 May 16:30:52.386 # +odown master mymaster db0 6379 #quorum 2/2
[19069] 14 May 16:30:52.386 # +failover-triggered master mymaster db0 6379
[19069] 14 May 16:30:52.386 # +failover-state-wait-start master mymaster db0 6379 #starting in 13910 milliseconds
[19069] 14 May 16:31:06.379 # +failover-state-select-slave master mymaster db0 6379
[19069] 14 May 16:31:06.480 # +selected-slave slave db1:6379 db1 6379 @ mymaster db0 6379
[19069] 14 May 16:31:06.480 * +failover-state-send-slaveof-noone slave db1:6379 db1 6379 @ mymaster db0 6379
[19069] 14 May 16:31:06.583 * +failover-state-wait-promotion slave db1:6379 db1 6379 @ mymaster db0 6379
[19069] 14 May 16:31:06.901 # +promoted-slave slave db1:6379 db1 6379 @ mymaster db0 6379
[19069] 14 May 16:31:06.902 # +failover-state-reconf-slaves master mymaster db0 6379
[19069] 14 May 16:31:06.991 * +slave-reconf-sent slave db0:6380 db0 6380 @ mymaster db0 6379
[19069] 14 May 16:31:07.294 * +slave-reconf-inprog slave db0:6380 db0 6380 @ mymaster db0 6379
[19069] 14 May 16:31:08.316 * +slave-reconf-done slave db0:6380 db0 6380 @ mymaster db0 6379
[19069] 14 May 16:31:08.417 # +failover-end master mymaster db0 6379
[19069] 14 May 16:31:08.417 # +switch-master mymaster db0 6379 db1 6379
[19069] 14 May 16:31:08.548 * +slave slave db0:6380 db0 6380 @ mymaster db1 6379
[19069] 14 May 16:31:09.068 * +sentinel sentinel db0:26380 db0 26380 @ mymaster db1 6379
[19069] 14 May 16:31:12.258 * +sentinel sentinel db1:26379 db1 26379 @ mymaster db1 6379
SentinelがMasterのダウンを検知すると状態がSDOWNに、quorumパラメータで指定した数のSDOWNが揃うと次はODOWNへと遷移、その後フェイルオーバー処理が開始されます。
最後に新しいMasterとSlaveで正常稼働していることを確認します。
redis db1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:db0,6380,online
以上、Sentinelによるフェイルオーバー機能の動作確認まで試してみました。
Sentinel API
SentinelはいくつかのAPIを提供しているので簡単に紹介したいと思います。
## SENTINEL masters
# 監視対象のMasterに関する情報を確認
redis 127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "6379"
7) "runid"
8) "b3b31e6c6d1fbb0cec5d179fd666ce00ea103746"
9) "flags"
10) "master"
11) "pending-commands"
12) "0"
13) "last-ok-ping-reply"
14) "568"
15) "last-ping-reply"
16) "568"
17) "info-refresh"
18) "9745"
19) "num-slaves"
20) "1"
21) "num-other-sentinels"
22) "1"
23) "quorum"
24) "2"
## SENTINEL slaves <master name>
# Slaveに関する情報を確認
redis 127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "127.0.0.1:6380"
3) "ip"
4) "127.0.0.1"
5) "port"
6) "6380"
7) "runid"
8) "17c0f7e7e4d2af0f5f6140ea0ceb0d82d0010aed"
9) "flags"
10) "s_down,slave,disconnected"
11) "pending-commands"
12) "0"
13) "last-ok-ping-reply"
14) "709377"
15) "last-ping-reply"
16) "709377"
17) "s-down-time"
18) "704333"
19) "info-refresh"
20) "712808"
21) "master-link-down-time"
22) "0"
23) "master-link-status"
24) "ok"
25) "master-host"
26) "127.0.0.1"
27) "master-port"
28) "6379"
29) "slave-priority"
30) "100"
## SENTINEL is-master-down-by-addr <ip> <port>
# Masterの死活確認
redis 127.0.0.1:26379> sentinel is-master-down-by-addr 127.0.0.1 6379
1) (integer) 0 ## 0:UP, 1:DOWN
2) "397dec99760d5d30043941fe4c1c35ba99e99ebf" ## Sentinel(subjective leader)のrun_id
## SENTINEL get-master-addr-by-name <master name>
# MasterのIP, Portを確認
redis 127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "127.0.0.1"
2) "6379"
## SENTINEL reset
# Sentinelの現在の状態をリセット(フェイルオーバー処理中であっても)
redis 127.0.0.1:26379> sentinel reset mymaster
(integer) 1
Sentinel関連の管理ツールを作る際にはこのSentinel APIをサポートしたクライアントライブラリを使うと楽かと思います。
以下、フェイルオーバー処理の挙動に関する部分をピックアップして紹介します。
昇格させるSlaveの選択
当然ですがSlaveとして正常に稼働しているプロセスが対象となります。細かい条件を省いてざっくり言うと、Masterとの接続が安定していて(ダウンタイムが少ない)、SentinelからのPING/INFOコマンドに直近5000ms以内に応答しているSlaveが対象になります(詳細は公式ドキュメントと src/sentinel.c を参照)。
対象となるSlaveが複数ある場合は slave_priority の値が小さいSlaveを選択します。
redis db0:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_priority:100 ## <- この値
slave_read_only:1
connected_slaves:0
同じ slave_priority のSlaveが存在する場合は run_id が小さいSlaveを選択します。
redis db0:6380> info
# Server
redis_version:2.6.10
redis_git_sha1:00000000
redis_git_dirty:0
redis_mode:standalone
os:Linux 2.6.18-194.26.1.el5 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.1.2
process_id:17468
run_id:17c0f7e7e4d2af0f5f6140ea0ceb0d82d0010aed ## <- この値
tcp_port:6380
uptime_in_seconds:1738
uptime_in_days:0
lru_clock:538965
2013/06現在は slave_priority の変更を行うAPIは公開されていないようですので、単に run_id が若いSlaveが選択されることになります。Slave選択のアルゴリズムは今後変更されることもあるでしょう。
Sentinels/Slavesの自動検出
Sentinelの設定にSlaveのリストを持たせる必要がないのは、SentinelがPub/Subによる情報共有を行っているからです。途中で別のSentinelやSlaveをオンラインで追加しても他のSentinelにその情報は伝わります。
## Sentinelは "__sentinel__:hello" チャンネルを利用している
redis db0:6379> subscribe __sentinel__:hello
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "__sentinel__:hello"
3) (integer) 1
1) "message"
2) "__sentinel__:hello"
3) "127.0.0.1:26380:77887a367e1c76ee9dc15f67a2fb3dc49bb00bf4:1"
1) "message"
2) "__sentinel__:hello"
3) "127.0.0.1:26379:3a92da7269b69fa1dcce5915068c4af6e8caf161:1"
1) "message"
2) "__sentinel__:hello"
3) "127.0.0.1:26380:77887a367e1c76ee9dc15f67a2fb3dc49bb00bf4:1"
1) "message"
2) "__sentinel__:hello"
3) "127.0.0.1:26379:3a92da7269b69fa1dcce5915068c4af6e8caf161:1"
メッセージの内容は host:port:run_id:can-failover となっていて、__sentinel__:hello チャンネルに5秒毎にpublish、全てのSentinelはこのチャンネルをsubscribeして情報共有しています。
レプリケーションの注意点
RedisのレプリケーションはMySQLなどのRDBMSのレプリケーションとは異なる部分が多いです。Redisはレプリケーション開始時に全てのデータをディスクに書き出してからSlaveに転送するのでI/Oやネットワーク帯域には注意してください。ただし、Redis v2.8ではPSYNC(Partial Resynchronization)が実装されるとのことなのでこの問題は解消されると思われます。
引き続きSentinelの検証を続けていきたいと思います。
http://qiita.com/wellflat/items/8935016fdee25d4866d9
相关推荐
标题中的“redissentinel基于phpredis扩展的redissentinel客户端”指的是一个使用PHP语言开发的Redis Sentinel客户端,它依赖于phpredis扩展来实现与Redis Sentinel服务的交互。Redis Sentinel是Redis集群的一个重要...
示例:$sentinel = new \Jenner\RedisSentinel\Sentinel(); $sentinel->connect('127.0.0.1', 6379); $address = $sentinel->getMasterAddrByName('mymaster'); $redis = new Redis(); $redis->connect($...
Redis Sentinel是Redis的一个高可用性解决方案,它提供了监控、故障检测和自动故障转移等功能,确保在主Redis服务器出现故障时,系统能够无缝地切换到备份节点,从而保持服务的连续性和稳定性。SpringBoot是一个轻量...
Windos系统的Redis sentinel集群。 启动命令:D:\redis-2.8.18.rar\redis-2.8.18>redis-server.exe sentinel.conf --sentinel
Redis Sentinel 主从部署 使用Python脚本获取Redis主从节点信息
Sentinel是Redis的一个高可用性解决方案,它可以监控Redis实例,并在主节点出现问题时自动进行故障转移,确保服务的连续性。 在这个"spring + redis + sentinel"配置中,我们将探讨如何整合这三个组件以创建一个...
实现了自动安装配置redis 已经测试过了,如果有问题,请留言 启动脚本需要 3个参数 serverIP masterIP redisType 例如, 作为master ./redis_create.sh 192.168.10.10 192.168.10.10 master 作为slave ./redis_...
Redis Sentinel是Redis数据库系统中的高可用性解决方案,用于监控、通知和自动故障转移。在Windows环境下搭建Redis Sentinel集群,你需要了解以下几个关键知识点: 1. **Redis Sentinel系统**:Redis Sentinel是一...
Redis Sentinel是Redis的高可用性解决方案,当主节点发生故障时,可以自动进行故障转移。部署Redis Sentinel主要涉及以下几个关键点: 1. Redis Sentinel的作用与优点 Redis Sentinel的主要功能是监控Redis主从...
8. Redis Sentinel 在高可用服务设计中的应用:Redis Sentinel 可以监控 Redis Server 服务是否正常,并自动地将备份(slave)Redis Server 启用,使得外部用户对 Redis 服务内部出现的异常无感知。 9. Redis 高...
Redis Sentinel和Redis Cluster是两种常见的Redis集群解决方案,用于提高Redis数据库的可用性和可扩展性。在本篇文章中,我们将深入探讨这两个系统的工作原理、配置步骤以及它们各自的特点。 首先,让我们了解一下...
redis+sentinel+tomcat部署Linux详细步骤,带安装包,自动脚本。redis+sentinel+tomcat部署Linux详细步骤,带安装包,自动脚本。redis+sentinel+tomcat部署Linux详细步骤,带安装包,自动脚本。
首先,Redis Sentinel 是一个监控、通知和自动故障转移的系统,它设计用于管理多个 Redis 实例,尤其是主从复制结构。Sentinel 系统可以监控主节点的状态,当检测到主节点失效时,会触发故障转移过程,将一个从节点...
Redis 是应用最广的缓存或NoSQL工具之一。 在UAT环境可生产环境下,一般要求以哨兵(sentinel)模式部署(Cluster模式一般用在规格很大的应用场景下,非大厂一般情况下用不上,用了会增加复杂度) 其中的配置项较多: ...
本项目"spring+springmvc+mybatis+redisSentinel"结合了Spring、SpringMVC、MyBatis以及Redis Sentinel,构建了一个高可用的Web应用程序,同时利用了Redis作为缓存系统提升性能。以下将详细讲解这些技术及其整合过程...
Redis Sentinel(哨兵)是Redis集群中的一个重要组件,它提供了高可用性解决方案,确保当主节点发生故障时,能够自动将从节点提升为主节点,从而维持服务的连续性。哨兵系统通过监控、通知和自动故障转移来实现这一...
在Windows环境下安装Redis Sentinel是一个重要的步骤,因为它提供了高可用性(HA)解决方案,确保了主Redis服务器的故障能够被自动检测并切换到备选节点。Redis Sentinel系统是Redis集群中的监控、通知和故障转移...
redis搭建sentinel高可用方法
【Redis Sentinel哨兵集群详解】 Redis Sentinel是一种高可用性解决方案,它是Redis官方提供的一种分布式系统,专门用于监控Redis集群中的Master主服务器状态。在Master出现故障时,Sentinel能够自动进行故障转移,...
Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。 提醒(Notification): 当被监控的某个...