单一Redis服务器存在的问题

1、单个redis如果发生意外(宕机、断电等),数据的安全得不到保证。

2、单一redis读写不分离,如果并发量大,一台redis可能会扛不住。

搭建Redis集群

此处我用windows环境搭建:

在任意盘创建一个名为Redis的文件夹,然后将Redis安装到该目录下,复制三份,用端口号隔开
1.png

6379为主机,80、81为从机,主从复制中,主机的配置文件不改动,只修改从机的配置文件,两台从机都要修改:

真正的配置文件修改都需要修改(linux):

拷贝多个redis.conf文件;daemonizeyes改为yes;

pidfile的名字;端口号;log文件名字;dump.rdb名字;

slaveof 主机ip 主机端口;masterauth 主机密码。

但在windows系统,分三个redis的话,此处我们只需要修改:
2.png

端口号修改为从机对应的端口号
3.png

slaveof

改为:

slaveof 127.0.0.1 6379 //此处改为主机的ip与端口

如果主机设有密码,则需要修改下面的masterauth ,若没有则不用理会

masterauth

修改完成后,启动我们的redis,三台都要启动,启动顺序为先启动主机,再启动从机

为了方便,我们创建脚本文件来执行启动:

每个redis文件夹下创建startRedisServer.bat的脚本文件,内容为

  1. @echo off
  2. redis-server.exe redis.windows.conf
  3. @pause

在文件夹外面创建start6379.bat,内容为:

  1. @echo off
  2. cd Redis-x64-5.0.9-6379
  3. startRedisServer.bat

然后给80、81创建的步骤同79,只需要修改文件夹目录

之后先启动主机,再启动从机:
4.png

用客户端连接79,输入info replication
5.png

可看到,我们这里已经检测到了有两台从机,此时,我们的主从复制已完成,详细的测试此处不列举,只说结果

1、主机宕机后,从机依然保留有数据,主机连接回来还是可以查询到之前的数据

2、主机宕机后,两台从机不会升级为主机,也就意味着,当时的业务环境不允许写入数据了,此时可以手动配置将一台从机升级为主机: slaveof no one 测试当主节点shutdown后,使用slaveof no one 使得6380成为主节点,但是也只是主节点,没有任何从节点!

3、主机宕机后重新启动,从节点依旧可以连接到主节点

哨兵模式

假设我们的主机宕机了,此时没有主机了,我们需要手动去配置,这样无疑是很复杂的,此时redis给出的解决方案就是哨兵模式(sentinel)

什么是哨兵模式

Redis-sentinel是Redis的作者antirez,因为Redis集群的被各大公司使用,每个公司要写自己的集群管理工具,于是antirez花了几个星期写出了Redis-sentinel。

Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance),Redis 的 Sentinel 为Redis提供了高可用性。使用哨兵模式创建一个可以不用人为干预而应对各种故障的Redis部署。

该系统执行以下三个任务:

  • 监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否允许正常。
  • 提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
  • 自动故障迁移(Automatic failover):
    (1)当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作,他会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;
    (2)客户端试图连接失败的主服务器时,集群也会向客服端返回新主服务器的地址,是的集群可以使用新主服务器代替失效服务器。

Redis-sentinel搭建

根据安装和基本配置,已经有了主从配置 ,对应文件夹Redis6379~Redis6381。然后在每个文件夹下面新增 一个名为 sentinel.conf 的文件。配置内容如下:

  1. # 这个是Redis6379配置内容,其他文件同理新增然后改一下端口即可,26380,和 26381。
  2. #当前Sentinel服务运行的端口
  3. port 26379
  4. # 哨兵监听的主服务器 投票超过2则认为主机宕机
  5. sentinel monitor mymaster 127.0.0.1 6379 2
  6. # 3s内mymaster无响应,则认为mymaster宕机了
  7. sentinel down-after-milliseconds mymaster 3000
  8. #如果10秒后,mysater仍没启动过来,则启动failover
  9. sentinel failover-timeout mymaster 10000
  10. # 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
  11. sentinel parallel-syncs mymaster 1

编写启动脚本 startRedisSentinel.bat :

  1. @echo off
  2. redis-server.exe sentinel.conf --sentinel
  3. @pause

然后先启动主从复制,再启动哨兵:
6.png

我们测试一下,假设79服务器断掉会发生什么?
7.png

简单分析一下哨兵的日志,应该是80主机被推上当了主机,连接80主机看一下:
8.png

可以看到,确实80升级为主机,并且81成为了它的从机

此时我们重启79服务器,会发生什么呢?
9.png

简单看一下,了解到连接了主机80,证明原来的主机宕机后重启,也不会变为主机,而是从机:
10.png

可以看到,此时已经变为两台从机了

总结

Redis-Sentinel是Redis官方推荐的高可用性(HA) 解决方案,Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。Sentinel可以监视任意多个主服务器(复用),以及主服务器属下的从服务器,并在被监视的主服务器下线时,自动执行故障转移操作。

为了防止sentinel的单点故障,可以对sentinel进行集群化,创建多个sentinel。