您的位置:首页 > 数据库 > Redis

Redis 5.0.4搭建集群

2020-07-21 04:09 756 查看

一、安装

使用上一章写好的Redis安装脚本
CentOS 下自动安装Redis脚本

二、搭建集群

参考篇幅:https://blog.csdn.net/baidu_38558076/article/details/90707045

三、使用redis-cli链接集群

  1. 切换到src目录下
  2. 使用redis-cli工具 -h 是要连接的ip -p 端口 -a 密码 -c 代表用集群方式访问
$ cd /usr/local/redis/redis-5.0.4/src
$ ./redis-cli -h ip -p 30011 -a 123456 -c

四、遇到的问题

集群搭建好,外部访问不到

  • 检查阿里云服务器是否开启了端口
  • 检查节点是否正常
$ ps -ef | grep redis
  • 把集群干掉,重新建立(迫不得已时)
#停止redis集群实例
$ ./create-cluster stop
#删除生成的日志,配置,数据文件
$ ./create-cluster clean
#创建redis集群实例
$ ./create-cluster start
#搭建redis集群
$ ./create-cluster create
  • 搭建的时候如果遇到某个节点启动不成功,可能是因为端口占用,可修改 create-cluster 文件中的 PORT(端口基准,以节点数向上递增)

五、主从复制的方式和工作原理

Redis的主从复制是异步复制,异步分为两个方面,一个是master服务器在将数据同步到slave时是异步的,因此master服务器在这里仍然可以接收其他请求,一个是slave在接收同步数据也是异步的。

复制方式

Redis主从复制分为以下三种方式:

  1. 如果无法部分同步(比如初次同步),则会请求进行全量同步,这时master服务器会将自己的rdb文件发送给slave服务器进行数据同步,并记录同步期间的其他写入,再发送给slave服务器,以达到完全同步的目的,这种方式称为全量复制。
  2. 当因为各种原因master服务器与slave服务器断开后,slave服务器在重新连上master服务器时会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制。
  3. 当master服务器与slave服务器正常连接时,master服务器会发送数据命令流给slave服务器,将自身数据的改变复制到slave服务器。这种叫做命令传播

工作原理

master服务器会记录一个replicationId的伪随机字符串,用于标识当前的数据集版本,还会记录一个当数据集的偏移量offset,不管master是否有配置slave服务器,replication Id和offset会一直记录并成对存在,我们可以通过以下命令查看replication Id和offset:

$ info  #查看配置

通过redis-cli在master或slave服务器执行该命令会打印类似以下信息(不同服务器数据不同,打印信息不同,使用info命令会打印很多信息,需要耐心找一下):

# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=30016,state=online,offset=7066,lag=1
master_replid:3e6aac77a95c0bbe7e1695436ef7ac2fb765d926
master_repl_offset:7066
  • 当master与slave正常连接时,slave使用PSYNC命令向master发送自己记录的旧master的replication id和offset,而master会计算与slave之间的数据偏移量,并将缓冲区中的偏移数量同步到slave,此时master和slave的数据一致。
  • 而如果slave引用的replication太旧了,master与slave之间的数据差异太大,则master与slave之间会使用全量复制的进行数据同步

避免清空数据

slave会被清空?slave不用同步了master的数据吗?备份的数据怎么会清空了呢?

  • 当master服务器关闭了持久化时,如果发生故障后自动重启时,由本地没有保存持久化的数据,重启的Redis内存数据为空,而slave会自动同步master的数据,这时候,slave服务器的数据也会被清空。

如何避免slave被清空呢?

  • 如果条件允许(一般都可以的),master服务器还是要开启持久化,这样master故障重启时,可以快速恢复数据,而同步这台master的slave数据也不会被清空。
  • 如果master不能开启持久化,则不应该设置让master发生故障后重启(有些机器会配置自动重启),而是将某个slave服务器升级为master服务器,对外继续提供服务。

slave默认为只读的
在Redis2.6以后,slave只读模式是默认开启的,我们可以通过配置文件中的slave-read-only选项配置是否开启只读模式:

# 默认是yes
slave-read-only yes/no
#或者在客户端中通过config set命令设置是否开启只读模式:
config set slave-read-only no

上面将slave服务器设置为可以写入,但是要注意,如果slave也配置了自己的从服务器(sub-slave),那么sub-slave只会同步从master服务器同步到slave的数据,而并会同步我们直接写入slave服务器的数据。

主从复制中的key过期问题

我们都知道Redis可以通过设置key的过期时间来限制key的生存时间,Redis处理key过期有惰性删除和定期删除两种机制,而在配置主从复制后,slave服务器就没有权限处理过期的key,这样的话,对于在master上过期的key,在slave服务器就可能被读取,所以master会累积过期的key,积累一定的量之后,发送del命令到slave,删除slave上的key。

如果slave服务器升级为master服务器 ,则它将开始独立地计算key过期时间,而不需要通过master服务器的帮助。

高可用性与故障转移

服务器的高可用性是指服务器能提供7*24小时不间断的服务,Redis可以通过Sentinel系统管理多个Redis服务器,当master服务器发生故障时,Sentineal系统会根据一定的规则将某台slave服务器升级为master服务器,继续提供服务,实现故障转移,保证Redis服务不间断。

下一篇文章我们来看一下哨兵是什么

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: