redis(持久化、主从复制、redis集群)

一、redis的持久化

        Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。

        Redis支持两种方式的持久化,一种是RDB方式,一种是AOF方式。可以单独使用其中一种或将二者结合用。

1.1、RDB持久化(默认)

        RDB方式的持久化是通过快照(snapshotting)完成的,当符合一定条件时Redis会自动将内存中的数据进行快照并持久化到硬盘。

        RDB是Redis默认采用的持久化方式,在redis.conf配置文件中默认有此下配置:

save 900 1  #900秒内容如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000 #表示60秒内如果超过10000个key被修改,则发起快照保存

在redis.conf中:

配置dir指定rdb快照文件的位置

配置dbfilenam指定rdb快照文件的名称

Redis启动后会读取RDB快照文件,将数据从硬盘载入到内存。

 实验

1、删除dump.rdb

2、set test abc

3、关闭服务端并观察bin目录的变化

总结:

优点:让redis的数据存取速度变快

缺点:服务器断电时会丢失部分数据(数据的完整性得不到保证)

1.2、AOF持久化

        默认情况下Redis没有开启AOF(append onlyfile)方式的持久化,可以通过appendonly参数开启:

appendonly yes

        AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改:  

appendfilename appendonly.aof

        AOF持久化策略如下:  

#appendfsync always   #每次有数据修改发生时都会写入AOF文件。
appendfsync everysec  #每秒钟同步一次,该策略为AOF的缺省策略。
#appendfsync no        #从不同步。高效但是数据不会被持久化。

实验 

1、设置appendonly为yes

2、设置一个key

3、观察appendonly.aof

总结:

优点:持久化良好,能包证数据的完整性

缺点:大大降低了redis系统的存取速度

二、主从复制(了解)

        持久化保证了即使redis服务重启也会丢失数据,因为redis服务重启后会将硬盘上持久化的数据恢复到内存中,但是当redis服务器的硬盘损坏了可能会导致数据丢失,如果通过redis的主从复制机制就可以避免这种单点故障,如下图:

说明:

  • 主redis中的数据有两个副本(replication)即从redis1和从redis2,即使一台redis服务器宕机其它两台redis服务也可以继续提供服务。

  • 主redis中的数据和从redis上的数据保持实时同步,当主redis写入数据时通过主从复制机制会复制到两个从redis服务上。

  • 只有一个主redis,可以有多个从redis。

  • 主从复制不会阻塞master,在同步数据时,master可以继续处理client 请求

  • 一个redis可以即是主又是从,如下图:

 

2.1、主从配置 

主redis配置

无需特殊配置

从redis配置

修改从redis服务器上的redis.conf文件,添加slaveof 主redis ip 主redis端口

上边的配置说明当前该从redis服务器所对应的主redis是192.168.101.3,端口是6379  

2.3、主从复制过程 

复制过程说明:

1、 slave 服务启动,slave 会建立和master 的连接,发送sync 命令。

2、master启动一个后台进程将数据库快照保存到RDB文件中

3、master 就发送RDB文件给slave

4、slave 将文件保存到磁盘上,然后加载到内存恢复

5、master把缓存的命令转发给slave

注意:主死了,从只能读

 三、redis集群的搭建

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),节点的fail是通过集群中超过半数的节点检测失效时才生效.

(2)存取数据时连接任一节点都可以,但集群中有一个节点fail整个集群都会fail

Redis 集群中内置了 16384 个哈希槽,当需要在Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点 

 

Redis集群中至少应该有三个节点。要保证集群的高可用,需要每个节点有一个备份机。

Redis集群至少需要6台服务器。

搭建伪分布式。可以使用一台虚拟机运行6个redis实例。需要修改redis的端口号7001-700

 3.1、集群搭建环境

使用ruby脚本搭建集群,需要安装ruby。

[root@upload ~]# yum install ruby
[root@upload ~]# yum install rubygems
[root@upload ~]# gem install redis-3.0.0.gem 

Successfully installed redis-3.0.0

1 gem installed

Installing ri documentation for redis-3.0.0...

Installing RDoc documentation for redis-3.0.0...

[root@localhost ~]# cd redis-3.0.0/src
[root@localhost src]# ll *.rb
-rwxrwxr-x. 1 root root 48141 Apr  1  2015 redis-trib.rb

3.2、搭建步骤 

注意:必须删除dump.rdb和appendonly.aof文件

搭建伪分布式,需要6个redis实例放到/usr/local/redis-cluster目录下,并且运行在不同的端口7001-7006

cp -r  /usr/local/redis  /usr/local/redis-cluster/redis-7001

3.3、创建6个redis实例

每个实例运行在不同的端口。还需要修改redis.conf配置文件。配置文件中还需要把cluster-enabled yes前的注释去掉。

 

3.4、启动每个redis实例

创建启动集群的脚本:start-all.sh 放在/usr/java/redis-cluster目录下。

  cd /usr/local/redis-cluster/redis-7001/bin
                ./redis-server redis.conf
                cd /usr/local/redis-cluster/redis-7002/bin
                ./redis-server redis.conf
                cd /usr/local/redis-cluster/redis-7003/bin
                ./redis-server redis.conf
                cd /usr/local/redis-cluster/redis-7004/bin
                ./redis-server redis.conf
                cd /usr/local/redis-cluster/redis-7005/bin
                ./redis-server redis.conf
                cd /usr/local/redis-cluster/redis-7006/bin
                ./redis-server redis.conf

[root@localhost redis-cluster]# chmod 777 start-all.sh

创建关闭集群的脚本:shutdown-all.sh,放在/usr/local/redis-cluster目录下。

 cd redis-7001/bin

./redis-cli -p 7001 shutdown

./redis-cli -p 7002 shutdown

./redis-cli -p 7003 shutdown

./redis-cli -p 7004 shutdown

./redis-cli -p 7005 shutdown

./redis-cli -p 7006 shutdown

[root@localhost redis-cluster]# chmod 777shutdown-all.sh

 3.5、使用ruby脚本搭建redis集群

cd /usr/upload/redis.3.0.0/src

#create --replicas 1 意思就是说,为每个节点创建一个副本,也就是备份,如果 是不同的服务器,那么后面的端口也需要改成服务器的端口, 前面3个ip是主,后面3个ip是备份机

./redis-trib.rb create --replicas 1 192.168.116.134:7001 192.168.116.134:7002 192.168.116.134:7003 192.168.116.134:7004 192.168.116.134:7005  192.168.116.134:7006

3.6、测试 

启动时使用-c参数来启动集群模式,命令如下:

./redis-cli -c -p 7001

 

3.7、redis cluster命令

cluster info   #打印集群的信息

cluster nodes  #列出集群当前已知的所有节点(node),以及这些节点的相关信息  

 3.8、主从个数设置

一:redis集群中的master节点个数要至少大于3个
因为master-1挂了以后,剩下的master节点(假如还有master-2、master-3)会重新选举出新的master,但是要超过一半的master节点个数都认为master-1挂了,这样才会重新选举新的master,如果是两个,挂了一个,还有一个,1>1不成立,所以要至少有3个master节点

二:集群节点个数要是奇数,虽然不是强制要求

因为要省钱,节省资源,假如4个节点,4的一半是2,挂了1个,剩下3个,3>2,满足重新选择的条件,但是假如有3个节点,一半1.5,挂了一个还有2两个,2>1.5,也满足了重新选举的条件,而且还节省了一个节点。

猜你喜欢

转载自blog.csdn.net/m0_71560190/article/details/126501151