Redis哨兵集群创建脚本--v2
1. 基础环境
操作系统版本 CentOS Linux release 7.6.1810 (Core)
Docker 版本 19.03.11, build 42e35e61f3
Redis 版本 3.2.3-alpine
2. 效果展示

3. 脚本参数解释
cmd 定义redis容器启动命令
sentinel_cmd 定义sentinel容器启动命令
image 容器启动镜像
redis_conf redis容器配置文件路径
sentinel_conf sentinel容器配置文件路径
redis_quota redis容器cpu、内存配额
sentinel_quota sentinel容器cpu、内存配额
base_dir 脚本运行的家目录
base_conf_dir redis配置文件目录
record_dir 集群配置记录目录
log_dir 脚本日志目录
bak_dir 备份目录
ipmark 可用IP记录文件
ipmark_assigned 已用IP记录文件
op_cmd 脚本命令参数
envv 脚本环境参数
cluster_name 脚本集群名参数
cluster_port 脚本集群端口参数
4. 脚本运行说明
a. 脚本中,包含了ceph rdb 的创建、删除功能,如不需要,可以注释
b. docker网络,使用macvlan,在执行脚本的初始化时,需要针对本地的实际情况,进行修改
c. redis 配置文件,可以在 init_cluster 中修改
d. 创建集群前,先执行初始化命令
e. 目录结构如下图:

