共计 11627 个字符,预计需要花费 30 分钟才能阅读完成。
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
makeMALLOC=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 {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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 {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
notification_email_from Alexandre.Cassen@firewall.loc
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 服务器搭建及主从双机热备架构实现。
下面关于 Redis 的文章您也可能喜欢,不妨参考下:
Ubuntu 14.04 下 Redis 安装及简单测试 http://www.linuxidc.com/Linux/2014-05/101544.htm
Redis 主从复制基本配置 http://www.linuxidc.com/Linux/2015-03/115610.htm
Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm
Ubuntu 14.04 安装 Redis 与简单配置 http://www.linuxidc.com/Linux/2017-01/139075.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
CentOS 7.0 安装 Redis 3.2.1 详细过程和使用常见问题 http://www.linuxidc.com/Linux/2016-09/135071.htm
Ubuntu 16.04 环境中安装 PHP7.0 Redis 扩展 http://www.linuxidc.com/Linux/2016-09/135631.htm
Ubuntu 15.10 下 Redis 集群部署文档 http://www.linuxidc.com/Linux/2016-06/132340.htm
Redis 实战 中文 PDF http://www.linuxidc.com/Linux/2016-04/129932.htm
Redis 的详细介绍:请点这里
Redis 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-01/139793.htm