アリクラウドredis大key検索ツール
3565 ワード
https://yq.aliyun.com/articles/117042
Redisはlist,hash,zsetなどの複雑なタイプのデータ構造を提供しており,業務は使用時にkeyの設計が不合理であるためあるkeyが大きすぎる可能性があり,redisの簡単な単一スレッドモデルのため,業務は大きなkeyを取得または削除する際に一定の影響を及ぼすほか,クラスタモードでは大きなkeyの発生によりあるサブノードのメモリが満たされやすく,以上,大きなkeyの検索ツールを提供する必要がある.
pythonクライアントwgetをダウンロードhttps://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35b79257ddb324031a/redis-2.10.5.tar.gz#md5=3b26c2b9703b4b56b30a1ad508e31083”
tar -xvf redis-2.10.5.tar.gz cd redis-2.10.5 sudo python setup.py install
Redisマスターバージョンについてはscanコマンドでスキャンでき、クラスタバージョンについてはISCANコマンドでスキャンできます.コマンドルールは次のとおりです.ノード数nodeはinfoコマンドで取得できます.
python find_でbigkey host 6379 passwordが実行され、アリクラウドRedisのプライマリ・スレーブ・バージョンとクラスタ・バージョンのビッグキー検索をサポートし、デフォルトのビッグキーのしきい値は10240、すなわちstringタイプのvalueが10240より大きい場合はビッグキー、listではlist長が10240より大きい場合はビッグキー、hashではfieldの数が10240より大きい場合はビッグキーとなる.また、デフォルトでは1000 keyを検索するたびに、ビジネスへの影響は低いが、scanコマンドがビジネスに与える影響を避けるために、ビジネスの低ピーク期間で操作することが望ましい.
Redisはlist,hash,zsetなどの複雑なタイプのデータ構造を提供しており,業務は使用時にkeyの設計が不合理であるためあるkeyが大きすぎる可能性があり,redisの簡単な単一スレッドモデルのため,業務は大きなkeyを取得または削除する際に一定の影響を及ぼすほか,クラスタモードでは大きなkeyの発生によりあるサブノードのメモリが満たされやすく,以上,大きなkeyの検索ツールを提供する必要がある.
環境の初期化
pythonクライアントのインストール
pythonクライアントwgetをダウンロードhttps://pypi.python.org/packages/68/44/5efe9e98ad83ef5b742ce62a15bea609ed5a0d1caf35b79257ddb324031a/redis-2.10.5.tar.gz#md5=3b26c2b9703b4b56b30a1ad508e31083”
インストールの解凍
tar -xvf redis-2.10.5.tar.gz cd redis-2.10.5 sudo python setup.py install
スキャンスクリプト
遍歴key
Redisマスターバージョンについてはscanコマンドでスキャンでき、クラスタバージョンについてはISCANコマンドでスキャンできます.コマンドルールは次のとおりです.ノード数nodeはinfoコマンドで取得できます.
ISCAN idx cursor [MATCH pattern] [COUNT count](idx id, 0 ,16 64gb 8 idx 0 7,128g 256gb 16 )
スキャンスクリプト
import sys
import redis
f = open('bigKey.txt', 'a')
f2 = open('ttl.txt', 'a')
def check_big_key(r, k):
bigKey = False
length = 0
try:
type = r.type(k)
if type == "string":
length = r.strlen(k)
elif type == "hash":
length = r.hlen(k)
elif type == "list":
length = r.llen(k)
elif type == "set":
length = r.scard(k)
elif type == "zset":
length = r.zcard(k)
except:
return
if length > 10240:
bigKey = True
if bigKey :
print db,k,type,length
f.write("%s
" % (k))
f.flush()
ttl = r.ttl(k)
if ttl < 0:
print "ttl-----:",k,ttl
f2.write("%s
" % (k))
f2.flush()
def find_big_key_normal(db_host, db_port, db_password, db_num):
r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)
for k in r.scan_iter(count=1000):
check_big_key(r, k)
def find_big_key_sharding(db_host, db_port, db_password, db_num, nodecount):
r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)
cursor = 0
for node in range(0, nodecount) :
while True:
iscan = r.execute_command("iscan",str(node), str(cursor), "count", "1000")
for k in iscan[1]:
check_big_key(r, k)
cursor = iscan[0]
print cursor, db, node, len(iscan[1])
if cursor == "0":
break;
if __name__ == '__main__':
if len(sys.argv) != 4:
print 'Usage: python ', sys.argv[0], ' host port password '
exit(1)
db_host = sys.argv[1]
db_port = sys.argv[2]
db_password = sys.argv[3]
r = redis.StrictRedis(host=db_host, port=int(db_port), password=db_password)
nodecount = r.info()['nodecount']
#nodecount = 1
keyspace_info = r.info("keyspace")
for db in keyspace_info:
print 'check ', db, ' ', keyspace_info[db]
if nodecount > 1:
find_big_key_sharding(db_host, db_port, db_password, db.replace("db",""), nodecount)
else:
find_big_key_normal(db_host, db_port, db_password, db.replace("db", ""))
f.close()
f2.close()
python find_でbigkey host 6379 passwordが実行され、アリクラウドRedisのプライマリ・スレーブ・バージョンとクラスタ・バージョンのビッグキー検索をサポートし、デフォルトのビッグキーのしきい値は10240、すなわちstringタイプのvalueが10240より大きい場合はビッグキー、listではlist長が10240より大きい場合はビッグキー、hashではfieldの数が10240より大きい場合はビッグキーとなる.また、デフォルトでは1000 keyを検索するたびに、ビジネスへの影響は低いが、scanコマンドがビジネスに与える影響を避けるために、ビジネスの低ピーク期間で操作することが望ましい.