作者:北京运维

1. 安装环境说明

  • OS 版本:CentOS 7.5.1804
  • Redis 版本:redis-3.2.12

Redis 下载页面:http://download.redis.io/releases/

Redis 版本号第 2 位,如果是奇数,则为非稳定版本(例如 2.7、2.9、3.1)如果是偶数为稳定版本(例如 2.8、3.0、3.2)

2. 下载安装 Redis

$ cd /usr/local/
$ wget http://download.redis.io/releases/redis-3.2.12.tar.gz
$ tar xf redis-3.2.12.tar.gz
$ ln -sv redis-3.2.12 redis
$ cd redis
$ make
$ make install

安装完成后再任意目录下执行 redis-cli -v 检查版本:

$ redis-cli -v
redis-cli 3.2.12

Redis 安装完成后,src 和 /usr/local/bin/ 目录下多了几个 redis 开头的可执行文件:

$ ls /usr/local/bin/redis-*
/usr/local/bin/redis-benchmark /usr/local/bin/redis-check-rdb /usr/local/bin/redis-sentinel
/usr/local/bin/redis-check-aof /usr/local/bin/redis-cli /usr/local/bin/redis-server

2.1 可执行文件说明

可执行文件 作用
redis-server 启动 Redis
redis-cli Redis 命令行客户端
redis-benchmark Redis 基准测试工具
redis-check-aof Redis AOF 持久化文件检测和修复工具
redis-check-rdb Redis RDB 持久化文件检测和修复工具
redis-sentinel 启动 Redis Sentinel (哨兵模式)

2.2 Redis 的基础配置

Redis 目录下都会有一个 redis.conf 的配置文件,里面就是 redis 的默认配置,通常我们会在一台服务器上启动多个 redis 实例,并且集中将配置管理在指定目录下,而且不是完全手动配置的,而是将 redis.conf 作为模板进行修改。

redis 的基础配置

配置名 配置说明
port 端口
logfile 日志文件
dir Redis 工作目录(存放持久化文件和日志文件)
daemonize 是否已守护进程方式启动 Redis(yes 或 no)

2.3 启动 Redis

2.3.1 准备 Redis 配置文件

复制 redis.conf 配置文件到指定目录,修改默认端口,并且以守护进程方式运行 Redis:

$ mkdir /etc/redis
$ cp redis.conf /etc/redis/redis_6381.conf
$ vim /etc/redis/redis_6381.conf
# 默认端口为 6379
port 6381
# 定义 Redis 日志文件路径,默认为空
logfile "/data/redis/logs/redis_6381.log"
# 定义 Redis 持久化文件路径,默认为 `./` 当前目录
dir /data/redis
# 定义已守护进程方式启动 Redis,默认为 no
daemonize yes
# 定义 pid 文件,默认为 redis_6379.pid
pidfile /var/run/redis_6381.pid
# 定义 RDB 持久化文件名,默认为 dump.rdb
dbfilename 6381.rdb
# 定义 AFO 持久化文件名,默认为 appendonly.aof
appendfilename "6381.aof" $ mkdir -pv /data/redis/logs/

2.3.2 启动 Redis

$ redis-server /etc/redis/redis_6381.conf

验证 Redis 是否启动成功:

$ ss -tnlp | grep 6381

3. Redis 单机多实例

Redis 单机多实例部署方法十分简单,只要复制多个 redis 配置文件即可。需要注意每个实例的端口不能冲突。基于上面的例子,在复制一份 redis 配置文件监听在 6382 端口。

$ cp redis.conf /etc/redis/redis_6382.conf
$ vim /etc/redis/redis_6382.conf
port 6382
daemonize yes
pidfile /var/run/redis_6382.pid
logfile "/data/redis/logs/redis_6382.log"
dbfilename 6382.rdb
dir /data/redis
appendfilename "6382.aof"

启动 6382 实例:

$ redis-server /etc/redis/redis_6382.conf

验证 6382 实例是否启动:

$ ss -tnlp | grep 6382

4. Redis 自动化创建实例脚本

4.1 脚本实现功能说明

  1. 运行 init 脚本自动创建 Redis 实例(单实例或多实例);
  2. 根据模板文件 redis.conf.tpl 生成 Redis 配置文件;
  3. 软链接 redis_scripts 脚本到 /etc/init.d/目录下为对应端口实例的启动脚本;
  4. 运行 uninit 脚本卸载指定 Redis 实例

注意:该脚本依赖于本文 Redis 安装方式,其它方式自行修改。

4.2 配置文件模板

redis.conf.tpl 模板文件中 REDISPORT 会在 init 脚本执行时替换为传入的端口号。

$ vim /usr/local/redis/redis.conf.tpl

