Redis 简介:
Redis 是一个开源的使用 ANSI C 语言编写, 支持网络, 可基于内存亦可持久化的日志型, Key-Value 数据库, 并提供多种语言的 API. 从 2010 年 3 月 15 日起, Redis 的开发工作由 VMware 主持.
redis 是一个 key-value 存储系统. 和 Memcached 类似, 它支持存储的 value 类型相对更多, 包括 string(字符串),list(链表),set(集合),zset(sorted set - 有序集合) 和 hash(哈希类型). 这些数据类型都支持 push/pop,add/remove 及取交集并集和差集及更丰富的操作, 而且这些操作都是原子性的. 在此基础上, redis 支持各种不同方式的排序. 与 memcached 一样, 为了保证效率, 数据都是缓存在内存中. 区别的是 redis 会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件, 并且在此基础上实现了 master-slave(主从) 同步.
keepalived 简介:
??Keepalived 软件主要是通过 VRRP 协议实现高可用功能的. VRRP 是 Virtual Router RedundancyProtocol(虚拟路由器冗余协议) 的缩写, VRRP 出现的目的就是为了解决静态路由单点故障问题的, 它能够保证当个别节点宕机时, 整个网络可以不间断地运行.
基本步骤:
1.keepalived+redis 高可用 redis 主从解决方案
2. 两台测试主机安装 redis 服务
3. 在 Master redis 和 Slave redis 上安装 Keepalived
4. 在 Master redis 和 Slave redis 上创建配置文件
5. 在 Master redis 和 Slave redis 上创建各自所需的监控脚本
6. 测试 redis 配置文件和监控脚本是否正常
一: keepalived+redis 高可用 redis 主从解决方案
环境介绍:
- Master: 192.168.1.10
- Slave: 192.168.1.17
- Virtural IP Address (VIP): 192.168.1.13
设计思路:
当 Master 与 Slave 均运作正常时, Master 负责服务, Slave 负责 Standby;
当 Master 挂掉, Slave 正常时, Slave 接管服务, 同时关闭主从复制功能;
当 Master 恢复正常, 则从 Slave 同步数据, 同步数据之后关闭主从复制功能, 恢复 Master 身份, 于此同时 Slave 等待 Master 同步数据完成之后, 恢复 Slave 身份.
然后依次循环.
需要注意的是, 这样做需要在 Master 与 Slave 上都开启本地化策略, 否则在互相自动切换的过程中, 未开启本地化的一方会将另一方的数据清空, 造成数据完全丢失.
二: 两台测试主机安装 redis 服务
1. 下载 redis 安装包及安装
- mkdir -p /home/ywxi/tools/
- cd /home/ywxi/tools/
- wget http://download.redis.io/releases/redis-3.2.0.tar.gz
- tar -xf redis-3.2.0.tar.gz
- cd redis-3.2.0
- make
- echo $?
2. 添加相关文件及服务命令
- mkdir /usr/local/redis/bin/ -p
- cd src/
- cp redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /usr/local/redis/bin/
- cd ../
- cp redis.conf /etc/
3. 添加启动脚本
以下是个完整的脚本, 拷贝即可用 (注: 也可以自己用 shell 写, 判断方法很多)
- echo '#chkconfig: 2345 10 90
- #description: Start and Stop redis
- REDISPORT=6379
- EXEC=/usr/local/redis/bin/redis-server
- REDIS_CLI=/usr/local/redis/bin/redis-cli
- PIDFILE=/var/run/redis.pid
- CONF="/etc/redis.conf"
- case "$1" in
- start)
- if [ -f $PIDFILE ]
- then
- echo "$PIDFILE exists, process is already running or crashed"
- else
- echo "Starting Redis server..."
- $EXEC $CONF
- fi
- if [ "$?"="0" ]
- then
- echo "Redis is running..."
- fi
- ;;
- stop)
- if [ ! -f $PIDFILE ]
- then
- echo "$PIDFILE does not exist, process is not running"
- else
- PID=$(cat $PIDFILE)
- echo "Stopping ..."
- $REDIS_CLI -p $REDISPORT SHUTDOWN
- while [ -x ${PIDFILE} ]
- do
- echo "Waiting for Redis to shutdown ..."
- sleep 1
- done
- echo "Redis stopped"
- fi
- ;;
- restart|force-reload)
- ${0} stop
- ${0} start
- ;;
- *)
- echo "Usage: /etc/init.d/redis {start|stop|restart|force-reload}" >&2
- exit 1
- esac
- ' > /etc/init.d/redis
4. 服务开机自启以及创建 redis 状态日志
- chmod +x /etc/init.d/redis
- chkconfig --add redis
- chkconfig redis on
- chkconfig --list| grep redis
- mkdir /var/log/redis/ -p
- touch /var/log/redis/redis.log
三: 在 Master redis 和 Slave redis 上安装 Keepalived
1. 获取安装包并安装
- cd /home/ywxi/tools
- wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
- tar zxf keepalived-1.2.20.tar.gz
- cd keepalived-1.2.20
- yum -y install openssl openssl-devel
- ./configure && make && make install
- echo $?
2. 配置文件添加及配置 (很重要, 服务启动需要这些文件)
- mkdir /etc/keepalived
- mkdir /usr/local/keepalived/scripts/ -p
- cp /usr/local/etc/keepalived/keepalived.conf /etc/keepalived/
- cp /usr/local/etc/rc.d/init.d/keepalived /etc/init.d/
- cp /usr/local/sbin/keepalived /usr/sbin
- cp /usr/local/etc/sysconfig/keepalived /etc/sysconfig/
3. 添加开机启动
- chmod +x /etc/init.d/keepalived
- chkconfig --add keepalived
- chkconfig keepalived on
四: 在 Master redis 和 Slave redis 上创建配置文件
1)Master redis 上创建配置文件
- cd /etc/keepalived/
- cp keepalived.conf keepalived.conf.bnk
- echo '! Configuration File for keepalived
- global_defs {
- notification_email{
- 1031664140-@qq.com
- }
- router_id redis140
- }
- vrrp_script chk_redis
- {
- script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379"
- interval 2
- timeout 2
- fall 3
- }
- vrrp_instance redis {
- state MASTER # master set to SLAVE also
- interface eth0
- lvs_sync_daemon_interface eth0
- virtual_router_id 202
- priority 150
- nopreempt # no seize,must add
- advert_int 1
- authentication { #all node must same
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.186.143
- }
- track_script {
- chk_redis
- }
- notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.186.141 6379"
- notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.186.141 6379"
- notify_fault /usr/local/keepalived/scripts/redis_fault.sh
- notify_stop /usr/local/keepalived/scripts/redis_stop.sh
- }' > /etc/keepalived/keepalived.conf
2)Slave redis 上创建配置文件
- cd /etc/keepalived/
- cp keepalived.conf keepalived.conf.bnk
- echo'! Configuration File for keepalived
- global_defs {
- notification_email{
- 1031664140-@qq.com
- }
- router_id redis141
- }
- vrrp_script chk_redis
- {
- script "/usr/local/keepalived/scripts/redis_check.sh 127.0.0.1 6379" #监控脚本
- interval 2
- timeout 2
- fall 3
- }
- vrrp_instance redis {
- state BACKUP
- interface eth0
- lvs_sync_daemon_interface eth0
- virtual_router_id 202
- priority 100
- nopreempt # no seize,must add
- advert_int 1
- authentication { #all node must same
- auth_type PASS
- auth_pass 1111
- }
- virtual_ipaddress {
- 192.168.186.143
- }
- track_script {
- chk_redis
- }
- notify_master "/usr/local/keepalived/scripts/redis_master.sh 127.0.0.1 192.168.186.140 6379"
- notify_backup "/usr/local/keepalived/scripts/redis_backup.sh 127.0.0.1 192.168.1.140 6379"
- notify_fault /usr/local/keepalived/scripts/redis_fault.sh
- notify_stop /usr/local/keepalived/scripts/redis_stop.sh
- }' >/etc/keepalived/keepalived.conf
五: 在 Master redis 和 Slave redis 上创建各自所需的监控脚本
1). 配置 master 脚本文件 (可从线上拷贝再做修改)
脚本目录 /usr/local/keepalived/scripts
以下用于监控 Redis 的脚本:
- mkdir -p /usr/local/keepalived/scripts
- cd /usr/local/keepalived/scripts
- echo '#!/bin/bash
- ALIVE=`/usr/local/redis/bin/redis-cli -h $1 -p $2 PING`
- LOGFILE="/var/log/keepalived-redis-check.log"
- echo "[CHECK]" >> $LOGFILE
- date >> $LOGFILE
- if [ $ALIVE == "PONG" ]; then :
- echo "Success: redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1
- exit 0
- else
- echo "Failed:redis-cli -h $1 -p $2 PING $ALIVE" >> $LOGFILE 2>&1
- exit 1
- fi' >/usr/local/keepalived/scripts/redis_check.sh
以下负责运作的关键脚本:
- notify_master /usr/local/keepalived/scripts/redis_master.sh
- notify_backup /usr/local/keepalived/scripts/redis_backup.sh
- notify_fault /usr/local/keepalived/scripts/redis_fault.sh
- notify_stop /usr/local/keepalived/scripts/redis_stop.sh
工作原理:
因为 Keepalived 在转换状态时会依照状态来呼叫:
当进入 Master 状态时会呼叫 notify_master
当进入 Backup 状态时会呼叫 notify_backup
当发现异常情况时进入 Fault 状态呼叫 notify_fault
当 Keepalived 程序终止时则呼叫 notify_stop
2) 首先, 在 Redis Master 上创建 notity_master 与 notify_backup 脚本:
注: Redis Slave 上创建 notity_master 与 notify_backup 脚本, 与 master 一致
- [root@www scripts]# vim redis_master.sh
- #!/bin/bash
- REDISCLI="/usr/local/redis/bin/redis-cli -h $1 -p $3"
- 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 $2 $3 >> $LOGFILE 2>&1
- #echo "SLAVEOF $2 cmd can't excute ... " >> $LOGFILE
- sleep 10 #延迟 10 秒以后待数据同步完成后再取消同步状态
- echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
notify_backup 脚本:
- [root@www scripts]# vim redis_backup.sh
- #!/bin/bash
- REDISCLI="/usr/local/redis/bin/redis-cli"
- LOGFILE="/var/log/keepalived-redis-state.log"
- echo "[BACKUP]" >> $LOGFILE
- date >> $LOGFILE
- echo "Being slave...." >> $LOGFILE 2>&1
- echo "Run SLAVEOF cmd ..." >> $LOGFILE 2>&1
$REDISCLI SLAVEOF $2 $3 >> $LOGFILE
- sleep 100 #延迟 100 秒以后待数据同步完成后再取消同步状态
- exit(0)
3)Master 额外还要创建两个脚本 redis_fault.sh 和 redis_stop.sh
- [root@www scripts]# vim redis_fault.sh
- #!/bin/bash
- LOGFILE="/var/log/keepalived-redis-state.log"
- echo "[fault]" >> $LOGFILE
- date >> $LOGFILE
- [root@www scripts]# vim redis_stop.sh
- #!/bin/bash
- LOGFILE="/var/log/keepalived-redis-state.log"
- echo "[stop]" >> $LOGFILE
- date >> $LOGFILE
主从记得加上脚本权限:
chmod +x /usr/local/keepalived/scripts/*.sh
设置环境变量:
- echo 'export PATH=$PATH:/usr/local/redis/bin'>> /root/.bash_profile
- source /root/.bash_profile
启动服务:
- /etc/init.d/keepalived restart
- /etc/init.d/redis restart
六: 测试 redis 配置文件和监控脚本是否正常
1. 启动主从的 keepalived 和 redis 服务
检查
/etc/init.d/keepalived restart
redis-server & redis 启动方式特殊, 加 & 放在后台运行
- netstat -tnlp | grep redis
- ps -ef | grep keepalived
ps -ef | grep redis | awk '{print $2}' |xargs kill -9 杀 redis 进程
redis-server /etc/redis.conf &
2. 尝试通过 VIP 连接 Redis:
- redis-cli -h 192.168.1.10
- redis-cli -h 192.168.1.17
- redis-cli -h 192.168.1.13
192.168.1.13:6379> 这是进入正确提示
3. 尝试插入一些数据:
- redis-cli -h 192.168.1.13 SET Hello Redis
- OK
从 VIP 读取数据
- redis-cli -h 192.168.1.13 GET Hello
- "Redis"
从 Master 读取数据
- redis-cli -h 192.168.1.10 GET Hello
- "Redis"
从 Slave 读取数据
- redis-cli -h 192.168.1.17 GET Hello
- "Redis"
4. 模拟故障发生: 看 keepalived 是否正常切换
将 Master 上的 Redis 进程杀死:
killall -9 redis-server
查看 Master 上的 Keepalived 日志
tailf /var/log/keepalived-redis-state.log
同时 Slave 上的日志显示:
tailf /var/log/keepalived-redis-state.log
然后我们可以发现, Slave 已经接管服务, 并且担任 Master 的角色了.
- redis-cli -h 192.168.1.13 INFO
- redis-cli -h 192.168.1.17 INFO
- role:master
然后我们恢复 Master 的 Redis 进程
/etc/init.d/redis start
查看 Master 上的 Keepalived 日志
tailf /var/log/keepalived-redis-state.log
同时 Slave 上的日志显示:
tailf /var/log/keepalived-redis-state.log
来源: http://www.bubuko.com/infodetail-2632875.html