linux中搭建高可用及负载均衡的REDIS

项目决定数据存储使用Redis为主,Mysql只保存日志信息。需要对Redis的高可用及负载均衡做一个部署测试。测试使用虚拟机用。

测试环境

机器

母机:Ubuntu 4核 16G

虚拟机:centos6.5-64 单核 1G 独立ip 3个

虚拟机使用virtual box,centos为64位6.5.具体信息如下

192.168.0.231   Redis-master

192.168.0.231   Redis-slave

192.168.0.239   Virtual IP
软件

Reidis
Keepalived
安装前配置

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

$ yum install -y openssl openssl-devel kernel kernel-devel gcc wget tcl libnl-devel

$ yum upgrade

$ reboot  //重启系统
安装Keepalived

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

$ wget http://www.keepalived.org/software/keepalived-1.2.13.tar.gz

$ tar -zxvf keepalived-1.2.13.tar.gz

$ cd keepalived-1.2.13

$ ln -s /usr/src/kernels/`uname -r`-`uname -m`/ /usr/src/linux

$ ./configure  --prefix=/usr/local/keepalived  --sysconf=/etc

$ chkconfig --add keepalived

//查看是否成功

$ service keepalived status
安装redis

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

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz

$ tar -zxvf redis-2.8.17.tar.gz

$ cd redis-2.8.17

$ make && make test

$ mkdir -p /usr/local/redis/{bin,var,etc}

$ cp ./src/{redis-benchmark,redis-cli,redis-server,redis-check-dump,redis-check-aof} /usr/local/redis/bin/

