Redis 安装配置
下载地址:wget http://download.redis.io/releases/redis-2.8.8.tar.gz
安装steps:
1 下载
Official Website : http://redis.io/
文档地址 address: http://redis.io/documentation
主从复制文档地址 : http://www.redis.io/topics/replication
2 解压缩安装
tar -xvf redis-2.8.8.tar.gz
cd redis-2.8.8
make
PS: make install 也可以make install,这样就是把可运行文件复制到/usr/local/bin里而已。
..........
Hint: To run 'make test' is a good idea ;)
INSTALL install
INSTALL install
INSTALL install
INSTALL install
INSTALL install
make[1]: Leaving directory `/root/redis-2.8.8/src'
3 make test验证
run the command to check the redis status:
[root@localhost redis-2.8.8]# make test
cd src && make test
make[1]: Entering directory `/root/redis-2.8.8/src'
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] 错误 1
make[1]: Leaving directory `/root/redis-2.8.8/src'
make: *** [test] 错误 2
[root@localhost redis-2.8.8]# cd src
[root@localhost src]# make test
You need tcl 8.5 or newer in order to run the Redis test
make: *** [test] 错误 1
提示需要安装tcl 8.5
然后到Tcl的官方网站http://www.tcl.tk/下载8.5版本
找到 http://www.activestate.com/activetcl/downloads 下载下来。
如果手动下载失败,那么可以考虑yum安装,比如yum install tcl -y;
official website download failure, go to http://download.csdn.net/detail/zouyongjin/4490216 to download the tar gz.
如果官方网站下载失败,就去csdn上面搜索tcl8.5.12-src.tar.gz 下载。
#tar xvzf tcl8.5.12-src.tar.gz
#cd tcl8.5.13/unix/
#./configure
#make
#make test
#make install
4 redis参数研究以及启动关闭
redis 配置文件 /opt/redis-2.8.8/redis.conf,所有的参数都在这个配置文件里面配置,redis启动的时候,会加载这个配置文件。
4.1
添加master主库数据保存目录:
mkdir -p /data/redis/master
4.2
save参数解读:
save 900 1
save 300 10
save 60 10000
在900秒(15分钟)内,至少有1次数据变更;
或者300秒内,有至少10次数据变更;
或者60秒内,有至少1000次数据变更;时间+数据变更次数,共同影响内存快照的出现。
4.3 appendonly no
4.4 port 6389
redis启动的端口号码,对外服务,外部程序通过此端口号码与redis建立连接,对redis进行数据变更和数据访问。
4.5 redis启动
运行redis:
2.2.7版本,redis-server被放到了src文件夹下,要这么运行:
在安装目录下# cd src
#./redis-server ./../redis.conf
或者全路径启动: /root/redis-2.8.8/src/redis-server /opt/redis-2.8.8/redis.conf
或者nohup后台启动: nohup /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.conf &
附注:
2.0.4以前的老版本,运行很简单,在安装目录下:
#./redis-server
就可以了。如果没有更改daemonize no配置,会看见运行的信息。
4.6 测试启动
redis-cli ping 返回PONG,启动成功。
查看端口是否被占用:netstat –ntlp |grep 6379
4.7 redis服务关闭
redis-cli shutdown
5 主从机制以及原理理解
redis主从使用以及配置起来非常简单,搭建一套master-slave服务意味着slave redis服务是主库的一份精确的数据备份:
redis主从基本特征如下描述:
5.1 redis采用异步复制,从redis2.8版本开始,slaves开始定期从复制流上确认数据处理的数量。
5.2 一个master可以对应多个slaves。
5.3 slave还可以接受其他slave发过来的请求,除了多个slave能连接一个master之外,slaves还可以被其他slaves以graph-like结构方式进行连接。
5.4 redis复制在master上面是不阻塞的,这意味着当一个或者多个slave复制开始初始化以及运行后,master还可以继续处理请求。
5.5 复制在从库上也是无阻塞的,当slave进行首次初始化同步时,slave可以使用旧的数据集合来处理请求,如果你在redis.conf里面配置了的话。 ?哪里配置?另外,如果复制流down了,你也可以配置一些redis slave返回一个error给客户端。然而,在同步初始化完成后,旧的数据被删除,新的数据会被加载进去,在这短暂的加载瞬间,slave会阻塞住进来的连接请求。
5.6 slave可以用来扩展,有多个slaves处理查询请求(例如,大的SORT操作可以在slave上执行),或者也简单的用来数据备份。
5.7 可以用replication来避免在master库上数据写入磁盘,减轻master压力,仅仅在master的redis.conf里面把所有save参数注释掉即可。然后可以在从库上slave上面开启save参数来做到数据实时写入到磁盘上面。
5.8 slave工作原理
(1) 如果建立了一个slave从库,slave会发一个SYNC的命令的connection到master库,不管这是否是第一次连接。
(2) master然后开始启动一个saving的背景线程,并缓存已经接收到的修改数据集的新的命令,当saving背景线程结束后,master会把数据文件传送给slave,并且save到磁盘,最后加载到内存。master将会发送所有的缓存命令给slave。
这些是以基于Redis协议的一系列连续的命令流来完成的。
(3) 当master-slave由于一些原因down之后,slave会自动连接master。
(4) 当连接断开之后,master和slave会重新连接,一次全同步会执行,然而,从redis2.8开始,一个局部的再同步也是可行的。
5.9 局部再同步
主要是在master这一边的复制流上面做了一个in-memory backlog,master和slave都会基于一个共同的replication offset和a master run id,因此当连接断开之后,slave将会重新连接并且咨询master去继续复制,
假如master run id是同一个,并且offset在复制backlog里面是可用的,复制将会从这个留下的偏移来恢复。如果这些条件不满足,那么一个全新的再同步会被执行。
当旧的实现机制用了SYNC之后,新的局部再同步用了一个内部命令PSYNC。
【Note】当Redis2.8察觉出来服务如果不支持PSYNC,就会使用SYNC命令。
6 搭建从库,从库配置文件
cp /root/redis-2.8.8/redis.conf /root/redis-2.8.8/redis.slave.conf
slave config:
port 6399 # 从库端口号
slaveof 127.0.0.1 6389 #主库ip地址以及端口号
#save参数,从库开启save,减轻主库的读写压力。
save 900 1
save 300 10
save 60 10000
7 启动start the master and slave
#修改一下redis-conf里面的
daemonize no,把no改为yes,可以后台启动。
/root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.conf
/root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.slave.conf
在后台启动
nohup /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.conf &
nohup /root/redis-2.8.8/src/redis-server /root/redis-2.8.8/redis.slave.conf > /root/redis_slave.log &
8 check master & slave
访问主库
/root/redis-2.8.8/src/redis-cli -p 6389
登录从库
/root/redis-2.8.8/src/redis-cli -p 6399
验证主从数据一致性:
[root@localhost redis]# /root/redis-2.8.8/src/redis-cli -p6389
Unrecognized option or bad number of args for: '-p6389'
[root@localhost redis]# /root/redis-2.8.8/src/redis-cli -p 6389
127.0.0.1:6389>
127.0.0.1:6389>
127.0.0.1:6389> set name jame #往主库中设置2组key-value值
OK
127.0.0.1:6389> set age 20
OK
127.0.0.1:6389> exit
[root@localhost redis]# /root/redis-2.8.8/src/redis-cli -p 6399
127.0.0.1:6399> get name #获取主库设置的key-value值,看是否已经从主库传递到从库了。
"jame"
127.0.0.1:6399> get age
"20"
127.0.0.1:6399>
8 验证过程
如何判断哪个是主哪个是从呢? 只需调用 info 这个命令就可以得到主从的信息了,我们在从库上执行 info 命令,如下所示:
127.0.0.1:6399> info
# Server
redis_version:2.8.8
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:a90848107b5eaf7f
redis_mode:standalone
os:Linux 2.6.32-358.el6.x86_64 x86_64
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.7
process_id:19513
run_id:c97e05680da496d58894963fb38045b9fba1b13d
tcp_port:6399
uptime_in_seconds:2672
uptime_in_days:0
hz:10
lru_clock:4722614
config_file:/root/redis-2.8.8/redis.slave.conf
# Clients
connected_clients:2
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
# Memory
used_memory:829360
used_memory_human:809.92K
used_memory_rss:7933952
used_memory_peak:829360
used_memory_peak_human:809.92K
used_memory_lua:33792
mem_fragmentation_ratio:9.57
mem_allocator:jemalloc-3.2.0
# Persistence
loading:0
rdb_changes_since_last_save:0
rdb_bgsave_in_progress:0
rdb_last_save_time:1397230798
rdb_last_bgsave_status:ok
rdb_last_bgsave_time_sec:0
rdb_current_bgsave_time_sec:-1
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:-1
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
# Stats
total_connections_received:1
total_commands_processed:271
instantaneous_ops_per_sec:0
rejected_connections:0
sync_full:0
sync_partial_ok:0
sync_partial_err:0
expired_keys:0
evicted_keys:0
keyspace_hits:2
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:3483
# Replication
role:slave
master_host:127.0.0.1
master_port:6389
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_repl_offset:3867
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
# CPU
used_cpu_sys:0.66
used_cpu_user:0.15
used_cpu_sys_children:0.01
used_cpu_user_children:0.00
# Keyspace
db0:keys=2,expires=0,avg_ttl=0
9 附带redis短连接
redis r = redis.connect(xx)
r.set()
r.get()
r.close()
redis长连接,那就是如果不用的话,线程就是sleep,如果用的话,那么就是query等的状态。
10 redis的一些参数优化
vm-enabled设置为no
maxmemory :告诉Redis当使用了多少物理内存后就开始拒绝后续的写入请求,该参数能很好的保护好你的Redis不会因为使用了过多的物理内存而导致swap,最终严重影响性能甚至崩溃。有个说法是一般不超过物理内存的3/5
Redis Hash 存储:
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
hash-max-zipmap-entries
同样类似的参数有
list-max-ziplist-entries 512
说明:list数据类型多少节点以下会采用去指针的紧凑存储格式。
list-max-ziplist-value 64
说明:list数据类型节点值大小小于多少字节会采用紧凑存储格式。
set-max-intset-entries 512
说明:set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储。
另外redis 的6种过期策略
redis 中的默认的过期策略是volatile-lru 。设置方式
config set maxmemory-policy volatile-lru
maxmemory-policy 六种方式
volatile-lru:只对设置了过期时间的key进行LRU(默认值)
allkeys-lru : 是从所有key里 删除 不经常使用的key
volatile-random:随机删除即将过期key
allkeys-random:随机删除
volatile-ttl : 删除即将过期的
noeviction : 永不过期,返回错误
maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取3个key 从里面淘汰最不经常使用的(默认选项)
save 参数解读:
save 900 1
save 300 10
save 60 10000
在900秒(15分钟)内,至少有1次数据变更;
或者300秒内,有至少10次数据变更;
或者60秒内,有至少1000次数据变更;时间+数据变更次数,共同影响内存快照的出现。
PS:在主库上注释掉save功能,在从库开启save功能,会减少主库的读写压力。
Redis 监控生产环境配置
下载redis监控插件
Redis已经在服务器安装好了,所以直接可以进行监控,下载地址为:http://download.csdn.net/detail/mchdba/8023351,有2个版本,一个是perl脚本写成的,一个是php脚本写成的,可以任意选择一个,这里选择的是perl脚本
2,赋予执行权限
将check_redis.php和check_redis.pl复制到/usr/lib/nagios/plugins/目录,然后赋予执行权限,
[root@wgq_41plugins]# cd /usr/lib/nagios/plugins/
[root@wgq_41plugins]# chown -R nagios.nagios check_redis.*
[root@wgq_41 plugins]# chmod 750check_redis.*
3, 定义监控命令
[root@wgq objects] vim /usr/local/nagios/etc/objects/commands.cfg
# add by tim on 20141010,for redis
# check redis
define command {
command_name check_redis
command_line /usr/lib/nagios/plugins/check_redis.pl -H$HOSTADDRESS$ -p $ARG1$ -a $ARG2$ -w $ARG3$ -c $ARG4$ -f
}
[root@wgq etc]# vim/usr/local/nagios/etc/hosts.cfg
# No.018,redis master server
define host{
use linux-server
host_name cache-1
alias cache-1
address 10.xxx.3.x0
check_command check-host-alive
max_check_attempts 5
check_period 24x7
contact_groups ops
notification_interval 30
notification_period 24x7
notification_options d,u,r
}
# No.020 cache-3 redis slave server
define host{
use linux-server
host_name cache-3
alias cache-3
address 10.xx.3.x2
check_command check-host-alive
max_check_attempts 5
check_period 24x7
contact_groups ops
notification_interval 30
notification_period 24x7
notification_options d,u,r
}
define hostgroup{
hostgroup_name Redis_Servers
alias Redisservices
members cache-1,cache-2
}
6, 定义 redis 监控服务选项
[root@wgq objects]# vim/usr/local/nagios/etc/objects/services_redis.cfg
# Redis Master 监控选项
define service {
host_name cache-1
servicegroups Redisservices
service_description RedisMaster Clients
check_command check_redis!6379!'connected_clients,blocked_clients,client_longest_output_list,client_biggest_input_buf'!200,50,~,~!600,150,~,~
max_check_attempts 5
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups ops
}
define service {
host_name cache-1
servicegroups Redisservices
service_description RedisMaster Memory
check_command check_redis!6379!'used_memory_human,used_memory_peak_human'!~,~!~,~
max_check_attempts 5
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups ops
}
define service {
host_name cache-1
servicegroups Redisservices
service_description RedisMaster CPU
check_command check_redis!6379!'used_cpu_sys,used_cpu_user,used_cpu_sys_children,used_cpu_user_children'!~,~,~,~!~,~,~,~; #未定义监控报警阀值
max_check_attempts 5
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups ops
}
# Redis Slave 监控选项
define service {
host_name cache-3
servicegroups Redisservices
service_description RedisSlave Clients
check_command check_redis!6379!'connected_clients,blocked_clients,client_longest_output_list,client_biggest_input_buf'!200,50,~,~!600,150,~,~
max_check_attempts 5
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups ops
}
define service {
host_name cache-3
servicegroups Redisservices
service_description RedisSlave Memory
check_command check_redis!6379!'used_memory_human,used_memory_peak_human'!~,~!~,~
max_check_attempts 5
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups ops
}
define service {
host_name cache-3
servicegroups Redisservices
service_description RedisSlave CPU
check_command check_redis!6379!'used_cpu_sys,used_cpu_user,used_cpu_sys_children,used_cpu_user_children'!~,~,~,~!~,~,~,~; #未定义监控报警阀值
max_check_attempts 5
normal_check_interval 3
retry_check_interval 2
check_period 24x7
notification_interval 10
notification_period 24x7
notification_options w,u,c,r
contact_groups ops
}
赋予nagios用户执行权限
[root@wgq objects]# chown -R nagios.nagios services_redis.cfg
[root@wgq objects]# chmod 777 services_redis.cfg
添加监控服务项到nagios.cfg
[root@wgq etc]# vim/usr/local/nagios/etc/nagios.cfg
cfg_file=/usr/local/nagios/etc/objects/services_redis.cfg
7 ,测试 redis 监控服务
执行命令/usr/lib/nagios/plugins/check_redis.pl -H cache-1 -a'connected_clients,blocked_clients' -w ~,~ -c ~,~ -m -M 4G -A -R -T来测试下redis监控是否正常运行
[root@wgq plugins]#/usr/lib/nagios/plugins/check_redis.pl -H 10.2xx.3.x0 -a 'connected_clients,blocked_clients' -w ~,~ -c ~,~ -m-M 4G -A -R -T
OK: REDIS 2.8.8 on 10.2xx.3.x0:6379 has 1databases (db0) with 28497 keys, up 76 days 2 hours - response in 0.004s,hitrate is 12.83%, memory use is 194.14M (peak 205.14M, 6.49% of max,fragmentation 1.37%), connected_clients is 35, blocked_clients is 11 | redis_build_id=d322d411218ade61total_connections_received=341191c used_memory_lua=33792aof_rewrite_buffer_length=0 used_memory_rss=278749184B redis_git_dirty=0loading=0 redis_mode=standalone latest_fork_usec=5588repl_backlog_first_byte_offset=0 sync_partial_ok=0 master_repl_offset=0uptime_in_days=76c aof_rewrite_scheduled=0 lru_clock=3649276rdb_bgsave_in_progress=0 rejected_connections=0 repl_backlog_active=0aof_delayed_fsync=1 sync_full=0 process_id=7776 used_memory_human=194.14Maof_current_rewrite_time_sec=-1 used_memory=203570960 aof_enabled=1blocked_clients=11 aof_last_bgrewrite_status=ok aof_rewrite_in_progress=0sync_partial_err=0 used_cpu_sys_children=2222.75 connected_slaves=0repl_backlog_histlen=0 uptime_in_seconds=6576292c repl_backlog_size=1048576os=Linux 2.6.32-358.el6.x86_64 x86_64 used_cpu_sys=32640.80aof_pending_bio_fsync=0 connected_clients=35 rdb_last_bgsave_time_sec=1used_memory_peak_human=205.14M run_id=d1fc098d26fa4bbcef3eabeec6d19a858f03dd00rdb_last_bgsave_status=ok pubsub_patterns=8 client_biggest_input_buf=0keyspace_hits=42175896c rdb_last_save_time=1412935342rdb_changes_since_last_save=318 db0_keys=28497 db0_expires=7 db0_avg_ttl=34003aof_pending_rewrite=0 aof_buffer_length=0config_file=/usr/local/redis-2.8.8/etc/redis.conf pubsub_channels=0used_cpu_user_children=21375.34 hz=10 aof_last_rewrite_time_sec=2aof_last_write_status=ok aof_base_size=82883253 used_cpu_user=18460.42keyspace_misses=286602797c tcp_port=6379 total_commands_processed=797581196cmem_fragmentation_ratio=1.37 aof_current_size=146485850rdb_current_bgsave_time_sec=-1 client_longest_output_list=0instantaneous_ops_per_sec=114 evicted_keys=0c used_memory_peak=215106272Bexpired_keys=58977c total_keys=28497 total_expires=7 response_time=0.003802shitrate=12.8281% memory_utilization=6.49013519287109%
[root@wgq plugins]#
8 ,查看 redis 监控服务状态
先重新加载nagios,使刚添加的redis监控配置生效
[root@wgq objects]# service nagios reload
Running configuration check...
Reloading nagios configuration...
done
[root@wgq objects]#
redis监控服务界面,如下图所示:
9 ,操作过程中的报错处理过程报错:
[root@wgq_line_cache_3_41 plugins]#./check_redis.pl --help
Can't locate Redis.pm in @INC (@INC contains:/usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at./check_redis.pl line 421.
BEGINfailed--compilation aborted at ./check_redis.pl line 421.
[root@wgq_line_cache_3_41 plugins]#
[root@wgq_line_cache_3_41 plugins]# perl-MCPAN -e shell
Terminal does not support AddHistory.
cpan shell -- CPAN exploration and modulesinstallation (v1.9402)
Enter 'h' for help.
cpan[1]> install Redis
…
Can't locate Module/Build/Tiny.pm in @INC(@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5/usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5/usr/share/perl5 .) at Build.PL line 2.
BEGIN failed--compilation aborted atBuild.PL line 2.
Warning: No success oncommand[/usr/bin/perl Build.PL --installdirs site]
Warning (usually harmless): 'YAML' not installed,will not store persistent state
DAMS/Redis-1.976.tar.gz
/usr/bin/perl Build.PL --installdirs site -- NOT OK
Running Build test
Make had some problems, won't test
Running Build install
Make had some problems, won't install
Could not read '/root/.cpan/build/Redis-1.976-Zhz6xI/META.yml'.Falling back to other methods to determine prerequisites……
YAML是以数据为中央的标记语言,其使用ASCII码(如连字符、问号、冒号、逗号等)构造数据块(标量值或哈希码)。和XML相同,YAML也是一种机器可识别语言,并能和多种脚本语言相结合,其中一种便是Perl,需要安装YAML,如下执行:
cpan[2]>install YAML
……
Appending installation info to/usr/lib64/perl5/perllocal.pod
INGY/YAML-1.12.tar.gz
/usr/bin/make install -- OK
CPAN: YAML loaded ok (v1.12)
PS:这里可能会安装失败,失败原因是网络连接,可以多执行几次install YAML就会成功。
再继续执行install Redis,有如下提示信息
cpan[4]> install Redis
Running install for module 'Redis'
Running Build forD/DA/DAMS/Redis-1.976.tar.gz
Hasalready been unwrapped into directory /root/.cpan/build/Redis-1.976-cUL4rt
'/usr/bin/perl Build.PL --installdirs site' returned status 512, won'tmake
Running Build test
Make had some problems, won't test
Running Build install
Make had some problems, won't install
cpan[5]>
Build失败,Build.PL故障了,需要重新安装下执行命令install Build
cpan[5]> install Build
成功后,再执行install Redis
cpan[6]> install Redis
Redis安装执行成功。