redis 持久化、主从配置保证数据安全性能

来源:互联网 发布:php彩票源码程序 编辑:程序博客网 时间:2024/06/05 20:58

使用分布式缓存技术,最为关心的就是缓存的数据丢失问题。那么我们在使用redis的时候,它到底提供什么持久化策略来保证我们缓存数据不丢失。

redis提供了两种持久化方式:rdb与aof

rdb是记录一段时间内的操作,一盘的配置是一段时间内操作超过多少次就持久化。
aof可以实现每次操作都持久化。
推介使用aof。

开启aof,打开redis配置文件,找到appendonly 设置为yes

aof有3这种策略

#appendfsync always   #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用 

appendfsync everysec    #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐 

#appendfsync no    #完全依赖os,性能最好,持久化没保证  


redis的详细配置推介http://www.cnblogs.com/kreo/p/4423362.html


接下再看看主从配置,以本机测试为主

第一步:在linux安装redis数据库作为主库 IP地址为192.168.127.129:6379

第二步:虚拟机IP地址映射到本机访问

映射之后遍可通过访问本机127.0.0.1:6380进行访问主库

第三步:在本机windows搭建redis数据库,然后进行主从配置

# 主从复制。使用 slaveof 来让一个 redis 实例成为另一个reids 实例的副本。# 注意这个只需要在 slave 上配置。# 主库IP、端口配置slaveof 127.0.0.1 6380
# 如果 master 需要密码认证,就在这里设置
#主库验证密码 ps:如果redis搭建在linux由于是受保护的所以主库必须设置验证密码才能进行访问masterauth redisadmin
# 当一个 slave 与 master 失去联系,或者复制正在进行的时候,# slave 可能会有两种表现:## 1) 如果为 yes ,slave 仍然会应答客户端请求,但返回的数据可能是过时,#    或者数据可能是空的在第一次同步的时候## 2) 如果为 no ,在你执行除了 info he salveof 之外的其他命令时,#    slave 都将返回一个 "SYNC with master in progress" 的错误,#slave-serve-stale-data yes # 你可以配置一个 slave 实体是否接受写入操作。# 通过写入操作来存储一些短暂的数据对于一个 slave 实例来说可能是有用的,# 因为相对从 master 重新同步数而言,据数据写入到 slave 会更容易被删除。# 但是如果客户端因为一个错误的配置写入,也可能会导致一些问题。## 从 redis 2.6 版起,默认 slaves 都是只读的。## Note: read only slaves are not designed to be exposed to untrusted clients# on the internet. It's just a protection layer against misuse of the instance.# Still a read only slave exports by default all the administrative commands# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve# security of read only slaves using 'rename-command' to shadow all the# administrative / dangerous commands.# 注意:只读的 slaves 没有被设计成在 internet 上暴露给不受信任的客户端。# 它仅仅是一个针对误用实例的一个保护层。slave-read-only yes # Slaves 在一个预定义的时间间隔内发送 ping 命令到 server 。# 你可以改变这个时间间隔。默认为 10 秒。#repl-ping-slave-period 10 # The following option sets the replication timeout for:# 设置主从复制过期时间## 1) Bulk transfer I/O during SYNC, from the point of view of slave.# 2) Master timeout from the point of view of slaves (data, pings).# 3) Slave timeout from the point of view of masters (REPLCONF ACK pings).## It is important to make sure that this value is greater than the value# specified for repl-ping-slave-period otherwise a timeout will be detected# every time there is low traffic between the master and the slave.# 这个值一定要比 repl-ping-slave-period 大#repl-timeout 60 # Disable TCP_NODELAY on the slave socket after SYNC?## If you select "yes" Redis will use a smaller number of TCP packets and# less bandwidth to send data to slaves. But this can add a delay for# the data to appear on the slave side, up to 40 milliseconds with# Linux kernels using a default configuration.## If you select "no" the delay for data to appear on the slave side will# be reduced but more bandwidth will be used for replication.## By default we optimize for low latency, but in very high traffic conditions# or when the master and slaves are many hops away, turning this to "yes" may# be a good idea.repl-disable-tcp-nodelay no # 设置主从复制容量大小。这个 backlog 是一个用来在 slaves 被断开连接时# 存放 slave 数据的 buffer,所以当一个 slave 想要重新连接,通常不希望全部重新同步,# 只是部分同步就够了,仅仅传递 slave 在断开连接时丢失的这部分数据。## The biggest the replication backlog, the longer the time the slave can be# disconnected and later be able to perform a partial resynchronization.# 这个值越大,salve 可以断开连接的时间就越长。## The backlog is only allocated once there is at least a slave connected.#repl-backlog-size 500mb # After a master has no longer connected slaves for some time, the backlog# will be freed. The following option configures the amount of seconds that# need to elapse, starting from the time the last slave disconnected, for# the backlog buffer to be freed.# 在某些时候,master 不再连接 slaves,backlog 将被释放。## A value of 0 means to never release the backlog.# 如果设置为 0 ,意味着绝不释放 backlog 。#repl-backlog-ttl 3600 # 当 master 不能正常工作的时候,Redis Sentinel 会从 slaves 中选出一个新的 master,# 这个值越小,就越会被优先选中,但是如果是 0 , 那是意味着这个 slave 不可能被选中。## 默认优先级为 100。slave-priority 100
以上从库配置完毕
接下来进行测试(操作redis demo上一篇博客已经给出了。下载地址:http://download.csdn.net/detail/u013294278/9915084)
我们先用redis客户端进行连接到两个redis服务,清空所有数据
接下来我们往主库写入10000条缓存数据
执行一下代码
for(int i=0;i<10000;i++){SharedJedisUtils.set(i+"", "test_"+i, 0);}System.err.println("写入完毕.........................");
 这个时候我们reload下主库看下数据缓存情况
reload之后发现主库10000条缓存数据已写入成功,那么我们再看看从库情况如何
reload之后发现从库的数据跟主库的数据一模一样。说明主从配置成功。

原创粉丝点击