作者:北京运维

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. asp.net mvc4 小问题

    最近在学习mvc4中间出现一些问题.留作记录.. 1.新建立的项目在vs2013中运行后会出现一个长轮询..这个叫browserLink 是vs2013中新加入的东西.至于更多解释.直接百度.. 关闭 ...

  2. listview的pushBackDefaultItem中的item属性被修改问题

    time:2015/05/04 1. 描述 在cocostudio中有两个控件,一个listview,另外一个是隐藏的imageview,其中后者作为listview的元素.每次使用的时候把Image ...

  3. kotlin lateinit

    声明变量: private var a: String? = "" 或者:private lateinit var a: String // 使用前先初始化

  4. Django路由系统---django重点之url传递一个默认参数

    django重点之url传递一个默认参数 可以利用这个特性,让2个URL映射一个函数,但是返回2个不同的HTML url(r'default_param1', views.def_param,), u ...

  5. Azure 负载均衡器的多个 VIP

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. Azure 负载均衡器 ...

  6. (转)如何解决VC中的警告warning C4251 needs to have dll-interface

    这通常是由于以数据成员方式在DLL导出类中使用了模板类造成的.比如: #include <iostream> #include <vector> using namespace ...

  7. 剖析php脚本的超时机制

    在做php开发的时候,经常会设置max_input_time.max_execution_time,用来控制脚本的超时时间.但却从来没有思考过背后的原理. 趁着这两天有空,研究一下这个问题.文中源码取 ...

  8. 页面请求速度慢,TTFB时间长的问题分析

    线上环境发现用户请求某个页面时,出现请求速度慢页面卡顿白屏的现象,通过chrome开发工具调试查看Timing,花费在waiting(TTFB)上的时间过长,几秒十几秒不等 TTFB全称Time To ...

  9. CSS3动画中的位置设定问题

    水平居中的不同方法实现: position: absolute; margin: auto; left:; right:; position: absolute; left:%; -webkit-tr ...

  10. JAVA Color类

    Color类用于定义颜色,java.awt.Color中提供了13个预定义的常量用来表示13中标准颜色,分别是: public static final Color white白色. public s ...