分布式

redis主从复制+keepalived的高可用配置

字号+ 作者:风潇潇 来源:原创 2016-01-03 11:16 我要评论( )

redis的主从复制+keepalived高可用,不论是服务器挂掉还是redis进程挂掉,都会触发vip漂移哦

Redis Replication工作原理:
1):Slave启动后,无论是第一次连接还是重连到Master,它都会主动发出一个SYNC命令
2):当Master收到SYNC命令之后,将会执行BGSAVE(后台存盘进程),即在后台保存数据到磁盘(rdb快照文件),同时收集所有新收到的写入和修改数据集的命令存入缓冲区(非查询类)
3):Master在后台把数据保存到快照文件完成后,会传送整个数据库文件到Slave
4):Slave接收到数据库文件后,会把内存清空,然后加载该文件到内存中以完成一次完全同步
5):然后Master会把之前收集到缓冲区中的命令和新的修改命令依次传送给Slave
6):Slave接受到之后在本地执行这些数据修改命令,从而达到最终的数据同步
7):之后Master与Slave之间将会不断的通过异步方式进行命令的同步,从而保证数据的时时同步
8):如果Master和Slave之间的链接出现断连,Slave可以自动重连Master。根据版本的不同,断连后同步的方式也不同:
 2.8之前:重连成功之后,一次全量同步操作将被自动执行
 2.8之后:重连成功之后,进行部分同步操作
 
部分同步:
从2.8开始,当Master和Slave之间的连接断开重连后,他们之间可以采用持续复制处理方式替代完全重同步操作。部分重同步会用到PSYNC的命令,2.8之后的版本才有此命令,之前的只有SYNC命令。只要Slave是2.8或以上的版本,Slave就会根据Master的版本来决定到底是使用PSYNC还是SYNC

部分同步工作原理如下:
1):Master为被发送的复制流创建一个内存缓冲区(in-memory backlog),记录最近发送的复制流命令
2):Master和Slave之间都记录一个复制偏移量(replication offset)和当前Master ID(Master run id)
3):当出现网络断开,Slave会重新连接,并且向Master请求继续执行原来的复制进程
4):如果Slave中断网前的MasterID和当前要连的MasterID相同,并且从断开时到当前时刻Slave记录的偏移量所指定的数据仍然保存在Master的复制流缓冲区里面,则Master会向Slave发送缺失的那部分数据,Slave执行后复制工作可以继续执行
5):否则Slave就执行完整重同步操作
 
redis持久化:
RDB方式:
优点:单一紧凑的文件,便于备份适用于容灾,传送方便,恢复快并且最大化redis性能
缺点:只能恢复到最近一次快照保存地点,如果数据量非常大的话保存工作是比较耗时的工作
AOF(Append-only file,AOF)方式:
              优点:实时性高,可以使用不同的策略来提高实时性。如果fsync设置为1s,最多丢失1s的数据。当后台AOF 文件过大Redis会重写AOF文件。方式为写一个新的文件,然后使用新的文件代替旧的文件,过程中还会追加到旧文件去,所以就算redis挂掉也安全
缺点:体积比RDB大,使用fsync策略会慢于RDB
策略:立即写入、每1s写入、交给操作系统
如果AOF文件损坏:redis-check-aof --fix <filename> 可以使用这个来修复
在操作的时候要记得备份
连接处理:命令会被顺序处理,默认最大连接数:10000。注意这个连接数还会被操作系统的所能打开的最大文件描述符给限制。一个socket最大缓冲区也有限制,注意是一个socket,因此各种客户端,包括slave端也受影响。客户端连接也可以设置超时,默认是不超时的
 
1keepalived+redis 主从复制+双机热备配置
主(192.168.40.130) 和 从(192.168.40.131) :修改 redis.conf
      daemonize yes #以守护方式进行
      dbfilename redis_db.rdb
 #配置Redis数据库的快照
       save 900 3 #900s保存3次
       save 300 1 #300s 保存1次
