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

  1. cd /opt
  2. tar -zxvf redis-4.0.6.tar.gz
  3. mv redis-4.0.6 redis
  4. cd redis
  5. makeMALLOC=libc
  6. make PREFIX=/usr/local/redis install

2、配置redis启动脚本

vim /etc/init.d/redis

  1. #!/bin/sh
  2.  
  3. #chkconfig:2345 80 90
  4. # Simple Redisinit.d script conceived to work on Linux systems
  5. # as it doesuse of the /proc filesystem.
  6.  
  7. #配置redis端口号
  8. REDISPORT=6379
  9. #配置redis启动命令路径
  10. EXE=/usr/local/redis/bin/redis-server
  11. #配置redis连接命令路径
  12. CLIEXE=/usr/local/redis/bin/redis-cli
  13. #配置redis运行PID路径
  14. PIDFILE=/var/run/redis_6379.pid
  15. #配置redis的配置文件路径
  16. CONF="/etc/redis/redis.conf"
  17. #配置redis的连接认证密码
  18. REDISPASSWORD=123456
  19.  
  20. function start () {
  21. if [ -f $PIDFILE ]
  22.  
  23. then
  24.  
  25. echo "$PIDFILE exists,process is already running or crashed"
  26.  
  27. else
  28.  
  29. echo "Starting Redisserver..."
  30.  
  31. $EXE $CONF &
  32.  
  33. fi
  34. }
  35.  
  36. function stop () {
  37. if [ ! -f $PIDFILE ]
  38.  
  39. then
  40.  
  41. echo "$PIDFILE does not exist, process is not running"
  42.  
  43. else
  44.  
  45. PID=$(cat $PIDFILE)
  46.  
  47. echo "Stopping ..."
  48.  
  49. $CLIEXE -p $REDISPORT -a $REDISPASSWORD shutdown
  50.  
  51. while [ -x /proc/${PID} ]
  52.  
  53. do
  54.  
  55. echo "Waiting forRedis to shutdown ..."
  56.  
  57. sleep 1
  58.  
  59. done
  60.  
  61. echo "Redis stopped"
  62.  
  63. fi
  64. }
  65.  
  66. function restart () {
  67. stop
  68.  
  69. sleep 3
  70.  
  71. start
  72. }
  73.  
  74. case "$1" in
  75. start)
  76. start
  77. ;;
  78. stop)
  79. stop
  80. ;;
  81. restart)
  82. restart
  83. ;;
  84. *)
  85. echo -e "\e[31m Please use $0 [start|stop|restart] asfirst argument \e[0m"
  86. ;;
  87. esac

授予执行权限:chmod +x /etc/init.d/redis

添加开机启动:

chkconfig --add redis

chkconfig redis on

查看:chkconfig --list | grep redis

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

3、添加redis命令环境变量

  1. #vi /etc/profile
    #添加下一行参数
  2. exportPATH="$PATH:/usr/local/redis/bin"
    #环境变量生效
    source /etc/profile

4、启动redis服务

  1. service redis start
  2. #检查启动情况
    ps -ef | grep redis

    注:在我们两台服务器上先执行同样的操作安装完成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配置文件

  1. vim /etc/redis/redis.conf
  2. bind 0.0.0.0
  3. port 6379
  4. daemonize yes
  5. requirepass 123456
  6. slave-serve-stale-data yes
  7. slave-read-only no

Slave-141配置文件

  1. vim /etc/redis/redis.conf
  2. bind 0.0.0.0
  3. port 6379
  4. daemonize yes
  5. slaveof 172.16.81.140 6379
  6. masterauth 123456
  7. slave-serve-stale-data yes
  8. slave-read-only no

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

主节点140终端登录测试:

  1. [root@localhost ~]# redis-cli -a 123456
  2. 127.0.0.1:6379> INFO
  3. .
  4. .
  5. .
  6. # Replication
  7. role:master
  8. connected_slaves:1
  9. slave0:ip=172.16.81.141,port=6379,state=online,offset=105768,lag=1
  10. master_replid:f83fcc3c98614d770f2205831fef1e877fa3f482
  11. master_replid2:1f25604997a4ad3eb8344e8155990e78acd93312
  12. master_repl_offset:105768
  13. second_repl_offset:447
  14. repl_backlog_active:1
  15. repl_backlog_size:1048576
  16. repl_backlog_first_byte_offset:447
  17. repl_backlog_histlen:105322

