文章目录
- Redis 如何使用 Twemproxy 和 Sentinel 构建高可用集群架构?
- 配置环境
- 构建 RedisSharding1
- 安装 Redis
- 配置 RedisSharding1
- 构建 RedisSharding2
- 安装 Redis
- 配置 RedisSharding2
- 构建 Sentinel Cluster
- 配置 Sentinel
- 启动 Sentinel
- 构建 Twemproxy Cluster
- 安装 Twemproxy
- 配置 Twemproxy
- 启动 Twemproxy
- 测试 Twemproxy
- 构建 Keepalived Cluster
- 安装 Keepalived
- 配置 Keepalived
- 配置 Twemproxy 检测脚本
- 配置 Keepalived Master 节点
- 配置 Keepalived Backup 节点
- 启动 Keepalived
- 观察虚拟 IP
- 测试 Redis 的连接
- 测试虚拟 IP 的漂移
- 再次测试 Redis 的连接
- Twemproxy + Sentinel 组合架构的优点
- Twemproxy + Sentinel 组合架构的缺点
Redis 如何使用 Twemproxy 和 Sentinel 构建高可用集群架构?
使用 Sentinel 构建的主从复制架构,能够实现高可用,但是不能解决单个 Redis 节点的数据量过大的问题,如果单个 Redis 节点的数据量过大,主机内存过载,那么就需要使用 Redis 的集群架构来将数据进行分片处理,使其分布在不同的物理机上面,使其能够做到容量的扩展。
可以使用 Twemproxy + Sentinel 组合的架构方式,对 Redis 构建高可用的集群。以下图为例,开始一步一步的构建一种 Redis 的高可用集群。
配置环境
以下配置,仅仅表示我的配置环境,读者可以根据自己的环境进行配置。
注意:需要把主机的防火墙关闭。
- 四台 Linux 主机(CentOS 7 版本),ip 分别为 10.211.55.5,10.211.55.6,10.211.55.7,10.211.55.8。
- 在每台主机上安装 Redis(3.2.12 版本),可以使用 yum 进行安装。
- 在 10.211.55.6 和 10.211.55.7 主机上安装 Twemproxy(0.5.0 版本)。
- 在 10.211.55.6 和 10.211.55.7 主机上安装 Keepalved (1.3.5 版本)。
构建 RedisSharding1
在主机 10.211.55.5 和 10.211.55.6 节点上安装并配置 Redis 主从节点。
安装 Redis
请参考 Redis 如何配置读写分离架构(主从复制)?篇中的安装 Redis 步骤。
配置 RedisSharding1
# 在 10.211.55.5 主机上登陆 Redis 控制台,执行 slaveof 命令
slaveof 10.211.55.6 6379
# 或者编辑 10.211.55.5 的 /etc/redis.conf 配置文件添加如下配置
vim /etc/redis.conf
slaveof 10.211.55.6 6379
# 重启从节点 Redis 服务
systemctl restart redis
构建 RedisSharding2
在主机 10.211.55.7 和 10.211.55.8 节点上安装并配置 Redis 主从节点。
安装 Redis
请参考 Redis 如何配置读写分离架构(主从复制)?篇中的安装 Redis 步骤。
配置 RedisSharding2
# 在 10.211.55.8 主机上登陆 Redis 控制台,执行 slaveof 命令
slaveof 10.211.55.7 6379
# 或者编辑 10.211.55.5 的 /etc/redis.conf 配置文件添加如下配置
vim /etc/redis.conf
slaveof 10.211.55.7 6379
# 重启从节点 Redis 服务
systemctl restart redis
构建 Sentinel Cluster
分别在主机 10.211.55.5,10.211.55.6,10.211.55.7 上进行 Sentinel 的配置,配置步骤如下:
配置 Sentinel
# 新建配置文件,并写入下列配置
vim /etc/redis-sentinel-26379.conf
port 26379
sentinel monitor redis-sharding1 10.211.55.6 6379 2
sentinel down-after-milliseconds redis-sharding1 5000
sentinel failover-timeout redis-sharding1 60000
sentinel parallel-syncs redis-sharding1 1
sentinel monitor redis-sharding2 10.211.55.7 6379 2
sentinel down-after-milliseconds redis-sharding2 5000
sentinel failover-timeout redis-sharding2 60000
sentinel parallel-syncs redis-sharding2 1
# 保存配置并退出编辑
在上述配置文件中,sentinel 监控两个 Redis 主从节点,命名为 redis-sharding1 和 redis-sharding2。
启动 Sentinel
# 调用 Sentinel 启动命令
nohup redis-sentinel /etc/redis-sentinel-26379.conf > /dev/null 2>&1 &
构建 Twemproxy Cluster
分别在主机 10.211.55.6 和 10.211.55.7 节点安装并配置 Twemproxy Cluster。这里说 Cluster 并不妥当,实际上为主备架构。
安装 Twemproxy
# 这里将安装包下载 /opt 目录中,并进行编译安装
cd /opt
wget https://github.com/twitter/twemproxy/releases/download/0.5.0/twemproxy-0.5.0.tar.gz
tar -xvf twemproxy-0.5.0.tar.gz
cd /opt/twemproxy-0.5.0
./configure
make && make install
配置 Twemproxy
# 进入安装目录
cd /opt/twemproxy-0.5.0
# 创建配置文件,并添加如下配置
vim conf/nutcracker-redis-cluster.yml
redis-cluster:
listen: 0.0.0.0:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 10.211.55.6:6379:1
- 10.211.55.7:6379:1
启动 Twemproxy
# 启动 Twemproxy 实例
nutcracker -d -c /opt/twemproxy-0.5.0/conf/nutcracker-redis-cluster.yml
测试 Twemproxy
# 测试 10.211.55.6 主机的 Twemproxy
redis-cli -h 10.211.55.6 -p 22121
# 测试 10.211.55.7 主机的 Twemproxy
redis-cli -h 10.211.55.7 -p 22121
构建 Keepalived Cluster
分别在主机 10.211.55.6 和 10.211.55.7 节点安装并配置 Keepalived Cluster,并以 10.211.55.10 为虚拟的 ip 对外提供服务。
安装 Keepalived
yum -y install keepalived
配置 Keepalived
配置 Twemproxy 检测脚本
分别在主机 10.211.66.6,10.211.66.7 节点上配置如下 Twemproxy 的检测脚本。
# 创建 check_nutcracker.sh 脚本
mkdir /usr/local/etc/twemproxy
# 编辑 check_nutcracker.sh 文件
vim /usr/local/etc/twemproxy/check_nutcracker.sh
# 添加如下内容
#!/bin/bash
ps -C nutcracker
if [[ $? -eq 0 ]];then
exit 0
else
exit 1
fi
# 保存退出,并给该文件可执行的权限
chmod +x /usr/local/etc/twemproxy/check_nutcracker.sh
配置 Keepalived Master 节点
在主机 10.211.66.6 节点上按照如下要求配置 Master 节点
# 在 /etc/keepalived 目录中创建 keepalived-twemproxy.conf 配置文件
vim /etc/keepalived/keepalived-twemproxy.conf
# 写入如下配置
global_defs {
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user root
enable_script_security
}
vrrp_script check_nutcracker {
script "/usr/local/etc/twemproxy/check_nutcracker.sh"
interval 10
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 47
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.211.55.10
}
track_script {
check_nutcracker
}
}
配置 Keepalived Backup 节点
在主机 10.211.66.7 节点上按照如下要求配置 Backup 节点
# 在 /etc/keepalived 目录中创建 keepalived-twemproxy.conf 配置文件
vim /etc/keepalived/keepalived-twemproxy.conf
# 写入如下配置
global_defs {
vrrp_garp_interval 0
vrrp_gna_interval 0
script_user root
enable_script_security
}
vrrp_script check_nutcracker {
script "/usr/local/etc/twemproxy/check_nutcracker.sh"
interval 10
weight -10
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 47
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
10.211.55.10
}
track_script {
check_nutcracker
}
}
注意:在配置 Keepalived 节点时,需要关注网卡接口名,也就是上述配置的 interface 后面的值,可以使用 ifconfig 自行查看。
启动 Keepalived
分别在主机 10.211.66.6,10.211.66.7 节点上执行如下命令启动 Keepalived。
keepalived -f /etc/keepalived/keepalived-twemproxy.conf
# 可以通过 tail -f /var/log/messages 观察 Keepalived 日志
观察虚拟 IP
# 在 10.211.66.6 执行如下命令
ip a
# 可以看到虚拟 ip(10.211.55.10) 在 10.211.66.6 节点上面
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
inet 10.211.55.6/24 brd 10.211.55.255 scope global noprefixroute dynamic eth0
valid_lft 1302sec preferred_lft 1302sec
inet 10.211.55.10/32 scope global eth0
valid_lft forever preferred_lft forever
...
# 在 10.211.66.6 执行如下命令,发现没有虚拟 ip
ip a
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
inet 10.211.55.7/24 brd 10.211.55.255 scope global noprefixroute dynamic eth0
valid_lft 1249sec preferred_lft 1249sec
...
测试 Redis 的连接
redis-cli -h 10.211.55.10 -p 22121
测试虚拟 IP 的漂移
通过虚拟 ip 地址的漂移,来达到 Twemproxy 的高可用。可以通过如下命令来进行模拟
# 在 10.211.66.6 节点执行如下命令:
pkill -9 -f nutcracker
# 在 10.211.66.6 执行 ip a,可以观察到 10.211.66.10 地址已经漂移走了
ip a
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
inet 10.211.55.6/24 brd 10.211.55.255 scope global noprefixroute dynamic eth0
valid_lft 1458sec preferred_lft 1458sec
...
# 在 10.211.66.7 执行 ip a,可以观察到 10.211.66.10 地址已经漂移过来
ip a
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
...
inet 10.211.55.7/24 brd 10.211.55.255 scope global noprefixroute dynamic eth0
valid_lft 1733sec preferred_lft 1733sec
inet 10.211.55.10/32 scope global eth0
valid_lft forever preferred_lft forever
...
再次测试 Redis 的连接
# 执行如下命令,发现 Redis 的连接依然可用
redis-cli -h 10.211.55.10 -p 22121
Twemproxy + Sentinel 组合架构的优点
- 通过 Sentinel 能够做到 Redis 节点的失效救援。
- 配置简单且 Twemproxy 具有高并发的能力。
- 能够均衡 Redis 的负载,提高 Redis 的吞吐能力。
- 通过 Twemproxy 配置多个 Redis 节点,能够显著提高单节点容量的限制。
Twemproxy + Sentinel 组合架构的缺点
- Twemproxy 实际上会给 Redis 带来一定的性能损耗。
- Twemproxy 无法很好解决 Redis 扩容的问题,添加或者减少 Redis 节点时,不能够自动进行节点数据的再分配。
- 需要使用 Keepalived 来解决 Twemproxy 单点的问题,给系统增加了复杂度。