Redis之——搭建高可用及负载均衡的Redis

之前,给大家介绍了一些关于Redis的文章,大家可以参见博文中有关Redis的文章。今天,我们就一起来学习如何搭建高可用及负载均衡的Redis,好了,不多说了,我们直接进入正题吧。

一、测试环境

1、机器

   母机:centos6.5-64
   虚拟机:centos6.5-64 单核 1G 独立ip 3个
   虚拟机使用VMWare,centos为64位6.5.具体信息如下:

[plain]  view plain  copy
 
  1. 192.168.0.231   Redis-master  
  2. 192.168.0.231   Redis-slave  
  3. 192.168.0.239   Virtual IP  

2、软件

    Reidis
    Keepalived

二、安装前配置

1、虚拟机最小化安装

虚拟机最小化安装,更新系统及安装必须组件

[plain]  view plain  copy
 
  1. $ yum install -y openssl openssl-devel kernel kernel-devel gcc wget tcl libnl-devel  
  2. $ yum upgrade  
  3. $ reboot  //重启系统  

2、安装Keepalived

安装keepalived 下载地址:http://www.keepalived.org/software/keepalived-1.2.13.tar.gz 安装

[plain]  view plain  copy
 
  1. $ wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz  
  2.   
  3. $ tar -zxvf keepalived-1.2.13.tar.gz  
  4.   
  5. $ cd keepalived-1.2.13  
  6.   
  7. $ ln -s /usr/src/kernels/`uname -r`-`uname -m`/ /usr/src/linux  
  8.   
  9. $ ./configure  --prefix=/usr/local/keepalived  --sysconf=/etc  
  10.   
  11. $ chkconfig --add keepalived  
  12.   
  13. //查看是否成功  
  14.   
  15. $ service keepalived status  

3、安装redis

下载Redis,目前Redis的稳定版本是2.8.17,下载地址Redis-2.8.17

