Redis的集群与主从复制(附Redis持久化)

Redis持久化

1、Rdb方式

Redis默认的方式,redis通过快照来将数据持久化到磁盘中。

(1)设置持久化快照的条件:在redis.conf中修改持久化快照的条件,如下:
这里写图片描述
图表示的意思:900秒内操作1次或者300秒内操作10次或者60秒内操作10000次,将数据写到磁盘

(2)持久化文件存储的目录:在redis.conf中可以指定持久化文件存储的目录
这里写图片描述

(3)Rdb问题
一旦redis非法关闭,那么会丢失最后一次持久化之后的数据。如果数据不重要,则不必要关心。如果数据不能允许丢失,那么要使用aof方式。实际项目开发中两种方式同时使用。

2、Aof方式

Redis默认是不使用该方式持久化的。Aof方式的持久化,是操作一次redis数据库,则将操作的记录存储到aof持久化文件中。

(1)开启aof方式的持久化方案
将redis.conf中的appendonly改为yes,即开启aof方式的持久化方案
这里写图片描述

(2)Aof文件存储的名称
Aof文件存储的目录和rdb方式的一样。
这里写图片描述

(3)结论

在使用aof和rdb方式时,如果redis重启,则数据从aof文件加载。

Redis的主从复制

1、什么是主从复制

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

说明:

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

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

(3)只有一个主redis,可以有多个从redis。

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

(5)一个redis可以即是主又是从,如下图:
这里写图片描述

2、主从复制设置

主机无需配置

从机配置

这里在一台机器上有两个bin文件,模拟两台机器

(1)复制出一个从机

[hadoop@mini01 redis]$ cp bin/ bin2 –r

(2)修改从机的redis.conf

语法:Slaveof masterip masterport

这里写图片描述

(3)修改从机的port地址为6380(在redis.conf中修改)

这里写图片描述

(4)清除从机中的持久化文件(如果有的话)

[hadoop@mini01 bin2]$ rm -rf appendonly.aof dump.rdb

(5)启动从机

[hadoop@mini01 bin2]$ ./redis-server redis.conf

[hadoop@mini01 bin2]$ ./redis-cli -p 6380  

注意
主机一旦发生增删改操作,那么从机会将数据同步到从机中。从机不能执行写操作。(如果从机想要进行写操作需要进行设置)

127.0.0.1:6380> set s2 222
(error) READONLY You can't write against a read only slave.

Redis集群(重点)

1、集群架构图

这里写图片描述

架构细节:

(1)所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽

(2)节点的fail是通过集群中超过半数的节点检测失效时才生效

(3)客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可

(4)redis-cluster把所有的物理节点映射到[0-16383]slot上,cluster 负责维护node<->slot<->value

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

这里写图片描述

2、集群投票:容错

这里写图片描述

(1)集群中所有master参与投票,如果半数以上master节点与其中一个master节点通信超过(cluster-node-timeout),认为该master节点挂掉

(2)什么时候整个集群不可用(cluster_state:fail)?

  • 如果集群任意master挂掉,且当前master没有slave,则集群进入fail状态。也可以理解成集群的[0-16383]slot映射不完全时进入fail状态
  • 如果集群超过半数以上master挂掉,无论是否有slave,集群进入fail状态

3、安装ruby

集群管理工具(redis-trib.rb)是使用ruby脚本语言编写的。

其他机器同操作

(1)安装ruby

[hadoop@mini01 apps]$ sudo yum install ruby

[hadoop@mini01 apps]$ sudo yum install rubygems

(2)将以下文件上传到linux系统
这里写图片描述
(3)安装ruby和redis接口

[hadoop@mini01 apps]$ sudo gem install redis-3.0.0.gem

报错解决:

#没有权限,用sudo或者root操作
ERROR: While executing gem … (Gem::FilePermissionError) You don’t have write 
permissions for the /Library/Ruby/Gems/2.0.0 directory. 

(4)将redis-3.0.0包下src目录中的redis-trib.rb文件拷贝到apps/下
这里写图片描述

4、搭建集群

集群说明

#三台机器,每台机器模拟两台,一个主机一个从机,相当于一共6台
#第一台主机与从机的ip与端口(前面是主机,后面是从机)
192.168.253.21:7001 (192.168.132.21:7004)
#第二台
192.168.253.22:7002192.168.253.22:7005#第三台
192.168.253.23:7003192.168.253.23:7006

(1)复制机器,如果有持久化文件则删除

(2)设置集群参数
这里写图片描述

(3)修改端口
这里写图片描述

(4)启动机器

#每一台机器都要启动,最好写一个脚本,这里只演示启动一台
./redis-server redis.conf -p 7001

(5)创建集群

#在其中任何一台机器中,执行以下命令
#replicas 1:表示每个主机配置一个从机,最后三个ip地址是从机ip地址,与前面三个主机的ip地址相对应
[hadoop@mini01 apps]$ ./redis-trib.rb create --replicas 1 192.168.253.21:7001 192.168.253.22:7002 192.168.253.23:7003 192.168.253.21:7004 192.168.253.22:7005  192.168.253.23:7006

#yes
Can I set the above configuration? (type 'yes' to accept): yes

5、连接集群

(1)连接集群命令(在其中任意机器)

#-c:指定是集群连接
[hadoop@mini01 redis]$ ./redis-cli -h 192.168.253.21 -p 7001 –c

6、查看集群信息

(1)查看集群信息

192.168.253.21:7001>cluster info

(2)查看集群节点

192.168.253.21:7001>cluster nodes

7、jedis连接集群

(1)设置防火墙,开放7001-7006的端口

-A INPUT -m state --state NEW -m tcp -p tcp --dport 7001 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7002 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7003 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7004 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7005 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7006 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 7007 -j ACCEPT

猜你喜欢

转载自blog.csdn.net/shaonianbz/article/details/80210069