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 {
}
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 {
}
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