Redis服務搭建及使用Keepalived實現主從雙機熱備

Redis服務搭建及使用Keepalived實現主從雙機熱備

1.  簡述

本文檔根據互聯網上博客參考,並在測試環境搭建成功,記錄測試環境中Redis緩存服務器的搭建過程及實現主從雙機熱備架構的過程。

2.  測試環境

系統:Centos6.5

軟件:redis-2.8.24.tar.gz  Keepalived v1.2.13

主IP: 192.168.3.3

從IP:192.168.3.4

VIP:   192.168.3.5

3.  Redis單機安裝及配置

3.1     編譯安裝

A.準備好redis tar gz 放到/tmp目錄

在線下載 wget http://download.redis.io/releases/redis-2.8.24.tar.gz

B.執行以下命令:

cd /tmp

tar -zxvf redis-2.8.24.tar.gz

cd redis-2.8.24

make MALLOC=libc

make PREFIX=/usr/local/redis install

3.2     配置啓動腳本redis和配置文件redis.conf

3.2.1   啓動腳本redis

touch /etc/init.d/redis

 

#!/bin/sh

#chkconfig:2345 80 90

#

# Simple Redisinit.d script conceived to work on Linux systems

# as it doesuse of the /proc filesystem.

 

REDISPORT=6379

EXEC=/usr/local/redis/bin/redis-server 

CLIEXEC=/usr/local/redis/bin/redis-cli

 

PIDFILE=/var/run/redis.pid

CONF="/etc/redis/redis.conf"

 

REDISPASSWORD=123456

 

 

case"$1" in

    start)

        if [ -f $PIDFILE ]

        then

                echo "$PIDFILE exists,process is already running or crashed"

        else

                echo "Starting Redisserver..."

                $EXEC $CONF &

        fi

        ;;

    stop)

        if [ ! -f $PIDFILE ]

        then

                echo "$PIDFILE does notexist, process is not running"

        else

                PID=$(cat $PIDFILE)

                echo "Stopping ..."

                $CLIEXEC -p $REDISPORT -a$REDISPASSWORD shutdown

                while [ -x /proc/${PID} ]

                do

                    echo "Waiting forRedis to shutdown ..."

                    sleep 1

                done

                echo "Redis stopped"

        fi

        ;;

    *)

        echo "Please use start or stop asfirst argument"

        ;;

esac

3.2.2   配置文件redis.conf

       mkdir/etc/redis/

       cp/tmp/redis-2.8.24/redis.conf /etc/redis/

      

       修改內容:

       daemonizeyes

       port6379

       bind0.0.0.0

       requirepass123456

      

3.2.3 開機啓動及防火牆

添加開機啓動

chkconfig --add redis

chkconfig redis on

chkconfig --list | grep redis

 

添加防火牆

/sbin/iptables -I INPUT -p tcp --dport 3306-j ACCEPT

service iptables restart

/etc/rc.d/init.d/iptables save

more /etc/sysconfig/iptables

 

將Redis的命令所在目錄添加到系統參數PATH中

並將此添加到.bashrc

#vi /etc/profile

exportPATH="$PATH:/usr/local/redis/bin"

 

啓動服務

service redis start

 

查看服務啓動情況:

[root@redis01 ~]# ps -ef | grep redis

root    18478 18465  0 06:28 pts/1    00:00:00 grep --color=auto redis

root    26404     1  0 Jan05 ?       00:04:40/usr/local/redis/bin/redis-server 0.0.0.0:6379

 

測試命令:

redis-cli -a 123456

 

127.0.0.1:6379> ping

PONG

證明安裝配置完成。

4.  主從雙機熱備的實現

將192.168.3.3作爲master將192.168.3.4作爲slave 並統一訪問地址爲192.168.3.5;應用通過訪問192.168.3.5:6379來訪問redis緩存數據庫。

 

實現主從雙機熱備,首先需要實現Redis的主從複製功能,然後使用Keepalived來實現系統的容災,創建出VIP,在master故障時能夠自動切換到slave機器上,並實現雙機熱備的能力。

 

