redis集群

Redis 集群是一个可以在多个 Redis 节点之间进行数据共享的设施。

它有几个好处:

  • 高性能,集群的性能和单节点的性能是同一个级别,并不会降低
  • 高可用,在使用集群承担高负载的同时,也能进行高可用的容灾机制
  • 易扩展,向集群添加新的节点,或者移除节点,都是透明化操作,不需要停机
  • 原生,不需要其他代理或工具,和单机redis几乎完全兼容

何为哨兵模式

哨兵模式,是监控redis集群状态的工具,就好像一个监控器,监控着主从服务器是否健康,是redis的高可用性解决方案,当某个主服务器宕机时,它会选举出一个最优的从服务器来充当主服务器,这样,用户体验不会改变

需要注意的是,虽然哨兵模式支持创建多个,但是一般建议采取奇数台,道理很简单,假如选举的两个从服务器票数一样,就会使场面瞬间尬住,主从间的切换有可能会崩掉

还有一点是,哨兵也不是不会出错的,如果哨兵出错,没有下一个哨兵出战,那么程序有可能会出错

使用docker创建镜像

  1. 建一个文件夹,进入项目文件夹,再建一个专门存放哨兵的脚本sentinel,cd sentinel

  2. 建立sentinel.conf配置文件

    sentinel monitor mymaster redis-master 6379 2
    sentinel down-after-milliseconds mymaster 5000
    sentinel parallel-syncs mymaster 1
    sentinel failover-timeout mymaster 5000

    该配置的意思是,监控主服务器的6379端口并启动两个实例,如果5秒内没有收到主节点的心跳,则哨兵就认为主节点宕机了,默认是30秒,如果5秒以上连接不上主库同步,则在5秒后进行选举,对其他从服务器进行角色转换

  3. 建立sentinel-entypoint.sh脚本

    #!/bin/sh
    
    sed -i "s/$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /etc/redis/sentinel.conf
    sed -i "s/$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g" /etc/redis/sentinel.conf
    sed -i "s/$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g" /etc/redis/sentinel.conf
    
    exec docker-entrypoint.sh redis-server /etc/redis/sentinel.conf --sentinel

    该脚本文件会对配置文件进行同步,用来启动哨兵

  4. 建立Dockerfile指定基础镜像,同时拷贝配置文件到镜像内部

    FROM redis
    
    EXPOSE 26379
    ADD sentinel.conf /etc/redis/sentinel.conf
    RUN chown redis:redis /etc/redis/sentinel.conf
    COPY sentinel-entrypoint.sh /usr/local/bin/
    RUN chmod +x /usr/local/bin/sentinel-entrypoint.sh
    ENTRYPOINT ["sentinel-entrypoint.sh"]
  5. 最后退到项目的根目录,建docker-compose.yml配置文件

    master:
      image: redis
      ports:
        - "6379:6379"
    slave1:
      image: redis
      command: redis-server --slaveof redis-master 6379
      links:
        - master:redis-master
      ports:
        - "6380:6379"
    slave2:
      image: redis
      command: redis-server --slaveof redis-master 6379
      links:
        - master:redis-master
      ports:
        - "6381:6379"
    sentinel1:
      build: sentinel
      environment:
        - SENTINEL_DOWN_AFTER=5000
        - SENTINEL_FAILOVER=5000    
      links:
        - master:redis-master
        - slave1
    sentinel2:
      build: sentinel
      environment:
        - SENTINEL_DOWN_AFTER=5000
        - SENTINEL_FAILOVER=5000    
      links:
        - master:redis-master
        - slave2

    意思是,我们起三台redis服务,分别跑在6379,6380,6381 ,一主两从,并且有两个哨兵实例来监控他们

  6. 在项目根目录下,启动服务:

    docker-compose up --force-recreate
    # 如果希望在后台运行可以加-d参数
  7. 测试一下,打开三个终端,分别进入redis-cli -p 6379,6380,6381
    在主服务器6379下,添加一个数据,然后分别get

  8. 测试哨兵
    手动停止主库的容器进程,来模拟宕机的情况

    docker stop redissentinel_master_1

    使用info命令查询服务器的角色,可以看到,原本是slave,现在成为了master