[plain]  view plain  copy
 
  1. $ wget http://download.redis.io/releases/redis-2.8.17.tar.gz  
  2.   
  3. $ tar -zxvf redis-2.8.17.tar.gz  
  4.   
  5. $ cd redis-2.8.17  
  6.   
  7. $ make && make test  
  8.   
  9. $ mkdir -p /usr/local/redis/{bin,var,etc}  
  10.   
  11. $ cp ./src/{redis-benchmark,redis-cli,redis-server,redis-check-dump,redis-check-aof} /usr/local/redis/bin/  
  12.   
  13. $ cp /usr/local/redis/bin/* /usr/local/bin/  

三、配置

1、Master配置

 先配置好Redis,主从复制成功之后再行配置Keepalived。
 Master-Redis配置

[plain]  view plain  copy
 
  1. $ vim /usr/local/redis/etc/redis.conf  

修改如下值

[plain]  view plain  copy
 
  1. daemonize yes  
  2. pidfile /var/run/redis.pid  
  3. port 6379  
  4. tcp-backlog 511  
  5. timeout 0  
  6. tcp-keepalive 0  
  7. loglevel notice  
  8. logfile "/usr/local/redis/log/redis.log"  
  9. databases 16  
  10. save 900 1  
  11. save 300 10  
  12. save 60 10000  
  13. stop-writes-on-bgsave-error yes  
  14. rdbcompression yes  
  15. rdbchecksum yes  
  16. dbfilename dump.rdb  
  17. dir /usr/local/redis/data  
  18. slave-serve-stale-data yes  
  19. slave-read-only no  
  20. repl-disable-tcp-nodelay no  
  21. slave-priority 100  
  22. appendonly yes  
  23. appendfilename "appendonly.aof"  
  24. appendfsync everysec  
  25. no-appendfsync-on-rewrite no  
  26. auto-aof-rewrite-percentage 100  
  27. auto-aof-rewrite-min-size 64mb  
  28. lua-time-limit 5000  
  29. slowlog-log-slower-than 10000  
  30. slowlog-max-len 128  
  31. notify-keyspace-events ""  
  32. hash-max-ziplist-entries 512  
  33. hash-max-ziplist-value 64  
  34. list-max-ziplist-entries 512  
  35. list-max-ziplist-value 64  
  36. set-max-intset-entries 512  
  37. zset-max-ziplist-entries 128  
  38. zset-max-ziplist-value 64  
  39. activerehashing yes  
  40. client-output-buffer-limit normal 0 0 0  
  41. client-output-buffer-limit slave 256mb 64mb 60  
  42. client-output-buffer-limit pubsub 32mb 8mb 60  
  43. hz 10  
  44. aof-rewrite-incremental-fsync yes  
Master-Keepalived配置
[plain]  view plain  copy
 
  1. global_defs {  
  2.     router_id redis  
  3. }  
  4. vrrp_script chk_redis {  
  5.     script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本  
  6.     interval 2                  ###监控时间  
  7.     timeout  2                                  ###超时时间  
  8.     fall     3                  ###重试次数  
  9. }  
  10. vrrp_instance redis {  
  11.   state MASTER                  ###设置为MASTER  
  12.   interface eth0              ###监控网卡  
  13.   virtual_router_id 52  
  14.   priority 101              ###权重值  
  15.   authentication {  
  16.          auth_type PASS          ###加密  
  17.          auth_pass redis        ###密码  
  18.   }  
  19.   track_script {  
  20.     chk_redis              ###执行上面定义的chk_redis  
  21.   }  
  22.   virtual_ipaddress {  
  23.        192.168.0.239            ###VIP  
  24.   }  
  25.   notify_master /etc/keepalived/scripts/redis_master.sh  
  26.   notify_backup /etc/keepalived/scripts/redis_backup.sh  
  27.   notify_fault  /etc/keepalived/scripts/redis_fault.sh  
  28.   notify_stop   /etc/keepalived/scripts/redsi_stop.sh  
  29. }  
也可在本地编辑好后使用 scp 上传到服务器。 Master-keepalived脚本redis_master.sh:
[plain]  view plain  copy
 
  1. #!/bin/bash  
  2. REDISCLI="/usr/local/redis/bin/redis-cli"  
  3. LOGFILE="/usr/local/redis/var/keepalived-redis-state.log"  
  4. echo "[master]" >> $LOGFILE  
  5. date >> $LOGFILE  
  6. echo "Being master...." >> $LOGFILE 2>&1  
  7. echo "Run SLAVEOF cmd ..." >> $LOGFILE  
  8. $REDISCLI SLAVEOF 192.168.0.232 6379 >> $LOGFILE  2>&1  
  9. sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态  
  10. echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE  
  11. $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1  
Master-keepalived脚本redis_backup.sh:
[plain]  view plain  copy
 
  1. #!/bin/bash  
  2. REDISCLI="/usr/local/redis/bin/redis-cli"  
  3. LOGFILE="/usr/local/redis/log/keepalived-redis-state.log"  
  4. echo "[backup]" >> $LOGFILE  
  5. date >> $LOGFILE  
  6. echo "Being slave...." >> $LOGFILE 2>&1  
  7. sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色  
  8. echo "Run SLAVEOF cmd ..." >> $LOGFILE  
  9. $REDISCLI SLAVEOF 192.168.0.232 6379 >> $LOGFILE  2>&1  

2、Backup配置

同样先配置好Redis,主从复制成功之后再行配置Keepalived。
Backup-Redis配置

[plain]  view plain  copy
 
  1. $ vim /usr/local/redis/etc/redis.conf  
修改如下值
[plain]  view plain  copy
 
  1. daemonize yes  
  2. pidfile /var/run/redis.pid  
  3. port 6379  
  4. tcp-backlog 511  
  5. timeout 0  
  6. tcp-keepalive 0  
  7. loglevel notice  
  8. logfile "/usr/local/redis/log/redis.log"  
  9. databases 16  
  10. save 900 1  
  11. save 300 10  
  12. save 60 10000  
  13. stop-writes-on-bgsave-error yes  
  14. rdbcompression yes  
  15. rdbchecksum yes  
  16. dbfilename dump.rdb  
  17. dir /usr/local/redis/data  
  18. slave-serve-stale-data yes  
  19. slave-read-only no  
  20. repl-disable-tcp-nodelay no  
  21. slave-priority 100  
  22. appendonly yes  
  23. appendfilename "appendonly.aof"  
  24. appendfsync everysec  
  25. no-appendfsync-on-rewrite no  
  26. auto-aof-rewrite-percentage 100  
  27. auto-aof-rewrite-min-size 64mb  
  28. lua-time-limit 5000  
  29. slowlog-log-slower-than 10000  
  30. slowlog-max-len 128  
  31. notify-keyspace-events ""  
  32. hash-max-ziplist-entries 512  
  33. hash-max-ziplist-value 64  
  34. list-max-ziplist-entries 512  
  35. list-max-ziplist-value 64  
  36. set-max-intset-entries 512  
  37. zset-max-ziplist-entries 128  
  38. zset-max-ziplist-value 64  
  39. activerehashing yes  
  40. client-output-buffer-limit normal 0 0 0  
  41. client-output-buffer-limit slave 256mb 64mb 60  
  42. client-output-buffer-limit pubsub 32mb 8mb 60  
  43. hz 10  
  44. aof-rewrite-incremental-fsync yes  
  45. SLAVEOF 192.168.0.231 6379  
Backup-Keepalived配置
[plain]  view plain  copy
 
  1. global_defs {  
  2.     router_id redis  
  3. }  
  4. vrrp_script chk_redis {  
  5.     script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本  
  6.     interval 2                  ###监控时间  
  7.     timeout  2                                  ###超时时间  
  8.     fall     3                  ###重试次数  
  9. }  
  10. vrrp_instance redis {  
  11.   state BACKUP                  ###设置为MASTER  
  12.   interface eth0              ###监控网卡  
  13.   virtual_router_id 51  
  14.   priority 100              ###权重值  
  15.   authentication {  
  16.          auth_type PASS          ###加密  
  17.          auth_pass redis        ###密码  
  18.   }  
  19.   track_script {  
  20.     chk_redis              ###执行上面定义的chk_redis  
  21.   }  
  22.   virtual_ipaddress {  
  23.        192.168.0.239            ###VIP  
  24.   }  
  25.   notify_master /etc/keepalived/scripts/redis_master.sh  
  26.   notify_backup /etc/keepalived/scripts/redis_backup.sh  
  27.   notify_fault  /etc/keepalived/scripts/redis_fault.sh  
  28.   notify_stop   /etc/keepalived/scripts/redsi_stop.sh  
  29. }  
也可在本地编辑好后使用 scp 上传到服务器。 Master-keepalived脚本redis_master.sh:
[plain]  view plain  copy
 
  1. #!/bin/bash  
  2.  REDISCLI="/usr/local/redis/bin/redis-cli"  
  3.  LOGFILE="/usr/local/redis/var/keepalived-redis-state.log"  
  4.  echo "[master]" >> $LOGFILE  
  5.  date >> $LOGFILE  
  6.  echo "Being master...." >> $LOGFILE 2>&1  
  7.  echo "Run SLAVEOF cmd ..." >> $LOGFILE  
  8.  $REDISCLI SLAVEOF 192.168.0.231 6379 >> $LOGFILE  2>&1  
  9.  sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态  
  10.  echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE  
  11.  $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1  
Master-keepalived脚本redis_backup.sh:
[plain]  view plain  copy
 
  1. #!/bin/bash  
  2. REDISCLI="/usr/local/redis/bin/redis-cli"  
  3. LOGFILE="/usr/local/redis/log/keepalived-redis-state.log"  
  4. echo "[backup]" >> $LOGFILE  
  5. date >> $LOGFILE  
  6. echo "Being slave...." >> $LOGFILE 2>&1  
  7. sleep 15 #延迟15秒待数据被对方同步完成之后再切换主从角色  
  8. echo "Run SLAVEOF cmd ..." >> $LOGFILE  
  9. $REDISCLI SLAVEOF 192.168.0.231 6379 >> $LOGFILE  2>&1  

四、公共脚本配置

1、redis_chekc.sh

可以使用netcat来检测redis服务的状态.

安装nc,使用nc检测redis的服务而不是ping

[plain]  view plain  copy
 
  1. $ wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz  
  2. $ tar -zxvf netcat-0.7.1.tar.gz  
  3. $ ./configure  
  4. $ make && make install  
建立脚本:
[plain]  view plain  copy
 
  1. $ vim /etc/keepalived/scripts/redis_check.sh  
脚本内容:
[plain]  view plain  copy
 
  1. #!/bin/bash  
  2. ALIVE=`/usr/local/redis/bin/redis-cli PING`  
  3.   
  4. if ["$ALIVE" == "PONG"] ;then  
  5.       echo $ALIVE  
  6.       exit 0  
  7. else   
  8.       echo $ALIVE  
  9.       exit 1  
  10. fi  

2、redis_fault.sh

建立脚本:

[plain]  view plain  copy
 
  1. $ vim /etc/keepalived/scripts/redis_fault.sh   
脚本内容:
[plain]  view plain  copy
 
  1. # !/bin/bash  
  2.   
  3. LOGFILE=/usr/local/redis/var/keepalived-redis-state.log   
  4. echo "[faule]" >> $LOGFILE   
  5. date >> $LOGFILE  

3、redis_stop.sh

建立脚本:

[plain]  view plain  copy
 
  1. $ vim /etc/keepalived/scripts/redis_stop.sh   
脚本内容:
[plain]  view plain  copy
 
  1. # !/bin/bash  
  2.   
  3. LOGFILE=/usr/local/redis/var/keepalived-redis-state.log   
  4. echo "[stop]" >> $LOGFILE   
  5. date >> $LOGFILE  

五、测试

1、主从复制测试

先打开Master上的Redis,再打开Backup上的Redis,分别查看info

[plain]  view plain  copy
 
  1. $ redis-cli info    
Master的rule显示master为正常,slave会显示为192.168.0.232
在Master上写入数据,在Backup读取
[plain]  view plain  copy
 
  1. $ redis-cli set a hello  //Master 写入数据  
  2. $ redis-cli get a        //Backup 读取数据  
  3. "hello"  
主从复制正常。

2、主从切换测试

先后启动Master和Backup上的keepalived,在Master上查看vip

[plain]  view plain  copy
 
  1. $ ip a  
Redis之——搭建高可用及负载均衡的Redis_第1张图片
从图中可以看出vip已经绑定在Master上,现在通过vip来进行数据测试

[plain]  view plain  copy
 
  1. $ redis-cli -h 192.168.0.239 set a test  
  2. $ redis-cli -h 192.168.0.239 get a //测试虚拟ip数据读取  
  3. //在主机和从机上分别进行数据读取  
  4. $ redis-cli get a  
Redis之——搭建高可用及负载均衡的Redis_第2张图片

从图中可以看出测试无问题。

现在关闭Master上的redis,来看VIP能否正常漂移,并进行数据测试。

[plain]  view plain  copy
 
  1. $ killall -9 redis-server  
  2. $ redis-cli -h 192.168.0.232 info  
Redis之——搭建高可用及负载均衡的Redis_第3张图片
现在给redis写入数据,测试看Master恢复服务后能否正常恢复数据

[plain]  view plain  copy
 
  1. $ redis-cli -h 192.168.0.239 set a nihao  
恢复Master上的Redis,查看ip a
[plain]  view plain  copy
 
  1. $ service redis-server start  
  2. $ ip a  
  3. $ redis-cli get a  
Redis之——搭建高可用及负载均衡的Redis_第4张图片
数据恢复,VIP切换回Master,Redis高可用环境搭建成功.

至此,已成功搭建高可用及负载均衡的Redis环境。

你可能感兴趣的:(Redis之——搭建高可用及负载均衡的Redis)