@IT·互联网

Redis主从+keepalive实现高可用(不推荐)

2024-06-23  本文已影响0人  我可能是个假开发

一、安装Redis

1.安装依赖

yum install -y gcc tcl

2.将Redis压缩包解压到对应的目录

tar -zxvf redis-2.8.0.tar.gz
mv redis-2.8.0 /usr/local

3.编译

cd /usr/local/redis-2.8.0
make && make install

4.配置redis.conf

# 任意ip都可以访问
bind 0.0.0.0
# 关闭保护模式
# protected-mode no
# 让 Redis 服务器以守护进程的方式在后台持续运行
daemonize yes
# 日志文件(要手动创建这个文件)
logfile /usr/local/redis-2.8.0/log/redis.log
save 900 1
save 300 10
save 60 1000
# 启用 Redis 在执行 RDB 持久化操作时对生成的 RDB 文件进行压缩,以节省磁盘空间
rdbcompression yes

关闭防火墙:systemctl disable firewalld.service

5.启动

[root@localhost local]# cd redis-2.8.0/src
[root@localhost src]# ./redis-server ../redis.conf
[root@localhost src]# ps aux | grep redis
root      10190  0.0  0.3 140912  7384 ?        Ssl  13:38   0:00 ./redis-server 0.0.0.0:6379
root      10194  0.0  0.0 112812   972 pts/0    S+   13:38   0:00 grep --color=auto redis

这里我的redis版本很低,因为项目太老了,支持不了高版本

二、安装Keepalive

1.创建keepalived的配置文件/etc/keepalived/keepalived.conf

注意要修改网卡为自己的网卡(用ipconfi查看网卡)
keepalived.conf:

vim /etc/keepalived/keepalived.conf
! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id redis02 # 主机:redis01 从:redis02
}

vrrp_script chk_redis {
    script "/etc/keepalived/script/redis_check.sh"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP # 修改这里的角色 主的话是MASTER 从是BACKUP
    interface ens32 # 修改这里的网卡
    virtual_router_id 51
    priority 99
    advert_int 1

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        192.168.108.130 # 对外的虚拟ip
    }

    notify_master /etc/keepalived/script/redis_master.sh
    notify_backup /etc/keepalived/script/redis_backup.sh
    notify_fault  /etc/keepalived/script/redis_fault.sh
    notify_stop  /etc/keepalived/script/redis_stop.sh
}

2.解压安装包

tar xvf keepalived.tar 

3.安装