daemonize yes
# 定义 PID 文件路径
pidfile /var/run/redis_REDISPORT.pid
bind 127.0.0.1
protected-mode no
# 定义 Redis 端口
port REDISPORT
tcp-backlog 20000
timeout 30
tcp-keepalive 0
loglevel notice
# 定义日志文件路径
logfile /data/redis/logs/redis_REDISPORT.log
databases 16
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
# 定义 RDB 文件
dbfilename REDISPORT.rdb
dir /data/redis/
slave-serve-stale-data yes
slave-read-only yes
repl-timeout 300
repl-disable-tcp-nodelay no
repl-backlog-size 1024mb
repl-backlog-ttl 0
slave-priority 100
maxmemory 20G
maxmemory-policy noeviction
appendonly yes
# 定义 AOF 持久化文件名
appendfilename REDISPORT.aof
appendfsync everysec
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 0
auto-aof-rewrite-min-size 1024mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10

4.3 Redis 启动脚本模板

$ vim /usr/local/redis/redis_scripts
#!/bin/sh
##
## redis - this script starts and stops the redis daemin
##
## chkconfig: - 52 15
## description: Simple Redis init.d script conceived to work on Linux systems \
MYNAM=`basename "$0"` REDISPORT=`echo ${MYNAM} | awk -F'_' '{print $2}'`
if [ -z "${REDISPORT}" ] ; then
REDISPORT=6379
fi EXEC=/usr/local/bin/redis-server
CLIEXEC=/usr/local/bin/redis-cli
PROG=$(basename $EXEC) PIDFILE=/var/run/redis_${REDISPORT}.pid
CONF="/etc/redis/redis_${REDISPORT}.conf"
[ -x $EXEC ] || exit 5
[ -f $CONF ] || exit 6 case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, process is already running or crashed"
else
echo "Starting Redis server..."
$EXEC $CONF
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE does not exist, process is not running"
else
PID=$(cat $PIDFILE)
echo "Stopping ..."
$CLIEXEC -p $REDISPORT shutdown
while [ -x /proc/${PID} ]
do
echo "Waiting for Redis to shutdown ..."
sleep 1
done
echo "Redis stopped"
fi
;;
*)
echo "Please use start or stop as first argument"
;;
esac $ chmod +x /usr/local/redis/redis_scripts.sh

4.4 init 脚本

$ vim /usr/local/redis/init.sh