4.1     Redis主從複製

 

Master的redis.conf 

slave-read-only no #因同時寫入的只會有一個,此選項打開是爲了防止master -slave數據不同步問題,我們此架構不存在master slave同時寫入過程。所以我們將此選項關閉,爲了當從master切換到slave後,應用也可以寫入,不影響應用的正常使用。

 

Slave的redis.conf

slaveof 192.168.3.3 6379

masterauth 123456

slave-serve-stale-data yes

slave-read-only no

 

設置完成後,重啓兩臺機器的redis服務。

 

驗證主從複製是否正常:

終端登陸:

redis-cli -a 123456

 

info 輸出:

master

[root@youlook-redis01 ~]# redis-cli -a123456

127.0.0.1:6379> info

# Server

redis_version:2.8.24

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:24d3bdda0cc05ee1

redis_mode:standalone

os:Linux 2.6.32-642.6.2.el6.x86_64 x86_64

arch_bits:64

multiplexing_api:epoll

gcc_version:4.4.7

process_id:23070

run_id:f0d358edd0d6aad82171e4c16fae2c522ba62bd0

tcp_port:6379

uptime_in_seconds:3815852

uptime_in_days:44

hz:10

lru_clock:7551606

config_file:/etc/redis/redis.conf

 

# Clients

connected_clients:13

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

 

# Memory

used_memory:29171896

used_memory_human:27.82M

used_memory_rss:116658176

used_memory_peak:518246264

used_memory_peak_human:494.24M

used_memory_lua:36864

mem_fragmentation_ratio:4.00

mem_allocator:libc

 

# Persistence

loading:0

rdb_changes_since_last_save:6

rdb_bgsave_in_progress:0

rdb_last_save_time:1483946348

rdb_last_bgsave_status:ok

rdb_last_bgsave_time_sec:0

rdb_current_bgsave_time_sec:-1

aof_enabled:0

aof_rewrite_in_progress:0

aof_rewrite_scheduled:0

aof_last_rewrite_time_sec:-1

aof_current_rewrite_time_sec:-1

aof_last_bgrewrite_status:ok

aof_last_write_status:ok

 

# Stats

total_connections_received:5481499

total_commands_processed:85348127

instantaneous_ops_per_sec:3

total_net_input_bytes:7877840209

total_net_output_bytes:28361548248

instantaneous_input_kbps:0.09

instantaneous_output_kbps:0.02

rejected_connections:2

sync_full:2

sync_partial_ok:0

sync_partial_err:1

expired_keys:93876

evicted_keys:0

keyspace_hits:33685304

keyspace_misses:2473872

pubsub_channels:0

pubsub_patterns:0

latest_fork_usec:3264

 

# Replication

role:master

connected_slaves:1

slave0:ip=192.168.3.4,port=6379,state=online,offset=4237822823,lag=1

master_repl_offset:4237822823

repl_backlog_active:1

repl_backlog_size:1048576

repl_backlog_first_byte_offset:4236774248

repl_backlog_histlen:1048576

 

# CPU

used_cpu_sys:5370.02

used_cpu_user:3799.63

used_cpu_sys_children:320.30

used_cpu_user_children:1659.35

 

# Keyspace

db0:keys=7124,expires=47,avg_ttl=128544654

 

slave端的info信息:

[root@youlook-redis02 ~]# redis-cli -a123456

127.0.0.1:6379> info

# Server

redis_version:2.8.24

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:aa10e3525eecea17

redis_mode:standalone

os:Linux 2.6.32-642.6.2.el6.x86_64 x86_64

arch_bits:64

multiplexing_api:epoll

gcc_version:4.4.7

process_id:22720

run_id:5e61741d52bb82def68c30cc2df322f34135798b

tcp_port:6379

uptime_in_seconds:3816078

uptime_in_days:44

hz:10

lru_clock:7551784

config_file:/etc/redis/redis.conf

 

# Clients

connected_clients:3

client_longest_output_list:0

client_biggest_input_buf:0

blocked_clients:0

 

# Memory

used_memory:27903728

used_memory_human:26.61M

