vagrant系列四:vagrant搭建redis与redis的监控程序redis-stat
上一篇php7环境的搭建 真是火爆。仅仅两天时间,就破了我之前swagger系列的一片文章,看来,大家对搭建好开发环境真是情有独钟。
为了訪问量,我今天再来一篇redis的搭建。
当然不能仅仅是redis的搭建。
否则,多不上档次呀。这种文章一抓一大把。这次还顺带把redis监控程序的搭建给弄上了。非常高大上的额。
redis的安装
哎,写到这儿,说一句,诅咒联通这网络,联通网络一上,打开vpn,照样不能訪问外网,联baidu都一卡一卡的。
redis就不用yum来进行安装了。直接从官方下载来安装吧。
(老实说,我也不知道yum里边有没有redis的最新版)
下载redis
$ wget -c http://download.redis.io/releases/redis-3.0.7.tar.gz
当然你也能够到redis官网 下载最新的版本号。当然个人建议,开发中还是使用稳定版本号吧!
解压redis
$ tar -zxvf redis-3.0.7.tar.gz
这个命令什么意思,我就不多说了,假设不清楚的同学,建议平时还是多积累点linux的命令知识额。加薪升职的利器额。
编译安装redis
$ cd redis-3.0.7
$ make && make install
进入到解压后的文件夹。然后运行编译,然后安装。
OK,至此,我们的redis安装还没有完额。事实上好玩儿的才刚刚開始呢。
配置redis
创建redis 配置文件夹。
$ mkdir /etc/redis
在/var/lib/redis 下创建有效的保存数据的文件夹
$ mkdir -p /var/lib/redis/6379
redis.conf 是 redis 的配置文件,然而你会看到我们会把这个文件的名字改为 6379.conf ,而这个数字就是 redis 监听的网络端口。假设你想要运行超过一个的 redis 实例,推荐用这种名字。
复制演示样例的 redis.conf 到 /etc/redis/6379.conf。
$ cp redis.conf /etc/redis/6379.conf
改动的内容例如以下:
设置 daemonize 为 no。systemd 须要它运行在前台,否则 redis 会突然挂掉。
daemonize yes设置 pidfile 为 /var/run/redis_6379.pid。
pidfile /var/run/redis_6379.pid假设不准备用默认端口,能够改动。
port 6379设置日志级别。
loglevel debug改动日志文件路径。
logfile /var/log/redis_6379.log设置文件夹为 /var/lib/redis/6379
dir /var/lib/redis/6379
redis配置文件。各项的具体解释
######################### 通用 #########################
# 启动后台进程
daemonize yes
# 后台进程的pid文件存储位置
pidfile /var/run/redis.pid
# 默认监听端口
port 6379
# 在高并发的环境中,为避免慢client的连接问题,须要设置一个快速后台日志
tcp-backlog 511
# 仅仅接受下面绑定的IP请求
# Examples:
# bind 192.168.1.100 10.0.0.1
bind 127.0.0.1
# 设置unix监听,默觉得空
# unixsocket /tmp/redis.sock
# unixsocketperm 700
#client空暇多长时间,关闭链接,0表示不关闭
timeout 0
# TCP keepalive.
# 假设是非零值。当失去链接时,会使用SO_KEEPALIVE发送TCP ACKs 到client。
# 这个參数有两个作用:
# 1.检測断点。
# 2.从网络中间设备来看,就是保持链接
# 在Linux上,设定的时间就是发送ACKs的周期。
# 注意:达到双倍的设定时间才会关闭链接。在其它内核上,周期依赖于内核设置。
# 一个比較合理的值为60s
tcp-keepalive 0
# 指定日志级别。下面记录信息依次递减
# debug用于开发/測试
# verbose没debug那么具体
# notice适用于生产线
# warning仅仅记录非常重要的信息
loglevel notice
#日志文件名,假设为stdout则输出到标准输出端,假设是以后台进程运行则不产生日志
logfile ""
# 要想启用系统日志记录器,设置一下选项为yes
# syslog-enabled no
# 指明syslog身份
# syslog-ident redis
# 指明syslog设备。必须是一个用户或者是local0 ~ local7之中的一个
# syslog-facility local0
#设置数据库数目,第一个数据库编号为:0
databases 16
######################### 快照 #########################
# 在什么条件下保存数据库到磁盘,条件能够有非常多个,满足不论什么一个条件都会进行快照存储
# 在900秒之内有一次key的变化
save 900 1
# 在300秒之内,有10个key的变化
save 300 10
# 在60秒之内有10000个key变化
save 60 10000
# 当持久化失败的时候,是否继续提供服务
stop-writes-on-bgsave-error yes
# 当写入磁盘时,是否使用LZF算法压缩数据。默觉得yes
rdbcompression yes
# 是否加入CRC64校验到每一个文件末尾--花费时间保证安全
rdbchecksum yes
# 磁盘上数据库的保存名称
dbfilename dump.rdb
# Redis工作文件夹。以上数据库保存文件和AOF日志都会写入此文件夹
dir ./
######################### 主从同步 #########################
# 主从复制。当本机是slave时配置
# slaveof <masterip> <masterport>
# 当主机须要password验证时候配置
# masterauth <master-password>
# 当slave和master丢失链接,或正处于同步过程中。是否响应client请求
# 设置为yes表示响应
# 设置为no。直接返回"SYNC with master in progress"(正在和主server同步中)
slave-serve-stale-data yes
# 设置slave是否为仅仅读。
# 注意:即使slave设置为仅仅读,也不能令其暴露在不受信任的网络环境中
slave-read-only yes
# 无硬盘复制功能
repl-diskless-sync no
# 等待多个slave一起来请求之间的间隔时间
repl-diskless-sync-delay 5
# 设置slave给master发送ping的时间间隔
# repl-ping-slave-period 10
# 设置传输数据I/O,主机数据、ping响应超时时间,默认60s
# 这个时间一定要比repl-ping-slave-period大,否则会不断检測到超时
# repl-timeout 60
# 是否在SYNC后slave socket上禁用TCP_NODELAY?
# 假设你设置为yes,Redis会使用少量TCP报文和少量带宽发送数据给slave。
# 可是这样会在slave端出现延迟。假设使用Linux内核的默认设置,大概40毫秒。
# 假设你设置为no。那么在slave端研究就会降低可是同步带宽要添加。
# 默认我们是为低延迟优化的。
# 可是假设流量特别大或者主从server相距比較远,设置为yes比較合理。
repl-disable-tcp-nodelay no
# 设置复制的后台日志大小。
# 复制的后台日志越大。 slave 断开连接及后来可能运行部分复制花的时间就越长。
# 后台日志在至少有一个 slave 连接时,仅仅分配一次。
# repl-backlog-size 1mb
# 在 master 不再连接 slave 后,后台日志将被释放。下面的配置定义从最后一个 slave 断开连接后须要释放的时间(秒)。
# 0 意味着从不释放后台日志
# repl-backlog-ttl 3600
# 设置slave优先级。默觉得100
# 当主server不能正确工作的时候,数字低的首先被提升为主server。可是0是禁用选择
slave-priority 100
# 假设少于 N 个 slave 连接,且延迟时间 <=M 秒,则 master 可配置停止接受写操作。
# 比如须要至少 3 个 slave 连接,且延迟 <=10 秒的配置:
# min-slaves-to-write 3
# min-slaves-max-lag 10
# 设置 0 为禁用
# 默认 min-slaves-to-write 为 0 (禁用), min-slaves-max-lag 为 10
######################### 安全 #########################
# 设置client连接password。由于Redis响应速度能够达到每秒100w次,所以password要特别复杂
# requirepass 1413
# 命令又一次命名,或者禁用。
# 重命名命令为空字符串能够禁用一些危急命令比方:FLUSHALL删除全部数据
# 须要注意的是,写入AOF文件或传送给slave的命令别名或许会引起一些问题
# rename-command CONFIG ""
# 设置client连接password,由于Redis响应速度能够达到每秒100w次,所以password要特别复杂
requirepass 1413
# 命令又一次命名,或者禁用。
# 重命名命令为空字符串能够禁用一些危急命令比方:FLUSHALL删除全部数据
# 须要注意的是,写入AOF文件或传送给slave的命令别名或许会引起一些问题
# rename-command CONFIG ""
######################### 限制 #########################
# 设置最多链接client数量。默觉得10000。
# 实际能够接受的请求数目为设置值减去32,这32是Redis为内部文件描写叙述符保留的
# maxclients 10000
# 设置最多链接client数量,默觉得10000。
# 实际能够接受的请求数目为设置值减去32,这32是Redis为内部文件描写叙述符保留的
# maxclients 10000
# 设置最大使用内存数量,在把Redis当作LRU缓存时特别实用。
# 设置的值要比系统能使用的值要小
# 由于当启用删除算法时。slave输出缓存也要占用内存
# maxmemory <bytes>
#达到最大内存限制时。使用何种删除算法
# volatile-lru 使用LRU算法移除带有过期标致的key
# allkeys-lru -> 使用LRU算法移除不论什么key
# volatile-random -> 随机移除一个带有过期标致的key
# allkeys-random -> 随机移除一个key
# volatile-ttl -> 移除近期要过期的key
# noeviction -> 不删除key,当有写请求时,返回错误
#默认设置为volatile-lru
# maxmemory-policy noeviction
# LRU和最小TTL算法没有精确的实现
# 为了节省内存仅仅在一个样本范围内选择一个近期最少使用的key,能够设置这个样本大小
# maxmemory-samples 5
######################### AO模式 #########################
# AOF和RDB持久化能够同一时候启用
# Redis启动时候会读取AOF文件,AOF文件有更好的持久化保证
appendonly no
# AOF的保存名称,默觉得appendonly.aof
appendfilename "appendonly.aof"
# 设置何时写入追加日志。又三种模式
# no:表示由操作系统决定何时写入。性能最好,但可靠性最低
# everysec:表示每秒运行一次写入。折中方案。推荐
# always:表示每次都写入磁盘。性能最差。比上面的安全一些
# appendfsync always
appendfsync everysec
# appendfsync no
# 当AOF同步策略设定为alway或everysec
# 当后台存储进程(后台存储或者AOF日志后台写入)会产生非常多磁盘开销
# 某些Linux配置会使Redis由于fsync()调用产生堵塞非常久
# 如今还没有修复补丁。甚至使用不同线程进行fsync都会堵塞我们的同步write(2)调用。
# 为了缓解这个问题,使用下面选项在一个BGSAVE或BGREWRITEAOF运行的时候
# 能够阻止fsync()在主程序中被调用,
no-appendfsync-on-rewrite no
# AOF自己主动重写(合并命令,降低日志大小)
# 当AOF日志大小添加到一个特定比率,Redis调用BGREWRITEAOF自己主动重写日志文件
# 原理:Redis 会记录上次重写后AOF文件的文件大小。
# 假设刚启动,则记录启动时AOF大小
# 这个基本大小会用来和当前大小比較。假设当前大小比特定比率大。就会触发重写。
# 你也须要指定一个AOF须要被重写的最小值,这样会避免达到了比率。
# 可是AOF文件还非常小的情况下重写AOF文件。
# 设置为0禁用自己主动重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
#redis在启动时能够载入被截断的AOF文件。而不须要先运行 redis-check-aof 工具
aof-load-truncated yes
######################### LUA脚本 #########################
# Lua脚本的最大运行时间,单位毫秒
# 超时后会报错,而且计入日志
# 当一个脚本运行时间超过了最大运行时间
# 仅仅有SCRIPT KILL和 SHUTDOWN NOSAVE两个命令能够使用。
# SCRIPT KILL用于停止没有调用写命令的脚本。
# SHUTDOWN NOSAVE是唯一的一个,在脚本的写命令正在运行
# 用户又不想等待脚本的正常结束的情况下,关闭server的方法。
# 下面选项设置为0或负数就会取消脚本运行时间限制
lua-time-limit 5000
####################### redis集群 ########################
# 是否启用集群
# cluster-enabled yes
# 集群配置文件
# 集群配置变更后会自己主动写入改文件
# cluster-config-file nodes-6379.conf
# 节点互连超时的阀值
# 节点超时时间。超过该时间无法连接主要Master节点后,会停止接受查询服务
# cluster-node-timeout 15000
# 控制从节点FailOver相关的设置,设为0,从节点会一直尝试启动FailOver.
# 设为正数,失联大于一定时间(factor*节点TimeOut),不再进行FailOver
# cluster-slave-validity-factor 10
# 最小从节点连接数
# cluster-migration-barrier 1
# 默觉得Yes,丢失一定比例Key后(可能Node无法连接或者挂掉)。集群停止接受写操作
# 设置为No,集群丢失Key的情况下仍提供查询服务
# cluster-require-full-coverage yes
######################### 慢查询 #########################
# Redis慢查询日志记录超过设定时间的查询,且仅仅记录运行命令的时间
# 不记录I/O操作。比方:和client交互,发送回复等。
# 时间单位为微妙,1000000微妙 = 1 秒
# 设置为负数会禁用慢查询日志,设置为0会记录全部查询命令
slowlog-log-slower-than 10000
# 日志长度没有限制,可是会消耗内存。超过日志长度后,最旧的记录会被移除
# 使用SLOWLOG RESET命令能够回收内存
slowlog-max-len 128
######################### 延迟监測 #########################
# 系统仅仅记录超过设定值的操作。单位是毫秒,0表示禁用该功能
# 能够通过命令“CONFIG SET latency-monitor-threshold <milliseconds>” 直接设置而不须要重新启动redis
latency-monitor-threshold 0
######################### 事件通知 #########################
# 当事件发生时, Redis 能够通知 Pub/Sub client。
# 能够在下表中选择 Redis 要通知的事件类型。事件类型由单个字符来标识:
# K Keyspace 事件,以 _keyspace@<db>_ 的前缀方式公布
# E Keyevent 事件,以 _keysevent@<db>_ 的前缀方式公布
# g 通用事件(不指定类型)。像 DEL, EXPIRE, RENAME, …
# $ String 命令
# s Set 命令
# h Hash 命令
# z 有序集合命令
# x 过期事件(每次 key 过期时生成)
# e 清除事件(当 key 在内存被清除时生成)
# A g$lshzxe 的别称。因此 ”AKE” 意味着全部的事件
# notify-keyspace-events 带一个由 0 到多个字符组成的字符串參数。空字符串意思是通知被禁用。
# 样例:启用 list 和通用事件:
# notify-keyspace-events Elg
# 默认所用的通知被禁用。由于用户通常不须要改特性,而且该特性会有性能损耗。
# 注意假设你不指定至少 K 或 E 之中的一个。不会发送不论什么事件。
notify-keyspace-events ""
#notify-keyspace-events AKE
######################### 高级设置 #########################
# 当有少量条目的时候,哈希使用高效内存数据结构。最大的条目也不能超过设定的阈值。# “少量”定义例如以下:
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
# 和哈希编码一样,少量列表也以特殊方式编码节省内存。
“少量”设定例如以下:
list-max-ziplist-entries 512
list-max-ziplist-value 64
# 集合仅仅在下面情况下使用特殊编码来节省内存
# -->集合全部由64位带符号10进制整数构成的字符串组成
# 下面的选项设置这个特殊集合的大小。
set-max-intset-entries 512
# 当有序集合的长度和元素设定为下面数字时,又特殊编码节省内存
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
# HyperLogLog 稀疏表示字节限制
# 这个限制包括了16个字节的头部,当一个HyperLogLog使用sparse representation
# 超过了这个显示,它就会转换到dense representation上
hll-sparse-max-bytes 3000
# 哈希刷新使用每100个CPU毫秒中的1毫秒来帮助刷新主哈希表(顶级键值映射表)。
# Redis哈希表使用延迟刷新机制,越多操作,越多刷新。
# 假设server空暇。刷新操作就不会进行,很多其它内存会被哈希表占用
# 默认每秒进行10次主字典刷新,释放内存。
# 假设你有硬性延迟需求,偶尔2毫秒的延迟无法忍受的话。
设置为no
# 否则设置为yes
activerehashing yes
# client输出缓存限制强迫断开读取速度比較慢的client
# 有三种类型的限制
# normal -> 正常
# slave -> slave和 MONITOR
# pubsub -> client至少订阅了一个频道或者模式
# client输出缓存限制语法例如以下(时间单位:秒)
# client-output-buffer-limit <类别> <强制限制> <软性限制> <软性时间>
# 达到强制限制缓存大小,立马断开链接。
# 达到软性限制,仍然会有软性时间大小的链接时间
# 默认正常client无限制,仅仅有请求后。异步client数据请求速度快于它能读取数据的速度
# 订阅模式和主从client又默认限制,由于它们都接受推送。
# 强制限制和软性限制都能够设置为0来禁用这个特性
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
# 设置Redis后台任务运行频率,比方清除过期键任务。
# 设置范围为1到500,默觉得10.越大CPU消耗越大。延迟越小。
# 建议不要超过100
hz 10
# 当子进程重写AOF文件。下面选项开启时。AOF文件会每产生32M数据同步一次。
# 这有助于更快写入文件到磁盘避免延迟
aof-rewrite-incremental-fsync yes
redis开机自启动
复制redis的自启动脚本到init.d中
$ cp utils/redis_init_script /etc/init.d/redis_6379
这里说明一下哈。镜像还是前面用的CentOs7。所以有的命令略微跟6不一样。建立一个redis的服务
$ vim /etc/systemd/system/redis_6379.service
然后输入下面的内容
[Unit]
Description=Redis on port 6379
[Service]
Type=forking
ExecStart=/etc/init.d/redis_6379 start
ExecStop=/etc/init.d/redis_6379 stop
[Install]
WantedBy=multi-user.target
注意上面文件的文件夹。就是刚刚复制的文件夹,假设有多个redis,这里须要注意。
系统參数的调整
为了让redis正常运行,须要对某些系统參数进行调整。
# 避免数据被截断
$ sysctl -w vm.overcommit_memory=1
# 改动 backlog 连接数的最大值超过 redis.conf 中的 tcp-backlog 值,即默认值511
$ sysctl -w net.core.somaxconn=512
# 取消对透明巨页内存(transparent huge pages)的支持,由于这会造成 redis 使用过程产生延时和内存訪问问题。
$ echo never > /sys/kernel/mm/transparent_hugepage/enabled
然后将以上配置,写入相关文件:
$ vim /etc/sysctl.conf
输入内容例如以下:
vm.overcommit_memory = 1
net.core.somaxconn=512
对于透明巨页内存支持。并没有直接 sysctl 命令能够控制,所以须要将下面的命令放到 /etc/rc.local 的结尾。
echo never > /sys/kernel/mm/transparent_hugepage/enabled
通过以上配置,能够来启动redis服务了。
$ systemctl start redis_6379
# 设置为开机启动
$ systemctl enable redis_6379
# 通过下面命令。查看redis的状态
$ systemctl status redis_6379
然后使用client来进行測试一下redis服务是否正常。參见截图:
redis的监控redis-stat的安装
由于redis-stat是使用ruby开发的。在安装前。请确保你的环境已经有了ruby的环境。假设没有,请自行google、百度安装之,我就不写了哦。
由于ruby默认使用的镜像在国外,剩下的不说了。大家都懂得。然后万能的淘宝镜像。切换一下:
$ gem sources --add https://ruby.taobao.org/ --remove https://rubygems.org/
证据例如以下:
然后開始安装:
$ gem install redis-stat
然后。一般来说,你会发现报错啦,报错例如以下:
Building native extensions. This could take a while...
ERROR: Error installing redis-stat:
ERROR: Failed to build gem native extension.
/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/share/include/ruby.h
Gem files will remain installed in /usr/local/share/gems/gems/json-1.8.3 for inspection.
Results logged to /usr/local/share/gems/gems/json-1.8.3/ext/json/ext/generator/gem_make.out
哈哈,。我好机智,想到大家非常多人会搜索这个错误信息。会不会因此被带到这里呢?就像试试认真写的博客,会有多少人看。
这个错呢,非常easy,就是由于没有安装ruby-devel,全部通过yum给安装上吧
$ yum -y install ruby-devel
这个就不要截图了吧。
没什么好看的。
安装完毕后。再次运行 gem install redis-stat
然后,至此安装完毕,看一看劳动成果吧。随便说一句,它对redis的效率影响,基本能够忽略不计,因此。能够放心的使用。
$ redis-stat
然后。他会自带一个web的版本号。大家能够通过浏览器来訪问,具体方式留给大家自己去查一查,搜一搜吧。
单机版的redis服务安装与监控。就全部搞定。so easy。!
!