从库((192.168.40.131)redis.conf
       slaveof  192.168.40.130  6379
并且一定要记得关掉两服务器的的防火墙(centos7):
       systemctl stop firewalld
分别启动redis
       src/redis-server redis.conf
可以根据
主从就配置好了,这样只能实验用,生产环境需要根据自己的项目调优
关掉redis :  src/redis-cli SHUTDOWN
将redis的backup转成master:src/redis-cli SLAVEOF NO ONE
将redis的实例转为另一个的slave:src/redis-cli SLAVEOF 192.168.40.130 6379
192.168.40.130 keepalived 配置
! Configuration File for keepalived
global_defs {
   notification_email {
     xh199110@163.com
   }
   notification_email_from xh199110@163.com
   smtp_server localhost #邮件服务器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_script chk_redis {
     script "/home/script_master/redis_check.sh"
     interval 2
     weight -20
 }
 
vrrp_instance VI_1 {
    state BACKUP
    nopreempt
    interface eno16777736
    virtual_router_id 51
    priority 100  #优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
       192.168.40.200 #vip
    }
  track_script {
    chk_redis
   }
    notify_master /home/script_master/redis_master.sh
    notify_backup /home/script_master/redis_backup.sh
    notify_fault /home/script_master/redis_fault.sh
}
主服务器redis脚本
redis_check.sh
#!/bin/bash
ALIVE=`/home/redis305/src/redis-cli PING`
if [ "$ALIVE" == "PONG" ]; then
echo 0
exit 0
else
echo $ALIVE
exit 1
fi
notify_master
#!/bin/bash
REDISCLI="/home/redis305/src/redis-cli"
LOGFILE="/home/work/redis/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being master." >> $LOGFILE 2>&1
echo "Run SLAVEOF NO ONE …" >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
Notify_backup
#!/bin/bash
REDISCLI="/home/redis305/src/redis-cli"
LOGFILE="/home/work/redis/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave…." >> $LOGFILE 2>&1
sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
echo "Run SLAVEOF 192.168.40.131 6379 …" >> $LOGFILE
$REDISCLI SLAVEOF 192.168.40.131 6379 >> $LOGFILE 2>&1
notify_fault.sh
#!/bin/bash
LOGFILE="/home/redis/keepalived-redis-state.log"
echo "[fault] keepalived fault" >> $LOGFILE
date >> $LOGFILE
 
现在配置从服务器
10.211.21.59 keepalived 配置
! Configuration File for keepalived
global_defs {
   notification_email {
     xh199110@163.com
   }
   notification_email_from xh199110@163.com
   smtp_server localhost #邮件服务器
   smtp_connect_timeout 30
   router_id LVS_DEVEL
}
 
vrrp_script chk_redis {
     script "/home/script_backup/redis_check.sh"
     interval 2
     weight -20
 }
 
vrrp_instance VI_1 {
    state BACKUP
#   nopreempt
    interface eno16777736
    virtual_router_id 51
    priority 90  #优先级
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
       192.168.40.200 #vip
    }
  track_script {
    chk_redis
   }
    notify_master /home/script_backup/redis_master.sh
    notify_backup /home/script_backup/redis_backup.sh
    notify_fault /home/script_backup/redis_fault.sh
}
主的redis脚本
redis_check.sh
#!/bin/bash
ALIVE=`/home/redis305/src/redis-cli PING`
if [ "$ALIVE" == "PONG" ]; then
echo 0
exit 0
else
killall keepalived #优先级降低也没用,因为从服务器本来就低,所以要杀掉#keepalived进程
echo 1
exit 1
fi
notify_master.sh
#!/bin/bash
REDISCLI="/home/redis305/src/redis-cli"
LOGFILE="/home/work/redis/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being master." >> $LOGFILE 2>&1
echo "Run SLAVEOF NO ONE …" >> $LOGFILE
$REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
notify_backup.sh
#!/bin/bash
REDISCLI="/home/redis305/src/redis-cli"
LOGFILE="/home/work/redis/keepalived-redis-state.log"
echo "[backup]" >> $LOGFILE
date >> $LOGFILE
echo "Being slave…." >> $LOGFILE 2>&1
sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从
echo "Run SLAVEOF 192.168.40.130 6379 …" >> $LOGFILE
$REDISCLI SLAVEOF 192.168.40.130 6379 >> $LOGFILE 2>&1
notify_fault.sh
#!/bin/bash
LOGFILE="/home/redis/keepalived-redis-state.log"
echo "[fault] keepalived fault" >> $LOGFILE
date >> $LOGFILE
 
整个配置就算搭好了
分别启动两个系统的redis
首先启动主(192.168.40.130)的keepalived,再启动主(192.168.40.131) 可以查看虚拟ip是否绑定在网卡上:ip addr 并且在过程中只会绑定一台服务器
 
注意,脚本中的 sleep 15 没搞懂为什么要这么执行?也许可以删掉



转载请注明出处。

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Redis内存优化

    Redis内存优化

    2016-04-29 09:38

  • Redis基本知识以及管理

    Redis基本知识以及管理

    2016-03-29 15:52

  • redis使用sentinel高可用配置

    redis使用sentinel高可用配置

    2016-03-31 21:39

  • Keepalived 初步认识

    Keepalived 初步认识

    2016-01-03 11:16

网友点评
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)