used_memory_rss:58122240

used_memory_peak:41421576

used_memory_peak_human:39.50M

used_memory_lua:36864

mem_fragmentation_ratio:2.08

mem_allocator:libc

 

# Persistence

loading:0

rdb_changes_since_last_save:1689

rdb_bgsave_in_progress:0

rdb_last_save_time:1483946706

rdb_last_bgsave_status:ok

rdb_last_bgsave_time_sec:0

rdb_current_bgsave_time_sec:-1

aof_enabled:0

aof_rewrite_in_progress:0

aof_rewrite_scheduled:0

aof_last_rewrite_time_sec:-1

aof_current_rewrite_time_sec:-1

aof_last_bgrewrite_status:ok

aof_last_write_status:ok

 

# Stats

total_connections_received:1907598

total_commands_processed:21038297

instantaneous_ops_per_sec:1

total_net_input_bytes:4343963223

total_net_output_bytes:188755136

instantaneous_input_kbps:0.02

instantaneous_output_kbps:0.06

rejected_connections:0

sync_full:0

sync_partial_ok:0

sync_partial_err:0

expired_keys:0

evicted_keys:0

keyspace_hits:90412

keyspace_misses:11

pubsub_channels:0

pubsub_patterns:0

latest_fork_usec:438

 

# Replication

role:slave

master_host:192.168.3.3

master_port:6379

master_link_status:up

master_last_io_seconds_ago:8

master_sync_in_progress:0

slave_repl_offset:4238304449

slave_priority:100

slave_read_only:0

connected_slaves:0

master_repl_offset:0

repl_backlog_active:0

repl_backlog_size:1048576

repl_backlog_first_byte_offset:0

repl_backlog_histlen:0

 

# CPU

used_cpu_sys:3004.34

used_cpu_user:1546.73

used_cpu_sys_children:276.15

used_cpu_user_children:1587.06

 

# Keyspace

db0:keys=7124,expires=47,avg_ttl=184336271

 

4.2     KeepAlived實現雙機熱備

使用Keepalived實現VIP,並且通過notify_notify_master、notify_backup、notify_fault、notify_stop來實現容災。

4.2.1 安裝Keepalived

yum -y install keepalived

4.2.2   配置Keepalived.conf

在此貼出master 和slave的Keepalived.conf 配置文件以及相關的依賴腳本。

Master
/etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

  notification_email {

    [email protected]

    [email protected]

    [email protected]

   }

  notification_email_from [email protected]

  smtp_server 192.168.200.1

  smtp_connect_timeout 30

  router_id redis01

}

 

vrrp_script chk_redis {

   script "/etc/keepalived/scripts/redis_check.sh"     ###監控腳本  

   interval 2                                          ###監控時間

}

 

 

vrrp_instance VI_1 {

   state MASTER

   interface eth0

   virtual_router_id 51

   priority 100

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 1111

    }

   track_script {

       chk_redis             ###執行上面定義的chk_redis 

    }

   virtual_ipaddress {

       192.168.3.5

    }

   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/redis_stop.sh

}

 

進入/etc/keepalived/scripts/查看依賴腳本

redis_backup.sh  redis_check.sh  redis_fault.sh  redis_master.sh  redis_stop.sh

 

redis_master.sh

#!/bin/bash

 

REDISCLI="/usr/local/redis/bin/redis-cli-a 123456"

LOGFILE="/var/log/keepalived-redis-state.log"

 

 

 

 

echo "[master]" >> $LOGFILE

date >> $LOGFILE

echo "Being master...." >>$LOGFILE 2>&1

 

echo "Run SLAVEOF cmd ...">> $LOGFILE

$REDISCLI SLAVEOF 192.168.3.4 6379 >>$LOGFILE  2>&1

sleep 10 #延遲10秒以後待數據同步完成後再取消同步狀態 

 

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE

$REDISCLI SLAVEOF NO ONE >> $LOGFILE2>&1

 

redis_backup.sh

#!/bin/bash 

REDISCLI="/usr/local/redis/bin/redis-cli-a 123456"