从节点141终端登录测试:

  1. [root@localhost ~]# redis-cli -a 123456
  2. 127.0.0.1:6379> info
  3. .
  4. .
  5. .
  6. # Replication
  7. role:slave
  8. master_host:172.16.81.140
  9. master_port:6379
  10. master_link_status:up
  11. master_last_io_seconds_ago:5
  12. master_sync_in_progress:0
  13. slave_repl_offset:105992
  14. slave_priority:100
  15. slave_read_only:0
  16. connected_slaves:0
  17. master_replid:f83fcc3c98614d770f2205831fef1e877fa3f482
  18. master_replid2:1f25604997a4ad3eb8344e8155990e78acd93312
  19. master_repl_offset:105992
  20. second_repl_offset:447
  21. repl_backlog_active:1
  22. repl_backlog_size:1048576
  23. repl_backlog_first_byte_offset:239
  24. repl_backlog_histlen:105754

3、同步测试

主节点140

从节点141

到此redis的主从已经完成!

KeepAlived配置实现双机热备

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

1、配置Keepalived配置文件

主Keepalived配置文件

  1. vim /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3.  
  4. global_defs {
  5. notification_email {
  6. acassen@firewall.loc
  7. failover@firewall.loc
  8. sysadmin@firewall.loc
  9. }
  10. notification_email_from Alexandre.Cassen@firewall.loc
  11. smtp_server 192.168.200.1
  12. smtp_connect_timeout 30
  13. router_id redis01
  14. }
  15.  
  16. vrrp_script chk_redis {
  17. script "/etc/keepalived/script/redis_check.sh"
  18. interval 2
  19. }
  20.  
  21. vrrp_instance VI_1 {
  22. state MASTER
  23. interface eno16777984
  24. virtual_router_id 51
  25. priority 100
  26. advert_int 1
  27. authentication {
  28. auth_type PASS
  29. auth_pass 1111
  30. }
  31.  
  32. track_script {
  33. chk_redis
  34. }
  35. virtual_ipaddress {
  36. 172.16.81.139
  37. }
  38.  
  39. notify_master /etc/keepalived/script/redis_master.sh
  40. notify_backup /etc/keepalived/script/redis_backup.sh
  41. notify_fault /etc/keepalived/script/redis_fault.sh
  42. notify_stop /etc/keepalived/script/redis_stop.sh
  43. }

备用Keepalived配置文件

  1. vim /etc/keepalived/keepalived.conf
  2. ! Configuration File for keepalived
  3.  
  4. global_defs {
  5. notification_email {
  6. acassen@firewall.loc
  7. failover@firewall.loc
  8. sysadmin@firewall.loc
  9. }
  10. notification_email_from Alexandre.Cassen@firewall.loc
  11. smtp_server 192.168.200.1
  12. smtp_connect_timeout 30
  13. router_id redis02
  14. }
  15.  
  16. vrrp_script chk_redis {
  17. script "/etc/keepalived/script/redis_check.sh"
  18. interval 2
  19. }
  20.  
  21. vrrp_instance VI_1 {
  22. state BACKUP
  23. interface eno16777984
  24. virtual_router_id 51
  25. priority 99
  26. advert_int 1
  27. authentication {
  28. auth_type PASS
  29. auth_pass 1111
  30. }
  31.  
  32. track_script {
  33. chk_redis
  34. }
  35. virtual_ipaddress {
  36. 172.16.81.139
  37. }
  38.  
  39. notify_master /etc/keepalived/script/redis_master.sh
  40. notify_backup /etc/keepalived/script/redis_backup.sh
  41. notify_fault /etc/keepalived/script/redis_fault.sh
  42. notify_stop /etc/keepalived/script/redis_stop.sh
  43. }

2、配置脚本

Master KeepAlived -- 140

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

