redis配置两种持久化存储方式;
RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中。
•redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。
•对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行任何IO操作的,这样就确保了redis极高的性能。
•如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。
AOF方式是将执行过的写指令记录下来,在数据恢复时按照丛前到后的顺序再将指令执行一遍。
•AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。
•如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。
•因为采用了追加方式,如果不做任何处理的话,AOF文件会变得越来越大,为此,redis提供了AOF文件重写(rewrite)机制,即当AOF文件的大小超过所设定的阈值时,redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。举个例子或许更形象,假如我们调用了100次INCR指令,在AOF文件中就要存储100条指令,但这明显是很低效的,完全可以把这100条指令合并成一条SET指令,这就是重写机制的原理。
•在进行AOF重写时,仍然是采用先写临时文件,全部完成后再替换的流程,所以断电、磁盘满等问题都不会影响AOF文件的可用性。
二. 两种方式优缺点
- RDB方式
•优点:
1.RDB是一个单一的紧凑文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如你可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题你也可以根据需求恢复到不同版本的数据集.
2.RDB是一个紧凑的单一文件,方便传送,适用于灾难恢复.
3.RDB在保存RDB文件时父进程唯一需要做的就是fork出一个子进程,接下来的工作全部由子进程来做,父进程不需要再做其他IO操作,所以RDB持久化方式可以最大化redis的性能.
4.与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.
•缺点:
1.Redis意外宕机,可能会丢失几分钟的数据(取决于配置的save时间点)。RDB方式需要保存珍整个数据集,是一个比较繁重的工作,通常需要设置5分钟或者更久做一次完整的保存。
2.RDB 需要经常fork子进程来保存数据集到硬盘上,当数据集比较大的时候,fork的过程是非常耗时的,可能会导致Redis在一些毫秒级内不能响应客户端的请求.如果数据集巨大并且CPU性能不是很好的情况下,这种情况会持续更久。
- AOF方式
•优点
1.使用AOF 会让Redis数据更加耐久: 你可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,你最多丢失1秒的数据.
2.AOF文件是一个只进行追加的日志文件,所以不需要写入seek,即使由于某些原因(磁盘空间已满,写的过程中宕机等等)未执行完整的写入命令,你也也可使用redis-check-aof工具修复这些问题.
3.Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧 AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。
4.AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析也很轻松。 导出AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。
•缺点
1.对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。
2.根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间。
redis集群配置主从模式;
1、环境准备
这里使用三台服务器,每台服务器上开启一个redis-server和redis-sentinel服务,redis-server端口为8000,redis-sentinel的端口为6800,修改默认端口是安全的第一步。
redis-server说明
192.168.68.110:8000 主
192.168.68.111:8000 从
192.168.68.112:8000 从
redis-sentinel说明
192.168.68.110:6800
192.168.68.111:6800
192.168.68.112:6800
2、搭建redis系统
先在三台机器上安装redis,安装完成后复制redis提供的默认配置文件
cp /usr/src/redis-3.2.1/redis.conf /usr/local/redis
修改配置文件
cd /usr/local/redis
vim redis.conf
主节点192.168.68.110上的配置
port 8000
daemonize yes
bind 192.168.68.110
requirepass 123456
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
从节点192.168.68.111,192.168.68.112上的配置
port 8000
daemonize yes
bind 192.168.68.111 #192.168.68.112
requirepass 123456
masterauth 123456
pidfile /var/run/redis-8000.pid
logfile /var/log/redis/redis-8000.log
slaveof 192.168.68.110 8000
注意:redis不会帮我们创建目录,所以在启动之前需要创建目录/var/log/redis
启动三台机器上的redis
./bin/redis-server ./redis.conf
三个redis服务启动完毕后,进入命令行,执行info replication查看当前主从配置,如果没有发现从节点,很有可能是防火墙没有开放8000端口导致主从节点之间没法通信
firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --zone=public --add-port=6800/tcp --permanent
firewall-cmd --reload
重新查看主从信息
3、搭建redis-sentinel系统
首先复制默认的配置文件并修改
cp /usr/src/redis-3.2.1/sentinel.conf /usr/local/redis/
vim /usr/local/redis/sentinel.conf
内容如下
protected-mode no
daemonize yes
port 6800
sentinel monitor mymaster 192.168.68.110 8000 1
sentinel auth-pass mymaster 123456
5秒内master6800没有响应,就认为SDOWN
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 15000
logfile /var/log/redis/sentinel.log
pidfile /var/run/sentinel.pid
启动redis-sentinel
./bin/redis-sentinel ./sentinel.conf
测试
1、主从复制测试
主节点添加数据
./bin/redis-cli -h 192.168.68.110 -p 8000 -a 123456
192.168.68.110:8000>set mao chan
从节点添加数据
./bin/redis-cli -h 192.168.68.111 -p 8000 -a 123456
192.168.68.111:8000>get mao
2、故障转移测试
停掉主节点
./bin/redis-cli -h 192.168.68.110 -p 8000 -a 123456
192.168.68.110:8000>SHUTDOWN
查看redis集群信息
./bin/redis-cli -h 192.168.68.112 -p 8000 -a 123456
192.168.68.112:8000>info replication
从节点192.168.68.112升级为主节点
./bin/redis-cli -h 192.168.68.111 -p 8000 -a 123456
192.168.68.111:8000> info replication
redis集群配置集群模式;
-
安装依赖包
yum install ruby -y
yum install ruby-devel.x86_64 -y -
安装rubygem
有些系统默认没有rubygems的包,可能需要手动安装,先安装好ruby-irb和ruby-rdoc,然后操作以下步骤。
(1) 下载rubygem包,https://rubygems.org/?locale=zh-CN
(2) 上传rubygems-2.4.8.zip至/redis目录
(3) 解压,安装
unzip rubygems-2.4.8.zip
cd rubygems-2.4.8
ruby setup.rb -
安装redis-gem
上传redis.gem至/redis目录,执行命令gem install -l redis-3.2.2.gem -
redis安装
上传redis-3.2.1.tar.gz到/redis目录
tar -zxvf redis-3.2.1.tar.gz
cd redis-3.2.1
make
make install PREFIX=/redis/redis
执行make命令可能会出现的错误
(1)错误原因:缺少gcc包
解决方法:执行命令yum install gcc -y安装gcc包 -
创建节点目录
mkdir -p /redis/redis/cluster/7380
mkdir -p /redis/redis/cluster/7381 -
修改配置文件
将/redis/redis-3.2.1下的配置文件redis.conf拷贝到/redis/redis/cluster/7380下,并作如下修改
bind 192.168.1.101 127.0.0.1 #注意192.168.1.10改成你的机器IP。绑定多个IP,既可以远程访问,也可以本地客户端访问
port 7380 #端口可以修改
appendonly yes
daemonize yes
cluster-enabled yes
cluster-config-file /redis/redis/cluster/7380/nodes.conf
cluster-node-timeout 5000 -
复制配置文件redis.conf到其他节点
cp /redis/redis/cluster/7380/redis.conf /redis/redis/cluster/7381/redis.conf
port、cluster-config-file需要修改下
port 7381
cluster-config-file /redis/redis/cluster/7381/nodes.conf -
启动redis
执行如下命令启动redis
/redis/redis/bin/redis-server/redis/redis/cluster/7380/redis.conf
/redis/redis/bin/redis-server/redis/redis/cluster/7381/redis.conf
启动后,使用命令ps -ef|grep redis可查看redis进程。
ps -ef|grep redis
注意:以上步骤,另外两台机器需要做同样的操作 -
创建redis集群
注意:创建集群前,最好关闭防火墙,如果防火墙配置不当,可能出现连接拒绝的错误,创建集群,让上面的实例互相通讯(1表示为每个master分配一个salve)
./redis-trib.rb create --replicas 1 192.168.1.101:7380 192.168.1.101:7381 192.168.1.102:7380 192.168.1.102:7381 192.168.1.103:7380 192.168.1.103:7381
Creating cluster
Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.1.103:7380
192.168.1.102:7380
192.168.1.101:7380
Adding replica 192.168.1.102:7381 to 192.168.1.103:7380
Adding replica 192.168.1.103:7381 to 192.168.1.102:7380
Adding replica 192.168.1.101:7381 to 192.168.1.101:7380
M: 9e486a62edb7be05691219259a534a0491e376e3 192.168.1.101:7380
slots:10923-16383 (5461 slots) master
S: 51f00a2e9639b0427ec177877d775244307b096e 192.168.1.101:7381
replicates 9e486a62edb7be05691219259a534a0491e376e3
M: bc2d50daf9adb4e16e40048249ea97ec039dfa46 192.168.1.102:7380
slots:5461-10922 (5462 slots) master
S: 2ad41829d6c48a0216fb4632253add6edc80b3fc 192.168.1.102:7381
replicates 5e7a6df4a0c931ca36afced6c3c62330da026c26
M: 5e7a6df4a0c931ca36afced6c3c62330da026c26 192.168.1.103:7380
slots:0-5460 (5461 slots) master
S: 07698f884a97e6a85a7f032c0fd95738d6e73017 192.168.1.103:7381
replicates bc2d50daf9adb4e16e40048249ea97ec039dfa46
这里我们可以看到master节点为192.168.1.101:7380、192.168.1.102:7380、192.168.1.103:7380;其他三个为slave节点,输入yes确认
Can I set the above configuration? (type 'yes' to accept): yes
Nodes configuration updated
Assign a different config epoch to each node
Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join...
Performing Cluster Check (using node 192.168.1.101:7380)
M: 9e486a62edb7be05691219259a534a0491e376e3 192.168.1.101:7380
slots:10923-16383 (5461 slots) master
M: 51f00a2e9639b0427ec177877d775244307b096e 192.168.1.101:7381
slots: (0 slots) master
replicates 9e486a62edb7be05691219259a534a0491e376e3
M: bc2d50daf9adb4e16e40048249ea97ec039dfa46 192.168.1.102:7380
slots:5461-10922 (5462 slots) master
M: 2ad41829d6c48a0216fb4632253add6edc80b3fc 192.168.1.102:7381
slots: (0 slots) master
replicates 5e7a6df4a0c931ca36afced6c3c62330da026c26
M: 5e7a6df4a0c931ca36afced6c3c62330da026c26 192.168.1.103:7380
slots:0-5460 (5461 slots) master
M: 07698f884a97e6a85a7f032c0fd95738d6e73017 192.168.1.103:7381
slots: (0 slots) master
replicates bc2d50daf9adb4e16e40048249ea97ec039dfa46
[OK] All nodes agree about slots configuration.
Check for open slots...
Check slots coverage...
[OK] All 16384 slots covered.
到此redis集群创建完成。
- 测试redis集群
在任意一台集群机器上执行如下操作
/redis/redis/bin/redis-cli -h 192.168.1.101 -p 7380 -c
192.168.1.101:7380> set k1 "AA"
OK
192.168.1.101:7380> set k2 "BB"
-> Redirected to slot [449] located at 192.168.1.103:7380
OK
192.168.1.103:7380> get k1
-> Redirected to slot [12706] located at 192.168.1.101:7380
"AA"
192.168.1.101:7380> get k2
-> Redirected to slot [449] located at 192.168.1.103:7380
"BB"
192.168.1.103:7380>
浙公网安备 33010602011771号