vlambda博客
学习文章列表

redis-免安装的redis包_拷贝版

一个软件在系统中的安装有很多种方式,但分析其原理,无非就是文件的拷贝和注册。这也是Linux中 Everything is file 理念的一种体现。若再进一步说,则大致可以分为如下几个步骤。

  • 源码,通过源码获得软件,常用的指令是wget;

  • 编译,通过编译使源码结合当前系统的环境生成相应的二进制文件和修改相应的配置文件,常用的指令是configure,make;

  • 测试,使用预设的用例对编译后的结果进行测试,以检验是否编译完整,常用的指令是make test;

  • 安装,将二进制文件、配置文件放入系统中约定俗成的目录下,并在环境变量中进行声明,常用的指令是make install,当然也有yum和apt,只是它们是把之前的过程交由其他公司完成;

  • 配置,将一些常见的配置项进行配置;

  • 服务启动,检验软件是否可以正常提供服务,常用的指令是service xxx start;

  • 应用测试,通过应用用例进行测试服务可正常提供响应,如本文所使用的ping;

  • 使用,正常使用软件吧;

在实际业务环境下,软件的安装往往受到公司的一些现实因素的约束,如技术策略、选型倾向、安全限制、人员能力、团队风格等。举个栗子来说,一个公司所使用的操作系统是确定的,像是 Redhat Enterprise Linux 64,甚至有时操作系统的版本也会做出相应的约定。所以在具体操作上,往往不会那么灵活,但也提供了一条捷径。那就是在预先拟定的一台服务器上进行满足所有条件的安装,在其他开发、测试、预投产、生产等环境下,直接采用拷贝的方式完成。这样在符合标准规范的同时,可以大幅减少人力投入。若是在容器的环境下,道理也是相通的,只是把软件写入指定的image中了。

拷贝版的安装方式还有一个好处是可以较容易的将一些开源软件作为自身软件的一个组件进行统一安装,以减少用户进行软件安装时的步骤。

目录

  • 安装标准

  • 预制软件

    • 源码

  • 编译

  • 测试

    • 安装

    • 配置文件

    • 环境变量

    • 服务启动

    • Service服务启动

    • 应用测试

    • redis打包

  • 拷贝安装

    • 复制redis包

    • 服务启动

    • Service服务启动

安装标准

redis软件要遵循以下安装标准:

  • 软件目录为 /opt/app/redis

  • 配置目录为 /opt/app/redis/config

  • 服务脚本目录为 /opt/app/redis/sbin

  • 能够支持以service指令启停

  • 可以通过删除软件目录,从而卸载整个软件

  • 尽可能简化安装步骤

预制软件

源码

从官网下载源代码

 
   
   
 
mkdir -p /opt/app/software/redis
cd /opt/app/software/redis
wget http://download.redis.io/releases/redis-5.0.8.tar.gz

编译

在编译时需要指定PREFIX,其实就是在make时进行声明环境变量。在 src/Makefile 中有如下代码 PREFIX?=/usr/local,含义是若PREFIX未被赋值,则采用 /usr/local 进行赋值。所以可以通过在make时声明环境变量进行修改。网上有不少攻略,是直接修改Makefile文件,不太规范和妥当。

redis目录中是没有 configure 文件的,所以不用执行 ./configure 来生成Makefile。

 
   
   
 
tar xvzf redis-5.0.8.tar.gz
cd redis-5.0.8
make PREFIX=/opt/app/redis

测试

编译后的测试其实挺简单的,就是一条指令,具体的测试点在 /opt/app/software/redis/redis-5.0.8 下的 tests 系列文件中。通过指令 /usr/bin/tclsh8.5 tests/test_helper.tcl --single unit/moduleapi/commandfilter --single unit/moduleapi/testrdb 执行测试。

给个测试的例子,瞧瞧!


 
   
   
 
make test

安装

安装时注意两点,一是预先创建所需的安装目录,二是声明PREFIX。

 
   
   
 
mkdir -p /opt/app/redis
make install PREFIX=/opt/app/redis
mkdir -p /opt/app/redis/config
cp redis.conf /opt/app/redis/config
cp sentinel.conf /opt/app/redis/config
mkdir -p /opt/app/redis/sbin
mkdir -p /opt/app/redis/log
mkdir -p /opt/app/redis/dump

配置文件

依据公司的规范标准,修改配置文件,进行常规性配置。

 
   
   
 
cd /opt/app/redis/config
vi redis.conf

