-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcluster.sh
executable file
·330 lines (298 loc) · 9.53 KB
/
cluster.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
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
#!/usr/bin/env bash
#set -ex
WORK_DIR=`pwd`
NODE_NUM=3
CLUSTER_ID=2
ZKS_DAEMON_IMAGE='zksdaemon:latest'
ZKS_IMAGE='zookeeper:latest'
IS_CLEAR=0
CPORT='9639'
QUORUM_PORT='2888'
ELECTION_PORT='3888'
DAEMON_OFF=0
while getopts "p:n:d:z:i:hco" arg
do
case $arg in
c)
IS_CLEAR=1
echo "Cleaning cluster...."
;;
0)
DAEMON_OFF=1
echo "DAEMON_OFF...."
;;
p)
WORK_DIR=$OPTARG
;;
n)
NODE_NUM=$OPTARG
;;
d)
ZKS_DAEMON_IMAGE=$OPTARG
;;
z)
ZKS_IMAGE=$OPTARG
;;
i)
CLUSTER_ID=$OPTARG
;;
h)
echo "### help ####"
echo "Usage: $0 -p [path] -n [node numbers] -i [cluster id] -d [zks daemon docker image] -z [ zookeeper docker image]"
echo "-h : help message"
echo "-c : clear cluster."
echo "### ####"
exit 0
;;
?)
echo "ERROR: unkonw argument: $*"
echo "Usage: $0 -p [path] -n [node numbers] -i [cluster id] -d [zks daemon docker image] -z [ zookeeper docker image]"
exit 1
;;
esac
done
function create_zks_cfg(){
local myid=$1
local myip=$2
local zksDir=$3
local cluster=$4
if [ ! -d "$zksDir" ];then
echo "path[$zksDir] invalid."
return 1
fi
ret=`docker container ps |grep $CLUSTER_NAME-$myid`
if [ ! -z "$ret" ];then
echo "stop and rm container: $CLUSTER_NAME-$myid"
docker container stop $CLUSTER_NAME-$myid
docker rm $CLUSTER_NAME-$myid
fi
rm -rf $zksDir/*
mkdir $zksDir/{conf,data,datalog}
echo "$myid">$zksDir/data/myid
echo "autopurge.purgeInterval=8
initLimit=10
syncLimit=2
autopurge.snapRetainCount=3
skipACL=yes
forceSync=no
zookeeper.electionPortBindRetry=604800
4lw.commands.whitelist=*
globalOutstandingLimit=5000
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=7000
metricsProvider.exportJvmInfo=true
[zookeeper]=
cnxTimeout=200
tickTime=2000
dataDir=/data
dataLogDir=/datalog
reconfigEnabled=true
preAllocSize=16384
standaloneEnabled=false
dynamicConfigFile=/conf/zoo.cfg.dynamic" > $zksDir/conf/zoo.cfg
#这里可以考虑少于等于3个节点时,都是participant。
if [ -z $cluster ];then
echo -e "server.$myid=$myip:$QUORUM_PORT:$ELECTION_PORT;0.0.0.0:$CPORT" > $zksDir/conf/zoo.cfg.dynamic
else
echo -e "$cluster" > $zksDir/conf/zoo.cfg.dynamic
echo -e "server.$myid=$myip:$QUORUM_PORT:$ELECTION_PORT;0.0.0.0:$CPORT" >> $zksDir/conf/zoo.cfg.dynamic
fi
echo "export ZK_SERVER_HEAP=2048
export JMXPORT=9630
export ZOO_ADMIN_SERVER_ENABLE=false
export ZOO_ADMIN_SERVER_HOST=localhost
export ZOO_ADMIN_SERVER_PORT=9631
export ZOO_LOG4J_PROP=INFO,CONSOLE
export ZOO_LOG_DIR=/var/
export ZOO_RANDOM_PATH=file:/dev/./urandom
export ZOO_ELEPORT_BIND_RETRY=604800
export JVMFLAGS=\"-Dfsync.warningthresholdms=5 $JVMFLAGS\"" > $zksDir/conf/java.env
echo 'zookeeper.root.logger=INFO, CONSOLE
zookeeper.console.threshold=INFO
zookeeper.log.dir=.
zookeeper.log.file=zookeeper.log
zookeeper.log.threshold=INFO
zookeeper.log.maxfilesize=128MB
zookeeper.log.maxbackupindex=8
zookeeper.tracelog.dir=${zookeeper.log.dir}
zookeeper.tracelog.file=zookeeper_trace.log
log4j.rootLogger=${zookeeper.root.logger}
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=${zookeeper.console.threshold}
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n
log4j.appender.ROLLINGFILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLINGFILE.Threshold=${zookeeper.log.threshold}
log4j.appender.ROLLINGFILE.File=${zookeeper.log.dir}/${zookeeper.log.file}
log4j.appender.ROLLINGFILE.MaxFileSize=${zookeeper.log.maxfilesize}
log4j.appender.ROLLINGFILE.MaxBackupIndex=${zookeeper.log.maxbackupindex}
log4j.appender.ROLLINGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLINGFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L] - %m%n
log4j.appender.TRACEFILE=org.apache.log4j.FileAppender
log4j.appender.TRACEFILE.Threshold=TRACE
log4j.appender.TRACEFILE.File=${zookeeper.tracelog.dir}/${zookeeper.tracelog.file}
log4j.appender.TRACEFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.TRACEFILE.layout.ConversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n
log4j.appender.SYSLOG=org.apache.log4j.net.SyslogAppender
log4j.appender.SYSLOG.syslogHost=localhost
log4j.appender.SYSLOG.layout=org.apache.log4j.PatternLayout
log4j.appender.SYSLOG.layout.conversionPattern=%d{ISO8601} [myid:%X{myid}] - %-5p [%t:%C{1}@%L][%x] - %m%n
log4j.appender.SYSLOG.Facility=LOCAL6
log4j.appender.SYSLOG.Threshold=debug
log4j.appender.SYSLOG.FacilityPrinting=true' > $zksDir/conf/log4j.properties
chmod -R a+rwx $zksDir
}
function create_zks(){
local id=$1
local ip=$2
local path=$3
cmd="docker run -dit --name=$CLUSTER_NAME-$id --privileged=true --network=$network_name --ip=$ip -v $path/conf:/conf -v $path/data:/data -v $path/datalog:/datalog $ZKS_IMAGE"
docker container stop $CLUSTER_NAME-$id > /dev/null 2>&1
docker rm $CLUSTER_NAME-$id > /dev/null 2>&1
$cmd
if [ $? != 0 ];then
echo "run docker fail, [$cmd]"
return 1
else
echo "success for [$cmd]"
fi
cnt=0
while [[ $cnt -lt 100 ]]
do
sleep 3
ret=`echo ruok|nc $ip $CPORT`
if [ "$ret" == 'imok' ];then
echo "$CLUSTER_NAME-$id have running."
return 0
fi
echo "wait for $CLUSTER_NAME-$id ok ..."
let cnt++
done
echo "error: wait for $CLUSTER_NAME-$id timeout."
return 1
}
function add_zks_node(){
local myid=$1
local myip=$2
local cluster=$3
dataDir=$WORK_DIR/zks-$myid
if [ ! -d "$dataDir" ];then
mkdir $dataDir
fi
create_zks_cfg $myid $myip $dataDir $cluster
if [ $? != 0 ];then
echo "[create_zks_cfg $myid $myip $dataDir $cluster] fail..."
return 1
fi
sleep 1
create_zks $myid $myip $dataDir
if [ $? != 0 ];then
echo "[create_zks $myid $myip $dataDir] fail..."
return 1
fi
return 0
}
function add_zks_daemon(){
local myid=$1
local myhost=$2
ret=`docker container ps -a|grep $CLUSTER_NAME-$myid-daemon`
if [ ! -z "$ret" ];then
echo "stop and rm container: $CLUSTER_NAME-$myid-daemon"
docker container stop $CLUSTER_NAME-$myid-daemon
docker rm $CLUSTER_NAME-$myid-daemon
fi
docker container stop $CLUSTER_NAME-$myid-daemon > /dev/null 2>&1
docker rm $CLUSTER_NAME-$myid-daemon> /dev/null 2>&1
cmd="docker run -dit --privileged=true --name=$CLUSTER_NAME-$myid-daemon --network=host $ZKS_DAEMON_IMAGE -i $myid -h $myhost"
$cmd
if [ $? != 0 ];then
echo "run daemon docker fail, [$cmd]"
return 1
else
echo "success for [$cmd]"
fi
return 0
}
function clear_cluster()
{
for cons in `docker container ps -a|grep $CLUSTER_NAME|awk '{print$1}'`
do
docker container stop $cons
docker rm $cons
echo "stop and rm container: $cons"
done
}
CLUSTER="zks"
CLUSTER_NAME="$CLUSTER.$CLUSTER_ID"
NETWORK_ADDR="172.22.$CLUSTER_ID.0"
echo "### create zookeeper cluster ###"
if [ ! -d $WORK_DIR ];then
echo "WORK_DIR: $WORK_DIR invalid"
exit 1
fi
WORK_DIR="$WORK_DIR/$CLUSTER_NAME"
if [ ! -e $WORK_DIR ];then
mkdir $WORK_DIR
fi
echo "WORK_DIR: $WORK_DIR"
echo "NODE_NUM: $NODE_NUM"
echo "CLUSTER_NAME: $CLUSTER_NAME"
echo "NETWORK_ADDR: $NETWORK_ADDR"
echo "CPORT: $CPORT"
echo "ZKS_DAEMON_IMAGE: $ZKS_DAEMON_IMAGE"
echo "ZKS_IMAGE: $ZKS_IMAGE"
echo "####################"
#创建zookeeper集群
i=1
net_ip=${NETWORK_ADDR%.*}
g_myid=2
server_info=''
clear_cluster
if [ $IS_CLEAR != 0 ];then
for cons in `docker container ps -a|grep $CLUSTER|awk '{print$1}'`
do
docker container stop $cons
docker rm $cons
echo "stop and rm container: $cons"
done
echo "Clear zookeeper cluster Finished."
exit 0
fi
#建立集群网络
network_name=$CLUSTER_NAME'-net'
ret=`docker network ls |grep "$network_name"|awk '{print $2}'`
if [ "$ret" != "$network_name" ];then
docker network create --subnet=$NETWORK_ADDR/24 $network_name
if [ $? != 0 ];then
echo "docker network create --subnet=$NETWORK_ADDR/24 $network_name fail..."
exit 1
fi
fi
echo "Now create zookeeper cluster: $net_ip.[$g_myid - $NODE_NUM] "
while [ $i -le $NODE_NUM ]
do
let i++
let ip_addr=g_myid
node_ip=$net_ip.$ip_addr
echo "zks Node message: {id:$g_myid} {ip:$node_ip}"
if [ -z "$server_info" ];then
echo "this is first node for cluster."
fi
add_zks_node $g_myid $node_ip $server_info
if [ $? != 0 ];then
echo "[add_zks_node $g_myid $node_ip $server_info] fail..."
exit 1
fi
if [ $DAEMON_OFF == 0 ];then
add_zks_daemon $g_myid $node_ip:$CPORT
if [ $? != 0 ];then
echo "[add_zks_daemon $g_myid $node_ip:$CPORT] fail..."
exit 1
fi
fi
#server_info=`echo conf|nc $node_ip $CPORT|grep 'server\.'|grep "$CPORT"`
server_info="$server_info""server.$g_myid=$node_ip:$QUORUM_PORT:$ELECTION_PORT;0.0.0.0:$CPORT\n"
echo -e "update cluster: $server_info"
let g_myid++
sleep 5
done