阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis主从+KeepAlived实现高可用

171次阅读
没有评论

共计 9033 个字符,预计需要花费 23 分钟才能阅读完成。

Redis 是我们当下比较流行使用的非关系数据库,可支持多样化的数据类型,多线程高并发支持,redis 运行在内存拥有更快的读写。因为 redis 的表现如此出色,如何能保障 redis 在运行中能够应对宕机故障,

所以今天总结了下 redis 主从高可用的搭建,参考了网上一些大神的博客文章,发现很多都是有坑的,所以本人在此分享一次,希望能帮助到大家。

Redis 特点
Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库。

Redis 与其他 key – value 缓存产品有以下三个特点:

Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供如:字符串 (String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets) 等数据结构的存储。

Redis 支持数据的备份,即 master-slave 模式的数据备份。

Redis 优势
性能极高 – Redis 能读的速度是 100K+ 次 /s, 写的速度是 80K+ 次 /s。

丰富的数据类型 – Redis 支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。

原子 – Redis 的所有操作都是原子性的,同时 Redis 还支持对几个操作全并后的原子性执行。

丰富的特性 – Redis 还支持 publish/subscribe, 通知, key 过期等等特性。

准备环境
CentOS7 –> 172.16.81.140 –> 主 Redis –> 主 Keepalived

CentOS7 –> 172.16.81.141 –> 从 Redis –> 备 Keepalived

VIP –> 172.16.81.139

redis(一般 3.0 版本以上都行)

KeepAlived(直接在线安装的)

Redis 编译安装

1、提前准备好的 redis 软件放在 /opt 目录下:redis-4.0.6.tar.gz

cd /opt
tar -zxvf redis-4.0.6.tar.gz
mv redis-4.0.6 redis
cd redis
makeMALLOC=libc
make PREFIX=/usr/local/redis install

2、配置 redis 启动脚本

vim /etc/init.d/redis

#!/bin/sh

#chkconfig:2345 80 90
# Simple Redisinit.d script conceived to work on Linux systems
# as it doeSUSE of the /proc filesystem.

# 配置 redis 端口号
REDISPORT=6379
# 配置 redis 启动命令路径
EXE=/usr/local/redis/bin/redis-server
# 配置 redis 连接命令路径
CLIEXE=/usr/local/redis/bin/redis-cli
# 配置 redis 运行 PID 路径
PIDFILE=/var/run/redis_6379.pid
# 配置 redis 的配置文件路径
CONF=”/etc/redis/redis.conf”
# 配置 redis 的连接认证密码
REDISPASSWORD=123456

function start () {
        if [-f $PIDFILE]

        then

                echo “$PIDFILE exists,process is already running or crashed”

        else

                echo “Starting Redisserver…”

                $EXE $CONF &

        fi
}

function stop () {
        if [! -f $PIDFILE]

        then

                echo “$PIDFILE does not exist, process is not running”

        else

                PID=$(cat $PIDFILE)

                echo “Stopping …”

                $CLIEXE -p $REDISPORT -a $REDISPASSWORD shutdown

                while [-x /proc/${PID} ]

                do

                    echo “Waiting forRedis to shutdown …”

                    sleep 1

                done

                echo “Redis stopped”

        fi
}

function restart () {
        stop
       
        sleep 3
       
        start
}

