云數據庫 Tair(兼容 Redis)采用自研的高可用服務HA組件,無需依賴Sentinel(哨兵)。但為了提高實例的兼容性,減少用戶的代碼改動,云數據庫 Tair(兼容 Redis)提供Sentinel兼容模式。開啟該功能后,您可以像連接開源Redis Sentinel一樣連接Tair(以及Redis開源版)實例。
Redis Sentinel簡介
Redis Sentinel為開源Redis提供主從實例監控、故障告警、自動故障切換等服務,很多使用本地自建Redis數據庫并且對可靠性要求較高的業務場景都用到了Sentinel。為了給這類場景中的Redis數據庫遷移上云提供方便,阿里云開發了Sentinel兼容模式。開啟Sentinel兼容模式后,您可以使用如下的Sentinel相關命令:
命令 | 說明 |
SENTINEL sentinels | 查詢master的Sentinel實例列表以及這些Sentinel實例的狀態。使用方式:
|
SENTINEL get-master-addr-by-name | 查詢master的IP地址和端口號。使用方式:
|
關于Sentinel相關命令在各版本中的支持度,請參見Redis開源版命令支持。
前提條件
實例的版本為兼容Redis 4.0及以上。
實例的網絡類型為專有網絡。
說明如果實例為經典網絡,切換方法請參見切換為專有網絡VPC。
已將客戶端的IP地址(ECS實例的內網IP地址或本地主機的外網IP地址)加入實例白名單。
操作步驟
訪問實例列表,在上方選擇地域,然后單擊目標實例ID。
在實例信息頁的左側導航欄中,單擊參數設置。
根據實例架構,通過修改對應的參數開啟Sentinel兼容模式,具體操作請參見設置參數。
若實例為集群架構代理模式或讀寫分離架構:將sentinel_compat_enable參數的值修改為1。
若實例為標準架構:將#no_loose_sentinel-enabled參數的值修改為yes。
說明您可以在實例詳情頁確認實例的架構信息。
集群架構直連模式使用開源Redis Cluster進行負載均衡,無需Sentinel組件,也不支持設置Sentinel參數。
(可選)開啟后,您可以連接實例,執行
SENTINEL sentinels test
命令進行測試,執行成功表示實例已開啟Redis Sentinel兼容模式。Sentinel兼容模式不提供額外的連接地址,您可以直接通過原連接地址(例如
r-********.redis.rds.aliyuncs.com:6379
)進行連接。說明如需設置SENTINEL命令免密,您可以將#no_loose_sentinel-password-free-access參數設置為yes,使用SUBSCRIBE、SENTINEL命令訂閱、監聽
+switch-master
通道免密。如需更多免密命令,您可以在開啟上述免密參數后,通過#no_loose_sentinel-password-free-commands參數額外添加免密的命令列表。
Sentinel連接示例
開啟Sentinel兼容模式后,有兩種方式連接實例:若實例開啟專有網絡免密訪問,您可以通過Sentinel模式免密連接實例;若未開啟免密訪問,您需要在連接時配置驗證信息。
Sentinel免密連接
開啟專有網絡免密訪問的具體操作,請參見開啟專有網絡免密訪問。
阿里云Redis Sentinel兼容模式連接代碼配置示例如下。
本示例的Spring Data Redis版本為2.4.2。
@Bean
public JedisConnectionFactory connectionFactory() {
RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration()
.master("testmaster")
.sentinel("r-bp10noxlhcoim2****.redis.rds.aliyuncs.com", 6379);
JedisPoolConfig poolConfig = new JedisPoolConfig();
...
JedisConnectionFactory connectionFactory = new JedisConnectionFactory(sentinelConfig, poolConfig);
return connectionFactory;
}
參數說明:
master:自定義名稱,可保持默認,例如
testmaster
。sentinel:實例的專有網絡連接地址與端口號,用英文逗號(,)分隔,例如
"r-bp10noxlhcoim2****.redis.rds.aliyuncs.com", 6379
。
本示例的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 = "testmaster"
sentinel = Sentinel([(SENTINEL_HOST, SENTINEL_PORT)])
r = sentinel.master_for(SENTINEL_MASTER_NAME, db=0)
r.set('foo', 'bar')
print(r.get('foo'))
參數說明:
SENTINEL_HOST與SENTINEL_PORT:實例的專有網絡連接地址與端口號。
SENTINEL_MASTER_NAME:自定義名稱,可保持默認,例如
testmaster
。
Sentinel密碼連接
阿里云Redis Sentinel兼容模式連接代碼配置示例如下
本示例以Java客戶端的最低版本為例,客戶端版本要求如下:
Jedis為3.6.0版本及以上。
Lettuce為5.3.0.RELEASE版本及以上。
Spring Data Redis為2.5.1版本及以上,同時需要配置spring.redis.sentinel.password參數。
強烈建議您升級最新穩定版本客戶端,最新版本請搜索MVN Repository。
String masterName = "any-name";
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);
參數說明:
masterName:自定義名稱,可保持默認,例如
testmaster
。sentinels.add:設置為實例的專有網絡連接地址和端口號,格式為
r-bp10noxlhcoim2****.redis.rds.aliyuncs.com:6379
。dbPassword與sentinelPassword:設置為實例賬號的密碼。根據選取賬號的不同,密碼的填寫格式有一定區別。如果忘記密碼,您可以重置密碼。具體操作,請參見修改或重置密碼。
說明默認賬號(即以實例ID命名的賬號):直接填寫密碼即可。
新創建的賬號:密碼格式為
<user>:<password>
,默認賬號也支持此認證方式。例如自定義賬號為testaccount
,密碼為Rp829dlwa
,密碼需填寫為testaccount:Rp829dlwa
。
本示例的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:實例的專有網絡連接地址與端口號。
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:Redis倚天版實例支持Sentinel兼容模式嗎?
A:支持。