一、安装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












网友评论