• Keepalived+Redis高可用部署


    1   Redis简介及安装

    Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案。

    Redis从它的许多竞争继承来的三个主要特点:

    Redis数据库完全在内存中,使用磁盘仅用于持久性。

    相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。

    Redis可以将数据复制到任意数量的从服务器。

    1.1 REDIS优势

    异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。

    支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。

    操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。

    多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

    1.2 REDIS安装

    在redis官网下载最新的源码包

    http://download.redis.io/releases/redis-2.8.3.tar.gz

    1. 解压

    # tar xzf redis-3.0.0.tar.gz

    1. 拷贝目录

    # mv redis-3.0.0 /usr/local/redis

    1. 进入目录

    # cd /usr/local/redis

    1. 编译

    # make && make install

    1. 查看命令运行结果,如果是0则是成功

    # echo $?

    1.3 REDIS启动

    # redis-server

    第一次启动时可能会有提示的warning信息;可以忽略,但最好是按照提示的处理办法修改。

    1.4 REDIS客户端启动

    # redis-cli

    1.5 验证客户端操作

    # redis> set iom dtsoft

    OK

    # redis> get iom

    “dtsoft”

    2   主从自动切换原理

    2.1 场景描述

    假设有两台服务器A,B,A为主节点,B为从节点,每台上都装有keepalived和redis,并且已为keepalived分配一个VIP,下面分两种情况讨论:

    B-redis挂掉

    VIP仍为A服务器占用,用户读写不受任何影响,B-keepalived检测到B-redis挂掉后自动关掉本身服务(其实也可以不关掉keepalived服务,此处是为了尽量保持和A-keepalived相同的配置);问题修复后,以从机配置文件启动B-redis,启动B-keepalived, A、B两节点回到初始状态。

    A-redis挂掉

    A-keepalived检测到A-redis挂掉后自动关掉本身服务,VIP被B服务器占用,B-redis设置为主节点;问题修复后,A-redis以从机配置文件重启并自动同步B-redis数据,同步完成后开启A-keepalived, VIP重回A 服务器,A-redis设置成主节点, B-redis设置为A-redis的从节点,A、B两节点回到初始状态

    2.1 切换要求

    1. A,B上的keepalived要能在本服务器上的redis挂掉后关掉本身服务。
    2. 不论A-redis还是B-redis,都是以从机配置文件重启(第一次安装,或两个服务都宕掉重启等特殊情况例外);
    3. A-reids必须在同步完成后才能开启keepalived;
    4. A-redis必须在本服务器获得VIP后,设置为主节点;
    5. 丢失VIP的服务器要将本机上的redis置为从节点(如果redis还没挂)。

    1,4,5可以用keepalived的配置脚本解决,2,3可以自己编写主从启动脚本控制。

    3   keepalived配置

    3.1 A-keepalived配置

    红字为手工加的备注,原文件里没有。

    vi /etc/keepalived/keepalived.cnf文件

    global_defs {

    router_id LVS_MASTER

    }

    vrrp_script monitor_redis {

    script “/etc/keepalived/script/redis_monitor.sh” –检查redis服务状态脚本;

    interval 3

    }

    vrrp_instance VI_1 {

    state MASTER

    interface eth0

    virtual_router_id 51

    priority 100

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    track_script {

    monitor_redis      –检查redis服务状态脚本;

    }

    virtual_ipaddress {

    192.168.10.251     #virtual server

    }

    notify_backup /etc/keepalived/script/redis_backup.sh –keepalived变为从节点(丢失VIP)后执行的脚本

    notify_master /etc/keepalived/script/redis_master.sh — keepalived变为主节点(获得VIP)后执行的脚本

    }

    3.2 B-keepalived配置

    vi /etc/keepalived/keepalived.cnf文件

    global_defs {

    router_id LVS_BACKUP

    }

    vrrp_script monitor_redis {

    script “/etc/keepalived/script/redis_monitor.sh” –检查redis服务状态脚本;

    interval 3

    }

    vrrp_instance VI_1 {

    state BACKUP

    interface eth0

    virtual_router_id 51

    priority 99

    advert_int 1

    authentication {

    auth_type PASS

    auth_pass 1111

    }

    track_script {

    monitor_redis      –检查redis服务状态脚本;

    }

    virtual_ipaddress {

    192.168.10.251     #virtual server

    }

    notify_backup /etc/keepalived/script/redis_backup.sh –keepalived变为从节点(丢失VIP)后执行的脚本

    notify_master /etc/keepalived/script/redis_master.sh — keepalived变为主节点(获得VIP)后执行的脚本

    }

    4   REDIS配置

    我们是根据keepalived自动切换VIP的原理来实现redis主从切换,每次切换,主从角色都会调换,因此两台两台机子上都要编写主从配置文件。

    4.1 编辑主节点配置文件

    # vim redis.conf

    daemonize yes                    –进程后台启动

    logfile /usr/local/redis/redis.log       –日志文件

    syslog-enabled no                –日志不写进系统日志

    dir /usr/local/redis/data      –数据文件存放

    requirepass system                      –认证密码

    slave-server-stale-data no               –同步未完成从机不能接收除slaveof和info之外的命令,相当重要

    4.2 编辑从节点配置文件

    # vim redis_slave.conf

    daemonize yes

    logfile /usr/local/redis/redis.log

    syslog-enabled no

    dir /usr/local/redis/data

    slaveof 192.168.10.3 6379           –主服务器的IP(两台机器不同)地址和端口

    masterauth system                       –主服务器上的认证密码

    slave-server-stale-data no               –同步未完成从机不能接收除slaveof和info之外的命令,相当重要

    5   编写脚本

    5.1 A服务器redis启动脚本:

    #!/bin/bash

    export CONFIGPATH=/usr/local/redis/redis_slave.conf

    export REDISPATH=/usr/local/redis/src

    export REDISPASS=system

    export result=123

    export RESULT=0

    export VIP=192.168.10.251

    export SLAVEIP=192.168.10.3

    killall -9 redis-server

    #scp $REDISPATH/flag xf7023@$SLAVEIP:$REDISPATH

    echo “start redis-server with $CONFIGPATH”

    nohup $REDISPATH/redis-server $CONFIGPATH  2>nohup.out

    until [ “$result” = “$RESULT” ]

    do

    export RESULT=`redis-cli -a $REDISPASS<<EOF

    get iom

    EOF`

    echo “RESULT=$RESULT,SYNC…, wait 10s…”

    sleep 10

    done

    killall -9 keepalived

    sleep 5

    echo “start keepalived”

    service keepalived start

    sleep 10

    echo “VIP get?”

    ip a|sed -n ‘/inet addr/p’|grep $VIP

    #until [ “$?” = “0” ]

    #do

    #ip a|sed -n ‘/inet/p’|grep $VIP

    #done

    if [ “$?” == “0” ];then

    echo $(ip a)

    fi

    echo “set slaveof master”

    redis-cli -a $REDISPASS <<EOF

    slaveof no one

    EOF

    exit 0

    5.2 redis_monitor.sh

    #/bin/bash

    export LOGFILE=/etc/keepalived/log/alive_state.log

    export ALIVE=$(/usr/local/redis/src/redis-cli -a system PING)

    echo “ALIVE=$ALIVE” >>$LOGFILE

    if [ “$ALIVE” = “PONG” ]; then

    echo $ALIVE

    exit 0

    else

    echo “killall -9 keepalived”>>$LOGFILE

    echo $ALIVE

    killall -9 keepalived

    exit 1

    fi

    5.3 redis_master.sh

    #!/bin/bash

    export REDISPATH=/usr/local/redis/src

    export REDISPASS=system

    export LOGFILE=”/etc/keepalived/log/alive_state.log”

    date >> $LOGFILE

    echo “set master ” >> $LOGFILE

    echo “run slaveof no one cmd …”

    $REDISPATH/redis-cli -a $REDISPASS slaveof no one

    5.4 redis_backup.sh

    #!/bin/bash

    export REDISPATH=/usr/local/redis/src

    export REDISPASS=system

    export REDISMASTER=”192.168.10.3 6379″   –redis主节点地址,A,B两服务器不同,注意区别

    export LOGFILE=”/etc/keepalived/log/alive_state.log”

    date >> $LOGFILE

    echo “set back up ” >> $LOGFILE

    echo “MASTER:$REDISMASTER”>>$LOGFILE

    echo “run slaveof cmd …”

    $REDISPATH/redis-cli -a $REDISPASS slaveof $REDISMASTER

    6   系统测试

    6.1.1   测试环境

    VIP:192.168.10.251

    A机器IP:192.168.10.2

    B机器IP:192.168.10.2

    客户机IP:192.168.10.1

    6.1.2   测试过程

    A机器启动redis和keepalived

    # redis-server redis.conf

    # service keepalived start

    B机器启动redis和keepalived

    # redis-server redis_slave.conf

    # service keepalived start

                测试客户机与A,B集群连接

    客户机运行redis客户端:

    # redis-cli –h 192.168.10.251 –p 6379

    redis:6379> auth system –第一次需要输入密码

    OK

    客户机上做些写(增,删,改)操作,看A-redis和B-redis是否数据同步。

                测试A-redis(主节点)挂掉后客户机业务

    关掉redis主机,查看A-keepalived是否自动停止

    # ps –ef|grep keep

    B机器是否获得VIP

    # ip a

    B-redis是否变为主机状态

    # info

    客户机上做些写(增,删,改)操作,看B-redis是否数据同步。

                测试A-redis重启后客户机业务

    用命令脚本启动A-redis主机

    # sh ./script/redis_start.sh

    查看A-redis是否将B-redis数据同步完全,分别在A,B redis运行

    # keys * 看数量是否相等

    查看A机器是否或得VIP

    # ip a

    查看A-redis是否变为主节点(keepalived获得VIP会执行命令,将A-redis变为主节点),登陆A-redis,运行命令

    # info

    查看B-redis是否变为从节点(keepalived丢失VIP会执行命令,将B-redis变为从节点),登陆B-redis,运行命令

    # info

    客户机连接redis客户端,测试业务是否正常

    # redis-cli –h 192.168.10.251 –p 6379

    6.1.3   测试注意

    • redis节点不能开启从节点只读模式,也就是slave-read-only要设置为 no。
    • 如果AB服务器keepalived都挂掉,VIP有可能长久固定在某个上面。
    • keepalived的配置文件里的脚本要注意执行权限,配置文件格式要完全正确,否则可能会无法绑定VIP。
    • A,B服务器各脚本里的变量要注意区别,尤其是IP。
    • A-redis挂掉后启动要用启动脚本,B-redis不需要。
  • 相关阅读:
    window.location.Reload()和window.location.href 区别
    PHP substr(),mb_substr()及mb_strcut的区别和用法
    jstree节点展开设置
    关于Jquery中ajax方法data参数用法
    HTML相对路径(Relative Path)和绝对路径(Absolute Path)
    Win32基础编程了解窗口类
    Visual C++ ActiveX 开发指南:第一章 什么是ActiveX
    分粥
    蛙蛙推荐:ASP实现自定义标签模板
    蛙蛙请教:如何利用委托实现多个方法同时调用.
  • 原文地址:https://www.cnblogs.com/grimm/p/5771051.html
Copyright © 2020-2023  润新知