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的更多相关文章

  1. Redis哨兵集群创建脚本--v1

    基础环境 操作系统版本  CentOS Linux release 7.6.1810 (Core) Docker 版本  19.03.11, build 42e35e61f3 Redis  版本  3 ...

  2. redis哨兵集群搭建

    下载redis jar包redis-4.0.11.tar.gz放在/data/redis目录下 解压 命令:tar -zxvf redis-4.0.11.tar.gz 解压后如图所示 在/usr/lo ...

  3. Linux - redis哨兵集群实例

    目录 Linux - redis哨兵集群实例 命令整理 配置流程 Linux - redis哨兵集群实例 命令整理 官网地址:http://redisdoc.com/ redis-cli info # ...

  4. helm部署Redis哨兵集群

    介绍 Redis Sentinel集群是由若干Sentinel节点组成的分布式集群,可以实现故障发现.故障自动转移.配置中心和客户端通知. 如下图: Redis Sentinel 故障转移过程: 从这 ...

  5. 11.Redis 哨兵集群实现高可用

    作者:中华石杉 Redis 哨兵集群实现高可用 哨兵的介绍 sentinel,中文名是哨兵.哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能: 集群监控:负责监控 redis mast ...

  6. python连接redis哨兵集群

    一.redis集群模式有多种, 哨兵模式只是其中的一种实现方式, 其原理请自行谷歌或者百度 二.python 连接 redis 哨兵集群 1. 安装redis包 pip install redis 2 ...

  7. redis哨兵集群、docker入门

    redis-sentinel主从复制高可用 Redis-Sentinel Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果m ...

  8. redis 哨兵集群原理及部署

    复制粘贴自: https://www.cnblogs.com/kevingrace/p/9004460.html 请点击此链接查看原文. 仅供本人学习参考, 如有侵权, 请联系删除, 多谢! Redi ...

  9. Redis进阶实践之十 Redis哨兵集群模式

    一.引言             上一篇文章我们详细的讲解了Redis的主从集群模式,其实这个集群模式配置很简单,只需要在Slave的节点上进行配置,Master主节点的配置不需要做任何更改,但是有一 ...

随机推荐

  1. 温故知新-Mysql索引结构&页&聚集索引&非聚集索

    文章目录 摘要 索引 索引概述 索引优势劣势 索引结构 BTREE 结构 B+TREE 结构 页 索引分类 索引语法 索引设计原则 聚触索引 & 非聚触索引 你的鼓励也是我创作的动力 Post ...

  2. Android拍照相关知识总结

    1.调用系统的照相机程序 Intent intent = newIntent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(inte ...

  3. 指定web默认首页,导致访问路径的问题

    今天写了一个登陆页面,登陆成功跳转时,url中的路径不对 这是目录结构 |-web |---login |-----login.jsp |---success |-----success.jsp 这是 ...

  4. 关于adb的下载和基本使用

    我们无论是开发还是测试,对Android SDK一定都不陌生,如果我们要使用adb(Android debug bridge)命令,那么这个就必不可少了. 1.给大家提供一个下载地址:https:// ...

  5. 使用CURL和火车头软件采集搜狐文章

    直接上代码: //参数1:访问的URL,参数2:post数据(不填则为GET),参数3:提交的$cookies,参数4:是否返回$cookies function curl_request($url, ...

  6. Uint47 calculator【map数组+快速积+各种取余公式】

    Uint47 calculator 题目链接(点击) In the distant space, there is a technologically advanced planet. One day ...

  7. CollectionView的cell长按事件实现

    原生cell没有长按事件,我们需要使用手势识别来绑定CollectionView.创建并绑定CollectionView如下: (void)viewDidLoad { [super viewDidLo ...

  8. web资源图分析

    随着请求数增加,吞吐量没有增大,服务器仍然可以处理,那就是带宽问题 Web资源图是从服务器的角度进行统计分析的,和事务图是两个纬度. 1,每秒点击数 每秒点击数( Hits per Second)统计 ...

  9. Dubbo——服务调用过程

    文章目录 引言 服务的交互 服务降级 集群容错 服务调用 服务端接收请求 总结 引言 经过之前文章的铺垫,现在可以来分析服务的交互调用过程了. 服务的交互 服务降级 从名字上看我们不难理解MockCl ...

  10. 使用addEventListener绑定事件是关于this和event记录

    DOM元素使用addEventListener绑定事件的时候经常会碰到想把当前作用域传到函数内部,可以使用以下两种放下: var bindAsEventListener=function (objec ...