Tair (Redis OSS-compatible) は独自の高可用性 (HA) コンポーネントを使用しており、Sentinel には依存していません。ただし、互換性を向上させ、コード変更の必要性を減らすために、Tair (Redis OSS-compatible) は Sentinel 互換モードを提供しています。この機能を有効にすると、セルフマネージドの Redis Sentinel デプロイメントへの接続と同じ方法で、Tair および Redis オープンソース版 インスタンスに接続できます。
Redis Sentinel
Redis Sentinel は、オープンソースの Redis に、マスターおよびレプリカノードの監視、障害通知、自動フェイルオーバーなどの機能を提供します。セルフマネージドの Redis データベースを使用する多くの高信頼性アプリケーションは Sentinel に依存しています。これらのデータベースのクラウドへの移行を簡素化するために、Alibaba Cloud は Sentinel 互換モードを開発しました。このモードを有効にすると、以下の Sentinel コマンドを使用できます。これらのコマンドでは、マスター名を redis_master に設定する必要があります。
コマンド | 説明 |
SENTINEL sentinels | 指定された Master の Sentinel インスタンスと、これらの Sentinel インスタンスのステータスを照会します。次の構文が使用されます: SENTINEL sentinels redis_master
|
SENTINEL get-master-addr-by-name | 指定された Master の IP アドレスとポート番号を照会します。次の構文が使用されます: SENTINEL get-master-addr-by-name redis_master
|
各バージョンでの Sentinel コマンドのサポート状況の詳細は、「Redis オープンソース版コマンドサポート」をご参照ください。
接続例
Sentinel 互換モードを有効にすると、パスワードを使用した接続とパスワードなしの接続のいずれかでインスタンスに接続できます。VPC 内でインスタンスのパスワードなしアクセスが有効になっている場合、パスワードは不要です。それ以外の場合は、認証情報を提供する必要があります。
パスワードなしの接続
以下のコードは、Sentinel 互換モードを使用してパスワードなしでインスタンスに接続する方法を示しています。
Spring Data Redis
この例では Spring Data Redis 2.4.2 を使用しています。
@Bean
public JedisConnectionFactory connectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("redis_master")
.sentinel("r-bp10noxlhcoim2****.redis.rds.aliyuncs.com", 6379);
JedisPoolConfig poolConfig = new JedisPoolConfig();
...
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(sentinelConfig, poolConfig);
return connectionFactory;
}
パラメーター:
master:マスター名。redis_master に設定する必要があります。
sentinel:インスタンスの VPC エンドポイントとポート番号をカンマ (,) で区切ったもの。例:"r-bp10noxlhcoim2****.redis.rds.aliyuncs.com", 6379
redis-py
この例では Python 3.9 と redis-py 4.3.6 を使用しています。
from redis.sentinel import Sentinel
SENTINEL_HOST = "r-bp10noxlhcoim2****.redis.rds.aliyuncs.com"
SENTINEL_PORT = 6379
SENTINEL_MASTER_NAME = "redis_master"
sentinel = Sentinel([(SENTINEL_HOST, SENTINEL_PORT)])
r = sentinel.master_for(SENTINEL_MASTER_NAME, db=0)
r.set('foo', 'bar')
print(r.get('foo'))
パラメーター:
パスワードを使用した接続
以下のコードは、Sentinel 互換モードを使用してパスワード付きでインスタンスに接続する方法を示しています。
Java
この例では、最低限必要なクライアントバージョンを使用しています。お使いのクライアントは以下のバージョン要件を満たす必要があります:
説明 クライアントを最新の安定バージョンにアップグレードすることを強く推奨します。最新バージョンを確認するには、MVN Repository を検索してください。
Jedis
String masterName = "redis_master";
Set<String> sentinels = new HashSet<>();
sentinels.add("r-bp10noxlhcoim2****.redis.rds.aliyuncs.com:6379");
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
String dbPassword = "testaccount:Rp829dlwa";
String sentinelPassword = "testaccount:Rp829dlwa";
JedisSentinelPool jedisSentinelPool =
new JedisSentinelPool(masterName, sentinels, poolConfig,
2000, 2000, dbPassword,
0, null, 2000, 2000,
sentinelPassword, null);
Lettuce
String masterName = "redis_master";
String sentinelNodes = "r-bp10noxlhcoim2****.redis.rds.aliyuncs.com:6379";
String sentinelPassword = "testaccount:Rp829dlwa";
RedisURI redisURI = RedisURI.create("redis-sentinel://" + sentinelPassword + "@" + sentinelNodes + "#" + masterName);
redisURI.getSentinels().forEach(it -> it.setPassword(sentinelPassword));
RedisClient client = RedisClient.create(redisURI);
RedisCommands<String, String> sync = client.connect().sync();
System.out.println(sync.set("key", "value"));
System.out.println(sync.get("key"));
client.close();
パラメーター:
masterName:マスター名。redis_master に設定する必要があります。
sentinels.add/sentinelNodes:インスタンスの VPC エンドポイントとポート番号。形式は r-bp10noxlhcoim2****.redis.rds.aliyuncs.com:6379
dbPassword および sentinelPassword:インスタンスアカウントのパスワード。パスワードを忘れた場合は、リセットできます。詳細については、「パスワードの変更またはリセット」をご参照ください。
説明 ユーザー名がインスタンス ID と同じデフォルトアカウントの場合は、パスワードのみを入力してください。
新しく作成されたアカウントの場合は、<user>:<password> 形式を使用します。この形式は、デフォルト アカウントでもサポートされています。たとえば、ユーザー名が testaccount で、パスワードが Rp829dlwa の場合、testaccount:Rp829dlwa と入力します。
redis-py
この例では Python 3.9 と redis-py 4.3.6 を使用しています。
from redis.sentinel import Sentinel
SENTINEL_HOST = "r-bp10noxlhcoim2****.redis.rds.aliyuncs.com"
SENTINEL_PORT = 6379
SENTINEL_MASTER_NAME = "redis_master" # 注:この名前は変更できません。
SENTINEL_REDIS_PWD = "testaccount:Rp829dlwa"
conf = {
'password': SENTINEL_REDIS_PWD,
}
sentinel = Sentinel([(SENTINEL_HOST, SENTINEL_PORT)], sentinel_kwargs=conf)
r = sentinel.master_for(SENTINEL_MASTER_NAME, db=0, **conf)
r.set('foo', 'bar')
print(r.get('foo'))
パラメーター:
SENTINEL_HOST および SENTINEL_PORT:インスタンスの VPC エンドポイントとポート番号。
SENTINEL_MASTER_NAME:マスター名。redis_master に設定する必要があります。
SENTINEL_REDIS_PWD:インスタンスアカウントのパスワード。
よくある質問
Q:セルフマネージドの Redis Sentinel デプロイメントから Sentinel 互換モードに切り替えた後、NOAUTH Authentication required エラーが発生した場合、どうすればよいですか?
A:#no_loose_sentinel-password-free-access パラメーターを yes に設定することで、グローバル VPC パスワードなしアクセス機能を有効にすることなく、VPC エンドポイント経由でパスワードなしの Sentinel 接続が可能になります。
インスタンスが Redis 6.0 より前のバージョンを実行している場合は、クライアントをアップグレードし、Sentinel 認証パスワードを含めるようにコードを変更し、再試行してください。詳細については、本トピックの パスワードを使用した接続 をご参照ください。
Q:Unknown sentinel subcommand 'MASTERS' エラーが発生するのはなぜですか?
A:このエラーは、インスタンスのマイナーバージョンが SENTINEL MASTERS コマンドをサポートしていないために発生します。マイナーバージョンを更新してから、再試行してください。
Q:Redis オープンソース版 インスタンスは Sentinel 互換モードをサポートしていますか?