#!/bin/sh
#
# define restricted path
PATH="/bin:/usr/bin:/sbin:/usr/sbin" # adirname - return absolute dirname of given file
adirname() { odir=`pwd`; cd `dirname $1`; pwd; cd "${odir}"; } # ---------
# constants
# ---------
MYNAM=`basename "$0"`
MYDIR=`adirname "$0"`
MYTMP="${MYDIR}/../tmp"
MYLCK="${MYTMP}/${MYNAM}.lock" PORTS=(${1//,/ })
for PORT in ${PORTS[@]}
do
cp redis.conf.tpl /etc/redis/redis_${PORT}.conf
sed -i "s/REDISPORT/${PORT}/g" /etc/redis/redis_${PORT}.conf
# 链接启动脚本对应本次生成实例的端口
ln -s redis_scripts redis_${PORT}
# 链接启动脚本到 /etc/init.d/
ln -s /usr/local/redis/redis_${PORT} /etc/init.d/redis_${PORT}
# 启动 redis
/etc/init.d/redis_${PORT} start
done
# 记录上一次创建 Redis 实例的端口号
vi /usr/local/redis/redis_chkmult.cfg $ chmod +x /usr/local/redis/init.sh

创建 redis_chkmult.cfg 用于记录上次创建 Redis 实例

$ vim /usr/local/redis/redis_chkmult.cfg
PORTS="6381"
SLAVE_CHK="true"

4.5 uninit 脚本

$ vim /usr/local/redis/uninit.sh

#!/bin/sh
#
# define restricted path
PATH="/bin:/usr/bin:/sbin:/usr/sbin" # adirname - return absolute dirname of given file
adirname() { odir=`pwd`; cd `dirname $1`; pwd; cd "${odir}"; } # ---------
# constants
# ---------
MYNAM=`basename "$0"`
MYDIR=`adirname "$0"`
MYTMP="${MYDIR}/../tmp"
MYLCK="${MYTMP}/${MYNAM}.lock" PORTS=(${1//,/ })
vi /usr/local/redis/redis_chkmult.cfg
for PORT in ${PORTS[@]}
do
/etc/init.d/redis_${PORT} stop
sudo rm -rf /etc/init.d/redis_${PORT}
sudo rm -rf /usr/local/redis/redis_${PORT}
sudo rm -rf /etc/redis/redis_${PORT}.conf
sudo rm -rf /data/redis/logs/redis_${PORT}.*
sudo rm -rf /data/redis/${PORT}.*
done $ chmod +x /usr/local/redis/uninit.sh

4.5 验证 init 脚本

创建一个 Redis 实例,端口为 6383

4.6 验证 uninit 脚本

删除 6383 实例

Redis 单机和多实例部署的更多相关文章

  1. Redis单机配置多实例,实现主从同步

    版权声明:本文为博主原创文章,欢迎转载,转载请保留或注明出处 本文转自:http://www.cnblogs.com/lgeng/p/6623336.html 一,单机多实例:Redis官网: htt ...

  2. Mysql 数据库单机多实例部署手记

        最近的研发机器需要部署多个环境,包括数据库.为了管理方便考虑将mysql数据库进行隔离,即采用单机多实例部署的方式.找了会资料发现用的人也不是太多,一般的生产环境为了充分发挥机器性能都是单机单 ...

  3. redis安装,修改配置文件,多实例部署 redis-server

    redis 安装 解压: [root@Aliyun software]# tar -xvf redis-3.2.11.tar.gz 进入redis根目录: [root@Aliyun software] ...

  4. tomcat单机多实例部署

    最近在面试的过程中,一家公司在面试时提到了有关tomcat单机多实例部署的提问, 正好, 之前使用IntelliJ IDEA 13.1.4这款IDE开发web项目,在开发的过程中,因为有多个web项目 ...

  5. solr单机多实例部署文件锁冲突解决的方法

    给出一个有问题的单机多tomcat实例引用同一个solr实例部署图. 这样的部署必定造成一个问题.启动第二个tomcat实例时,一定会报索引目录文件锁已经被占用. 最初的解决的方法是.有多少个tomc ...

  6. MYSQL 5.5.32的单机多实例部署

    Centos6.6安装并配置单机多实例的MYSQL数据库 本文介绍安装单机多实例的MYSQL数据库的环境如下: 系统平台环境:Centos6.6 Mysql软件包:Mysql-5.5.32.tar.g ...

  7. Redis学习笔记之Redis单机,伪集群,Sentinel主从复制的安装和配置

    0x00 Redis简介 Redis是一款开源的.高性能的键-值存储(key-value store).它常被称作是一款数据结构服务器(data structure server). Redis的键值 ...

  8. Redis 单机模式,主从模式,哨兵模式(sentinel),集群模式(cluster),第三方模式优缺点分析

    Redis 的几种常见使用方式包括: 单机模式 主从模式 哨兵模式(sentinel) 集群模式(cluster) 第三方模式 单机模式 Redis 单副本,采用单个 Redis 节点部署架构,没有备 ...

  9. redis从入门到放弃 -> 部署方案

    单点部署方案 环境准备: [root@localhost ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@ ...

随机推荐

  1. [iOS] UIFont 设置字体

    label.font = [UIFont fontWithName:@"Arial-BoldItalicMT" size:24]; 字体名如下: Font Family: Amer ...

  2. C++ 判断进程是否存在

    原文:http://blog.csdn.net/u010803748/article/details/53927977?locationNum=2&fps=1 一.判断指定程序名的进程是否存在 ...

  3. Linux开篇

    1.为什么学习Linux? 2.学习Linux的资料

  4. Android适配--百分比的适配

    首先,需要添加com.android.support:percent:24.1.1 包,版本随意. dependencies { compile fileTree(dir: 'libs', inclu ...

  5. JavaScript中map函数和filter的简单举例

    JavaScript的数组迭代器函数map和filter,可以遍历数组时产生新的数组,和python的map函数很类似 1> filter是满足条件的留下,是对原数组的过滤:2> map则 ...

  6. select server

    server with select #include<stdio.h> #include<sys/types.h> #include<sys/socket.h> ...

  7. maven dependendency

    登录|注册     zhengsj的专栏       目录视图 摘要视图 订阅 [公告]博客系统优化升级     [收藏]Html5 精品资源汇集     博乐招募开始啦       Maven De ...

  8. 关于Unity3d的Quaternion.Slerp的学习

    首先在场景中创建三个cube的GameObject,from表示要转换之前的样子,to表示转换之后的样子,change表示转的效果.如下图所示: 其中from和change cube开始运行之前的tr ...

  9. [翻译] ABPadLockScreen

    ABPadLockScreen ABPadLockScreen aims to provide a universal solution to providing a secure keypad/pi ...

  10. Centos7 下编译 Openjdk8

    本文主要介绍如何在 Centos7 下编译 Openjdk8 源码,<深入理解java虚拟机>第二版网上好多 openjdk7 的帖子,编译 jdk8 和 7 还是有些差别的,比如大家经常 ...