LOGFILE="/var/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.3.4 6379 >>$LOGFILE  2>&1

 

redis_fault.sh

#!/bin/bash 

LOGFILE=/var/log/keepalived-redis-state.log

echo "[fault]" >> $LOGFILE

date >> $LOGFILE

redis_stop.sh

#!/bin/bash 

LOGFILE=/var/log/keepalived-redis-state.log

echo "[stop]" >> $LOGFILE

date >> $LOGFILE

redis_check.sh

#!/bin/bash 

ALIVE=`/usr/local/redis/bin/redis-cli -a123456 PING` 

if [ "$ALIVE" == "PONG"]; then

echo $ALIVE 

exit 0 

else

echo $ALIVE 

exit 1 

fi

Slave
/etc/keepalived/keepalived.conf

! Configuration File for keepalived

 

global_defs {

  notification_email {

    [email protected]

    [email protected]

    [email protected]

   }

  notification_email_from [email protected]

  smtp_server 192.168.200.1

  smtp_connect_timeout 30

  router_id redis02

}

 

vrrp_script chk_redis {

   script "/etc/keepalived/scripts/redis_check.sh"     ###監控腳本 

   interval 2                   ###監控時間

}

vrrp_instance VI_1 {

   state BACKUP

   interface eth0

   virtual_router_id 51

   priority 10

   advert_int 1

   authentication {

       auth_type PASS

       auth_pass 1111

    }

   track_script {

       chk_redis        ###執行上面定義的chk_redis 

    }

   virtual_ipaddress {

       192.168.3.5

    }

   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/redis_stop.sh

 

}

redis_master.sh

#!/bin/bash 

REDISCLI="/usr/local/redis/bin/redis-cli-a 123456"

LOGFILE="/var/log/keepalived-redis-state.log"

 

echo "[master]" >> $LOGFILE

date >> $LOGFILE

echo "Being master...." >>$LOGFILE 2>&1

 

echo "Run SLAVEOF cmd ...">> $LOGFILE

$REDISCLI SLAVEOF 192.168.3.3 6379 >>$LOGFILE  2>&1

sleep 10 #延遲10秒以後待數據同步完成後再取消同步狀態 

 

echo "Run SLAVEOF NO ONE cmd ...">> $LOGFILE

$REDISCLI SLAVEOF NO ONE >> $LOGFILE2>&1

redis_backup.sh

#!/bin/bash 

REDISCLI="/usr/local/redis/bin/redis-cli-a 123456"

LOGFILE="/var/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.3.3 6379 >>$LOGFILE  2>&1

redis_fault.sh

#!/bin/bash 

LOGFILE=/var/log/keepalived-redis-state.log

echo "[fault]" >> $LOGFILE

date >> $LOGFILE

redis_stop.sh

#!/bin/bash 

LOGFILE=/var/log/keepalived-redis-state.log

echo "[stop]" >> $LOGFILE

date >> $LOGFILE

redis_check.sh

#!/bin/bash 

ALIVE=`/usr/local/redis/bin/redis-cli -a123456 PING` 

if [ "$ALIVE" == "PONG"]; then

echo $ALIVE 

exit 0 

else

echo $ALIVE 

exit 1 

fi

 

4.2.3 開機啓動及防火牆

添加開機啓動

chkconfig keepalived on

 

添加防火牆

編輯/etc/sysconfig/iptables

添加:

-A INPUT -s 192.168.3.0/24 -p vrrp -jACCEPT

或者

-A INPUT -p vrrp -j ACCEPT

 

service iptables restart

/etc/rc.d/init.d/iptables save

more /etc/sysconfig/iptables

 

啓動服務

service keepalived start

 

測試服務是否正常

從另外服務器ping 192.168.3.5 是否聯通

測試redis是否正常

redis-cli -h 192.168.3.5 -p 6379 -a 123456 info

至此Redis服務器搭建及主從雙機熱備架構實現。

參考博客:
http://hao360.blog.51cto.com/5820068/1435297

發佈了193 篇原創文章 · 獲贊 115 · 訪問量 71萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章