$ cp /usr/local/redis/bin/* /usr/local/bin/
配置

Master配置

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

Master-Redis配置

$ vim /usr/local/redis/etc/redis.conf
修改如下值

daemonize yes
pidfile /var/run/redis.pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/usr/local/redis/log/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis/data
slave-serve-stale-data yes
slave-read-only no
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
Master-Keepalived配置

global_defs {
    router_id redis
}
vrrp_script chk_redis {
    script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本
    interval 2                  ###监控时间
    timeout  2                                  ###超时时间
    fall     3                  ###重试次数
}
vrrp_instance redis {
  state MASTER                  ###设置为MASTER
  interface eth0              ###监控网卡
  virtual_router_id 52
  priority 101              ###权重值
  authentication {
         auth_type PASS          ###加密
         auth_pass redis        ###密码
  }
  track_script {
    chk_redis              ###执行上面定义的chk_redis
  }
  virtual_ipaddress {
       192.168.0.239            ###VIP
  }
  notify_master /etc/keepalived/scripts/redis_master.sh
  notify_backup /etc/keepalived/scripts/redis_backup.sh
  notify_fault  /etc/keepalived/scripts/redis_fault.sh
  notify_stop   /etc/keepalived/scripts/redsi_stop.sh
}
也可在本地编辑好后使用scp上传到服务器。 Master-keepalived脚本redis_master.sh:

  #!/bin/bash
  REDISCLI="/usr/local/redis/bin/redis-cli"
  LOGFILE="/usr/local/redis/var/keepalived-redis-state.log"
  echo "[master]" >> $LOGFILE
  date >> $LOGFILE
  echo "Being master...." >> $LOGFILE 2>&1
  echo "Run SLAVEOF cmd ..." >> $LOGFILE
  $REDISCLI SLAVEOF 192.168.0.232 6379 >> $LOGFILE  2>&1
  sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
  echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
  $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
Master-keepalived脚本redis_backup.sh:

  #!/bin/bash
  REDISCLI="/usr/local/redis/bin/redis-cli"
  LOGFILE="/usr/local/redis/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 192.168.0.232 6379 >> $LOGFILE  2>&1
Backup配置

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

Backup-Redis配置

$ vim /usr/local/redis/etc/redis.conf
修改如下值

daemonize yes
pidfile /var/run/redis.pid
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 0
loglevel notice
logfile "/usr/local/redis/log/redis.log"
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /usr/local/redis/data
slave-serve-stale-data yes
slave-read-only no
repl-disable-tcp-nodelay no
slave-priority 100
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes
SLAVEOF 192.168.0.231 6379
Backup-Keepalived配置

global_defs {
    router_id redis
}
vrrp_script chk_redis {
    script "/etc/keepalived/scripts/redis_check.sh"   ###监控脚本
    interval 2                  ###监控时间
    timeout  2                                  ###超时时间
    fall     3                  ###重试次数
}
vrrp_instance redis {
  state BACKUP                  ###设置为MASTER
  interface eth0              ###监控网卡
  virtual_router_id 51
  priority 100              ###权重值
  authentication {
         auth_type PASS          ###加密
         auth_pass redis        ###密码
  }
  track_script {
    chk_redis              ###执行上面定义的chk_redis
  }
  virtual_ipaddress {
       192.168.0.239            ###VIP
  }
  notify_master /etc/keepalived/scripts/redis_master.sh
  notify_backup /etc/keepalived/scripts/redis_backup.sh
  notify_fault  /etc/keepalived/scripts/redis_fault.sh
  notify_stop   /etc/keepalived/scripts/redsi_stop.sh
}
也可在本地编辑好后使用scp上传到服务器。 Master-keepalived脚本redis_master.sh:

  #!/bin/bash
  REDISCLI="/usr/local/redis/bin/redis-cli"
  LOGFILE="/usr/local/redis/var/keepalived-redis-state.log"
  echo "[master]" >> $LOGFILE
  date >> $LOGFILE
  echo "Being master...." >> $LOGFILE 2>&1
  echo "Run SLAVEOF cmd ..." >> $LOGFILE
  $REDISCLI SLAVEOF 192.168.0.231 6379 >> $LOGFILE  2>&1
  sleep 10 #延迟10秒以后待数据同步完成后再取消同步状态
  echo "Run SLAVEOF NO ONE cmd ..." >> $LOGFILE
  $REDISCLI SLAVEOF NO ONE >> $LOGFILE 2>&1
Master-keepalived脚本redis_backup.sh:

  #!/bin/bash
  REDISCLI="/usr/local/redis/bin/redis-cli"
  LOGFILE="/usr/local/redis/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 192.168.0.231 6379 >> $LOGFILE  2>&1
公共脚本配置

redis_chekc.sh

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

安装nc,使用nc检测redis的服务而不是ping
$ wget http://sourceforge.net/projects/netcat/files/netcat/0.7.1/netcat-0.7.1.tar.gz
$ tar -zxvf netcat-0.7.1.tar.gz
$ ./configure
$ make && make install

建立脚本:

$ vim /etc/keepalived/scripts/redis_check.sh
脚本内容:

#!/bin/bash
ALIVE=`/usr/local/redis/bin/redis-cli PING`

if ["$ALIVE" == "PONG"] ;then
      echo $ALIVE
      exit 0
else
      echo $ALIVE
      exit 1
fi
redis_fault.sh

建立脚本:

$ vim /etc/keepalived/scripts/redis_fault.sh
脚本内容:

# !/bin/bash

LOGFILE=/usr/local/redis/var/keepalived-redis-state.log
echo "[faule]" >> $LOGFILE
date >> $LOGFILE
redis_stop.sh

建立脚本:

$ vim /etc/keepalived/scripts/redis_stop.sh
脚本内容:

# !/bin/bash

LOGFILE=/usr/local/redis/var/keepalived-redis-state.log
echo "[stop]" >> $LOGFILE
date >> $LOGFILE
测试

主从复制测试

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

$ redis-cli info 
Master的rule显示master为正常,slave会显示为192.168.0.232

在Master上写入数据,在Backup读取

$ redis-cli set a hello  //Master 写入数据
$ redis-cli get a        //Backup 读取数据
"hello"
主从复制正常。

主从切换测试
先后启动Master和Backup上的keepalived,在Master上查看vip

$ ip a
enter image description here

从图中可以看出vip已经绑定在Master上,现在通过vip来进行数据测试

$ redis-cli -h 192.168.0.239 set a test
$ redis-cli -h 192.168.0.239 get a //测试虚拟ip数据读取
//在主机和从机上分别进行数据读取
$ redis-cli get a
enter image description here

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

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

$ killall -9 redis-server
$ redis-cli -h 192.168.0.232 info
enter image description here

现在给redis写入数据,测试看Master恢复服务后能否正常恢复数据

$ redis-cli -h 192.168.0.239 set a nihao
恢复Master上的Redis,查看ip a

$ service redis-server start
$ ip a
$ redis-cli get a
enter image description here

数据恢复,VIP切换回Master,Redis高可用环境搭建成功.

时间: 2024-12-27 06:57:31

linux中搭建高可用及负载均衡的REDIS的相关文章

MySQL双机高可用的负载均衡(读写分离、主从自动切换)架构设计

架构简介   前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构.ps://www.centos.bz/wp-content/uploads/2014/12/%E5%8F%8C%E6%9C%BAha%E6%9E%B6%E6%9E%84%E5%9B%BE.png" /> 此架构主要是由keepalived实现双机高可用,维护了一个外网VIP,一个内网VIP.正常情况时,外网V

搭建高可用的MongoDB集群

MongoDB公司原名10gen,创立于2007年,在2013年收到一笔2.31亿美元的融资后,公司市值评估已增至10亿美元级别,这个高度是知名开源公司Red Hat(创建于1993年)20年的奋斗成果. 高性能.易扩展一直是MongoDB的立足之本,同时规范的文档和接口更让其深受用户喜爱,这一点从分析DB-Engines的得分结果不难看出--仅仅1年时间,MongoDB就完成了第7名到第五名的提升,得分就从124分上升至214分,上升值是第四名PotgreSQL的两倍,同时当下与Postgre

如何使用 Weave 以及 Docker 搭建 Nginx 反向代理/负载均衡服务器

Hi, 今天我们将会学习如何使用 Weave 和 Docker 搭建 Nginx 的反向代理/负载均衡服务器.Weave 可以创建一个虚拟网络将 Docker 容器彼此连接在一起,支持跨主机部署及自动发现.它可以让我们更加专注于应用的开发,而不是基础架构.Weave 提供了一个如此棒的环境,仿佛它的所有容器都属于同个网络,不需要端口/映射/连接等的配置.容器中的应用提供的服务在 weave 网络中可以轻易地被外部世界访问,不论你的容器运行在哪里.在这个教程里我们将会使用 weave 快速并且简单

CentOS 7下怎么搭建高可用集群?

  CentOS 7下怎么搭建高可用集群.高可用集群是指以减少服务中断时间为目的的服务器集群技术.它通过保护用户的业务程序对外不间断提供的服务,把因软件/硬件/人为造成的故障对业务的影响降低到最小程度.那么新的centos下怎么来搭建高可用集群. 环境:本文以两台机器实现双集热备高可用集群,主机名node1的IP为192.168.122.168 ,主机名node2的IP为192.168.122.169 . 一.安装集群软件必须软件pcs,pacemaker,corosync,fence-agen

CentOS 7下搭建高可用集群

CentOS 7下搭建高可用集群 本文以两台机器实现双集热备高可用集群,主机名node1的IP为192.168.122.168 ,主机名node2的IP为192.168.122.169 . 一.安装集群软件 必须软件pcs,pacemaker,corosync,fence-agents-all,如果需要配置相关服务,也要安装对应的软件 二.配置防火墙 1.禁止防火墙和selinux # systemctl disable firewalld # systemctl stop firewalld

Nginx+Keepalived(双机热备)搭建高可用负载均衡环境(HA)

基于 Nginx+Tomcat+Redis负载均衡Session共享来实现后续的功能 个人微信小程序.是关于人工智能的.应用是百度大脑 和 腾讯优图的人脸识别 有问题加QQ:783021975 验证问题写明在哪知道的QQ.直接说问的问题.会在不忙的时候回复你.毕竟我也有自己的工作要做. 一张简单的图说下大概的意思 安装Keepalived到CentOS虚拟机环境(2个虚拟机都安装) 使用的版本为keepalived-1.2.24.tar.gz 为了方便安装,在系统里面提前下载好相关的库 yum

Nginx反向代理,负载均衡,redis session共享,keepalived高可用

相关知识自行搜索,直接上干货... 使用的资源: nginx主服务器一台,nginx备服务器一台,使用keepalived进行宕机切换. tomcat服务器两台,由nginx进行反向代理和负载均衡,此处可搭建服务器集群. redis服务器一台,用于session的分离共享. nginx主服务器:192.168.50.133 nginx备服务器:192.168.50.135 tomcat项目服务器1:192.168.50.137 tomcat项目服务器2:192.168.50.139 redis服

搭建高可用MongoDB集群(分片)

MongoDB基础请参考:http://blog.51cto.com/kaliarch/2044423 MongoDB(replica set)请参考:http://blog.51cto.com/kaliarch/2044618 一.概述 1.1 背景 为解决mongodb在replica set每个从节点上面的数据库均是对数据库的全量拷贝,从节点压力在高并发大数据量的场景下存在很大挑战,同时考虑到后期mongodb集群的在数据压力巨大时的扩展性,应对海量数据引出了分片机制. 1.2 分片概念

搭建高可用的MongoDB集群(上):MongoDB的配置与副本集

传统的关系数据库具有不错的性能及稳定性,同时,久经历史考验,许多优秀的数据库沉淀了下来,比如MySQL.然而随着数据体积的爆发性增长,数据类型的增多,许多传统关系数据库扩展难的特点也爆发了出来,NoSQL数据库也应运而生.然而区别于以往的使用方法,许多NoSQL都有着自己的限制,从而也导致了入门难的问题.这里我们为大家分享上海创行科技技术总监严澜的博文--如何搭建高效的MongoDB集群. 以下为原文 在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