首页 > 代码库 > 如何在linux平台上安装redis(附自动安装脚本)

如何在linux平台上安装redis(附自动安装脚本)

1.Redis的简单介绍

Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务器。

Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这被称为半持久化模式;也可以把每一次数据变化都写到一个append onlyfile(aof)里面(“这称为全持久化模式”)

 

 

 

 

 

 

 

2.Redis的生产经验教训

1.要进行Master-slave主从同步配置,在出现服务故障时候切换。

2.master禁用数据持久化,只需在slave上配置数据持久化。

3.物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉,这个情况是灾难!

4.Redis物理内存使用超过内存总容量的3/5时就会出现比较危险了,就开始用swap内存了。

5.档达到最大内存时候,会清空带有过期时间的key,即使key未到过期时间。

6.redisDB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题。


 2.Redis部署环境搭建

安装redis编译所需的相关依赖包

Ubuntu Debain系列操作系统

apt-get  -y install gcc make  tcl

 

RedhatCentOS 系列操作系统

yum -yinstall gcc  make  automake  tcl

 

 

下载redis源码安装包

sudo su-        #统一切换到root家目录

mkdir -p/home/tools #统一把下载的redis安装包放到/home/tools目录

wgethttp://download.redis.io/redis-stable.tar.gz

 

解压安装redis安装包

tar zxvf  /home/tools/redis-stable.tar.gz

cdredis-stable/

make&& make  PREFIX=/usr/local/redis  install

#可以将相关命令文件安装到指定的path路径下,比如/usr/local/redis

                            spacer.gif

redis-benchmark#性能测试工具,测试Redis在您的系统及您的配置下的读写性

redis-check-aof#更新日志检查

redis-check-dump#用于本地数据库检查

redis-cli#命令行操作工具

redis-server#Redis服务器的daemon启动程序

 

 

 

 

配置redis相关目录以及文件

mkdir -p/usr/local/redis/{etc,run,data,log}

mkdir -p /usr/local/redis/data/6379

cd/home/tools/redis-stable

\cp/home/tools/redis-stable/redis.conf /usr/local/redis/etc/redis.conf

\cp/usr/local/redis/etc/redis.conf /usr/local/redis/etc/redis_6379.conf

sed -i‘37s/daemonize no/daemonize yes/‘ /usr/local/redis/etc/redis_6379.conf

sed -i‘41s#/var/run/redis.pid#/usr/local/redis/run/redis_6379.pid#‘/usr/local/redis/etc/redis_6379.conf

sed -i‘187s#dir ./#dir /usr/local/redis/data/6379#‘/usr/local/redis/etc/redis_6379.conf

sed -i‘103s#logfile ""#logfile /usr/local/redis/log/redis_6379.log#‘/usr/local/redis/etc/redis_6379.conf

 

 

添加redis内存优化参数

echo"vm.overcommit_memory = 1" >> /etc/sysctl.conf

# /proc/sys/vm/overcommit_memory文件指定了内核针对内存分配的策略,其值可以是012
0
表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1
表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2
表示内核允许分配超过所有物理内存和交换空间总和的内存。
Redis
dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为 8G,这个时候也要同样分配8G的内存给child, 如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。
所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

sysctl -p #立刻生效

 

 

自定义配置redis启动关闭脚本

vim/etc/init.d/redis

添加如下脚本

################################################################################

 

 

#!/bin/sh

 

PATH="/usr/local/redis/bin:$PATH"

EXEC="/usr/local/redis/bin/redis-server"

CLIEXEC="/usr/local/redis/bin/redis-cli"

PIDFILE="/usr/local/redis/run/redis_6379.pid"

CONF="/usr/local/redis/etc/redis_6379.conf"

REDISPORT="6379"

 

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"Usage: $0 {start|stop}" >&2

        exit 1

        ;;

esac

###########################################################################

 

 

 

赋与权限,启动redis服务,加载数据,测试redis

chmod +x/etc/init.d/redis && /etc/init.d/redis start   #启动redis

/usr/local/redis/bin/redis-cli   # 进入redis命令行

