在Centos7下源码安装配置Redis

来源:互联网 发布:深入浅出python豆瓣 编辑:程序博客网 时间:2024/05/19 04:28

1.安装前准备开发环境

安装pcre开发包: yum install -y pcre-devel 
安装编译源码所需的工具和库:yum install gcc gcc-c++ ncurses-devel perl
安装cmake:yum -y install make gcc gcc-c++ ncurses-devel
安装ssl功能需要openssl库:yum -y install openssl-devel
安装压缩包:yum -y install zlib zlib-devel
JDK:jdk-8u92-linux-x64.rpm
Redis:jdk-8u92-linux-x64.rp
系统信息:
CentOS Linux release 7.2.1511 (Core)
Kernel: Linux 3.10.0-327.el7.x86_64

2.Redis安装过程

2.1解压Redis文件




进入到redis文件目录下,输入tar –zxvf redis-3.2.1.tar.gz解压文件。


编译成功。目录在在redis-3.2.1目录下输入make进行编译。

2.2编译安装文件


输入cd /usr/local目录下,输入mkdir redis创建文件夹。


输入cd /var/ftp/pub/redis-3.2.1目录下,输入输入make&&makeinstall进行编译安装。


输入whereis redis查看安装文件的路径。


输入cd /usr/local/redis/bin进入到目录下,查看文件。

Redis-benchmark

Redis-check-aof

Redis-check-rdb

Redis-cli

Redis-sentinel –>redis-server

Redis-server

2.3拷贝文件



进入到redis-3.2.1解压的目录下,输入

cp /var/ftp/pub/redis-3.2.1/redis.conf/usr/local/redis/bin

cp /var/ftp/pub/redis-3.2.1/runtest-cluster/usr/local/redis/bin

cp /var/ftp/pub/redis-3.2.1/runtest-sentinel/usr/local/redis/bin

cp /var/ftp/pub/redis-3.2.1/runtest/usr/local/redis/bin

cd /usr/local/redis/bin

将文件到问道/usr/local/redis/bin目录下。

2.4运行Redis



进入到cd /usr/local/redis/bin目录下,输入./redis-server redis.conf运行redis服务。

2.5测试Redis



新打开一个窗口,进入到cd /usr/local/redis/bin目录下,输入./redis-cli,运行客户端,进行测试:

127.0.0.1:6379> set username andrew

OK

127.0.0.1:6379> set password 123456

OK

127.0.0.1:6379> get username

"andrew"

127.0.0.1:6379> get password

"123456"

127.0.0.1:6379>

如果想退出客户端,输入exit。


3.将Redis的端口添加到Firewall



在Firewall中添加6379端口,firewall-cmd –permanent –add-port=6379/tcp,然后在输入firewall-cmd–reload,

重载成功过后,在输入firewall-cmd –list-all,可显示添加的6379端口。

4.设置自定义开机系统服务

CentOS 7 使用systemd替换了SysV。Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,

而且够在进程启动过程中更有效地引导加载服务。

systemd的特性有:

支持并行化任务

同时采用socket式与D-Bus总线式激活服务;

按需启动守护进程(daemon);

利用 Linux 的 cgroups 监视进程;

支持快照和系统恢复;

维护挂载点和自动挂载点;

各服务间基于依赖关系进行精密控制。

检视和控制systemd的主要命令是systemctl。该命令可用于查看系统状态和管理系统及服务。详见man 1 systemctl。


输入vim /usr/lib/systemd/system/redis.service进入文件编辑。


将以下内容拷贝到nginx.service文件中,然后保存。


[Unit]

Description=Redis daemon

After=network.target


[Service]

Type=forking

ExecStart=/usr/local/redis/bin/redis-server/usr/local/redis/bin/redis.conf

ExecReload=/usr/local/redis/bin/redis-server-s reload

ExecStop=/usr/local/redis/bin/redis-server-s stop

PrivateTmp=true


[Install]

WantedBy=multi-user.target



如果需要更详细的配置,请参考:

https://www.freedesktop.org/software/systemd/man/systemd.service.html


使用单元

一个单元配置文件可以描述如下内容之一:系统服务(.service)、挂载点(.mount)、sockets(.sockets)、系统设备(.device)、交换分区(.swap)、文件路径(.path)、启动目标(.target)、由 systemd 管理的计时器(.timer)。详情参阅 man 5 systemd.unit。

使用 systemctl 控制单元时,通常需要使用单元文件的全名,包括扩展名(例如 sshd.service)。但是有些单元可以在systemctl中使用简写方式。

如果无扩展名,systemctl 默认把扩展名当作 .service。例如 netcfg 和 netcfg.service 是等价的。

挂载点会自动转化为相应的 .mount 单元。例如 /home 等价于 home.mount。

设备会自动转化为相应的 .device 单元,所以 /dev/sda2 等价于 dev-sda2.device。

注: 有一些单元的名称包含一个 @ 标记, (e.g. name@string.service): 这意味着它是模板单元name@.service 的一个实例。 string 被称作实例标识符, 在 systemctl 调用模板单元时,会将其当作一个参数传给模板单元,模板单元会使用这个传入的参数代替模板中的 %I 指示符。在实例化之前,systemd 会先检查 name@string.suffix 文件是否存在(如果存在,应该就是直接使用这个文件,而不是模板实例化了)。大多数情况下,包换 @ 标记都意味着这个文件是模板。如果一个模板单元没有实例化就调用,该调用会返回失败,因为模板单元中的 %I 指示符没有被替换。

