初学乍练redis:一键部署集群

2019-05-25 19:42:14 浏览数 (1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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集群,一键式秒建。

0 人点赞