Tair (Redis OSS-compatible) は、自社開発の高可用性 (HA) サービスコンポーネントを使用しており、Sentinel には依存しません。ただし、インスタンスの互換性を向上させ、コードの変更を減らすために、Tair (Redis OSS-compatible) は Sentinel 互換モードを提供します。この機能を有効にすると、オープンソースの Redis Sentinel に接続するのと同じ方法で Tair (および Redis オープンソース版) インスタンスに接続できます。
Redis Sentinel の概要
Redis Sentinel は、オープンソース Redis のマスターインスタンスとレプリカインスタンスに対して、モニタリング、アラート、自動フェールオーバーサービスを提供します。自主管理 Redis データベースを使用し、高い信頼性を必要とする多くのビジネスシナリオでは Sentinel が使用されます。これらのシナリオで Redis データベースのクラウドへの移行を容易にするために、Alibaba Cloud は Sentinel 互換モードを開発しました。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 互換モードを有効にすると、2 つの方法でインスタンスに接続できます: インスタンスで Virtual Private Cloud (VPC) 経由のパスワードなしのアクセスが有効になっている場合、Sentinel を介してパスワードなしモードでインスタンスに接続できます。パスワードなしのアクセスが有効になっていない場合は、接続時に認証情報を設定する必要があります。
Sentinel を介したパスワードなしの接続
次の例は、Sentinel 互換モードで Alibaba Cloud Redis に接続するためのコードを設定する方法を示しています。
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: SENTINEL 名。 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 を介したパスワードベースの接続
次の例は、Sentinel 互換モードで Alibaba Cloud Redis に接続するためのコードを設定する方法を示しています
Java
この例では、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: SENTINEL 名。 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****.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: SENTINEL 名。 redis_master に固定する必要があります。
SENTINEL_REDIS_PWD: インスタンスアカウントのパスワード。
よくある質問
Q: 以前は自主管理 Redis Sentinel モードを使用していました。Redis Sentinel 互換モードに切り替えた後、NOAUTH Authentication required エラーが発生しました。この問題を解決するにはどうすればよいですか?
A: #no_loose_sentinel-password-free-access パラメーターを有効にする (yes に設定する) ことで、VPC パスワードなし機能を有効にせずに、VPC エンドポイント経由で Sentinel を介したパスワードなしの接続を実装できます。
インスタンスが Redis 6.0 以前を実行している場合は、クライアントをアップグレードし、一部のコードを変更して Sentinel 認証パスワードを追加してから、再試行してください。詳細については、このトピックの「Sentinel を介したパスワードベースの接続」をご参照ください。
Q: なぜ Unknown sentinel subcommand 'MASTERS' というエラーが表示されるのですか?
A: 古いマイナーバージョンは一部のコマンドと互換性がありません。マイナーバージョンを更新して、もう一度お試しください。