ln -s/usr/local/redis/bin/* /usr/bin  # 添加软连接

 

加载数据

 

spacer.gif

 

 

查看所有key

spacer.gif

 

 

 

5. Redis的安全

 

警告:因为redis速度相当快,所以在一台比较好的服务器之下,一个外部的用户可以在一秒钟进行上万次的密码尝试,这意味着你需要制定非常强大的密码来防止暴力破解。

 

1)编辑配置文件/usr/local/redis/etc/redis_6379.conf

找到”requirepass”这一行,默认是注释掉的,去掉注释,自定义相关密码。

 

spacer.gif

 

2)修改之后,记得重启redis服务,然后再次连接redis,发现没有密码的话,无法进行任何操作

 

spacer.gif

 

3使用密码以非交互式的方式连接,发现又可以进行查询和修改了

spacer.gif

 

 

 

 

 

 

 

 

 

 

6.数据的保存和备份

因为Redis是异步写入磁盘的,如果要让内存中的数据马上写入硬盘,可以执行如下命令:

spacer.gif

 

 

 

 

 

 

7.Redis相关配置参数详解

daemonizeyes #是否作为守护进程运行

pidfile /usr/local/redis/run/redis_6379.pid#如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid

port 6379#默认监听端口

#bind127.0.0.1 #绑定主机IP,默认值为不绑定,即0.0.0.0

timeout 0#客户端闲置多少秒后,断开连接,默认为0,即不断开

loglevelverbose #日志记录等级,有4个可选值,debugverbose(默认值),noticewarning

logfile/opt/redis/log/redis_6379.log #指定日志输出的文件名,默认值为stdout,也可设为/dev/null屏蔽日志

databases16 #可用数据库数,默认值为16,默认数据库为0

################################SNAPSHOTTING #################################

save 900 1#保存数据到disk的策略,当有一条Keys数据被改变是,900秒刷新到disk一次

save 30010 #当有10Keys数据被改变时,300秒刷新到disk一次

save 6010000 #当有1wkeys数据被改变时,60秒刷新到disk一次

rdbcompressionyes #dump .rdb数据库的时候是否压缩数据对象

dbfilenamedump.rdb #本地数据库文件名,默认值为dump.rdb

dir/opt/redis/data/6379 #本地数据库存放路径

#################################REPLICATION #################################

# slaveof<masterip> <masterport> #当本机为从服务时,设置主服务的IP及端口

#masterauth <master-password> #当本机为从服务时,设置主服务的连接密码

#requirepass foobared #连接密码

slave-serve-stale-datayes

slave-priority100

###################################LIMITS ####################################

#maxclients 128 #最大客户端连接数,默认不限制

#maxmemory <bytes> #最大内存使用设置,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,仍到达最大内存设置,将无法再进行写入操作

##############################APPEND ONLY MODE ###############################

appendonlyno #是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no

#appendfilename appendonly.aof #更新日志文件名,默认值为appendonly.aof

#appendfsync always #更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)

appendfsynceverysec

#appendfsync no

no-appendfsync-on-rewriteno

auto-aof-rewrite-percentage100

auto-aof-rewrite-min-size64mb

##################################SLOW LOG ###################################

slowlog-log-slower-than10000

slowlog-max-len128

################################VIRTUAL MEMORY ###############################

vm-enabledno #是否开启VM功能,默认值为no

vm-swap-file/tmp/redis.swap #虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

vm-max-memory0 #将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的 (Redis的索引数据就是keys),也就是说,vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

vm-page-size32

vm-pages134217728

vm-max-threads4

###############################ADVANCED CONFIG ###############################

hash-max-zipmap-entries64

hash-max-zipmap-value512

list-max-ziplist-entries512

list-max-ziplist-value64

set-max-intset-entries512

zset-max-ziplist-entries128

zset-max-ziplist-value64

activerehashingyes #是否重置Hash

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8.Redis自动化安装脚本

以上的操作步骤完全可以用下面这个自动化安装脚本代替。

可以直接运行此脚本来实现自动安装redis,兼融centosubuntu系列。

##############################################

#!/bin/bash
#version choose
OS=`sed -n ‘1p‘ /etc/issue|awk ‘{print $1}‘`
if [ $OS = "Ubuntu" ];then
apt-get  -y install gcc make  tcl
else
yum -y install gcc  make  automake  tcl
fi

#Install redis
if [ ! -d /home/tools/ ];then
mkdir -p /home/tools
else
rm -rf /home/tools && mkdir -p /home/tools
fi

cd /home/tools
wget 
http://download.redis.io/redis-stable.tar.gz
tar zxvf redis-stable.tar.gz
if [ $? -eq 0 ];then
cd redis-stable/ && make && make  PREFIX=/usr/local/redis  install
fi

#Config redis
mkdir -p /usr/local/redis/{etc,run,data,log}
mkdir -p /usr/local/redis/data/6379
cd /home/tools/redis-stable
\cp /home/tools/redis-stable/redis.conf  /usr/local/redis/etc/redis.conf
\cp /usr/local/redis/etc/redis.conf  /usr/local/redis/etc/redis_6379.conf
sed -i ‘37s/daemonize no/daemonize yes/‘ /usr/local/redis/etc/redis_6379.conf
sed -i ‘41s#/var/run/redis.pid#/usr/local/redis/run/redis_6379.pid#‘ /usr/local/redis/etc/redis_6379.conf
sed -i ‘187s#dir ./#dir /usr/local/redis/data/6379#‘ /usr/local/redis/etc/redis_6379.conf
sed -i ‘103s#logfile ""#logfile /usr/local/redis/log/redis_6379.log#‘ /usr/local/redis/etc/redis_6379.conf

#Adding memory optimization parameters
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf 
sysctl -p

#Config start/stop script
cat > /etc/init.d/redis <<EOF
#!/bin/sh

PATH="/usr/local/redis/bin:\$PATH"
EXEC="/usr/local/redis/bin/redis-server"
CLIEXEC="/usr/local/redis/bin/redis-cli"
PIDFILE="/usr/local/redis/run/redis_6379.pid"
CONF="/usr/local/redis/etc/redis_6379.conf"
REDISPORT="6379"

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 "Usage: \$0 {start|stop}" >&2
        exit 1
        ;;
esac
EOF

#Setup redis
chmod +x /etc/init.d/redis && /etc/init.d/redis start 

ln -s /usr/local/redis/bin/*/usr/bin

##########################################################

 

 


本文出自 “运维人生” 博客,请务必保留此出处http://jinyan2049.blog.51cto.com/881440/1557700

如何在linux平台上安装redis(附自动安装脚本)