例如:systemctl start <单元>

 

编写单元文件

systemd单元文件的语法来源于 XDG桌面入口配置文件.desktop文件,最初的源头则是MicrosoftWindows的.ini文件。单元文件可以从两个地方加载,优先级从低到高分别是:

/usr/lib/systemd/system/: 软件包安装的单元

/etc/systemd/system/: 系统管理员安装的单元

注意: 当systemd运行在用户模式下时,使用的加载路径是完全不同的。

 

处理依赖关系

使用systemd时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元A要求单元B在A启动之前运行。在此情况下,向单元A配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B。请注意 Wants= 和 Requires= 并不意味着 After=,即如果 After= 选项没有制定,这两个单元将被并行启动。

依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。

服务类型

编写自定义的 service 文件时,可以选择几种不同的服务启动方式。启动方式可通过配置文件 [Service] 段中的 Type= 参数进行设置。

Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。

Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。

Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。

Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。

Type=dbus:若以此方式启动,当指定的 BusName出现在DBus系统总线上时,systemd认为服务就绪。

Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。

type的更多解释可以参考systemd.service(5)。

4.2设置开机服务


输入systemctl start redis启动redis服务

在输入systemctl enable redis设置redis服务为开机启动服务

最后输入systemctl status redis查看redis的运行状态。

4.2停止开机服务


输入systemctl disable redis停止开机启动redis服务

输入systemctlstop redis停止redis服务

输入systemctl status redis查看redis的运行状态。

5.在客户端上运行Redis



#redis-cli -h 127.0.0.1 -p 6379

localhost:6379>

localhost:6379> PING

PONG

localhost:6379> set databaseName redis

OK

localhost:6379> keys *

1) "databaseName"


#redis-cli -h 127.0.0.1 -p 6379 -a"mypass"

以下实例演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上。

6.附录

6.1Redis.conf配置项详解

#是否作为守护进程运行

daemonize yes

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

pidfile redis.pid

#绑定主机IP,默认值为127.0.0.1

#bind 127.0.0.1

#Redis默认监听端口

port 6379

#客户端闲置多少秒后,断开连接,默认为300(秒)

timeout 300

#日志记录等级,有4个可选值,debug,verbose(默认值),notice,warning

loglevel verbose

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

logfile stdout

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

databases 16

#保存数据到disk的策略

#当有一条Keys数据被改变是,900秒刷新到disk一次

save 900 1

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

save 300 10

#当有1w条keys数据被改变时,60秒刷新到disk一次

save 60 10000

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

rdbcompression yes

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

dbfilename dump.rdb

#本地数据库存放路径,默认值为 ./

dir /usr/local/redis/var/

########### Replication#####################

#Redis的复制配置

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

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

#连接密码

# requirepass foobared

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

# maxclients 128

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

# maxmemory <bytes>

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

appendonly no

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

#appendfilename

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

# appendfsync always

appendfsync everysec

# appendfsync no

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

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

vm-enabled no

# vm-enabled yes

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

vm-swap-file logs/redis.swap

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

vm-max-memory 0

vm-page-size 32

vm-pages 134217728

vm-max-threads 4

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

glueoutputbuf yes

hash-max-zipmap-entries 64

hash-max-zipmap-value 512

#是否重置Hash表

activerehashing yes

注意:Redis官方文档对VM的使用提出了一些建议:

 

当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.

当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.

最好使用linux ext3 等对稀疏文件支持比较好的文件系统保存你的swap文件.

vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

2. 调整系统内核参数

如果内存情况比较紧张的话,需要设定内核参数:

 

echo 1 > /proc/sys/vm/overcommit_memory

这里说一下这个配置的含义:/proc/sys/vm/overcommit_memory

该文件指定了内核针对内存分配的策略,其值可以是0、1、2。

0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。

1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。

2,表示内核允许分配超过所有物理内存和交换空间总和的内存

Redis在dump数据的时候,会fork出一个子进程,理论上child进程所占用的内存和parent是一样的,比如parent占用的内存为 8G,这个时候也要同样分配8G的内存给child, 如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)

 

四. 运行 Redis

1. 运行服务

/usr/local/redis/bin/redis-server/usr/local/redis/etc/redis.conf

即可在后台启动redis服务,确认运行了之后,可以用redis-benchmark命令测试看看,还可以通过redis-cli命令实际操作一下,比如:

 

/usr/local/redis/bin/redis-cli set foo bar

OK

/usr/local/redis/bin/redis-cli get foo

bar

2. 关闭服务

redis-cli shutdown

如果端口变化可以指定端口:

 

redis-cli -p 6380 shutdown

3. 保存/备份

数据备份可以通过定期备份该文件实现。

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

redis-cli save 或者 redis-cli-p 6380 save(指定端口)

注意,以上部署操作需要具备一定的权限,比如复制和设定内核参数等。

执行redis-benchmark命令时也会将内存数据写入硬盘。

 

4. 同步机制

redis实现的同步机制相对简单,缺少同步机制常见的checkpoint和校验机制。

在运行时,如果master -> slave同步请求转发被丢弃, slave将无法恢复该请求的相关信息,直到slave重启时从master全量加载数据时才能修复。因此,建议使用redis尽量利用其 key/value和value支持多种类型的特性,存储一些相对不重要的数据。

0 0
原创粉丝点击