daemonize yes
pidfile /opt/app/redis/redis_6379.pid
logfile "/opt/app/redis/log/redis_6379.log"
bind 192.168.xx.xxx
port 6379
dir /opt/app/redis/dump/

环境变量

此处创建环境变量,主要是为了方便使用redis-cli。

 
   
   
 
cd /opt/app/redis
vi redis.env

REDIS_HOME=/opt/app/redis

export PATH=$PATH:$REDIS_HOME/bin

# 指令
echo "# redis env" >> ~/.bashrc
echo ". /opt/app/redis/redis.env" >> ~/.bashrc
. ~/.bashrc

服务启动

使用/opt/app/redis/config/redis.conf作为配置文件启动redis服务。

 
   
   
 
cd /opt/app/redis
./bin/redis-server ./config/redis.conf &
ps -ef|grep redis-server
ll redis_6379.pid

停止

 
   
   
 
# 优雅
cd /opt/app/redis
./bin/redis-cli -p 6379 shutdown
ll redis_6379.pid

# 强制
ps -ef|grep redis-server
kill -9 ${pid}

Service服务启动

若有root权限,则可以配置init.d下的文件实现service指令的启停。此处视具体情况决定是否配置。

  • 创建redisd文件。

 
   
   
 
cd /opt/app/redis/bin
touch redisd
chmod +x redisd

vi redisd

REDIS_HOME=/opt/app/redis

REDIS_PORT=6379
EXEC=$REDIS_HOME/bin/redis-server
CONF=$REDIS_HOME/config/redis.conf
PIDFILE=$REDIS_HOME/redis_$REDIS_PORT.pid

REDIS_CLI=$REDIS_HOME/bin/redis-cli


case "$1" in
start)
if [ -f $PIDFILE ]
then
echo "$PIDFILE exists, redis is already running or crashed."
else
echo "Starting Redis server..."
$EXEC $CONF
fi
if [ "$?" -eq "0" ]
then
echo "Redis is running..."
fi
;;
stop)
if [ ! -f $PIDFILE ]
then
echo "$PIDFILE exists, redis is not running."
else
PID=$(cat $PIDFILE)
echo "Stopping..."
$REDIS_CLI -p $REDIS_PORT SHUTDOWN
while [ -x $PIDFILE ]
do
echo "Waiting for Redis to shutdown..."
sleep 1
done
echo "Redis stopped"
fi
;;
status)
$REDIS_CLI -p $REDIS_PORT PING 1>/dev/null
if [ "$?" -eq "0" ]
then
echo "Redis is running."
else
echo "Redis is not running..."
fi
;;
restart|force-reload)
${0} stop
${0} start
;;
*)
echo "Usage: service redisd {start|stop|status|restart|force-reload}" >&2
exit 1
esac
  • 复制redisd文件

使用root用户,将redisd文件复制至 /etc/init.d/

 
   
   
 
cd /etc/init.d/
cp /opt/app/redis/bin/redisd .
  • 测试

 
   
   
 
service redisd start
service redisd stop
service redisd restart
service redisd status
service redisd force-reload
service redisd others

应用测试

通过redis-cli执行 ping 指令进行测试。

 
   
   
 
cd /opt/app/redis/bin
redis-cli -p 6379 ping
redis-cli -p 6379 info

redis打包

通过将已可正常使用的redis打包,生成 redis.tar,实现拷贝安装。

 
   
   
 
cd /opt/app
tar cvf redis.tar redis/
mv redis.tar software/redis/
cd software/redis/
ll redis.tar

拷贝安装

复制redis包

将redis包复制到所需安装的服务器中。

 
   
   
 
cd /opt/app
scp [email protected]:/opt/app/software/redis/redis.tar .
tar xvf redis.tar
rm redis.tar

服务启动

启动redis服务。

 
   
   
 
cd /opt/app/redis
./bin/redis-server ./config/redis.conf &
ps -ef|grep redis-server
ll redis_6379.pid

停止

 
   
   
 
# 优雅
cd /opt/app/redis
./bin/redis-cli -p 6379 shutdown
ll redis_6379.pid

Service服务启动

若有root权限,则可以配置init.d下的文件实现service指令的启停。

使用root用户,将redisd文件复制至 /etc/init.d/

 
   
   
 
cd /etc/init.d/
cp /opt/app/redis/bin/redisd .
  • 测试

 
   
   
 
service redisd start
service redisd stop
service redisd restart
service redisd status
service redisd force-reload
service redisd others