Redis的持久化和集群

原创
2019/03/18 18:31
阅读数 324

reids持久化的两种方式

RDB

RDB持久化是在指定时间间隔内将内存中的数据集快照写入磁盘。 实际是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

优点:1.备份文件只有一个,容易查找恢复;2.灾难恢复效率高;

缺点:1.如果在定时持久化前出现宕机,数据将丢失;2.RDB是通过fork子进程来完成持久化的,如果数据集较大会导致数据库服务器短时间内停止服务


AOF

AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本方式记录,可以打开文件看到详细的操作记录。

优点:数据安全性更好,可以配置同步持久化

缺点:灾难恢复效率低


redis集群

redis三种集群策略

  1. 主从复制
  2. 哨兵
  3. 集群

主从复制

主从复制中数据库分为两类:主数据库(master)和从数据库(slave)。

特点:

  • 主数据库可以进行读写操作,当数据变化时,会自动将数据同步给从数据库
  • 从数据库一般是只读,并且接受主数据库同步过来的数据
  • 一个master可以对应多个slave,但是一个slave只能对应一个master

主从复制工作机制

当slave启动后主动给master发送SYNC命令。master收到SYNC命令后在后台保存快照(RDB)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存命令发送给slave。slave收到快照文件和命令后加载快照文件和缓存的执行命令。

复制初始化后,master每次接收到的写命令都会同步发给slave,保证主从数据一致性。

全量同步,slave初始化阶段,将master上所有的数据复制一份

增量同步,slave初始化后主服务器发生写操作同步到从服务器的过程,增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接受并执行收到的写命令

设置需要连接的master的ip端口:

slaveof 192.168.0.107 6379

如果master设置了密码。需要配置:

masterauth

连接成功进入命令行后,可以通过以下命令行查看连接该数据库的其他库信息:

info replication


哨兵

哨兵的作用是监控redis系统的运行状况,他的功能如下:

  • 监控主从数据库是否正常运行
  • master出现故障时,自动将slave转化为master
  • 多哨兵配置的时候,哨兵之间也会自动监控
  • 多个哨兵可以监控同一个redis

哨兵工作机制

哨兵进程启动时会读取配置文件的内容,通过sentinel monitor master-name ip port quorum查找到master的ip端口。一个哨兵可以监控多个master数据库,只需要提供多个该配置项即可。

配置文件还定义了与监控相关的参数,比如master多长时间无响应即判定位下线。

哨兵启动后,会与要监控的master建立俩条连接:

  1. 一条连接用来订阅master的_sentinel_:hello 频道与获取其他监控该master的哨兵节点信息
  2. 另一条连接定期向master发送INFO等命令获取master本身的信息

与master建立连接后,哨兵会执行三个操作,这三个操作的发送频率都可以在配置文件中配置:

  1. 定期向master和slave发送INFO命令
  2. 定期向master和slave的_sentinel_:hello 频道发送自己的信息
  3. 定期向master、slave和其他哨兵发送PING命令

发送INFO命令可以获取当前数据库的相关信息从而实现新节点的自动发现。 所以说哨兵只需要配置master数据库信息就可以自动发现其slave信息。 获取slave信息后哨兵也会与slave建立两条连接执行监控。通过INFO命令,哨兵可以获取主从数据库的最新信息,并进行相应的操作,比如角色变更等。

接下来哨兵向主从数据库的_sentinel_:hello 频道发送信息,与同样监控这些数据库的哨兵共享自己的信息,发送内容为哨兵的ip端口、运行id、配置版本、master名字、master的ip端口还有master的配置版本。这些信息的用处:

  • 其它哨兵可以通过该信息判断发送者是否是新发现的哨兵,如果是就会创建一个到该哨兵的连接用于发送PING命令。
  • 其它哨兵通过该信息可以判断master的版本,如果该版本高于直接记录的版本,将会更新

当实现了自动发现slave和其它哨兵节点后,哨兵可以通过定期发送PING命令监控这些数据库和节点有没有停止服务。发送评率可以设置,但是最长间隔时间为1S, sentinel down-after-millisecondes mymaster 600 设置。

如果被ping的数据库或者节点超时未回复,哨兵认为其下线。如果下线的是master,哨兵会向其他哨兵点发送命令询问他们是否也认为该master主观下线,如果达到一定数量(配置文件中的quorum)投票,哨兵也会认为该master已经主观下线,并选举领头哨兵节点对主从系统发起故障恢复。

如上文所说,哨兵认为master客观下线后,故障恢复的操作需要由选举的哨兵执行,选举采用Raft算法:

  1. 所有在线的slave中选择优先级最高的,优先级可以通过slave-priority配置
  2. 如果有多个最高优先级的slave,则选取复制偏移量最大(即复制越完整)的当选
  3. 如果以上条件都一样,选取id最小的slave

挑选出需要继任的slave后,领头哨兵向该数据库发送命令使其升格为master,然后再向其他slave发送命令接收新的master,最后更新数据。将已经停止的旧的master更新为新的master的从数据库,使其恢复服务后以slave的身份继续运行。

哨兵配置 哨兵配置的配置文件为sentinel.conf,设置主机名称,地址,端口,以及选举票数即恢复时最少需要几个哨兵节点同意。

sentinel monitor mymaster 192.168.0.107 6379 1

只要配置需要监控的master就可以了,哨兵会监控连接该master的slave。

启动哨兵节点:

redis-server sentinel.conf --sentinel &

可以在任何一台服务器上查看指定哨兵节点信息:

bin/redis-cli -h 192.168.0.110 -p 26379 info Sentinel

集群

使用集群,只需要将每个数据库节点的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行。

集群配置

安装依赖环境ruby,注意ruby版本必须高于2.2

yum install ruby
yum install rubygems
gem install redis

修改配置文件:

bind 192.168.0.107

配置端口

port 6380

配置快照保存路径

dir/usr/local/redis-cluster/6380/

开启集群

cluster-enabled yes

为节点设置不同的工作目录

cluster-config-file nodes-6380.conf

集群失效时间

cluster-node-timeout 15000

开启集群中的节点

redis-service ../6380/redis.conf

将节点加入集群中

redis-trib.rb create --replicas 1 192.168.107:6380 192.168.0.107:6381 192.168.0.107:6382 192.168.0.107:6383 192.168.0.107:6384 192.168.0.107:6385

中途需要输入yes确定创建集群

进入任何一个集群中的节点:

redis-cli -c -h 192.168.0.107 -p 6381

查看集群中的节点:

cluster nodes

增加集群节点

cluster meet ip port
展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部