case “$1” in
    start)
    start
    ;;
    stop)
    stop
    ;;
    restart)
    restart
    ;;
    *)
    echo -e “\e[31m Please use $0 [start|stop|restart] asfirst argument \e[0m”
    ;;
esac

授予执行权限:

chmod +x /etc/init.d/redis

添加开机启动:

chkconfig –add redis

chkconfig redis on

查看:chkconfig –list | grep redis

此次试验事先关闭了防火墙和 selinux,生产环境建议开启防火墙。

3、添加 redis 命令环境变量

#vi /etc/profile
# 添加下一行参数
exportPATH=”$PATH:/usr/local/redis/bin”
# 环境变量生效
source /etc/profile
4、启动 redis 服务

service redis start
# 检查启动情况

ps -ef | grep redis

Redis 主从 +KeepAlived 实现高可用

注:在我们两台服务器上先执行同样的操作安装完成 redis,接下来安装完成后,就直接进入配置主从环境。

Redis 主从配置

引申回到前面的设计模式,我们的思路是以 140 作为主,141 作为从,139 作为 VIP 飘逸地址,应用通过 139 的 6379 端口访问 redis 数据库。

正常运行下,当主节点 140 宕机后,VIP 飘逸到 141 上,这时 141 就会接管 140 成为主节点,140 就会成为从节点,继续提供读写操作。

 当 140 恢复正常后,这时 140 会与 141 进行一次数据同步,140 原有的数据不会丢失,还会同步宕机之间已经写入到 141 的数据,数据同步完成之后,

VIP 会因为权重的原因重新回到 140 节点上并成为主节点,141 会因为失去 VIP 会重新成为从节点,恢复到初始状态继续提供不间断的读写服务。

1、配置 redis 的配置文件

Master-140 配置文件

vim /etc/redis/redis.conf
    bind 0.0.0.0
    port 6379
    daemonize yes
    requirepass 123456
    slave-serve-stale-data yes
    slave-read-only no

Slave-141 配置文件

vim /etc/redis/redis.conf
    bind 0.0.0.0
    port 6379
    daemonize yes
    slaveof 172.16.81.140 6379
    masterauth 123456
    slave-serve-stale-data yes
    slave-read-only no

2、配置完成后重启 redis 服务!验证主从是否正常。

主节点 140 终端登录测试:

[root@localhost ~]# redis-cli -a 123456
127.0.0.1:6379> INFO
.
.
.
# Replication
role:master
connected_slaves:1
slave0:ip=172.16.81.141,port=6379,state=online,offset=105768,lag=1
master_replid:f83fcc3c98614d770f2205831fef1e877fa3f482
master_replid2:1f25604997a4ad3eb8344e8155990e78acd93312
master_repl_offset:105768
second_repl_offset:447
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:447
repl_backlog_histlen:105322

从节点 141 终端登录测试:

[root@localhost ~]# redis-cli -a 123456
127.0.0.1:6379> info
.
.
.
# Replication
role:slave
master_host:172.16.81.140
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_repl_offset:105992
slave_priority:100
slave_read_only:0
connected_slaves:0
master_replid:f83fcc3c98614d770f2205831fef1e877fa3f482
master_replid2:1f25604997a4ad3eb8344e8155990e78acd93312
master_repl_offset:105992
second_repl_offset:447
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:239
repl_backlog_histlen:105754
3、同步测试

主节点 140

Redis 主从 +KeepAlived 实现高可用

从节点 141

Redis 主从 +KeepAlived 实现高可用

到此 redis 的主从已经完成!

KeepAlived 配置实现双机热备

使用 Keepalived 实现 VIP,并且通过 notify_master、notify_backup、notify_fault、notify_stop 来实现容灾。

1、配置 Keepalived 配置文件

主 Keepalived 配置文件

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

global_defs {
  notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
  }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id redis01
}

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

vrrp_instance VI_1 {
    state MASTER
    interface eno16777984
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        172.16.81.139
    }
   
    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
}

备用 Keepalived 配置文件

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

global_defs {
  notification_email {
    acassen@firewall.loc
    failover@firewall.loc
    sysadmin@firewall.loc
  }
  notification_email_from Alexandre.Cassen@firewall.loc
  smtp_server 192.168.200.1
  smtp_connect_timeout 30
  router_id redis02
}

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

vrrp_instance VI_1 {
    state BACKUP
    interface eno16777984
    virtual_router_id 51
    priority 99
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }

    track_script {
        chk_redis
    }
    virtual_ipaddress {
        172.16.81.139
    }
   
    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、配置脚本

