-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathredis-test_dinamyc.sh
executable file
·246 lines (214 loc) · 6.19 KB
/
redis-test_dinamyc.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#!/bin/bash
#set -x
#CONFIG SECTION
SLEEP=1
KEYS=100
KEYPREFIX=key
SERVERS="10.60.4.207:6379
10.60.4.106:6379
10.60.4.216:6379
10.60.4.105:6379
10.60.4.217:6379
10.60.4.107:6379
10.60.4.210:6379
10.60.4.209:6379
10.60.4.215:6379
"
#END CONFIG SECTION
#FUNCTIONS
function runParallel () {
cmd=$1
args=$2
number=$3
currNumber="1024"
function redis_query {
RedisHost=$1
RedisPort=$2
RedisKey=$3
RedisValue=$4
TTL=$5
if [ $TTL -le 1 ]
then
echo "ERROR TTL"
return 1
else
let "TTL -= 1"
RedisQuery=$(redis-cli -h $RedisHost -p $RedisPort GET $RedisKey 2>&1)
if [[ "$RedisQuery" == *MOVED* ]]
then
MovedHost=$(echo $RedisQuery | sed 's/MOVED\ [0-9]*\ //; s/:.*//')
MovedPort=$(echo $RedisQuery | sed 's/MOVED\ [0-9]*\ //; s/.*://')
redis_query $MovedHost $MovedPort $RedisKey $RedisValue $TTL
return $?
fi
if [[ "$RedisQuery" == *CLUSTERDOWN* ]]
then
echo -n "-"
return 1
fi
if [[ "$RedisQuery" == *Connection* ]]
then
echo -n "?"
return 1
else
if [[ $RedisQuery == $RedisValue ]];
then
echo -n "+"
let "RedisValue += 1"
let "NewRedisValue = RedisValue"
redis-cli -h $RedisHost -p $RedisPort SET $RedisKey $NewRedisValue > /dev/null
return 0
else
echo
echo "Bad response: $RedisQuery :+: $RedisHost : $RedisKey : $RedisValue"
echo "redis-cli -h $RedisHost -p $RedisPort GET $RedisKey ::: $RedisQuery"
if [[ $RedisQuery == "" ]];
then
echo -n
redis-cli -h $RedisHost -p $RedisPort SET $RedisKey $RedisValue
fi
redis-cli -h $RedisHost SET $RedisKey 0
return 1
fi
fi
fi
}
#create redis values.
#if argc == 0 when exit
#if argc == 1, then $1 is keyname. get first server from server list
function add_redis_value0 {
if [ $# -eq 0 ]
then
return 1
fi
if [ $# -eq 1 ]
then
#get first server
SERVER=($SERVERS)
NUM=${#SERVER[*]}
RedisHost=$(echo ${SERVER[0]} | sed 's/:.*//')
RedisPort=$(echo ${SERVER[0]} | sed 's/.*://')
add_redis_value0 $1 $RedisHost $RedisPort $NUM
return $?
fi
RedisKey=$1
RedisHost=$2
RedisPort=$3
TTL=$4
if [ $TTL -le 1 ]
then
echo "ERROR TTL"
return 1
else
let "TTL -= 1"
RedisQuery=$(redis-cli -h $RedisHost -p $RedisPort SET $RedisKey 0 2>&1)
if [[ "$RedisQuery" == *MOVED* ]]
then
MovedHost=$(echo $RedisQuery | sed 's/MOVED\ [0-9]*\ //; s/:.*//')
MovedPort=$(echo $RedisQuery | sed 's/MOVED\ [0-9]*\ //; s/.*://')
add_redis_value0 $RedisKey $MovedHost $MovedPort $TTL
return $?
fi
if [[ "$RedisQuery" == *CLUSTERDOWN* ]]
then
return 1
fi
fi
# echo "-------------- $RedisKey : $RedisQuery ------------"
return 0
}
#testing redis nodes.
function redis_ping {
SERVER=($SERVERS)
NUM=${#SERVER[*]}
let "NUM -= 1" #ибо массив с нуля считается
for i in $(echo "echo {0..$NUM}" | bash) # не делайте так!
do
RedisHost=$(echo ${SERVER[$i]} | sed 's/:.*//')
RedisPort=$(echo ${SERVER[$i]} | sed 's/.*://')
Resp=$(redis-cli -h ${RedisHost} -p ${RedisPort} PING)
if [[ "$Resp" != "PONG" ]]
then
echo "Server $RedisHost $RedisPort not response"
return 1
fi
done
return 0
}
#if $1 == "+XXX" where XXX is integer
# then add new XXX values into redis and local cache
#if $1 == "XXX" where XXX is integer and without leader "+"
# then create values from 1 to XXX
#if $1 and $2 is integer
# then create values from $1 to $2
function init_redis_key {
KEYS=${KEYS:-0}
#echo "DEBUG: 1-> $1; 2-> $2; KEYS-> $KEYS ;"
if [ ${1:0:1} == "+" ]
then
NEWKEYS=${1:1}
let "NEWKEYS += KEYS"
let "KEYS += 1"
init_redis_key ${KEYS} ${NEWKEYS}
return $?
fi
if [ ! $2 ]
then
init_redis_key 1 ${1}
return $?
fi
if [ "$2" -gt "$1" ]
then
for ii in $(echo "echo ${KEYPREFIX}{$1..$2}" | bash) # не делайте так!
do
let "$ii = 0";
add_redis_value0 $ii
#TODO: Вот тут надо обработать ситуацию, когда редис обломился и не смог ничего записать. Иначе словим расхождение в ключах
done
return 0
fi
return 1
}
#MAIN PROGRAMM
redis_ping
if [ ! $? ]
then
echo "Bad cluster configuration."
echo "Please check and try again"
return 1
fi
init_redis_key ${KEYS}
###init_redis_key "+10"
MSERVER=($SERVERS)
MNUM=${#MSERVER[*]}
#Main section
while [ 1 ]
do
MI=${MSERVER[$((RANDOM%NUM))]}
MRedisHost=$(echo $MI | sed 's/:.*//')
MRedisPort=$(echo $MI | sed 's/.*://')
echo "$MI $MRedisHost $MRedisPort"
echo -n "+"
for mi in $(echo "echo ${KEYPREFIX}{1..$KEYS}" | bash)
do
let "tmpii = $mi"
redis_query $MRedisHost $MRedisPort $mi $tmpii $NUM
if [ $? -eq 0 ]
then
let "$mi += 1"
fi
done
echo "+="
init_redis_key "+10"
let "KEYS += 9" #где-то я обсчитался в глобальном параметре. должна быть десятка, но в функции выше добавляется еденица. ай как некрасиво...
sleep ${SLEEP}
done
$cmd $args &
}
loop=0
# We will run 12 sleep commands for 10 seconds each
# and only five of them will work simultaneously
while [ $loop -ne 12 ] ; do
runParallel "sleep" 10 5
loop=`expr $loop + 1`
done