前言
本文主要讲述 Redis 代理 Twemproxy 安装过程。
Twemproxy 是推特开源用于 Memcached 和 Redis 的轻量级代理。这里以0.5.0版本为例。
我们可以通过取模、随机、一致性哈希等算法将数据分散在多个 Redis 服务来实现水平扩展。但是客户端直连就需要跟每个 Redis 服务产生连接,而代理的主要作用就是为了避免这一问题。客户端连接代理进行操作,让代理通过分片算法来操作对应的 Redis 服务。
准备工作
本文服务器 Linux CentOS 64 7.5 版本。
启动多个Redis服务,本文启动了两个 Redis 服务 6386 和 6387。
安装步骤
下载源码编译
- 通过Git下载
echo "安装Git如果没有的话" > /dev/null
yum -y install git
echo "创指定目录" > /dev/null
mkdir -p ~/soft/redis/twemproxy-0.5.0
echo "从 GitHub 克隆源码" > /dev/null
git clone https://github.com/twitter/twemproxy.git ~/soft/redis/twemproxy-0.5.0
- 直接下载解压,也可以去 GitHub Twemproxy Releases 下载上传到目录。
echo "下载" > /dev/null
wget -O ~/soft/redis/twemproxy-0.5.0.tar.gz https://github.com/twitter/twemproxy/archive/refs/tags/0.5.0.tar.gz
echo "解压" > /dev/null
tar -xf ~/soft/redis/twemproxy-0.5.0.tar.gz -C ~/soft/redis/
进入解压目录
cd ~/soft/redis/twemproxy-0.5.0
配置、编译,完成后可以在 src 目录下看到可执行程序 nutcracker。
echo "安装必要的工具" > /dev/null
yum install -y automake libtool
echo "配置、编译" > /dev/null
autoreconf -fvi
./configure
make
设置为系统服务
将 Twemproxy 配置为系统服务方便使用。
echo "拷贝启动脚本到 init.d 目录" > /dev/null
cp scripts/nutcracker.init /etc/init.d/twemproxy
echo "给予执行权限" > /dev/null
chmod +x /etc/init.d/twemproxy
echo "下面这些都是 nutcracker.init 会使用到的" > /dev/null
echo "拷贝可执行程序,这样在系统任意位置都可以使用 nutcracker" > /dev/null
cp src/nutcracker /usr/bin
echo "拷贝配置文件" > /dev/null
mkdir /etc/nutcracker
cp conf/* /etc/nutcracker
echo "备份配置文件" > /dev/null
cp /etc/nutcracker/nutcracker.yml /etc/nutcracker/nutcracker.yml.bak
修改配置文件
修改代理配置,去掉多余部分。
vim /etc/nutcracker/nutcracker.yml
通过配置项servers指定被代理的Redis服务,格式为 IP:端口:权重。
alpha:
listen: 127.0.0.1:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 2000
server_failure_limit: 1
servers:
- 127.0.0.1:6386:1
- 127.0.0.1:6387:1
启动/停止/查看状态
# 启动
service twemproxy start
# 停止
service twemproxy stop
# 查看状态
service twemproxy status
测试分片效果
通过代理写入数据
# 连接代理
redis-cli -p 22121
# 写入测试数据
set 1 1
# 写入测试数据
set k1 k1
另开两个 ssh 窗口分别登陆两个 Redis 服务可以看到数据分散在了两台服务上
# redis-cli -p 6387
redis-cli -p 6386
# 查看所有key
keys *
数据分片环境下聚合操作难以实现,通过 Twemproxy 执行会报错,如:
# 查看所有key
KEYS *
# 监控k1
WATCH k1
# 开启事务
MULTI