5. 脚本内容 (内容冗余,未做优化)
#!/bin/bash
#Author:Jixson
#Date: 2020-07-07
cmd="/usr/local/bin/redis-server /usr/local/etc/redis/redis.conf"
sentinel_cmd="/usr/local/bin/redis-sentinel /usr/local/etc/redis/sentinel.conf"
image="redis:latest"
redis_conf="/usr/local/etc/redis/redis.conf"
sentinel_conf="/usr/local/etc/redis/sentinel.conf"
redis_quota="-c2 -m 4g"
sentinel_quota="-c2 -m 1g"
base_dir="/opt/redis"
base_conf_dir="${base_dir}/conf"
record_dir="${base_dir}/record"
log_dir="${base_dir}/logs"
bak_dir="${base_dir}/backup"
ipmark="${base_dir}/ipmark"
ipmark_assigned="${base_dir}/ipmark_assigned"
op_cmd=$1
envv=$2
cluster_name=$3
cluster_port=$4 Color_Text()
{
echo -e " \e[0;$2m$1\e[0m"
}
Echo_Yellow()
{
echo "$(Color_Text "$1" "33")"
}
Echo_Red()
{
echo "$(Color_Text "$1" "31")"
}
Echo_Green()
{
echo "$(Color_Text "$1" "32")"
}
write_log()
{
mkdir -p ${log_dir}
local log_type=$1
local log_msg=$2
local log_name="${log_dir}/redis-shell.log"
echo "`date +"%Y-%m-%d %H:%M:%S"` $log_type $log_msg " >> $log_name
}
init_cluster()
{
if [ -d ${base_dir} ];then
mv ${base_dir} ${base_dir}.bak
write_log info "已备份 原${base_dir} 为 ${base_dir}.bak "
Echo_Yellow " 已备份 原${base_dir} 为 ${base_dir}.bak ."
fi
mkdir -p ${base_conf_dir}
write_log info "${base_conf_dir} 已创建 ."
Echo_Yellow " ${base_conf_dir} 已创建 ."
mkdir -p ${record_dir}
write_log info "${record_dir} 已创建 ."
Echo_Yellow " ${record_dir} 已创建 ."
mkdir -p ${log_dir}
write_log info "${log_dir} 已创建 ."
Echo_Yellow " ${log_dir} 已创建 ."
mkdir -p ${bak_dir}
write_log info "${bak_dir} 已创建 ."
Echo_Yellow " ${bak_dir} 已创建 ."
cat << EOF > ${base_conf_dir}/sentinel.conf
port \$cluster_port
daemonize no
logfile "/data/sentinel.log"
protected-mode no
sentinel monitor \$cluster_name redis-master.xxx.com 6379 2
sentinel down-after-milliseconds \$cluster_name 15000
EOF
write_log info "Sentinel 配置文件已经初始化 ."
Echo_Yellow " Sentinel 配置文件已经初始化 ."
cat << EOF > ${base_conf_dir}/redis-master.conf
bind 0.0.0.0
port 6379
pidfile "/data/redis_6379.pid"
logfile "/data/redis_6379.log"
dir "/data"
dbfilename "redis_6379.rdb"
maxmemory 1gb
appendfilename "redis_6379.aof"
protected-mode yes
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
loglevel notice
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
slave-serve-stale-data yes
slave-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-ping-slave-period 10
repl-timeout 60
repl-disable-tcp-nodelay no
repl-backlog-size 150mb
repl-backlog-ttl 3600
slave-priority 100
maxclients 10000
maxmemory-policy allkeys-lru
appendonly no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
EOF
write_log info "Redis-master 配置文件已经初始化 ."
Echo_Yellow " Redis-master 配置文件已经初始化"
\cp ${base_conf_dir}/redis-master.conf ${base_conf_dir}/redis-slave.conf
echo "slaveof redis-master.xxx.com 6379" >> ${base_conf_dir}/redis-slave.conf
write_log info "Redis-slave 配置文件已经初始化 ."
Echo_Yellow " Redis-slave 配置文件已经初始化"
}
init_network()
{
docker network create -d macvlan --subnet=10.6.88.0/24 --gateway=10.6.88.1 --ip-range=10.6.88.64/27 -o parent=eth0 sentinel-net
for i in $(seq 64 95)
do
echo "10.6.88.$i" >> $ipmark
done
}
envv_true_check()
{
local envv_dir="${record_dir}/${envv}"
if [ -d ${envv_dir} ];then
Echo_Red " 哨兵集群 ${envv} 已存在 ."
exit 1
fi
}
envv_false_check()
{
local envv_dir="${record_dir}/${envv}"
if [ -d ${envv_dir} ];then
echo '' > /dev/null
else
Echo_Red " 哨兵集群 ${envv} 不存在 ."
exit 1
fi
}
create_rbd()
{
base_data_dir="${base_dir}/cluster-data/${envv}"
mkdir -p ${base_data_dir}/data_sen01
sen01=${base_data_dir}/data_sen01
write_log info "ceph data directory ${sen01} 已创建 ."
Echo_Yellow " ceph data directory ${sen01} 已创建 ."
mkdir -p ${base_data_dir}/data_sen02
sen02=${base_data_dir}/data_sen02
write_log info "ceph data directory ${sen02} 已创建 ."
Echo_Yellow " ceph data directory ${sen02} 已创建 ."
mkdir -p ${base_data_dir}/data_sen03
sen03=${base_data_dir}/data_sen03
write_log info "ceph data directory ${sen03} 已创建 ."
Echo_Yellow " ceph data directory ${sen03} 已创建 ."
mkdir -p ${base_data_dir}/data_master
master=${base_data_dir}/data_master
write_log info "ceph data directory ${master} 已创建 ."
Echo_Yellow " ceph data directory ${master} 已创建 ."
mkdir -p ${base_data_dir}/data_slave
slave=${base_data_dir}/data_slave
write_log info "ceph data directory ${slave} 已创建 ."
Echo_Yellow " ceph data directory ${slave} 已创建 ." rbd create ${envv}-sentinel01 --size 1G --image-feature layering -p rbd
write_log info "ceph image ${envv}-sentinel01 已创建 ."
Echo_Yellow " ceph image ${envv}-sentinel01 已创建 ."
rbd create ${envv}-sentinel02 --size 1G --image-feature layering -p rbd
write_log info "ceph image ${envv}-sentinel02 已创建 ."
Echo_Yellow " ceph image ${envv}-sentinel02 已创建 ."
rbd create ${envv}-sentinel03 --size 1G --image-feature layering -p rbd
write_log info "ceph image ${envv}-sentinel03 已创建 ."
Echo_Yellow " ceph image ${envv}-sentinel03 已创建 ."
rbd create ${envv}-redismaster --size 50G --image-feature layering -p rbd
write_log info "ceph image ${envv}-redismaster 已创建 ."
Echo_Yellow " ceph image ${envv}-redismaster 已创建 ."
rbd create ${envv}-redisslave --size 50G --image-feature layering -p rbd
write_log info "ceph image ${envv}-redisslave 已创建 ."
Echo_Yellow " ceph image ${envv}-redisslave 已创建 ." data_sen01=$(rbd map ${envv}-sentinel01 --name client.admin -m 10.6.88.14,10.6.88.15,10.6.88.16)
write_log info "ceph image map ${envv}-sentinel01 ."
Echo_Yellow " ceph image map ${envv}-sentinel01 ."
data_sen02=$(rbd map ${envv}-sentinel02 --name client.admin -m 10.6.88.14,10.6.88.15,10.6.88.16)
write_log info "ceph image map ${envv}-sentinel02 ."
Echo_Yellow " ceph image map ${envv}-sentinel02 ."
data_sen03=$(rbd map ${envv}-sentinel03 --name client.admin -m 10.6.88.14,10.6.88.15,10.6.88.16)
write_log info "ceph image map ${envv}-sentinel03 ."
Echo_Yellow " ceph image map ${envv}-sentinel03 ."
data_master=$(rbd map ${envv}-redismaster --name client.admin -m 10.6.88.14,10.6.88.15,10.6.88.16)
write_log info "ceph image map ${envv}-redismaster ."
Echo_Yellow " ceph image map ${envv}-redismaster ."
data_slave=$(rbd map ${envv}-redisslave --name client.admin -m 10.6.88.14,10.6.88.15,10.6.88.16)
write_log info "ceph image map ${envv}-redisslave ."
Echo_Yellow " ceph image map ${envv}-redisslave ." mkfs.xfs $data_sen01
write_log info "ceph rbd ${data_sen01} 已格式化 xfs."
Echo_Yellow " ceph rbd ${data_sen01} 已格式化 xfs."
mkfs.xfs $data_sen02
write_log info "ceph rbd ${data_sen02} 已格式化 xfs."
Echo_Yellow " ceph rbd ${data_sen02} 已格式化 xfs."
mkfs.xfs $data_sen03
write_log info "ceph rbd ${data_sen03} 已格式化 xfs."
Echo_Yellow " ceph rbd ${data_sen03} 已格式化 xfs."
mkfs.xfs $data_master
write_log info "ceph rbd ${data_master} 已格式化 xfs."
Echo_Yellow " ceph rbd ${data_master} 已格式化 xfs."
mkfs.xfs $data_slave
write_log info "ceph rbd ${data_slave} 已格式化 xfs."
Echo_Yellow " ceph rbd ${data_slave} 已格式化 xfs." mount -o discard $data_sen01 ${sen01}
write_log info "ceph rbd ${data_sen01} 已挂载 ."
Echo_Yellow " ceph rbd ${data_sen01} 已挂载 ."
mount -o discard $data_sen02 ${sen02}
write_log info "ceph rbd ${data_sen02} 已挂载 ."
Echo_Yellow " ceph rbd ${data_sen02} 已挂载 ."
mount -o discard $data_sen03 ${sen03}
write_log info "ceph rbd ${data_sen03} 已挂载 ."
Echo_Yellow " ceph rbd ${data_sen03} 已挂载 ."
mount -o discard $data_master ${master}
write_log info "ceph rbd ${data_master} 已挂载 ."
Echo_Yellow " ceph rbd ${data_master} 已挂载 ."
mount -o discard $data_slave ${slave}
write_log info "ceph rbd ${data_slave} 已挂载 ."
Echo_Yellow " ceph rbd ${data_slave} 已挂载 ."
}
delete_rbd()
{
base_data_dir="${base_dir}/cluster-data/${envv}"
sen01="${base_data_dir}/data_sen01"
sen02="${base_data_dir}/data_sen02"
sen03="${base_data_dir}/data_sen03"
master="${base_data_dir}/data_master"
slave="${base_data_dir}/data_slave" rbd_id01=$(mount | grep "${sen01}" | awk '{print $1}')
rbd_id02=$(mount | grep "${sen02}" | awk '{print $1}')
rbd_id03=$(mount | grep "${sen03}" | awk '{print $1}')
rbd_id04=$(mount | grep "${master}" | awk '{print $1}')
rbd_id05=$(mount | grep "${slave}" | awk '{print $1}') umount $sen01 $sen02 $sen03 $master $slave
write_log warn "ceph data directory $sen01 $sen02 $sen03 $master $slave 已卸载 ."
Echo_Yellow " ceph data directory $sen01 $sen02 $sen03 $master $slave 已卸载 ." if [ -d ${base_data_dir} ];then
rm -rf ${base_data_dir}
fi
write_log warn "ceph data directory ${base_data_dir} 已删除 ."
Echo_Yellow " ceph data directory ${base_data_dir} 已删除 ." rbd unmap $rbd_id01
write_log warn "ceph rbd unmap ${rbd_id01} ."
Echo_Yellow " ceph rbd unmap ${rbd_id01} ."
rbd rm ${envv}-sentinel01
write_log warn "ceph rbd image delete ${envv}-sentinel01 ."
Echo_Yellow " ceph rbd image delete ${envv}-sentinel01 ." rbd unmap $rbd_id02
write_log warn "ceph rbd unmap ${rbd_id02} ."
Echo_Yellow " ceph rbd unmap ${rbd_id02} ."
rbd rm ${envv}-sentinel02
write_log warn "ceph rbd image delete ${envv}-sentinel02 ."
Echo_Yellow " ceph rbd image delete ${envv}-sentinel02 ." rbd unmap $rbd_id03
write_log warn "ceph rbd unmap ${rbd_id03} ."
Echo_Yellow " ceph rbd unmap ${rbd_id03} ."
rbd rm ${envv}-sentinel03
write_log warn "ceph rbd image delete ${envv}-sentinel03 ."
Echo_Yellow " ceph rbd image delete ${envv}-sentinel03 ." rbd unmap $rbd_id04
write_log warn "ceph rbd unmap ${rbd_id04} ."
Echo_Yellow " ceph rbd unmap ${rbd_id04} ."
rbd rm ${envv}-redismaster
write_log warn "ceph rbd image delete ${envv}-redismaster ."
Echo_Yellow " ceph rbd image delete ${envv}-redismaster ." rbd unmap $rbd_id05
write_log warn "ceph rbd unmap ${rbd_id05} ."
Echo_Yellow " ceph rbd unmap ${rbd_id05} ."
rbd rm ${envv}-redisslave
write_log warn "ceph rbd image delete ${envv}-redisslave ."
Echo_Yellow " ceph rbd image delete ${envv}-redisslave ." }
create_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 集群创建"
Echo_Yellow " $0 create [environment] [cluster_name] [cluster_port]"
Echo_Yellow " [environment] 集群所属环境标识"
Echo_Yellow " [cluster_name] 哨兵集群 monitor name"
Echo_Yellow " [cluster_port] 哨兵集群对外端口"
Echo_Yellow " E.g.: $0 create leo bytest 27001"
}
delete_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 集群删除"
Echo_Yellow " $0 delete [environment]"
Echo_Yellow " E.g.: $0 delete leo"
}
stop_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 停止集群"
Echo_Yellow " $0 stop [environment]"
Echo_Yellow " E.g.: $0 stop leo"
}
start_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 启动集群"
Echo_Yellow " $0 start [environment]"
Echo_Yellow " E.g.: $0 start leo"
}
restart_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 重启集群"
Echo_Yellow " $0 restart [environment]"
Echo_Yellow " E.g.: $0 restart leo"
}
backup_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 备份集群"
Echo_Yellow " $0 backup [environment]"
Echo_Yellow " E.g.: $0 backup leo"
}
show_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 显示集群运行信息"
Echo_Yellow " $0 show [environment]"
Echo_Yellow " E.g.: $0 show leo"
}
ls_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 显示已创建集群"
Echo_Yellow " $0 ls"
Echo_Yellow " E.g.: $0 ls"
}
install_usage()
{
Echo_Yellow " Usage : "
Echo_Red " 脚本初始化"
Echo_Yellow " $0 \"install --yes --yes\""
Echo_Yellow " E.g.: $0 \"install --yes --yes\""
}
create_cluster()
{
envv_true_check
mkdir -p $record_dir/${envv}
#Get IP address
master_ip=$(cat $ipmark | head -1)
sed -i "/^${master_ip}/d" $ipmark
echo "${master_ip} assigned $envv redis-master" >> $ipmark_assigned
write_log info "已分配 哨兵集群 ${envv} Redis-master IP: ${master_ip}"
Echo_Yellow " 已分配 哨兵集群 ${envv} Redis-master IP: ${master_ip}" slave_ip=$(cat $ipmark | head -1)
sed -i "/^${slave_ip}/d" $ipmark
echo "${slave_ip} assigned $envv redis-slave" >> $ipmark_assigned
write_log info "已分配 哨兵集群 ${envv} redis-slave IP: ${slave_ip}"
Echo_Yellow " 已分配 哨兵集群 ${envv} redis-slave IP: ${slave_ip}" sentinel_ip01=$(cat $ipmark | head -1)
sed -i "/^${sentinel_ip01}/d" $ipmark
echo "${sentinel_ip01} assigned $envv sentinel01" >> $ipmark_assigned
write_log info "已分配 哨兵集群 ${envv} Sentinel01 IP: ${sentinel_ip01}"
Echo_Yellow " 已分配 哨兵集群 ${envv} Sentinel01 IP: ${sentinel_ip01}" sentinel_ip02=$(cat $ipmark | head -1)
sed -i "/^${sentinel_ip02}/d" $ipmark
echo "${sentinel_ip02} assigned $envv sentinel02" >> $ipmark_assigned
write_log info "已分配 哨兵集群 ${envv} Sentinel02 IP: ${sentinel_ip02}"
Echo_Yellow " 已分配 哨兵集群 ${envv} Sentinel02 IP: ${sentinel_ip02}" sentinel_ip03=$(cat $ipmark | head -1)
sed -i "/^${sentinel_ip03}/d" $ipmark
echo "${sentinel_ip03} assigned $envv sentinel03" >> $ipmark_assigned
write_log info "已分配 哨兵集群 ${envv} Sentinel03 IP: ${sentinel_ip03}"
Echo_Yellow " 已分配 哨兵集群 ${envv} Sentinel03 IP: ${sentinel_ip03}"
#ceph create rbd
create_rbd
mountsen01="-v ${sen01}:/data"
mountsen02="-v ${sen02}:/data"
mountsen03="-v ${sen03}:/data"
mountmaster="-v ${master}:/data"
mountslave="-v ${slave}:/data"
#声明主机
hn1="--add-host=redis-master.xxx.com:${master_ip}"
hn2="--add-host=redis-slave.xxx.com:${slave_ip}"
hn3="--add-host=sentinel01.xxx.com:${sentinel_ip01}"
hn4="--add-host=sentinel02.xxx.com:${sentinel_ip02}"
hn5="--add-host=sentinel03.xxx.com:${sentinel_ip03}"
hosts="$hn1 $hn2 $hn3 $hn4 $hn5" #master conf
\cp -f "${base_conf_dir}/redis-master.conf" "${record_dir}/${envv}/redis-master.conf"
master_conf="${record_dir}/${envv}/redis-master.conf"
write_log info "已创建 哨兵集群 ${envv} Redis-master 配置文件 ${master_conf}"
Echo_Yellow " 已创建 哨兵集群 ${envv} Redis-master 配置文件 ${master_conf}"
masterconf="-v ${master_conf}:${redis_conf}" #slave conf
\cp -f "${base_conf_dir}/redis-slave.conf" "${record_dir}/${envv}/redis-slave.conf"
slave_conf="${record_dir}/${envv}/redis-slave.conf"
write_log info "已创建 哨兵集群 ${envv} Redis-slave 配置文件 ${slave_conf}"
Echo_Yellow " 已创建 哨兵集群 ${envv} Redis-slave 配置文件 ${slave_conf}"
slaveconf="-v ${slave_conf}:${redis_conf}" #sentinel conf
\cp -f "${base_conf_dir}/sentinel.conf" "${record_dir}/${envv}/sentinel01.conf"
sentinel01_conf="${record_dir}/${envv}/sentinel01.conf"
sed -i 's/\$cluster_name/'${cluster_name}'/g' ${sentinel01_conf}
sed -i 's/\$cluster_port/'${cluster_port}'/g' ${sentinel01_conf}
write_log info "已创建 哨兵集群 ${envv} Sentinel01 配置文件 ${sentinel01_conf}"
Echo_Yellow " 已创建 哨兵集群 ${envv} Sentinel01 配置文件 ${sentinel01_conf}"
sentinel01conf="-v ${sentinel01_conf}:${sentinel_conf}" \cp -f "${base_conf_dir}/sentinel.conf" "${record_dir}/${envv}/sentinel02.conf"
sentinel02_conf="${record_dir}/${envv}/sentinel02.conf"
sed -i 's/\$cluster_name/'${cluster_name}'/g' ${sentinel02_conf}
sed -i 's/\$cluster_port/'${cluster_port}'/g' ${sentinel02_conf}
write_log info "已创建 哨兵集群 ${envv} Sentinel02 配置文件 ${sentinel02_conf}"
Echo_Yellow " 已创建 哨兵集群 ${envv} Sentinel02 配置文件 ${sentinel02_conf}"
sentinel02conf="-v ${sentinel02_conf}:${sentinel_conf}" \cp -f "${base_conf_dir}/sentinel.conf" "${record_dir}/${envv}/sentinel03.conf"
sentinel03_conf="${record_dir}/${envv}/sentinel03.conf"
sed -i 's/\$cluster_name/'${cluster_name}'/g' ${sentinel03_conf}
sed -i 's/\$cluster_port/'${cluster_port}'/g' ${sentinel03_conf}
write_log info "已创建 哨兵集群 ${envv} Sentinel03 配置文件 ${sentinel03_conf}"
Echo_Yellow " 已创建 哨兵集群 ${envv} Sentinel03 配置文件 ${sentinel03_conf}"
sentinel03conf="-v ${sentinel03_conf}:${sentinel_conf}" #run redis
docker run -d --network sentinel-net --ip=$master_ip $redis_quota $hosts $mountmaster --name ${envv}-redis-master ${masterconf} ${image} ${cmd}
write_log info "已创建 哨兵集群 ${envv} Redis-master 节点"
Echo_Yellow " 已创建 哨兵集群 ${envv} Redis-master 节点"
write_log info "创建命令: docker run -d --network sentinel-net --ip=$master_ip $redis_quota $hosts $mountmaster --name ${envv}-redis-master ${masterconf} ${image} ${cmd}" docker run -d --network sentinel-net --ip=$slave_ip $redis_quota $hosts $mountslave --name ${envv}-redis-slave ${slaveconf} ${image} ${cmd}
write_log info "已创建 哨兵集群 ${envv} Redis-slave 节点"
Echo_Yellow " 已创建 哨兵集群 ${envv} Redis-slave 节点"
write_log info "创建命令: docker run -d --network sentinel-net --ip=$slave_ip $redis_quota $hosts $mountslave --name ${envv}-redis-slave ${slaveconf} ${image} ${cmd}"
#run sentinel
docker run -d --network sentinel-net --ip=$sentinel_ip01 $sentinel_quota $hosts $mountsen01 --name ${envv}-sentinel01 ${sentinel01conf} ${image} ${sentinel_cmd}
write_log info "已创建 哨兵集群 ${envv} Sentinel01 节点"
Echo_Yellow " 已创建 哨兵集群 ${envv} Sentinel01 节点"
write_log info "创建命令: docker run -d --network sentinel-net --ip=$sentinel_ip01 $sentinel_quota $hosts $mountsen01 --name ${envv}-sentinel01 ${sentinel01conf} ${image} ${sentinel_cmd}" docker run -d --network sentinel-net --ip=$sentinel_ip02 $sentinel_quota $hosts $mountsen02 --name ${envv}-sentinel02 ${sentinel02conf} ${image} ${sentinel_cmd}
write_log info "已创建 哨兵集群 ${envv} Sentinel02 节点"
Echo_Yellow " 已创建 哨兵集群 ${envv} Sentinel02 节点"
write_log info "创建命令: docker run -d --network sentinel-net --ip=$sentinel_ip02 $sentinel_quota $hosts $mountsen02 --name ${envv}-sentinel02 ${sentinel02conf} ${image} ${sentinel_cmd}" docker run -d --network sentinel-net --ip=$sentinel_ip03 $sentinel_quota $hosts $mountsen03 --name ${envv}-sentinel03 ${sentinel03conf} ${image} ${sentinel_cmd}
write_log info "已创建 哨兵集群 ${envv} Sentinel03 节点"
Echo_Yellow " 已创建 哨兵集群 ${envv} Sentinel03 节点"
write_log info "创建命令: docker run -d --network sentinel-net --ip=$sentinel_ip03 $sentinel_quota $hosts $mountsen03 --name ${envv}-sentinel03 ${sentinel03conf} ${image} ${sentinel_cmd}" write_log info "哨兵集群 ${envv} 已创建 ."
Echo_Yellow " 哨兵集群 ${envv} 已创建 ."
}
stop_cluster()
{
envv_false_check
docker stop ${envv}-sentinel01
write_log warn "哨兵集群 ${envv} sentinel01 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel01 已停止 ."
docker stop ${envv}-sentinel02
write_log warn "哨兵集群 ${envv} sentinel02 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel02 已停止 ."
docker stop ${envv}-sentinel03
write_log warn "哨兵集群 ${envv} sentinel03 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel03 已停止 ."
docker stop ${envv}-redis-master
write_log warn "哨兵集群 ${envv} redis-master 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} redis-master 已停止 ."
docker stop ${envv}-redis-slave
write_log warn "哨兵集群 ${envv} redis-slave 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} redis-slave 已停止 ."
write_log warn "哨兵集群 ${envv} 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} 已停止 ."
}
delete_ip()
{
cat $ipmark_assigned | grep " ${envv} " | awk '{print $1}' | while read line
do
sed -i "/^${line}/d" $ipmark_assigned
echo "${line}" >> $ipmark
done
write_log warn "哨兵集群 ${envv} IP 资源已回收 ."
Echo_Yellow " 哨兵集群 ${envv} IP 资源已回收 ."
}
delete_cluster()
{
envv_false_check
delete_ip
rm -rf ${record_dir}/${envv}/
write_log warn "哨兵集群 ${envv} 配置文件已删除 ."
Echo_Yellow " 哨兵集群 ${envv} 配置文件已删除 ."
docker stop ${envv}-sentinel01
write_log warn "哨兵集群 ${envv} sentinel01 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel01 已停止 ."
docker stop ${envv}-sentinel02
write_log warn "哨兵集群 ${envv} sentinel02 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel02 已停止 ."
docker stop ${envv}-sentinel03
write_log warn "哨兵集群 ${envv} sentinel03 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel03 已停止 ."
docker stop ${envv}-redis-master
write_log warn "哨兵集群 ${envv} redis-master 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} redis-master 已停止 ."
docker stop ${envv}-redis-slave
write_log warn "哨兵集群 ${envv} redis-slave 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} redis-slave 已停止 ."
write_log warn "哨兵集群 ${envv} 已停止 ."
Echo_Yellow " 哨兵集群 ${envv} 已停止 ."
docker rm ${envv}-sentinel01
write_log warn "哨兵集群 ${envv} sentinel01 已删除 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel01 已删除 ."
docker rm ${envv}-sentinel02
write_log warn "哨兵集群 ${envv} sentinel02 已删除 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel02 已删除 ."
docker rm ${envv}-sentinel03
write_log warn "哨兵集群 ${envv} sentinel03 已删除 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel03 已删除 ."
docker rm ${envv}-redis-master
write_log warn "哨兵集群 ${envv} redis-master 已删除 ."
Echo_Yellow " 哨兵集群 ${envv} redis-master 已删除 ."
docker rm ${envv}-redis-slave
write_log warn "哨兵集群 ${envv} redis-slave 已删除 ."
Echo_Yellow " 哨兵集群 ${envv} redis-slave 已删除 ."
#ceph rbd delete
delete_rbd
write_log warn "哨兵集群 ${envv} 已删除 ."
Echo_Yellow " 哨兵集群 ${envv} 已删除 ."
}
restart_cluster()
{
envv_false_check
docker restart ${envv}-redis-master
write_log warn "哨兵集群 ${envv} redis-master 已重启 ."
Echo_Yellow " 哨兵集群 ${envv} redis-master 已重启 ."
docker restart ${envv}-redis-slave
write_log warn "哨兵集群 ${envv} redis-slave 已重启 ."
Echo_Yellow " 哨兵集群 ${envv} redis-slave 已重启 ."
docker restart ${envv}-sentinel01
write_log warn "哨兵集群 ${envv} sentinel01 已重启 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel01 已重启 ."
docker restart ${envv}-sentinel02
write_log warn "哨兵集群 ${envv} sentinel02 已重启 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel02 已重启 ."
docker restart ${envv}-sentinel03
write_log warn "哨兵集群 ${envv} sentinel03 已重启 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel03 已重启 ."
write_log warn "哨兵集群 ${envv} 已重启 ."
Echo_Yellow " 哨兵集群 ${envv} 已重启 ."
}
start_cluster()
{
envv_false_check
docker start ${envv}-redis-master
write_log info "哨兵集群 ${envv} redis-master 已启动 ."
Echo_Yellow " 哨兵集群 ${envv} redis-master 已启动 ."
docker start ${envv}-redis-slave
write_log info "哨兵集群 ${envv} redis-slave 已启动 ."
Echo_Yellow " 哨兵集群 ${envv} redis-slave 已启动 ."
docker start ${envv}-sentinel01
write_log info "哨兵集群 ${envv} sentinel01 已启动 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel01 已启动 ."
docker start ${envv}-sentinel02
write_log info "哨兵集群 ${envv} sentinel02 已启动 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel02 已启动 ."
docker start ${envv}-sentinel03
write_log info "哨兵集群 ${envv} sentinel03 已启动 ."
Echo_Yellow " 哨兵集群 ${envv} sentinel03 已启动 ."
write_log info "哨兵集群 ${envv} 已启动 ."
Echo_Yellow " 哨兵集群 ${envv} 已启动 ."
}
ls_cluster()
{
local var=$(ls ${record_dir})
if [[ -z ${var} ]];then
Echo_Red " 目前还未创建任何哨兵集群 , 请先创建."
create_usage
exit 1
else
Echo_Yellow " 已创建的哨兵集群:"
ls ${record_dir} | xargs -n1 | while read line
do
Echo_Green " $line"
done
docker ps | grep "redis:latest" | awk '{print $NF}' | grep -v NAMES | awk -F '-' '{print $1}' | uniq | while read line
do
Echo_Yellow " 正在运行哨兵集群: $line"
docker ps | awk '{print $NF}' | grep -v NAMES | grep "$line-" > /tmp/conlist
cat /tmp/conlist |xargs -n1 | while read line
do
Echo_Green " $line"
done
rm -rf /tmp/conlist
done
fi
}
show_cluster()
{
envv_false_check
docker ps | awk '{print $NF}' | grep -v NAMES | grep "${envv}-" > /tmp/conlist
Echo_Yellow " 哨兵集群 ${envv} 节点如下:"
cat /tmp/conlist |xargs -n1 | while read line
do
Echo_Green " $line"
done
rm -rf /tmp/conlist }
bak_cluster()
{
envv_false_check
now_time=$(date +%Y%m%d%H%M)
backupdir="${bak_dir}/${envv}.${now_time}"
mkdir -p ${backupdir}
write_log info "已创建 哨兵集群 ${envv} 备份目录: ${backupdir}"
Echo_Yellow " 已创建 哨兵集群 ${envv} 备份目录: ${backupdir}"
\cp -rf ${record_dir}/${envv}/*.conf ${backupdir}/
write_log info "已备份 哨兵集群 ${envv} 配置文件 ."
Echo_Yellow " 已备份 哨兵集群 ${envv} 配置文件 ."
docker cp ${envv}-sentinel01:/data ${backupdir}/sentinel01_data
write_log info "已备份 哨兵集群 ${envv} sentinel01_data ."
Echo_Yellow " 已备份 哨兵集群 ${envv} sentinel01_data ."
docker cp ${envv}-sentinel02:/data ${backupdir}/sentinel02_data
write_log info "已备份 哨兵集群 ${envv} sentinel02_data ."
Echo_Yellow " 已备份 哨兵集群 ${envv} sentinel02_data ."
docker cp ${envv}-sentinel03:/data ${backupdir}/sentinel03_data
write_log info "已备份 哨兵集群 ${envv} sentinel03_data ."
Echo_Yellow " 已备份 哨兵集群 ${envv} sentinel03_data ."
docker cp ${envv}-redis-master:/data ${backupdir}/redis-master_data
write_log info "已备份 哨兵集群 ${envv} master_data ."
Echo_Yellow " 已备份 哨兵集群 ${envv} master_data ."
docker cp ${envv}-redis-slave:/data ${backupdir}/redis-slave_data
write_log info "已备份 哨兵集群 ${envv} slave_data ."
Echo_Yellow " 已备份 哨兵集群 ${envv} slave_data ."
Echo_Yellow " 哨兵集群 ${envv} 配置文件和数据目录已备份"
} case $op_cmd in
create)
if [[ -z ${envv} ]] || [[ -z ${cluster_port} ]] || [[ -z ${cluster_name} ]] ;then
create_usage
else
create_cluster
fi
;;
delete)
if [ -z ${envv} ];then
delete_usage
else
delete_cluster
fi
;;
restart)
if [ -z ${envv} ];then
restart_usage
else
restart_cluster
fi
;;
stop)
if [ -z ${envv} ];then
stop_usage
else
stop_cluster
fi
;;
start)
if [ -z ${envv} ];then
start_usage
else
start_cluster
fi
;;
ls)
ls_cluster
;;
show)
if [ -z ${envv} ];then
show_usage
else
show_cluster
fi
;;
"install --yes --yes")
init_cluster
init_network
;;
backup)
if [ -z ${envv} ];then
backup_usage
else
bak_cluster
fi
;;
--help)
create_usage
delete_usage
restart_usage
stop_usage
start_usage
backup_usage
show_usage
ls_usage
install_usage
;;
*)
$0 --help
;;
esac
Redis哨兵集群创建脚本--v2的更多相关文章
- Redis哨兵集群创建脚本--v1
基础环境 操作系统版本 CentOS Linux release 7.6.1810 (Core) Docker 版本 19.03.11, build 42e35e61f3 Redis 版本 3 ...
- redis哨兵集群搭建
下载redis jar包redis-4.0.11.tar.gz放在/data/redis目录下 解压 命令:tar -zxvf redis-4.0.11.tar.gz 解压后如图所示 在/usr/lo ...
- Linux - redis哨兵集群实例
目录 Linux - redis哨兵集群实例 命令整理 配置流程 Linux - redis哨兵集群实例 命令整理 官网地址:http://redisdoc.com/ redis-cli info # ...
- helm部署Redis哨兵集群
介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客户端通知. 如下图: Redis Sentinel 故障转移过程: 从这 ...
- 11.Redis 哨兵集群实现高可用
作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis mast ...
- python连接redis哨兵集群
一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...
- redis哨兵集群、docker入门
redis-sentinel主从复制高可用 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果m ...
- redis 哨兵集群原理及部署
复制粘贴自: https://www.cnblogs.com/kevingrace/p/9004460.html 请点击此链接查看原文. 仅供本人学习参考, 如有侵权, 请联系删除, 多谢! Redi ...
- Redis进阶实践之十 Redis哨兵集群模式
一.引言 上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...
随机推荐
- [ARC101B]Median of Medians
题目 点这里看题目. 分析 看到中位数,当然会想到二分答案. 考虑检查答案.自然,我们需要找出中位数小于二分值\(k\)的区间的个数.考虑构造一个\(b\): \[b_i=(-1)^{[a ...
- asp.net Mvc 路由详解,非常详细.
关于路由的理解 为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由. 各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如 ...
- OO第三单元——JML之破分大法
一.Jml总结及应用工具链 总的来说,jml就是对java程序进行规格化设计的一种表示语言,其中最核心的就是规格化,将代码要实现的功能和各项要求与约束不是通过自然语言,而是通过严密的逻辑语言来表达,这 ...
- 【译】Announcing Entity Framework Core 5.0 Preview 5
今天我们宣布EF Core 5.0发布第五个预览版. 1 先决条件 EF Core 5.0 的预览版要求 .NET Standard 2.1.这意味着: EF Core 5.0 在 .NET Cor ...
- Docker中使用ElasticSearch
安装Docker yum install docker //安装完成以后,可以查看一下docker的版本 docker -v //Docker version 1.13.1, build 64e998 ...
- SpringBoot从入门到放弃之配置Spring-Data-JPA自动建表
pom文件配置引入依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- 磨皮美颜算法 附完整C代码
前言 2017年底时候写了这篇<集 降噪 美颜 虚化 增强 为一体的极速图像润色算法 附Demo程序> 这也算是学习过程中比较有成就感的一个算法. 自2015年做算法开始到今天,还有个把月 ...
- DataOutputStream是用来处理什么类型数据的
FileOutputStream f=new FileOutputStream(new File("sa.txt")); DataOutputStream do=new DataO ...
- CF #640 (div4)
CF640 div4 草 迟到半个月的补题 真正的懒狗 再懒就无了 D. Alice, Bob and Candies 题意:n个数字,奇数时间从左侧删数字,偶数时间从右侧删数字,每次删的数字之和必须 ...
- Java 多线程基础(十二)生产者与消费者
Java 多线程基础(十二)生产者与消费者 一.生产者与消费者模型 生产者与消费者问题是个非常典型的多线程问题,涉及到的对象包括“生产者”.“消费者”.“仓库”和“产品”.他们之间的关系如下: ①.生 ...