`
velna_007
  • 浏览: 13536 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Redis集群管理脚本

阅读更多
最近在电信系统大量使用redis集群,之前都是小打小闹,搞个一两台机器,部署五六个redis实例。今天接到一个项目,要部署7台机器,由于每台有512G内存,按单实例24G内存来计算,每台需要部署10个实例,一共70个实例。。

好吧,不得不写个脚本来管理一下了。

准备工作:
1.从7台服务器选择一台作为主控机,用来管理整个群集
2.为了方便管理,需要可以从主控机使用公钥无密码ssh到其他6台机器
3.因为机器是全新的,有些系统参数需要修改,而且开了防火墙需要打开相关端口,root权限也是必须的


ok,脚本出炉:

#!/bin/sh

#redis的主目录,目录结构:
#    bin/
#        redis-server
#        redis-cli
#        redis-trib.rb
#    conf/
#        redis.conf
#    data/
REDIS_HOME=/home/kvuser/redis

#redis数据库存放位置
#由于会在一台机器上部署多个实例,各个实例的数据尽量存储在不同的硬盘上,以加快数据存储速度
DATA_DIRS=(/data1/redis /data2/redis /data3/redis /data4/redis /data5/redis)

#所有服务器的IP地址列表
HOSTS=(192.168.110.201 192.168.110.202 192.168.110.203 192.168.110.204 192.168.110.205 192.168.110.206 192.168.110.207)

#每台机器上生成的redis实例数量
NODES_PER_HOST=10

#每台机器的redis起始端口号,10台机器就是6379-6388
START_PORT=6379

#每组redis的slave机器的数量
REPLICAS=1

#是否拥有sudo权限,如果没有sudo权限或者登录账号不为root,需要root权限的操作都只会提示问题,不进行实际配置
SUDOABLE=1


USERNAME=`whoami`
IF_CONFIG=`/sbin/ifconfig`
LOCAL_IP=
SUDO=

#获得本机IP地址
for host in ${HOSTS[*]}
do
	i=`echo $IF_CONFIG|grep -c $host`
	if [ $i -eq 1 ]; then
		LOCAL_IP=$host
		break
	fi
done

#判断是否拥有root权限
if [ "$USERNAME" == "root" ]; then
	SUDOABLE=1
	SUDO=""
else
	SUDO=sudo
fi

redis_cmd() {
	for host in ${HOSTS[*]}
        do
                echo "[[$1 redis servers on $host]]"
                if [ "$LOCAL_IP" != "$host" ]; then
                        ssh -t -q $host "$REDIS_HOME/redis-cluster local$1"
                else
                        redis_local_$1
                fi
        done
}

redis_call(){
        for host in ${HOSTS[*]}
        do
                echo "[[call \"$@\" on $host]]"
                if [ "$LOCAL_IP" != "$host" ]; then
                        ssh -t -q $host "$REDIS_HOME/redis-cluster localcall $@"
                else
                        redis_local_call $@
                fi
        done
}

redis_start() {
	for host in ${HOSTS[*]}
	do
		echo "[[start redis servers on $host]]"
                if [ "$LOCAL_IP" != "$host" ]; then
			ssh -t -q $host "$REDIS_HOME/redis-cluster localstart"
		else
			redis_local_start
		fi
	done
}

redis_stop() {
        for host in ${HOSTS[*]}
        do
                echo "[[stop redis servers on $host]]"
                if [ "$LOCAL_IP" != "$host" ]; then
                	ssh -t -q $host "$REDIS_HOME/redis-cluster localstop"
                else
                        redis_local_stop
                fi
        done
}

redis_clean() {
        for host in ${HOSTS[*]}
        do
                echo "[[clean redis servers on $host]]"
                if [ "$LOCAL_IP" != "$host" ]; then
                        ssh -t -q $host "$REDIS_HOME/redis-cluster localclean"
                else
                        redis_local_clean
                fi
        done
}

redis_init() {
	if [ -f $REDIS_HOME.tar.gz ]; then
		rm -f $REDIS_HOME.tar.gz
	fi
	tar -C `dirname $REDIS_HOME` -czf $REDIS_HOME.tar.gz `basename $REDIS_HOME`/ --exclude `basename $REDIS_HOME`/data*
        for host in ${HOSTS[*]}
        do
		echo "[[init redis servers on $host]]"
                if [ "$LOCAL_IP" != "$host" ]; then
			scp $REDIS_HOME.tar.gz $host:$REDIS_HOME.tar.gz
                	ssh -t -q $host "tar xzf $REDIS_HOME.tar.gz && $REDIS_HOME/redis-cluster localinit"
		else
			redis_local_init
		fi
        done
}

redis_create() {
        CLUSTER=""
        for host in ${HOSTS[*]}
        do
                for(( i=0; i<$NODES_PER_HOST; i++))
                do
                        PORT=$((START_PORT+i))
                        CLUSTER="$CLUSTER $host:$PORT"
                done
        done
        echo "[create cluster $CLUSTER]"
        $REDIS_HOME/bin/redis-trib.rb create --replicas $REPLICAS $CLUSTER
}

redis_update() {
	for host in ${HOSTS[*]}
	do
                echo "[[update redis servers on $host]]"
                if [ "$LOCAL_IP" != "$host" ]; then
                        scp $REDIS_HOME/redis-cluster $host:$REDIS_HOME/
                fi
        done
}

redis_local_start() {
	j=0
	l=${#DATA_DIRS[@]}
	for(( i=0; i<$NODES_PER_HOST; i++))
	do
		PORT=$((START_PORT+i))
		echo "start redis at port $PORT"
		if [ ! -L $REDIS_HOME/data/$PORT ]; then
                        echo "make symbolic link to ${DATA_DIRS[j]}/$PORT"
                        ln -s ${DATA_DIRS[j]}/$PORT $REDIS_HOME/data/$PORT
                fi
		$REDIS_HOME/bin/redis-server $REDIS_HOME/conf/redis.conf --dir $REDIS_HOME/data/$PORT --port $PORT --bind $LOCAL_IP
		j=$(((j+1) % l))
	done
}

redis_local_stop() {
	for(( i=0; i<$NODES_PER_HOST; i++))
        do
                PORT=$((START_PORT+i))
		echo "stop redis at port $PORT"
                $REDIS_HOME/bin/redis-cli -h $LOCAL_IP -p $PORT shutdown
        done
}

redis_local_call() {
	for(( i=0; i<$NODES_PER_HOST; i++))
        do
                PORT=$((START_PORT+i))
		echo "[call $@ on port $PORT]"
		$REDIS_HOME/bin/redis-cli -h $LOCAL_IP -p $PORT $@
	done
}

redis_local_init() {
	j=0
	l=${#DATA_DIRS[@]}
	mkdir -p $REDIS_HOME/data
	for(( i=0; i<$NODES_PER_HOST; i++))
        do
                PORT=$((START_PORT+i))
                echo "[init redis at port $PORT]"

		if [ ! -d ${DATA_DIRS[j]}/$PORT ]; then
			echo "make data dir at ${DATA_DIRS[j]}/$PORT"
			mkdir -p ${DATA_DIRS[j]}/$PORT 2&> /dev/null || ( $SUDO mkdir -p ${DATA_DIRS[j]}/$PORT && $SUDO chown $USERNAME:$USERNAME ${DATA_DIRS[j]}/$PORT )
		fi
		j=$(((j+1) % l))
        done
	i=`/sbin/sysctl vm.overcommit_memory | grep -c "vm.overcommit_memory = 1"`
	if [ $i -eq 0 ]; then
		if [ $SUDOABLE -eq 1 ]; then
			echo "[set vm.overcommit_memory = 1]"
			$SUDO sh -c 'echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf'
			$SUDO sysctl vm.overcommit_memory=1
		else
			echo "[!!! should set vm.overcommit_memory = 1 !!!]"
		fi
	fi
	
	i=`cat /sys/kernel/mm/transparent_hugepage/enabled|grep -c "\[never\]"`
	if [ $i -eq 0 ]; then
		if [ $SUDOABLE -eq 1 ]; then
			echo "[set /sys/kernel/mm/transparent_hugepage/enabled to never]"
			$SUDO sh -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
		else
			echo "[!!! /sys/kernel/mm/transparent_hugepage/enabled is \"always\", should set to \"never\". !!!]"
		fi
	fi

	i=`ulimit -n`
	if [ $i -lt 65536 ]; then
		if [ $SUDOABLE -eq 1 ]; then
			echo "[set open files to 65536]"
			line="$USERNAME	soft	nofile	65536"
			$SUDO sh -c "echo $line >> /etc/security/limits.d/$USERNAME.conf"
			line="$USERNAME	hard	nofile	65536"
			$SUDO sh -c "echo $line >> /etc/security/limits.d/$USERNAME.conf"
		else
			echo "[!!! max open file is $i, may be too small. !!!]"
		fi
	fi

	if [ $SUDOABLE -eq 1 ]; then
		s=`$SUDO service iptables status`
		f=0
		for(( i=0; i<$NODES_PER_HOST; i++))
        	do
        	        PORT=$((START_PORT+i))
			n=`echo $s|grep -c $PORT`
			if [ $n -eq 0 ]; then
				echo "[allow tcp connect on port $PORT from ${HOSTS[0]}/24]"
				$SUDO iptables -I INPUT 5 -m state --state NEW -s ${HOSTS[0]}/24 -p tcp --dport $PORT -j ACCEPT
				f=1
			fi
			PORT=$((PORT+10000))
        	        n=`echo $s|grep -c $PORT`
        	        if [ $n -eq 0 ]; then
        	                echo "[allow tcp connect on port $PORT from ${HOSTS[0]}/24]"
        	                $SUDO iptables -I INPUT 5 -m state --state NEW -s ${HOSTS[0]}/24 -p tcp --dport $PORT -j ACCEPT
        	                f=1
        	        fi
		done
		if [ $f -eq 1 ]; then
			echo "[save iptables]"
			$SUDO service iptables save
		fi
	else
		echo "[@@@ please check iptables for redis PORT and PORT+10000 @@@]"
	fi
}

redis_local_clean() {
        j=0
        l=${#DATA_DIRS[@]}
        for(( i=0; i<$NODES_PER_HOST; i++))
        do
                PORT=$((START_PORT+i))
                echo "[clean redis at port $PORT]"
		rm -fr ${DATA_DIRS[j]}/$PORT/*
		j=$(((j+1) % l))
	done
	rm -f $REDIS_HOME/data/*
}

redis_local_tail() {
	for(( i=0; i<$NODES_PER_HOST; i++))
        do
                PORT=$((START_PORT+i))
		echo "[tail $REDIS_HOME/data/$PORT/redis.log]"
		tail $REDIS_HOME/data/$PORT/redis.log
		echo ""
        done
}

case "$1" in
	localstart)
#启动本机的所有redis实例
		redis_local_start
	;;
	localstop)
#停止本机的所有redis实例
		redis_local_stop
	;;
	localinit)
#初始化本机配置
		redis_local_init
	;;
	localclean)
#清除本机所有redis实例的数据
		redis_local_clean
	;;
	localtail)
#查看本机所有redis实例日志的最后10行
		redis_local_tail
	;;
	localcall)
#在本机所有redis实例上执行redis命令
		redis_local_call $2 $3 $4 $5 $6 $7 $8 $9
	;;
	create)
#初始化redis集群
		redis_create
	;;
	start)
#启动集群的所有redis实例
		redis_cmd start
	;;
	stop)
#停止集群所有redis实例
		redis_cmd stop
	;;
	tail)
#查看集群所有redis实例日志的最后10行
		redis_cmd tail
	;;
	init)
#初始化集群所有redis实例
		redis_init
	;;
	clean)
#清除集群所有redis实例的数据
		redis_cmd clean
	;;
	update)
#更新集群上的redis-cluster脚本
		redis_update
	;;
	call)
#在集群所有redis实例上执行redis命令
		redis_call $2 $3 $4 $5 $6 $7 $8 $9
	;;
	*)
		echo $"Usage: $0 {init|create|start|stop|init|clean|tail|update|localstart|localstop|localinit|localclean|localtail}"
		exit 1
esac


redis.conf文件中不需要配置port, bind, dir这三个参数,这三个参数会直接在命令行上配置

好,现在就可以轻松管理这70个redis实例了:
./redis-cluster init
./redis-cluster start
./redis-cluster create
执行以上三条命令,集群就初始化完成了,如果有root权限,什么防火墙啊,系统参数啊,统统搞定

YES
0
0
分享到:
评论

相关推荐

    redis集群windows启动脚本

    在Windows环境下,设置和管理Redis集群可能相对复杂,但通过编写启动脚本可以实现一键启动,简化操作流程。以下将详细介绍如何创建并使用“redis集群windows启动脚本”。 1. **Redis集群概念** Redis集群是Redis...

    redis集群一键自动部署脚本.rar

    "redis集群一键自动部署脚本.rar" 提供了一种便捷的方式来在 CentOS 7.X 操作系统上搭建 Redis 集群。以下是关于Redis集群、shell脚本以及CentOS的相关知识点: 1. **Redis集群**: - **主从复制(Replication)**...

    redis集群搭建以及脚本启动

    在本文中,我们将深入探讨Redis集群的基本概念、搭建过程以及使用脚本自动化启动的方法。 首先,我们需要理解Redis集群的核心特性。Redis集群提供数据分片(sharding)功能,即将数据库分成多个片段存储在不同的...

    redis集群脚本redis-trib

    redis-trib.rb 是采用 Ruby 实现的 Redis 集群管理工具。内部通过 Cluster 相关命令帮我们简化集群创建、检查、槽迁移和均衡等常见运维操作,使用之前需要安装 Ruby 依赖环境。

    nginx+lua+redis 集群 连接插件和脚本

    本资源包“nginx+lua+redis集群 连接插件和脚本”正是为了解决这三者之间的协同工作,特别是针对原插件没有密码功能的问题进行了改进,使得安全性得到了提升。 首先,Nginx是一款轻量级的Web服务器/反向代理服务器...

    ruby.rar(redis集群管理器)

    在本案例中,提供的"ruby.rar"文件可能包含一个用Ruby语言编写的Redis集群管理脚本或工具,适用于Redis从2.4到3.0的版本。在CentOS 7操作系统环境下,这个工具可以帮助用户更方便地部署、监控和维护Redis集群。 ...

    redis集群,使用ruby脚本搭建集群

    这里提到的 Ruby 脚本可能是一种自动化工具,如 `redis-trib.rb`,这是 Redis 官方提供的用于创建和管理集群的命令行工具。这个脚本可以帮助我们快速地初始化和配置集群,避免手动操作的繁琐。 步骤如下: 1. 安装...

    redis集群连接及工具类DEMO

    【Redis集群连接及工具类DEMO】是一个Spring工程,它提供了与Redis集群交互的实例,同时也包含了一些实用的工具类,使得开发者能够更方便地在Java应用中使用Redis作为数据存储。这个DEMO的主要目标是展示如何配置和...

    docker 一键部署redis集群 shell脚本 适用centos7.x版本

    docker 一键部署redis集群 shell脚本 适用centos7.x版本,按照说明 将参数传递给 安装脚本,自动执行部署程序,亲测可用

    redis集群创建脚本.sh

    此附件是快速搭建redis集群的脚本,方便灵活,减少了自己一大堆复杂的操作,像运行服务一样执行几条start,stop等命令即可轻松完成集群搭建。

    Redis集群测试

    9. **edu-demo-redis-cluster**:这可能是具体实现Redis集群功能的示例项目,可能包含配置文件、Java代码或者其他脚本,用于演示如何在实际应用中设置和使用Redis集群。 在实际测试过程中,开发者需要确保集群的...

    Redis集群安装配置加图片详解清晰版

    本篇文档详细介绍了在Linux环境下安装Redis集群的全过程,包括了系统环境的准备、软件包的下载与安装、目录的规划与创建、Ruby环境的安装、Redis的编译与安装、服务安装脚本的执行、集群节点的配置以及各个关键步骤...

    redis集群批处理一键搭建

    Redis集群批处理一键搭建是指通过一个简单的批处理脚本来快速构建和配置...通过理解Redis集群的工作原理、数据持久化机制以及批处理脚本的运作方式,可以更好地管理和维护Redis集群,确保服务的稳定性和数据的安全性。

    windows后台服务形式启动redis集群及powershell脚本

    在Windows环境下,Redis通常以命令行方式运行,但为了实现后台服务化并便于管理,我们可以将其配置为服务形式启动...总的来说,通过PowerShell脚本自动化部署Redis集群,可以极大地提高效率,同时降低了出错的可能性。

    一键shell脚本搭建docker redis 集群(cluster)

    为了新手小伙伴发愁集群创建难,特意写了一个shell脚本。自己技术也很菜,但是我坚信也会有跟我一样菜的小伙伴。。。。哈哈哈 不多说直接上脚本 希望有大神更加优化一下,优化后的版本可以分享下。哇 等着你大神,...

    redis一键部署集群脚本

    本文将深入讲解如何利用"redis一键部署集群脚本"来搭建Redis集群,以及集群的工作原理和关键配置。 一、Redis集群基础 Redis集群(Redis Cluster)是Redis提供的分布式解决方案,通过数据分片(Sharding)实现水平...

    tomcat(可用于部署redis集群)

    这可能意味着Tomcat服务器中包含了一套自动脚本或配置模板,帮助用户快速配置Redis集群的节点,减少了手动操作和调试的时间。 **标签解析:** - **"tomcat"**:指的是Apache Tomcat,是一个流行的Java应用服务器,...

    Windows环境下搭建Redis集群.docx

    七、使用 Ruby 脚本编写 Redis 集群 * 使用 Ruby 脚本编写 Redis 集群 * 需要考虑兼容性,例如使用 3.2.2 版本的驱动 搭建 Redis 集群需要详细的步骤和配置,这些步骤和配置都是非常重要的。 tylko通过这些步骤和...

    redis集群 三主三从模式

    在"redis集群 三主三从模式"中,我们探讨的是一个典型的高可用配置,其中包含三个主节点和三个从节点。这种模式确保了即使在单个节点故障的情况下,系统仍能保持正常运行。 首先,我们需要理解Redis集群的基本概念...

Global site tag (gtag.js) - Google Analytics