redis集群搭建脚本(最简单的搭建方式)

redis集群搭建脚本

> 注意点1:  centos7.x的系统,低版本没有尝试,失败一般发生在编译redis源码的时候缺少依赖

> 注意点2:  IPADDRS的服务器间通信必须正常,防火墙关闭或开放对应集群端口

> 注意点3:  !!!!!! 必须在IPADDRS中的某一台服务器上用root账号执行此脚本 !!!!!! 
		   执行时必须在此节点执行的命令: yum install sshpass -y  
		   安装完成后不使用此脚本可以remove掉sshpass,自己决定
  
> 注意点4:  EXEPATH指定的目录下不建议存在redis开头的任何文件夹,不然此脚本会影响你的
		   文件,删除集群时可能造成误删除.

> 注意点5:  IPADDRS和PASSWORD的顺序必须一一对应,FIRSTPORT是每台服务器的起始端口号
		   安装几个实例取决于NODES参数,端口号以此递增
		   eg:NODES=3时 端口是6379 6380 6381

> 注意点6:  运行start时,redis集群创建存在交互,需要输入yes完成节点载入集群

使用方法

#1. 安装依赖环境
脚本.sh install
#2. 目录配置和编译源码
脚本.sh make
#3. 启动集群
脚本.sh start
#4. 停止集群
脚本.sh stop
#5. 卸载集群
脚本.sh delete
#6. 把集群所有节点注册成服务(不太建议使用,后期可能不方便)
脚本.sh service
#!/bin/bash

# 基本设置
#单台服务器起始端口号 eg:如果NODES=2 则端口号为6379,6380,为3的话就多一个6381
FIRSTPORT=6379
#超时时间配置
TIMEOUT=2000
#单台服务器实例数
NODES=2
#master的备份节点数
REPLICAS=1
#服务器ip集合
IPADDRS=(192.168.37.10 192.168.37.11 192.168.37.12)
#服务器密码集合,与ip对应
PASSWORD=(10pwd 11pwd 12pwd)
#实例安装根目录
EXEPATH=/opt


if [ -a config.sh ]
then
    source "config.sh"
fi

#安装redis集群依赖环境
if [ "$1" == "install" ]
then
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		echo -e "\033[43;31m install $IPADDR  Start \033[0m"
		sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "yum install gcc-c++ tcl libstdc++-devel wget -y" 
		echo -e "\033[43;31m install $IPADDR  End \033[0m"
	done
	exit 0    
fi