rpm -Uvh --force --nodeps keepalived/*.rpm

4.启动

[root@localhost etc]# systemctl start keepalived
[root@localhost etc]# systemctl status keepalived
● keepalived.service - LVS and VRRP High Availability Monitor
   Loaded: loaded (/usr/lib/systemd/system/keepalived.service; disabled; vendor preset: disabled)
   Active: active (running) since Sat 2024-06-22 13:58:55 CST; 6s ago
  Process: 10313 ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 10314 (keepalived)
   CGroup: /system.slice/keepalived.service
           ├─10314 /usr/sbin/keepalived -D
           ├─10315 /usr/sbin/keepalived -D
           └─10316 /usr/sbin/keepalived -D

Jun 22 13:58:55 localhost.localdomain Keepalived_vrrp[10316]: VRRP sockpool: [ifindex(2), proto(112), unicast(0), fd(10,11)]
Jun 22 13:58:59 localhost.localdomain Keepalived_vrrp[10316]: VRRP_Instance(VI_1) Transition to MASTER STATE
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: VRRP_Instance(VI_1) Entering MASTER STATE
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: VRRP_Instance(VI_1) setting protocol VIPs.
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: Sending gratuitous ARP on ens32 for 192.168.108.130
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: VRRP_Instance(VI_1) Sending/queueing gratuitous ARPs on ens32 for 192.168.108.130
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: Sending gratuitous ARP on ens32 for 192.168.108.130
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: Sending gratuitous ARP on ens32 for 192.168.108.130
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: Sending gratuitous ARP on ens32 for 192.168.108.130
Jun 22 13:59:00 localhost.localdomain Keepalived_vrrp[10316]: Sending gratuitous ARP on ens32 for 192.168.108.130

5.测试虚拟ip是否可用

[root@localhost keepalived]# ping 192.168.108.130
PING 192.168.108.130 (192.168.108.130) 56(84) bytes of data.
64 bytes from 192.168.108.130: icmp_seq=1 ttl=64 time=0.029 ms
64 bytes from 192.168.108.130: icmp_seq=2 ttl=64 time=0.081 ms
64 bytes from 192.168.108.130: icmp_seq=3 ttl=64 time=0.076 ms

三、Redis主从配置

在从的redis.conf中添加如下命令:

slaveof 192.168.108.131 6379
# 如果redis有密码(123456)的话:
masterauth 123456

重启Redis

防火墙关闭:systemctl stop firewalld.service

四、Keepalive高可用配置

1.master准备脚本:

/etc/keepalived/keepalived.conf:

! Configuration File for keepalived

global_defs {
   router_id redis01
   enable_script_security
}

vrrp_script chk_redis {
    script "/etc/keepalived/script/redis_check.sh"
    interval 2
}

vrrp_instance VI_1 {
    state MASTER
    interface ens32
    virtual_router_id 131
    priority 99
    advert_int 1

    track_script {
        chk_redis
    }

    virtual_ipaddress {
        192.168.108.130
    }

    notify_master /etc/keepalived/script/redis_master.sh
    notify_backup /etc/keepalived/script/redis_backup.sh
    notify_fault  /etc/keepalived/script/redis_fault.sh
    notify_stop  /etc/keepalived/script/redis_stop.sh
}

创建脚本文件夹:/etc/keepalived/script

redis_backup.sh: (slaveof ip需要改)

#!/bin/bash 

REDISCLI="/usr/local/redis-2.8.0/src/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"

echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >>$LOGFILE 2>&1

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色 
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.108.132 6379 >>$LOGFILE  2>&1

redis_check.sh:

#!/bin/bash 

ALIVE=`/usr/local/redis-2.8.0/src/redis-cli -a 123456 PING` 
if [ "$ALIVE" == "PONG" ];then
#echo "$(date): $ALIVE" >> /var/log/vrrp_script.log
echo $ALIVE 
exit 0 
else
#echo "$(date): $ALIVE" >> /var/log/vrrp_script.log
echo $ALIVE 
exit 1 
fi

redis_fault.sh

#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE

redis_master.sh

#!/bin/bash
REDISCLI="/usr/local/redis-2.8.0/src/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"

sleep 15
echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >>$LOGFILE 2>&1
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.108.132 6379 >>$LOGFILE  2>&1
if [ $? -ne 0 ];then
    echo "data rsync fail." >>$LOGFILE 2>&1
else
    echo "data rsync OK." >> $LOGFILE  2>&1
fi
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态 
echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
if [ $? -ne 0 ];then
    echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1
else
    echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILE  2>&1
fi

redis_stop.sh

#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

全部脚本:

[root@localhost script]# ls -l
total 20
-rw-r--r--. 1 root root 378 Jun 22 17:58 redis_backup.sh
-rw-r--r--. 1 root root 260 Jun 22 17:58 redis_check.sh
-rw-r--r--. 1 root root  87 Jun 22 17:59 redis_fault.sh
-rw-r--r--. 1 root root 724 Jun 22 17:59 redis_master.sh
-rw-r--r--. 1 root root 100 Jun 22 17:59 redis_stop.sh

2.slave准备脚本:

/etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {
   notification_email {
     root@localhost
   }
   notification_email_from root@localhost
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id redis02
   enable_script_security
}

vrrp_script chk_redis {
    script "/etc/keepalived/script/redis_check.sh"
    interval 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface ens32 # 修改这里的网卡
    virtual_router_id 131
    priority 99
    advert_int 1

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        192.168.108.130 # 对外的虚拟ip
    }

    notify_master /etc/keepalived/script/redis_master.sh
    notify_backup /etc/keepalived/script/redis_backup.sh
    notify_fault  /etc/keepalived/script/redis_fault.sh
    notify_stop  /etc/keepalived/script/redis_stop.sh
}

创建脚本文件夹:/etc/keepalived/script

redis_backup.sh: (slaveof ip需要改)

#!/bin/bash 
REDISCLI="/usr/local/redis-2.8.0/src/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"
 
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave...." >>$LOGFILE 2>&1

sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色 
echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.108.131 6379 >>$LOGFILE  2>&1

redis_check.sh:

#!/bin/bash 
ALIVE=`/usr/local/redis-2.8.0/src/redis-cli -a 123456 PING` 
if [ "$ALIVE" == "PONG" ]; then
echo $ALIVE 
exit 0 
else
echo $ALIVE 
exit 1 
fi

redis_fault.sh

#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[fault]" >> $LOGFILE
date >> $LOGFILE

redis_master.sh

#!/bin/bash 
REDISCLI="/usr/local/redis-2.8.0/src/redis-cli -a 123456"
LOGFILE="/var/log/keepalived-redis-state.log"

echo "[master]" >> $LOGFILE
date >> $LOGFILE
echo "Being master...." >>$LOGFILE 2>&1

echo "Run SLAVEOF cmd ...">> $LOGFILE
$REDISCLI SLAVEOF 192.168.108.131 6379 >>$LOGFILE  2>&1
sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态 
echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

redis_stop.sh

#!/bin/bash 
LOGFILE=/var/log/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE

3.给目录/etc/keepalived/授权:

cd /etc/keepalived/
chmod -R 777 script

重启keepalive

systemctl status keepalived
systemctl start keepalived
systemctl stop keepalived
上一篇 下一篇

猜你喜欢

热点阅读