zoukankan      html  css  js  c++  java
  • Redis5.0+哨兵模式+Keepalived实现高可用

    Redis主备配置

    原理:

    从服务器向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,主服务器将执行的写指令都缓存到内存中。

    在BGSVAE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个动作完成之后,主服务器会将这段时间缓存的写指令再以redis协议的格式发给从服务器。

    1.redis安装

    $ tar xf redis-5.0.3.tar.gz 
    $ mv redis-5.0.3 redis
    $ yum -y install gcc gcc-c++ jemalloc-devel
    $ cd redis
    $ make 
    

      

    2.配置主从

    $ cp redis.conf redis_7000.conf
    $ vim redis_7000.conf
        port 7000
        pidfile /var/run/redis_7000.pid
        logfile /var/log/7000.log
        dir ./7000
    ​
        # replicaof <masterip> <masterport>:主服务这句话注释,从服务配置的需要开启。配置主服务的ip的port。 
    ​
        # 主端的密码
        masterauth  
        # 客户端访问密码
        requirepass 

    3.配置哨兵模式

    $ vim sentinel.conf 
        daemonize yes
        logfile /var/log/redis-sentinel.log
        # 多少毫秒没有接收到主节点的反馈,认为主节点down
        sentinel down-after-milliseconds mymaster 60000
        # 哨兵监控主节点的IP和端口   1表示至少一个节点认为主节点down了,才开始选举新节点
        sentinel monitor mymaster 127.0.0.1 7000 1
        # failover过期时间
        sentinel failover-timeout mymaster 30000
        # 配置哨兵连接主节点的认证密码。(主节点配置的requirepass)
        sentinel auth-pass mymaster ypmdd21312@#asdhjs@#!
    

      

    如果Master宕机切换到Slave上,直接向slave写数据,之后将slave的角色切换成Master,原来的master重新加入到主从中,成为slave,对数据不会有影响。

     

    Redis启动的一些警告

    # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
    

      

    警告:过量使用内存设置为0!在低内存环境下,后台保存可能失败。

    $ vim /etc/sysctl.conf
        vm.overcommit_memory = 1
    $ sysctl -p
    

      

    4.检测

    查看master或者slave状态

    $ redis-cli -a 密码 (没有密码则忽略-a)
    $ INFO REPLICATION

    查看哨兵状态

    cat /var/log/redis-sentinel.log 

    keepalived

    1.安装keepalived服务

    $ yum -y install keepalived

    2.配置keepalived

    $ vim /etc/keepalived/keepalived.conf 
    global_defs {
       router_id redis1
    }
    ​
    vrrp_instance VI_1 {
        state BACKUP
        nopreempt
        interface eth0
        virtual_router_id 51
        priority 100
        # 本机ip地址
        unicast_src_ip 10.13.2.230
        # 对端ip地址,必须写成三行的形式
        unicast_peer {
            10.13.14.196
        }
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        virtual_ipaddress {
            10.13.171.98                #HAVIP
        }
    }
    ​
    virtual_server 10.13.171.98 6379 {
        delay_loop 3
        lb_algo rr
        lb_kind DR
        persistence_timeout 50
        protocol TCP
    ​
        real_server 10.13.2.230 6379 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
            }
        }
        real_server 10.13.14.196 6379 {
            weight 1
            TCP_CHECK {
                connect_timeout 3
            }
        }
    }

    3.启动服务

    $ systemctl start keepalived
    4.测试
    $ ip a
    5.配置脚本
    $ vim /etc/keepalived/keepalived.conf
    ···
        vrrp_script check_redis {
            script "/etc/keepalived/check_redis.sh"
            interval 3
        }
    ···
        vrrp_instance VI_1 {
            track_script {
                check_redis
            }
        }
    $ vim /etc/keepalived/check_redis.sh
        #/bin/bash
        port=`ss -antp | grep 7000 | grep LISTEN | wc -l `
        if [ $port -eq 0 ];then
                systemctl stop keepalived
        fi

    云上布置Keepalived的问题

    # 本机ip地址 
    unicast_src_ip 10.13.2.230
    # 对端ip地址,必须写成三行的形式
    unicast_peer {
        10.13.14.196
    }

    路由交换层禁用了ARP的广播限制,造成keepalived主备无法通z过vrrp协议广播的方式进行通讯,造成了两端都会产生HAVIP。必须配置指定IP的两台服务器间进行通讯。

    telnet+端口不成功

    ping端口没有问题,但是telnet VIP + 服务端口会偶尔出现问题,telnet VIP +其他端口 没有问题。

    virtual_server 10.13.171.98 6379 {
        delay_loop 3
        #lb_algo rr
        #lb_kind DR
        persistence_timeout 50
        protocol TCP
    

      

    因为用不到LVS的调度算法lb_algo和转发方式lb_kind,这两个会影响到telnet VIP+配置的端口。

    原因:

    因为如果采用了lvs的转发方式的话,以DR模式为例,直接将请求转发给了后端的真实服务器,但是目的ip为vip,后端的服务器上没有vip,所以导致请求无法响应。偶尔可以成功是因为rr正好轮训到了主节点上。

  • 相关阅读:
    Asp.net mvc项目分页功能
    asp.net mvc邮箱激活
    4. Spring 如何通过 XML 文件配置Bean,以及如何获取Bean
    3. Spring 核心之 IOC(控制反转) & DI(依赖注入)
    2. Spring 的 HelloWorld
    1. Spring 简介以及关于 Eclipse 的 Spring Tool Suite 插件安装
    早睡早起身体好,早睡早起有力量,晚安~~
    睡前写几句,缓解一下刷题的心情。。。
    ACM 杭电HDU 2084 数塔 [解题报告]
    ACM HDU 2041--超级楼梯题解
  • 原文地址:https://www.cnblogs.com/xll970105/p/10272812.html
Copyright © 2011-2022 走看看