#编译redis集群
if [ "$1" == "make" ]
then
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		echo -e "\033[43;31m download $IPADDR  Start \033[0m"
		sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "cd $EXEPATH && wget http://download.redis.io/releases/redis-5.0.5.tar.gz && tar -zxf $EXEPATH/redis-5.0.5.tar.gz && rm -rf $EXEPATH/redis-5.0.5.tar.gz && cd $EXEPATH/redis-5.0.5 && make MALLOC=libc "
		echo -e "\033[43;31m download $IPADDR  End \033[0m"
		for(( i=0;i<$NODES;i++)); do
			PORT=$((FIRSTPORT+i))
			echo -e "\033[43;31m make $IPADDR:$PORT  Start \033[0m"
			sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "cd $EXEPATH/redis-5.0.5 && make install PREFIX=$EXEPATH/redis_$PORT && mkdir $EXEPATH/redis_$PORT/etc && mkdir $EXEPATH/redis_$PORT/pid && mkdir $EXEPATH/redis_$PORT/logs && mkdir $EXEPATH/redis_$PORT/data && cp $EXEPATH/redis-5.0.5/redis.conf $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '69c bind 0.0.0.0' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '88c protected-mode no' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '92c port $PORT' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '136c daemonize yes' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '158c pidfile $EXEPATH/redis_$PORT/pid/redis_$PORT.pid' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '171c logfile $EXEPATH/redis_$PORT/logs/redis.log' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '263c dir $EXEPATH/redis_$PORT/data' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '832c cluster-enabled yes' $EXEPATH/redis_$PORT/etc/redis.conf && sed -i '840c cluster-config-file $EXEPATH/redis_$PORT/etc/nodes_$PORT.conf' $EXEPATH/redis_$PORT/etc/redis.conf  && sed -i '846c cluster-node-timeout $TIMEOUT' $EXEPATH/redis_$PORT/etc/redis.conf " 
			echo -e "\033[43;31m make $IPADDR:$PORT  End \033[0m"
		done;
		sshpass -p ${PASSWORD[p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "rm -rf $EXEPATH/redis-5.0.5"
	done
	exit 0    
fi


#运行集群
if [ "$1" == "start" ]
then
	HOSTS=""
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		for(( i=0;i<$NODES;i++)); do
			PORT=$((FIRSTPORT+i))
			HOSTS="$HOSTS $IPADDR:$PORT"
			echo -e "\033[43;31m Starting $IPADDR:$PORT Start \033[0m"
			sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "$EXEPATH/redis_$PORT/bin/redis-server $EXEPATH/redis_$PORT/etc/redis.conf"
			echo -e "\033[43;31m Starting $IPADDR:$PORT End \033[0m"
		done;
	done
	echo -e "\033[43;31m create cluster: $HOSTS \033[0m"
	$EXEPATH/redis_$FIRSTPORT/bin/redis-cli --cluster create $HOSTS --cluster-replicas $REPLICAS
	exit 0    
fi

#停止集群,建议先停止从节点,再停止主节点
if [ "$1" == "stop" ]
then
	for p in ${!IPADDRS[@]}; do
		IPADDR=${IPADDRS[$p]}
		for((i=($NODES-1);i>=0;i--)); do
			PORT=$((FIRSTPORT+i))
			echo -e "\033[43;31m Stopping $IPADDR:$PORT Start \033[0m"
			sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "$EXEPATH/redis_$PORT/bin/redis-cli -h $IPADDR -p $PORT shutdown nosave"
			echo -e "\033[43;31m Stopping $IPADDR:$PORT End \033[0m"
		done;
	done
	exit 0    
fi


#删除集群
if [ "$1" == "delete" ];then
	read -p "你确定要删除整个集群么?删除前请先stop,该操作会删除所有数据,输入[yes/no]?" input
	echo $input
	if [ $input = "yes" ];then
		for p in ${!IPADDRS[@]}; do
			IPADDR=${IPADDRS[$p]}
			echo -e "\033[43;31m Delete $IPADDR:$PORT Start \033[0m"
			sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "rm -rf redis-5.0.5.tar.gz && rm -rf redis-5.0.5 && rm -rf $EXEPATH/redis_*"
			echo -e "\033[43;31m Delete $IPADDR:$PORT End \033[0m"
		done
	fi
	exit 0
fi


if [ "$1" == "service" ];then
	read -p "设置成服务会重启新系统,我也不建议你注册成服务,确定要操作么,输入[yes/no]?" input
	echo $input
	if [ $input = "yes" ];then
		for p in ${!IPADDRS[@]}; do
			IPADDR=${IPADDRS[$p]}
			for((i=($NODES-1);i>=0;i--)); do
				PORT=$((FIRSTPORT+i))
				echo -e "\033[43;31m service $IPADDR:$PORT Start \033[0m"
				#sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "touch /usr/lib/systemd/system/redis_$PORT.service && echo '[Unit]' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'Description=Redis-Cluster' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'After=network.target' >> /usr/lib/systemd/system/redis_$PORT.service && echo '[Service]' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'Type=forking' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'PIDFile=$EXEPATH/redis_$PORT/pid/redis_$PORT.pid' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'ExecStart=$EXEPATH/redis_$PORT/bin/redis-server $EXEPATH/redis_$PORT/etc/redis.conf' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'ExecReload=/bin/kill -s HUP $MAINPID' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'ExecStop=/bin/kill -s QUIT $MAINPID' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'PrivateTmp=true' >> /usr/lib/systemd/system/redis_$PORT.service && echo '[Install]' >> /usr/lib/systemd/system/redis_$PORT.service && echo 'WantedBy=multi-user.target' >> /usr/lib/systemd/system/redis_$PORT.service "
				echo -e "\033[43;31m service $IPADDR:$PORT End \033[0m"
			done;
			echo -e "\033[43;31m systemctl $IPADDR Start \033[0m"
			#sshpass -p ${PASSWORD[$p]} ssh -o StrictHostKeychecking=no -n root@$IPADDR "systemctl daemon-reload && reboot"
			echo -e "\033[43;31m systemctl $IPADDR End \033[0m"
		done
	fi
	exit 0
fi



echo "Usage: $0 [install|make|start|stop|delete|server]"
echo "install     -- step1:yum安装redis-5.0.5集群所需要的环境,最好配置阿里的yum源"
echo "make        -- step2:编译redis源码并初始化redis集群实例和配置"
echo "start       -- step3:运行集群所有节点并构建成集群,注意要关闭防火墙或开放对应的端口"
echo "stop        -- step4:停止集群所有节点"
echo "delete      -- step5:删除整个集群所有数据(删除的是配置的个目录下所有以redis_开头的文件夹和源码包),删除前请先stop,谨慎操作!"

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于 Redis 集群搭建,可以通过以下步骤实现: 1. 准备集群节点:在准备搭建 Redis 集群之前,需要先准备好一组 Redis 节点。每个节点都是一个独立的 Redis 服务器,可以运行在同一台物理机上或者不同的物理机上。 2. 配置节点:对于每个节点,需要修改其配置文件以启用集群模式。打开每个节点的配置文件(redis.conf),将 cluster-enabled 参数设置为 yes,将 cluster-config-file 参数设置为一个文件路径(用于保存集群的配置信息),并将 cluster-node-timeout 参数设置为一个适当的值(用于检测节点是否离线)。 3. 启动节点:启动每个节点的 Redis 服务器。可以使用 redis-server 命令启动,指定配置文件作为参数。例如:redis-server /path/to/redis.conf 4. 创建集群:使用 redis-cli 命令行工具创建 Redis 集群。首先连接到任意一个节点(假设其 IP 地址为 192.168.0.1,端口号为 6379),然后执行以下命令创建集群: ``` redis-cli --cluster create 192.168.0.1:6379 192.168.0.2:6379 192.168.0.3:6379 192.168.0.4:6379 192.168.0.5:6379 192.168.0.6:6379 --cluster-replicas 1 ``` 这里将 192.168.0.1:6379 等替换为实际的节点 IP 地址和端口号。--cluster-replicas 参数用于设置每个主节点的从节点数量。 5. 验证集群:连接到任意一个节点,可以使用 cluster info 命令查看集群的一些信息,如节点数量、主从关系等。还可以使用 cluster nodes 命令查看每个节点的状态信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值