cd /etc/keepalived/script/

  1. [root@localhost script]# cat redis_check.sh
  2. #!/bin/bash
  3.  
  4. ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING`
  5.  
  6. if [ "$ALIVE" == "PONG" ];then
  7.  
  8. echo $ALIVE
  9.  
  10. exit 0
  11.  
  12. else
  13.  
  14. echo $ALIVE
  15.  
  16. exit 1
  17.  
  18. fi
  1. [root@localhost script]# cat redis_master.sh
  2. #!/bin/bash
  3. REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
  4. LOGFILE="/var/log/keepalived-redis-state.log"
  5.  
  6. sleep 15
  7.  
  8. echo "[master]" >> $LOGFILE
  9.  
  10. date >> $LOGFILE
  11.  
  12. echo "Being master...." >>$LOGFILE 2>&1
  13.  
  14. echo "Run SLAVEOF cmd ...">> $LOGFILE
  15.  
  16. $REDISCLI SLAVEOF 172.16.81.141 6379 >>$LOGFILE 2>&1
  17. if [ $? -ne 0 ];then
  18. echo "data rsync fail." >>$LOGFILE 2>&1
  19. else
  20. echo "data rsync OK." >> $LOGFILE 2>&1
  21. fi
  22.  
  23. sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
  24.  
  25. echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
  26.  
  27. $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
  28. if [ $? -ne 0 ];then
  29. echo "Run SLAVEOF NO ONE cmd fail." >>$LOGFILE 2>&1
  30. else
  31. echo "Run SLAVEOF NO ONE cmd OK." >> $LOGFILE 2>&1
  32. fi
  1. [root@localhost script]# cat redis_backup.sh
  2. #!/bin/bash
  3.  
  4. REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
  5.  
  6. LOGFILE="/var/log/keepalived-redis-state.log"
  7.  
  8. echo "[backup]" >> $LOGFILE
  9.  
  10. date >> $LOGFILE
  11.  
  12. echo "Being slave...." >>$LOGFILE 2>&1
  13.  
  14. sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
  15.  
  16. echo "Run SLAVEOF cmd ...">> $LOGFILE
  17.  
  18. $REDISCLI SLAVEOF 172.16.81.141 6379 >>$LOGFILE 2>&1
  1. [root@localhost script]# cat redis_fault.sh
  2. #!/bin/bash
  3.  
  4. LOGFILE=/var/log/keepalived-redis-state.log
  5.  
  6. echo "[fault]" >> $LOGFILE
  7.  
  8. date >> $LOGFILE
  1. [root@localhost script]# cat redis_stop.sh
  2. #!/bin/bash
  3.  
  4. LOGFILE=/var/log/keepalived-redis-state.log
  5.  
  6. echo "[stop]" >> $LOGFILE
  7.  
  8. date >> $LOGFILE

Slave KeepAlived -- 141

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

cd /etc/keepalived/script/

  1. [root@localhost script]# cat redis_check.sh
  2. #!/bin/bash
  3.  
  4. ALIVE=`/usr/local/redis/bin/redis-cli -a 123456 PING`
  5.  
  6. if [ "$ALIVE" == "PONG" ]; then
  7.  
  8. echo $ALIVE
  9.  
  10. exit 0
  11.  
  12. else
  13.  
  14. echo $ALIVE
  15.  
  16. exit 1
  17.  
  18. fi
  1. [root@localhost script]# cat redis_master.sh
  2. #!/bin/bash
  3.  
  4. REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
  5.  
  6. LOGFILE="/var/log/keepalived-redis-state.log"
  7.  
  8. echo "[master]" >> $LOGFILE
  9.  
  10. date >> $LOGFILE
  11.  
  12. echo "Being master...." >>$LOGFILE 2>&1
  13.  
  14. echo "Run SLAVEOF cmd ...">> $LOGFILE
  15.  
  16. $REDISCLI SLAVEOF 172.16.81.140 6379 >>$LOGFILE 2>&1
  17.  
  18. sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
  19.  
  20. echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE
  21.  
  22. $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
  1. [root@localhost script]# cat redis_backup.sh
  2. #!/bin/bash
  3.  
  4. REDISCLI="/usr/local/redis/bin/redis-cli -a 123456"
  5.  
  6. LOGFILE="/var/log/keepalived-redis-state.log"
  7.  
  8. echo "[backup]" >> $LOGFILE
  9.  
  10. date >> $LOGFILE
  11.  
  12. echo "Being slave...." >>$LOGFILE 2>&1
  13.  
  14. sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色
  15.  
  16. echo "Run SLAVEOF cmd ...">> $LOGFILE
  17.  
  18. $REDISCLI SLAVEOF 172.16.81.140 6379 >>$LOGFILE 2>&1
  1. [root@localhost script]# cat redis_fault.sh
  2. #!/bin/bash
  3.  
  4. LOGFILE=/var/log/keepalived-redis-state.log
  5.  
  6. echo "[fault]" >> $LOGFILE
  7.  
  8. date >> $LOGFILE
  1. [root@localhost script]# cat redis_stop.sh
  2. #!/bin/bash
  3.  
  4. LOGFILE=/var/log/keepalived-redis-state.log
  5.  
  6. echo "[stop]" >> $LOGFILE
  7.  
  8. date >> $LOGFILE

3、启动服务

systemctl start keepalived

systemctl enable keepalived

4、测试服务是否正常

ps -ef | grep keepalived

ping 172.16.81.139

查看VIP地址

测试连接redis是否正常

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

Keepalived测试完成!!

测试故障转移情况

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

1、主140关闭redis

service redis stop

2、查看141状态

测试VIP连接远程连接

通过INFO可以查看状态信息

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

3、插入数据

4、开启140主节点

service redis start

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

141的状态,变回了从

140的状态,变回了主

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

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

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

Redis主从+KeepAlived实现高可用的更多相关文章

  1. redis主从+keepalived实现高可用技术

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

  2. Redis+Keepalived实现高可用

    使用redis哨兵可以在主服务器出现故障的时候自动切换主从,但是从服务器的IP不同于原主服务器的IP还需要在客户端手动修改IP才能生效 下面使用keepalived实现VIP自动漂移 keepaliv ...

  3. Redis系列3:高可用之主从架构

    Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 1 主从复制介绍 上一篇<Redis系列2:数据持久化提高可用性>中,我们介绍了Redis中的数据 ...

  4. Nginx系列二:(Nginx Rewrite 规则、Nginx 防盗链、Nginx 动静分离、Nginx+keepalived 实现高可用)

    一.Nginx Rewrite 规则 1. Nginx rewrite规则 Rewrite规则含义就是某个URL重写成特定的URL(类似于Redirect),从某种意义上说为了美观或者对搜索引擎友好, ...

  5. LVS+KeepAlived+Nginx高可用实现方案

    文章目录概念LVSKeepAlived为什么要使用准备软件安装KeepAlived 安装源码安装yum安装服务启动.重启.关闭安装ipvsadmnginx安装防火墙(iptables)防火墙配置(方式 ...

  6. keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群

    keepalived工作原理和配置说明 腾讯云VPC内通过keepalived搭建高可用主备集群 内网路由都用mac地址 一个mac地址绑定多个ip一个网卡只能一个mac地址,而且mac地址无法改,但 ...

  7. haproxy+keepalived实现高可用负载均衡

    软件负载均衡一般通过两种方式来实现:基于操作系统的软负载实现和基于第三方应用的软负载实现.LVS就是基于Linux操作系统实现的一种软负载,HAProxy就是开源的并且基于第三应用实现的软负载. HA ...

  8. 用HAProxy和KeepAlived构建高可用的反向代理

      用HAProxy和KeepAlived构建高可用的反向代理 用HAProxy和KeepAlived构建高可用的反向代理 前言对于访问量较大的网站来说,随着流量的增加单台服务器已经无法处理所有的请求 ...

  9. 项目实战3—Keepalived 实现高可用

    实现基于Keepalived高可用集群网站架构 环境:随着业务的发展,网站的访问量越来越大,网站访问量已经从原来的1000QPS,变为3000QPS,目前业务已经通过集群LVS架构可做到随时拓展,后端 ...

随机推荐

  1. 获取父窗口的xxx节点的方法

    window.parent.document.getElementById("xxx");获取父窗口的xxx节点$("#myEle", window.paren ...

  2. H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位

    今天的目标 3.1:h5新特性--SVG--椭圆 <ellipse rx="" ry=""  cx="" cy="" ...

  3. Java基础之一

    移位操作符 移位操作符只可用来处理整数类型. <<:左移位操作符,按照操作符右侧指定的位数将操作符左边的操作数向左移动,在低位补0. >>:“有符号”右移位操作符,按照操作符右 ...

  4. 安装rabbtimq CentOS 7

    朋友们 今天安装rabbtimq  在安装完以后就是一直报错.一直启动不起来了.最后看到别人写到.centos 7  与 centos 6.下载的rabbitmq是不一样的. https://dl.b ...

  5. CPU芯片哪家强?电视处理器这么选就对了!

    任何智能设备,CPU(Central Processing Unit/中央处理器)都是决定其性能优劣的核心组件,在家电界,最为人们熟知的CPU厂商就是Mstar以及Amlogic这两个品牌了,那两个品 ...

  6. Ubuntu修改系统时间

    在新版的ubuntu中,使用timedatectl 替换了ntpdate来进行时间管理. 1.查看当前时间状态 查看当前时间状态 timedatectl status : res@ubuntu:~$ ...

  7. Windows和Office激活汇总

    Windows和Office是常用的软件.多数情况下,即使不激活,也会使用一部分功能.今天来看一下很多前辈的工作成果. 1. Windows 7&10 1.1 永久激活 通过key 分享几个常 ...

  8. 初探ansible

    Ansible 基于ssh的自动化运维工具 ansible 配置文件详解 ansible.cfg 文件 文件默认放置在/etc/ansible下,ansible读取配置文件的顺序是: 当前命令执行目录 ...

  9. 交叉编译ffmpeg(hi3520d)

    ./configure \--prefix=/usr/local/ffmpeg-3520D \--cross-prefix=/opt/hisi-linux-nptl/arm-hisiv100-linu ...

  10. MySql技术内幕之MySQL入门(1)

    目录 MySql技术内幕之MySQL入门(1) 安装 关于注释 执行SQL语句 关于命令大小写 创建数据库 查看表的信息 查看更加详细的信息 查看与给定模式相匹配的列 插入数据 利用insert添加行 ...