• Redis + Redis-sentinel + keepalived部署过程


    1   Redis缓存服务

    Redis是一个key-value存储系统。与memcached一样,为了保证效率,数据都是缓存在内存中的。区别的是redis支持周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且可以在此基础上实现主从同步。

    Redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度极快。

    目前官方提供的最新的稳定版本为3.2.5。

    1.1 Redis安装

    首先,将安装包下载到本地并上传到redis服务器的/opt/install目录下,或者直接在redis服务器上通过wget的方式下载redis-3.2.5.tar.gz。

    第一步:解压安装包

      # mkdir -p /application

       # tar zxf reids-3.2.5.tar.gz

    第二步:进入安装目录进行安装

      # cd redis-3.2.5

        make

         # make PREFIX=/opt/software/redis-3.2.5 install

         # ln -s /opt/software/redis-3.2.5 /application/redis

    第三步:准备配置文件

     # mkdir -p /application/redis/conf

     # cp /opt/install/redis-3.2.5/redis.conf /application/redis/conf/redis.conf

    第四步:启动redis

     # /application/redis/bin/redis-server /application/redis/conf/redis.conf

    1.2 Redis配置文件主要配置项说明

    一般情况下,需要对默认的配置文件按照一定的要求进行修改,再启动Redis服务。

                  bind 127.0.0.1                                               # 监听IP地址

                  port 6379                                                       # Redis服务监听端口号

                  daemonize no                                                # 是否需要以守护进程方式运行

                  pidfile /var/run/redis_6379.pid                            # PID文件路径

                  databases 16                                                  # 数据库数量,默认为16个

                  save 900 1                                                     # 快照配置

                  save 300 10

                  save 60 10000

                  slaveof <masterip> <masterport>                 # 主从配置

                  masterauth <master-password>                    # 从库访问主库的密码

                  requirepass foobared                                     # 配置客户端访问密码

                  appendonly no                                              # 默认持久化配置

                  cluster-enabled yes                                        # 配置是否开启集群模式

                  cluster-config-file nodes-6379.conf                     # 集群配置文件

                  cluster-node-timeout 15000                          # 集群节点互联超时时间

     

    说明:

      1.   bind配置默认是开启的,如果redis客户端和服务不在同一台机器上,一定要修改,否则只监听本地。
      2.   在高可用方案中,将bind配置选项注释掉,不要配置为bing本地网卡地址。注释掉以后,监听0.0.0.0 任意网段。
      3.   建议以守护进程方式运行,将daemonize 值修改为yes

     

     

     

    2   Redis主从复制结构及高可用方案

    2.1 Redis主从复制结构

    Redis 支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的精确复制品。

    Redis主从复制结构具有如下特点:

        l  redis使用异步的方式进行同步;

        l  master可以有多个slave;

        l  slave可以接受来至于其它slave的连接;

        l  redis的同步复制在master端是非阻塞的;

        l  redis的同步复制在slave端也是非阻塞的;

        l  redis的复制功能可以被用来做扩展。

            

     

    Redis主从复制同步过程:

        1)     slave服务器连接到master服务器;

        2)     slave服务器发送SYCN命令;

        3)     Master服务器备份数据库到RDB文件;

        4)     Master服务器把RDB文件传输给slave服务器;

        5)     salve服务器吧RDB文件数据导入到数据库中

    2.2 Redis配置主从同步

    Redis配置主从同步主要需要修改从库的配置文件。

    第一步:修改从库的配置文件,增加以下配置:

      slaveof 192.168.1.213 6379

    如果主库设置了客户端访问密码,还需要配置masteratuh,例如主库设置了requirepass是thinkive,那么从库的配置文件中就要配置masterauth。

      masterauth thinkive

    第二步:启动从库的服务

      # /application/redis/bin/redis-server /application/redis/conf/redis.conf

    第三步:查看主从配置情况,连接主库,使用info查看

      # /application/redis/bin/redis-cli -h 192.168.1.213 -p 6379

        > 192.168.1.213:6379> info

     

    2.3 Redis-Sentinel

    Redis-sentinel是官方推荐的一种高可用解决方案,使用M-S主从高可用方案时,假如MASTER宕机了。可以利用Redis-sentinel这个独立的进程来监控M-S集群,发现宕机以后立即进行切换。

    Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:

    • 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
    • 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
    • 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器。

    一般情况下,通过keepalived + Redis + Redis-sentinel组合的方式实现redis的高可用。

      redis负责提供Redis缓存服务,三台主机间的关系是M-S-S

      redis-sentinel负责提供Redis高可用监控,实现自动故障迁移,保证redis服务有效冗余。

      keepalived负责提供VIP地址供上层应用使用,三台主机的关系是M-B-B,VIP始终在redis-server master上,保证上层应用访问Redis可写可读。

     

    2.4 Redis + Redis-sentinel + keepalived部署过程

    假设三台redis服务器redis01,redis02,redis03。redis01为主,02、03是两台从服务器。IP分别是:redis01-213,redis02-214,redis03-215。

    2.4.1   部署安装部署Redis (每台机器都需要)

    见本文档1.1,redis安装。

    2.4.2   安装配置keepalived (每台机器都需要)

      2.4.2.1       安装依赖包

        # rpm -ivh ipvsadm-1.26-4.el6.x86_64.rpm

        # rpm -ivh kernel-devel-2.6.32-504.el6.x86_64.rpm

        # rpm -ivh kernel-devel-2.6.32-504.12.2.el6.x86_64.rpm

        # rpm -ivh keyutils-libs-devel-1.4-4.el6.x86_64.rpm

        # rpm -ivh libcom_err-devel-1.41.12-18.el6.x86_64.rpm

        # rpm -ivh libsepol-devel-2.0.41-4.el6.x86_64.rpm

        # rpm -ivh libselinux-devel-2.0.94-5.3.el6_4.1.x86_64.rpm

        # rpm -ivh krb5-devel-1.10.3-10.el6_4.6.x86_64.rpm

        # rpm -ivh openssl-devel-1.0.1e-15.el6.x86_64.rpm

        # rpm -ivh popt-devel-1.13-7.el6.x86_64.rpm

    2.4.2.2       解压keepalived,执行编译安装

        # cd /opt/install

        # tar -zxf keepalived-1.2.8.tar.gz

        # cd keepalived-1.2.8

        # ./configure

        # make && make install

        # cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/

        # cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/

        # cp /usr/local/sbin/keepalived /usr/sbin/

        # cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/

        # chkconfig --add keepalived

        # chkconfig keepalived on

    2.4.2.3       修改内核配置参数,抑制ARP

       编辑/etc/sysctl.conf文件,增加如下内容,并让配置立即生效。

        net.ipv4.ip_forward = 1

        net.ipv4.ip_nonlocal_bind = 1

        net.ipv4.conf.lo.arp_ignore = 1

        net.ipv4.conf.lo.arp_announce = 2

        net.ipv4.conf.all.arp_ignore = 1

        net.ipv4.conf.all.arp_announce = 2

        # sysctl -p

    2.4.2.4       准备keepalived配置文件,编辑/etc/keepalived/keepalived.conf

      redis01(Master) :

        vrrp_script chk_redis {

          script "/application/redis/bin/redis-cli -h 192.168.1.213 -p 6379 info | grep role:master >/dev/null 2>&1"

          interval 1

          timeout 3

          fall 3

          rise 1

        }

        vrrp_instance sentinel {

          state MASTER                                   # 表示本机为主

          interface eth0

          virtual_router_id 101

          priority 100                                # 值越大,优先级越高

          advert_int 1

          authentication {

          auth_type PASS

          auth_pass 1111

        }

        track_script {

          chk_redis

        }

    virtual_ipaddress {

    192.168.1.170                             # VIP,客户端访问配置该IP地址

    }

    }

    redis02(Backup) :

    vrrp_script chk_redis {

    script "/application/redis/bin/redis-cli -h 192.168.1.214 -p 6379 info | grep role:master >/dev/null 2>&1"

    interval 1

    timeout 3

    fall 3

    rise 1

    }

    vrrp_instance sentinel {

    state BACKUP                             # BACKUP角色

    interface eth0

    virtual_router_id 101

    priority 90                                  # BACKUP角色的优先级低

    nopreempt                                # BACKUP角色需要设置为非抢占模式

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    track_script {

    chk_redis

    }

    virtual_ipaddress {

    192.168.1.170

    }

    }

     

    redis03(Backup) :

    vrrp_script chk_redis {

    script "/application/redis/bin/redis-cli -h 192.168.1.214 -p 6379 info | grep role:master >/dev/null 2>&1"

    interval 1

    timeout 3

    fall 3

    rise 1

    }

    vrrp_instance sentinel {

    state BACKUP

    interface eth0

    virtual_router_id 101

    priority 80

    nopreempt

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    track_script {

    chk_redis

    }

    virtual_ipaddress {

    192.168.1.170

    }

    }

    2.4.2.5       keepalived配置文件简单说明

    • vrrp_instance,定义一个VRRP实例块,后面是实例名,可以自定义。每个VRRP实例可以认为是一个keepalived实例,在配置中VRRP实例可以有多个。
    • state MASTER/BACKUP,定义该实例的状态,是主还是备。这里只能有MASTER和BACKUP两种状态,需要大写。MASTER为主工作状态,BACKUP为备工作状态。
    • Interface,绑定的网卡,如果本机有多网卡,这里配置时一定要注意。
    • virtual_router_id ,虚拟路由ID 。每个VRRP实例的虚拟路由ID不能相同。但是主备两台机器上的同一实例的虚拟路由ID必须要一样。
    • priority,定义优先级,优先级高的在竞选中会被选为主。
    • nopreempt 设置为非抢占模式
    • advert_int,两个keepalived之间同步检查的时间间隔,单位:秒
    • authentication,心跳检查的验证方式
    • auth_type,密码类型,这里是明文的,后面的类型必须大写。
    • auth_pass,密文内容,生产中建议使用四位数字
    • virtual_ipaddres,配置VIP(virtual IP),keepalived的虚拟IP可以有多个。

    2.4.2.6       启动和停止keepalived

    # service keepalived start

    # service keepalived stop

    # service keepalived restart

    2.4.3   配置redis主从同步

    见本文档3.2 ,配置redis主从同步

    2.4.4   配置redis-sentinel

    2.4.4.1       从源码包中获得sentinel配置文件

    # cp /opt/install/redis-3.2.5/sentinel.conf  /application/redis/conf/sentinel.conf

    2.4.4.2       修改配置文件

    redis01(Master) :

    protected-mode no

    port 26379

    sentinel announce-ip 192.168.1.213

    sentinel monitor mymaster 192.168.1.213 6379 2

    sentinel down-after-milliseconds mymaster 30000

    sentinel parallel-syncs mymaster 1

    sentinel failover-timeout mymaster 180000

    redis02(Slave) :

    protected-mode no

    port 26379

    sentinel announce-ip 192.168.1.214

    sentinel monitor mymaster 192.168.1.213 6379 2

    sentinel down-after-milliseconds mymaster 30000

    sentinel parallel-syncs mymaster 1

    sentinel failover-timeout mymaster 180000

    redis03(Slave) :

    protected-mode no

    port 26379

    sentinel announce-ip 192.168.1.215

    sentinel monitor mymaster 192.168.1.213 6379 2

    sentinel down-after-milliseconds mymaster 30000

    sentinel parallel-syncs mymaster 1

    sentinel failover-timeout mymaster 180000

    2.4.4.3       配置说明

    • port 26379  sentinel默认通信端口
    • protected-mode no,默认是被注释的,开启保护模式。需要将这个配置项取消注释,否则不会执行failover自动故障转移。
    • sentinel announce-ip,定义本地IP
      • sentinel monitor  sentinel核心配置,语法为:

    sentinel monitor <master-name> <ip> <redis-port> <quorum>

    <master-name> : 自定义的名称,默认是mymaster,如果这里修改了,下面所有的配置都需要修改。

    IP:主库的IP

    redis-port : 主库的redis服务端口号

    quorum:表决最少数量,如果值是2,表示最少要有两个sentinel同意,才能判断一个服务器是失效的。

    • sentinel down-after-milliseconds 指定sentinel认定服务器已经失效所需的时间,单位毫秒。默认是30000秒。
    • parallel-syncs  指定了在执行故障转移时,最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长。
    • sentinel auth-pass <master-name> <password> 如果主库设置了密码,那么这里需要配置连接密码,而且必须所有的密码都设置成一样的。

    2.4.5   启动redis和redis-sentinel

    启动redis服务

    # /application/redis/bin/redis-server  /application/redis/conf/redis.conf

    启动redis-sentinel

    # /application/redis/bin/redis-sentinel       /application/redis/conf/sentinel.conf

    Sentinel默认是前台启动,如果要放在后台启动

    # /application/redis/bin/redis-sentinel       /application/redis/conf/sentinel.conf &

    2.4.6   特别注意

    • protected-mode 一定要设置为关闭;
    • sentinel配置文件会在第一次启动sentinel服务以后,自动修改;
    • sentinel配置不需要配置对从库的监测,它会自动通过主库去发现该master的所有从库,并添加到配置文件中;
    • 在多个从库的情况下,如果当前主库失效,sentinel通过一定的算法决定由谁来作为新的主库。
    • 确认失效有两种情况,一种是主观失效(sdown),一种是客观失效(odown)odown需要一定数量(就是我们配置的表决最少数量)的sentinel达成一致的意见才能认为一个master在客观上已经失效

    至此,基于redis + redis-sentinel + keepalived的高可用环境,配置完成。

    2.5 高可用环境验证

    2.5.1    验证redis主从同步状态

    1. 通过redis-cli客户端访问redis服务,使用info命令查看主从同步状态。

     

     

    1. 由于redis的从库是不可写的,可以在主库set几条数据,同时,使用redis-cli客户端访问从库,查看从库是否有同样的数据。如上图环境,我们在主库214上面,创建几条数据,同时,在213上面查看数据是否同步。

           

    根据上面的结果,可以判断结果正常,主从之间数据已经同步成功。

    2.5.2   验证keepalived配置是否正确

    在该环境中,keepalived的作用主要是提供VIP,让客户端可以访问。所以,主要验证VIP是否存在,并且VIP是在主库上面。

    注意,VIP不能通过ifconfig命令查看,只能使用ip add命令查看。

     

    2.5.3   验证自动故障转移

    人为的停止现在主库214的服务,然后观察sentinel自动转移情况。

    可以在214中使用DEBUG SEGFAULT,或者debug sleep 180让服务器暂停3分钟。都能模拟出主库失效。

     

    通过观察sentinel的输出,可以看出表决主库失效,到failover的过程。新主库是原来的从库215。可以登录到215进行查看。

     

    从上面的结果看出,原来的从库215,因为原主库214失效,成为了新的主库。数据也已经同步,关键还有一点,就是VIP是否已经成功漂移过来。

  • 相关阅读:
    采坑总结01
    Django设置联合唯一约束 -- migrate时报错处理
    Web前端开发资源整理
    kindEditor 使用
    Django模版语言自定义标签-实现前端 关联组合过滤查询
    django views视图函数返回值 return redirect httpresponse总结
    前端图片实现以瀑布流样式显示
    性能优化中CPU、内存、磁盘IO、网络性能的依赖(转)
    几种浏览器内核(百度百科)
    特殊格式文件(视频、声音等) 在数据库中的存储方式
  • 原文地址:https://www.cnblogs.com/zqingfeng/p/6429151.html
Copyright © 2020-2023  润新知