版权声明:本文为博主原创文章,未经博主允许不得转载。 https://cloud.tencent.com/developer/article/1433157
目录
一、需求
二、安装redis
1. 安装gcc
2. 建redis用户
3. 解压并编译
4. 限制redis用户登录
三、建立配置文件模板
1. master模板
2. slave模板
3. 哨兵模板
四、编写创建集群的shell脚本
1. master
2. slave
五、其它准备
1. 配置SSH登录无密码验证
2. 禁用requiretty
3. 将create_redis_cluster.sh改为可执行
一、需求
代码语言:txt复制 三台128G内存的物理机,目标为在其上构建多套一主两从的redis集群。要求根据业务需要,能够快速创建新集群。三台服务器IP如下:
代码语言:javascript复制103.244.233.166(master)
103.244.233.167(slave)
103.244.233.168(slave)
二、安装redis
代码语言:txt复制 以下操作步骤均在三台机器上执行。
1. 安装gcc
代码语言:javascript复制yum install gcc
2. 建redis用户
代码语言:javascript复制useradd redis
su - redis
3. 解压并编译
代码语言:javascript复制tar -zxvf redis-3.2.3.tar.gz
cd redis-3.2.3/src/ && make
4. 限制redis用户登录
代码语言:txt复制 编辑/etc/passwd文件,将redis用户的登录shell改为/sbin/nologin:
代码语言:javascript复制redis:x:8002:8002::/home/redis:/sbin/nologin
三、建立配置文件模板
1. master模板
代码语言:txt复制 在103.244.233.166上创建/home/redis/redis.conf.templet文件,内容如下:
代码语言:javascript复制rename-command flushAll ""
daemonize yes
port 20001
dir "/home/redis/redisdata1"
pidfile "/home/redis/redisdata1/redis.pid"
logfile "/home/redis/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模板
代码语言:txt复制 在103.244.233.167、103.244.233.168上创建/home/redis/redis.conf.templet文件,内容如下:
代码语言:javascript复制rename-command flushAll ""
daemonize yes
port 20001
dir "/home/redis/redisdata1"
pidfile "/home/redis/redisdata1/redis.pid"
logfile "/home/redis/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 103.244.233.166 20001
代码语言:txt复制 slave的模板文件比master的模板文件只是多了最后一行。
3. 哨兵模板
代码语言:txt复制 在全部三台机器上创建/home/redis/sentinel.conf.templet文件,内容如下:
代码语言:javascript复制port 20002
protected-mode no
sentinel monitor redis1 103.244.233.166 20001 2
dir "/home/redis/redisdata1"
sentinel auth-pass redis1 123456
sentinel down-after-milliseconds redis1 5000
sentinel failover-timeout redis1 10000
代码语言:txt复制 说明:
- 一个集群最少需要三个单实例的redis和三个哨兵实例。
- 第1个集群名称为redis1,第2、3...个集群的集群名称依次为redis2、redis3... 。
- 第1个集群的数据目录为/home/redis/redisdata1,第2、3...个集群的数据目录依次为/home/redis/redisdata2、/home/redis/redisdata3... 。
- 第1个集群redis服务器端口为20001,哨兵端口为20002;第2、3...个集群的redis服务器端口及哨兵端口依次为20003、20004,20005、20006... ,第n个集群的redis服务器端口和哨兵端口分别为20000 2*n - 1、20000 2*n。
- 需要提供开发人员的信息是:集群名称、口令和三个哨兵实例的IP、端口。
四、编写创建集群的shell脚本
1. master
代码语言:txt复制 在103.244.233.166上创建/root/create_redis_cluster.sh文件,内容如下:
代码语言:javascript复制#!/bin/bash
maxdir=`ls -l /home/redis | grep "redisdata" | awk '{print $9}' | sort -k1.10n | tail -n1`
maxnum=`expr ${maxdir:9} 1`
datadir='/home/redis/redisdata'${maxnum}
clustername='redis'${maxnum}
redis_port=$((20000 maxnum*2-1))
sentinel_port=$((20000 maxnum*2))
mkdir ${datadir}
cp /home/redis/redis.conf.templet ${datadir}/redis.conf
cp /home/redis/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 /home/redis/redis-3.2.3/src/redis-server ${datadir}/redis.conf
sudo -u redis /home/redis/redis-3.2.3/src/redis-sentinel ${datadir}/sentinel.conf > ${datadir}/sentinel.log 2>&1 &
ssh root@103.244.233.167 /root/create_redis_cluster.sh
ssh root@103.244.233.168 /root/create_redis_cluster.sh
info="集群名称:${clustername} |哨兵:103.244.233.166 ${sentinel_port}, 103.244.233.167 ${sentinel_port}, 103.244.233.168 ${sentinel_port} |口令:123456"
echo ${info} | sed 's/|/n /g'
2. slave
代码语言:txt复制 在103.244.233.167、103.244.233.168上创建/root/create_redis_cluster.sh文件,内容如下:
代码语言:javascript复制maxdir=`ls -l /home/redis | grep "redisdata" | awk '{print $9}' | sort -k1.10n | tail -n1`
maxnum=`expr ${maxdir:9} 1`
datadir='/home/redis/redisdata'${maxnum}
clustername='redis'${maxnum}
redis_port=$((20000 maxnum*2-1))
sentinel_port=$((20000 maxnum*2))
mkdir ${datadir}
cp /home/redis/redis.conf.templet ${datadir}/redis.conf
cp /home/redis/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 /home/redis/redis-3.2.3/src/redis-server ${datadir}/redis.conf
sudo -u redis /home/redis/redis-3.2.3/src/redis-sentinel ${datadir}/sentinel.conf > ${datadir}/sentinel.log 2>&1 &
五、其它准备
1. 配置SSH登录无密码验证
代码语言:txt复制 在103.244.233.166(master)上用root用户执行:
代码语言:javascript复制ssh-keygen -t rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@103.244.233.167
ssh-copy-id -i /root/.ssh/id_rsa.pub root@103.244.233.168
2. 禁用requiretty
代码语言:txt复制 编辑/etc/sudoers文件,注释以下行,三台都执行:
代码语言:javascript复制# Defaults requiretty
3. 将create_redis_cluster.sh改为可执行
代码语言:javascript复制chmod 755 /root/create_redis_cluster.sh
代码语言:txt复制 三台都执行。
代码语言:txt复制 至此所有配置已经完成。每次执行103.244.233.166上的/root/create_redis_cluster.sh文件,就会自动创建一个新的redis集群,一键式秒建。