Redis持久化
Redis只会缓存所有key的信息,如果redis发现内存的使用量超出了某一个阈值,将触发swap操作,redis根据‘swappability’计算出哪些key对应的value需要swap到磁盘。然后将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得redis可以保持超过其机器自身内存大小的数据。当然,机器本身的内存必须能够保存所有的key,毕竟这些数据是不会进行swap操作的。
同时由于redis将内存中的数据swap到磁盘中,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果需要swap的数据,redis会将阻塞这个操作,直到子线程完成swap操作后才可以进行修改。
Redis持久化的两种方式
1. RDB:snopshotting快照,保存为二进制的格式,周期性缓存数据。
2. AOF(append only file):可以理解为实时持久化,每写一次就会存储一次。当然对性能有所影响。
3. 在生产环境中,两者结合使用。在redis服务器重启恢复数据时,会优先使用AOF。
redis安装
1. wget http://download.redis.io/release/redis-3.2.8.tar.gz
2. less README.md 里面有安装步骤
3. make编译
4. make test检查安装有无问题
【注释】如果安装redis的机器配置过低,会在make test中报一个错:
Test replication partial resync ok psync…..
【解决方案】http://www.voidcn.com/blog/chenggong2dm/article/p-6097574.htm
调整目录(自己整理了一下,根据自己习惯来就好):
a) mkdir others
b) mv 00-RELEASENOTES BUGSCONTRIBUTING COPYING INSTALL Makefile MANIFESTO REANME.md runtestruntest-cluster
runtest-sentinel others/
c) mkdir conf
d) mv redis.conf conf/
e) mv sentinel.conf conf/
f) mkdir bin
g) cd src
h) mv redis-server redis-clirdis-sentinel ../bin/
修改redis配置文件
进入到redis.comf文件:
1. 修改监听地址:bind127.0.0.1èbind 安装redis的服务器IP地址
2. daemonize修改为yes(是否以后台daemon方式运行)
3. port:6379默认
4. snapshoting的持久化方式长度。
a) save 900 1 #在900秒内有一个key发生了变化
b) save300 10#在300秒内有10个key发生了变化
c) save 60 10000
d) 如果取消snapshoting持久化方式:save “”
5. AOF持久化方式>>>类似于mysql的二进制日志
appendonly yes#打开AOF存储方式
appendfilename “appendonly.aof”
appendfsync everysec #记录持久化文件时间
修改两个持久化位置:
dbfilename dump.rdb
#Note that you must specify a directory here,not a filename.
默认为dir ./根据自己情况修改即可
6. 修改redis日志文件的内容:
Logfile “redis.log(自行添加路径即可)”
7. redis密码
requirepass redis(密码最好复杂度高,避免被破解)
8. redis主从
redis主(master)不用做任何配置
只需要在从服务器上指定主库(master)的ip和端口即可,启动从库(slave)就可以自动同步。
slaveof <masterip> <masterport>
另外如果主库(master)设置了密码,从库(slave)配置文件需修改:
masterauth <master-password>
redis启动
进入到/bin目录下:./redis-server../conf/redis.conf
启动后状态:ps –ef | grep redis
redis对事务的支持
事务:一组相关的操作都是原子性的,要么都执行,要么都不执行。
redis通过multi,exec,watch等命令实现事务功能。
开始事务:multi命令开始事务
在事务进行过程中,其他对redis的操作都会被阻塞。
exec:一并返回。
redis的复制
一个master可以有多个slave
一个slave还可以有slave,支持链式复制。
master以非阻塞方式同步数据更新至slave,master可以同时处理多个slave的操作。
把redis拷贝到其他服务器上:
scp –r wlz root@10.199.130.243 :/home/redis
修改slave服务器的配置文件redis.conf:
1. bind slave服务器ip
2. slaveof <masterip><masterport>
3. masterauth<master-password>
4. 查看命令:info replication
redis安全简介
1. 禁止一些高危命令:
修改redis.conf文件:
rename-command FLUSHALL “”
rename-command CONFIG “”
rename-command EVAL “”
来禁止远程修改DB文件地址
2. 以低权限运行redis服务
为redis服务创建单独的用户和家目录,并且配置禁止登陆
3. 为redis添加密码验证
修改redis.conf文件,添加requirepassmypassword
4. 禁止外网访问redis
修改redis.conf文件,添加或者修改:bind10.0.140.84使得redis服务只能当前主机使用。
redis哨兵sentinel
redis主从有一个问题,如果我们的master挂掉了,slave服务器只读,这样就会出现问题。redis采用sentinel机制来解决这个问题。
sentinel配置
在redis/src/下有redis-sentinel的启动程序,前面我已经将其放置到bin目录下:
配置文件:/redis/wlz/redis/conf/sentinel.conf
二进制文件:/redis/wlz/redis/bin/redis-sentinel
运行有两种方式:
1. redis-sentinel /conf/sentinel.conf(常用)
2. redis-server /conf/sentinel.conf–sentinel
3. 默认监听26379端口
修改sentinel的配置文件:
1. port 26379
2. sentinel monitor<master-name> <ip> <redis-port> <quorum>
master-name理解为一个别名,随便取但需要注意格式(A-z0-9.-_)
quorum是指投票数,有多少个sentinel,取小于其的数字作为最少认为通过的投票数。
3. sentineldown-after0-milliseconds <master-name> <milliseconds> #默认30000
<milliseconds>指经过该时间后认为master宕机。
4. sentinel failover-timeout<master-name> <milliseconds>
当redis主出现问题时,sentinel经过投票提升slave,180秒后如果不切换成功则认为失败。
5. 如果redis配置了密码
Sentinel auth-pass mymaster redis
6. Sentinel parallel-syncsmymaster 1(并行同步)
7. 其他添加项
Daemonize yes#默认后台程序运行
Protected-mode no #非保护模式运行
Logfile “/data/wlz/redis/sentinel.log”#修改生成默认日志文件位置
可以直接编辑一个sentinel.conf文件,同时将原始sentinel.conf文件备份:
port 26379
dir "/tmp"
daemonize yes
protected-mode no
logfile "sentinel.log"
sentinel monitor redismaster 10.60.150.158 6379 2
sentinel down-after-milliseconds redismaster 5000
sentinel failover-timeout redismaster 60000
sentinel auth-pass redismaster redis
启动sentinel:
cd bin/
/redis-sentinel ../conf/sentinel.conf
redis-cluster
3.0以后开始redis支持cluster,进行cluster配置至少需要6台服务器。
分布式数据库,通过分片机制进行数据分布,cluster内的每个节点仅持有数据库的一部分数据。
Redis cluster每一个节点都可以作为客户端的接入节点。
每个节点都只持有一部分数据,但每个节点都有全局视角。
比如,有10000个key,一共有5个redis节点,每台都可以被客户端接入,但是每台可能只存储2000个key,每台都有一个类似于index索引的东西记录了这10000个key是如何分布的。
redis-cluster分片机制
每一个key都是一个hash slot。
redis-cluster主从模型
为了保证少数redis节点宕机或者不能与多数节点通讯时整个cluster还可以正常使用,redis-cluster使用了master-slave模式,每一个hash slot具有N个副本,n-1个slave node。
redis-cluster配置
首先将redis.conf配置文件改为redis-cluster.conf:
cp redis.confredsi-cluster.conf
修改以下内容:
reqiuirepass 去掉
cluster-enabled yes
cluster-config-file nodes-6379.conf #建议以nodes-端口号的形式命名,方便辨识
cluster-node-timeout 15000
cluster-slave-validity-factor 10
cluster-migration-barrier 1
cluster-require-full-coverage yes
启动集群的时候需要ruby:
yum install ruby
yum install rubygems
gem source -l查看当前ruby源
gem sources --remove https://rubygems.org/
gem sources –remove http://rubygems.org/
gem sources –a https://ruby.taobao.org/
gem install redis
redis-trib位于redis源码的src文件夹中,他是一个ruby程序,这个程序通过向实例发送特殊命令来完成创建新集群,检查集群,或者对集群进行重新分配等工作。这里通过create命令来创建集群,指定replicas=1,即每一个主实例有一个从实例。redis-trib会打印一份预想中的配置给你看,如果你觉得没有问题,就输入yes,redis-trib就会将这份配置应用到集群当中,让各个节点开始互相通讯。
启动redis-cluster:
./redis-server ../conf/redis-cluster.conf
在src文件下执行:
./redis-trib.rb create –replicas 1 集群机器ip+端口 (10.199.130.243:6379)
可能出现的问题:
解决方案:cluster-config-file nodes-6379.conf配置文件存在非空,需要删除,然后进行重启。
之后整个redis-cluster就启动成功了。
怎么连接集群?
./redis-cli –c ….就可以进入集群模式
在已有集群上添加新的机器:
为节点分配slots:redis-trib.rb reshard 192.168.72.100:7006
这一块可以参考博客:http://blog.csdn.net/a491857321/article/details/52058693