目录
3. 将 create_redis_cluster.sh 改为可执行
一、需求
三台 128G 内存的物理机,目标为在其上构建多套一主两从的 Redis 集群。要求根据业务需要,能够快速创建新集群。三台服务器 IP 如下:
10.10.10.1(master)
10.10.10.2(slave)
10.10.10.3(slave)
二、安装 Redis
以下操作步骤均在三台机器上执行。
1. 安装 gcc
yum install gcc
2. 创建 redis 用户
useradd redis
passwd redis
su - redis
3. 解压并编译
tar -zxvf redis-3.2.3.tar.gz
cd redis-3.2.3/src/ && make
4. 限制 redis 用户登录
用 root 用户编辑 /etc/passwd 文件,将 redis 用户的登录 shell 改为 /sbin/nologin:
redis:x:8002:8002::/home/redis:/sbin/nologin
三、建立配置文件模板
1. master 模板
在 10.10.10.1 上创建 redis.conf.templet 文件,内容如下:
rename-command flushAll ""
daemonize yes
port 20001
dir "/redisdata1"
pidfile "/redisdata1/redis.pid"
logfile "/redisdata1/redis.log"
dbfilename "dump.rdb"
save 900 1
appendonly no
appendfilename "appendonly.aof"
appendfsync always
maxmemory 8gb
maxmemory-policy volatile-lru
maxmemory-samples 3
slowlog-log-slower-than 10000
repl-backlog-size 64mb
timeout 0
repl-timeout 240
requirepass "123456"
masterauth "123456"
protected-mode no
2. slave 模板
在 10.10.10.2、10.10.10.3 上创建 redis.conf.templet 文件,内容如下:
rename-command flushAll ""
daemonize yes
port 20001
dir "/redisdata1"
pidfile "/redisdata1/redis.pid"
logfile "/redisdata1/redis.log"
dbfilename "dump.rdb"
save 900 1
appendonly no
appendfilename "appendonly.aof"
appendfsync always
maxmemory 8gb
maxmemory-policy volatile-lru
maxmemory-samples 3
slowlog-log-slower-than 10000
repl-backlog-size 64mb
timeout 0
repl-timeout 240
requirepass "123456"
masterauth "123456"
protected-mode no
slaveof 10.10.10.1 20001
slave 的模板文件比 master 的模板文件只是多了最后一行。
3. 哨兵模板
在全部三台机器上创建 sentinel.conf.templet 文件,内容如下:
port 20002
protected-mode no
dir "/redisdata1"
sentinel monitor redis1 10.10.10.1 20001 2
sentinel auth-pass redis1 123456
sentinel down-after-milliseconds redis1 5000
sentinel failover-timeout redis1 10000
说明:
- 一个集群最少需要三个单实例的 redis-server 和三个哨兵实例。
- 第 1 个集群名称为 redis1,第2、3...个集群的集群名称依次为 redis2、redis3... 。
- 第 1 个集群的数据目录为 /redisdata1,第2、3...个集群的数据目录依次为 /redisdata2、/redisdata3... 。
- 第 1 个集群 redis-server 端口为 20001,哨兵端口为 20002;第 2、3...个集群的 redis-server 端口及哨兵端口依次为 20003、20004,20005、20006... ,第 n 个集群的 redis-server 端口和哨兵端口分别为 20000 + 2*n - 1、20000 + 2*n。
- 需要提供给开发人员的信息是:集群名称、口令和三个哨兵实例的 IP、端口。
四、编写创建集群的shell脚本
1. master
在 10.10.10.1 上创建 create_redis_cluster.sh 文件,内容如下:
#!/bin/bash
maxdir=`ls -l /home/redis | grep "redisdata" | awk '{print $9}' | sort -k1.10n | tail -n1`
maxnum=`expr ${maxdir:9} + 1`
datadir='/redisdata'${maxnum}
clustername='redis'${maxnum}
redis_port=$((20000+maxnum*2-1))
sentinel_port=$((20000+maxnum*2))
mkdir ${datadir}
cp redis.conf.templet ${datadir}/redis.conf
cp sentinel.conf.templet ${datadir}/sentinel.conf
sed -i "s/20001/$redis_port/g" ${datadir}/redis.conf
sed -i "s/redisdata1/redisdata$maxnum/g" ${datadir}/redis.conf
sed -i "s/20002/$sentinel_port/g" ${datadir}/sentinel.conf
sed -i "s/20001/$redis_port/g" ${datadir}/sentinel.conf
sed -i "s/redis1/$clustername/g" ${datadir}/sentinel.conf
sed -i "s/redisdata1/redisdata$maxnum/g" ${datadir}/sentinel.conf
chown -R redis:redis ${datadir}
chmod 775 ${datadir}
chmod 664 ${datadir}/*
sudo -u redis redis-server ${datadir}/redis.conf
sudo -u redis redis-sentinel ${datadir}/sentinel.conf > ${datadir}/sentinel.log 2>&1 &
ssh root@10.10.10.2 create_redis_cluster.sh
ssh root@10.10.10.3 create_redis_cluster.sh
info="集群名称:${clustername} |哨兵:10.10.10.1 ${sentinel_port}, 10.10.10.2 ${sentinel_port}, 10.10.10.3 ${sentinel_port} |口令:123456"
echo ${info} | sed 's/|/\n /g'
2. slave
在 10.10.10.2、10.10.10.3 上创建 create_redis_cluster.sh 文件,内容如下:
maxdir=`ls -l /home/redis | grep "redisdata" | awk '{print $9}' | sort -k1.10n | tail -n1`
maxnum=`expr ${maxdir:9} + 1`
datadir='/redisdata'${maxnum}
clustername='redis'${maxnum}
redis_port=$((20000+maxnum*2-1))
sentinel_port=$((20000+maxnum*2))
mkdir ${datadir}
cp redis.conf.templet ${datadir}/redis.conf
cp sentinel.conf.templet ${datadir}/sentinel.conf
sed -i "s/20001/$redis_port/g" ${datadir}/redis.conf
sed -i "s/redisdata1/redisdata$maxnum/g" ${datadir}/redis.conf
sed -i "s/20002/$sentinel_port/g" ${datadir}/sentinel.conf
sed -i "s/20001/$redis_port/g" ${datadir}/sentinel.conf
sed -i "s/redis1/$clustername/g" ${datadir}/sentinel.conf
sed -i "s/redisdata1/redisdata$maxnum/g" ${datadir}/sentinel.conf
chown -R redis:redis ${datadir}
chmod 775 ${datadir}
chmod 664 ${datadir}/*
sudo -u redis redis-server ${datadir}/redis.conf
sudo -u redis redis-sentinel ${datadir}/sentinel.conf > ${datadir}/sentinel.log 2>&1 &
五、其它准备
1. 配置SSH登录无密码验证
在 10.10.10.1(master)上用 root 用户执行:
ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.2
ssh-copy-id -i /root/.ssh/id_rsa.pub root@10.10.10.3
2. 禁用 requiretty
用 root 用户编辑 /etc/sudoers 文件,注释以下行,三台都执行:
# Defaults requiretty
3. 将 create_redis_cluster.sh 改为可执行
chmod 755 /root/create_redis_cluster.sh
三台都执行。
至此所有配置已经完成。每次执行 10.10.10.1 上的 create_redis_cluster.sh 文件,就会自动创建一个新的哨兵模式 Redis 集群,一键式秒建。