linux中搭建高可用及負載平衡的REDIS

來源:互聯網
上載者:User

項目決定資料存放區使用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高可用環境搭建成功.

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.