Master KeepAlived — 140

创建存放脚本目录:mkdir -p /etc/keepalived/script/

cd /etc/keepalived/script/

[root@localhost script]# cat redis_check.sh
#!/bin/bash

ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING`

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

echo $ALIVE

exit 0

else

echo $ALIVE

exit 1

fi

[root@localhost script]# cat redis_master.sh
#!/bin/bash
REDISCLI=”/usr/local/redis/bin/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 172.16.81.141 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

[root@localhost script]# cat redis_backup.sh
#!/bin/bash

REDISCLI=”/usr/local/redis/bin/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 172.16.81.141 6379 >>$LOGFILE  2>&1

[root@localhost script]# cat redis_fault.sh
#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo “[fault]” >> $LOGFILE

date >> $LOGFILE

[root@localhost script]# cat redis_stop.sh
#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo “[stop]” >> $LOGFILE

date >> $LOGFILE

Slave KeepAlived — 141
创建存放脚本目录:mkdir -p /etc/keepalived/script/

cd /etc/keepalived/script/

[root@localhost script]# cat redis_check.sh
#!/bin/bash

ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING`

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

echo $ALIVE

exit 0

else

echo $ALIVE

exit 1

fi

[root@localhost script]# cat redis_master.sh
#!/bin/bash

REDISCLI=”/usr/local/redis/bin/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 172.16.81.140 6379 >>$LOGFILE  2>&1

sleep 10 #延迟 10 秒以后待数据同步完成后再取消同步状态

 

echo “Run SLAVEOF NO ONE cmd …”>> $LOGFILE

$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1

[root@localhost script]# cat redis_backup.sh
#!/bin/bash

REDISCLI=”/usr/local/redis/bin/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 172.16.81.140 6379 >>$LOGFILE  2>&1

[root@localhost script]# cat redis_fault.sh
#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo “[fault]” >> $LOGFILE

date >> $LOGFILE

[root@localhost script]# cat redis_stop.sh
#!/bin/bash

LOGFILE=/var/log/keepalived-redis-state.log

echo “[stop]” >> $LOGFILE

date >> $LOGFILE
3、启动服务

systemctl start keepalived

systemctl enable keepalived

4、测试服务是否正常

ps -ef | grep keepalived

Redis 主从 +KeepAlived 实现高可用

ping 172.16.81.139

Redis 主从 +KeepAlived 实现高可用

查看 VIP 地址

Redis 主从 +KeepAlived 实现高可用

测试连接 redis 是否正常

redis-cli -h 172.16.81.139 -p 6379 -a 123456

Redis 主从 +KeepAlived 实现高可用

Keepalived 测试完成!!

测试故障转移情况
关闭主 redis 服务,查看从 redis 是否会接管 VIP 变成主?然后再新的主 redis141 上插入数据,测试当 140 恢复,数据是否存在?141 的是否会变成从节点?

1、主 140 关闭 redis

service redis stop

2、查看 141 状态

测试 VIP 连接远程连接

Redis 主从 +KeepAlived 实现高可用

 通过 INFO 可以查看状态信息

Redis 主从 +KeepAlived 实现高可用

可以看到从节点的 141 已经变成 master 节点了。

3、插入数据

Redis 主从 +KeepAlived 实现高可用

4、开启 140 主节点

service redis start

5、查看 140 和 141 的主从状态

141 的状态,变回了从

Redis 主从 +KeepAlived 实现高可用

140 的状态,变回了主

Redis 主从 +KeepAlived 实现高可用

我们在 140 上查看刚刚在 141 上插入的新数据

Redis 主从 +KeepAlived 实现高可用

数据存在,证明主从切换是正常的!!!

上面是本人亲测过的,如有问题请留言!!!

本文永久更新链接地址:https://www.linuxidc.com/Linux/2018-03/151377.htm

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计9033字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中