# 138. 商品详情页动态渲染系统:redis 复习以及 twemproxy 基础知识讲解

# 部署 redis

本次使用 redis-2.8.19.tar.gz,关于该版本过旧问题:实际在做类似这种 nginx+lua 生产环境的部署的时候,不一定用最新的版本就是最好,老版本一般比较稳定,nginx+lua 整合用老点的版本,会比较保险一些

cd /usr/local/redis-test
tar -zxvf redis-2.8.19.tar.gz
cd redis-2.8.19
make
nohup /usr/local/redis-test/redis-2.8.19/src/redis-server /usr/local/redis-test/redis-2.8.19/redis.conf &

# 查看 redis 进程
ps -aux | grep redis

# 连接该实例
/usr/local/redis-test/redis-2.8.19/src/redis-cli -p 6379

# 简单测试是否正常存取值
set k1 v1
get k1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# twemproxy 部署

不要使用自动安装,因为对版本有要求,自动安装的版本过低

yum install -y autoconf automake libtool
# 由于对版本有要求,所以这里还是需要自己手动安装
yum remove -y autoconf --直接将 autoconf 和 automake、libtool 都删除掉了
1
2
3

安装到 /usr/local/twemproxy-test 目录下

cd /usr/local/twemproxy-test
# 依赖安装
wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar -zxvf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure --prefix=/usr
make && make install

wget http://ftp.gnu.org/gnu/automake/automake-1.14.tar.gz
tar -zxvf automake-1.14.tar.gz
cd automake-1.14
./bootstrap.sh
./configure --prefix=/usr
make && make install

wget http://ftpmirror.gnu.org/libtool/libtool-2.4.2.tar.gz
tar -zxvf libtool-2.4.2.tar.gz
cd libtool-2.4.2
./configure --prefix=/usr
make && make install

# twemproxy 安装
tar -zxvf twemproxy-0.4.0.tar.gz
cd twemproxy-0.4.0
autoreconf -fvi
./configure && make

# 修改配置文件
cd /usr/local/twemproxy-test/twemproxy-0.4.0/conf/
# 先备份一下原始配置文件
mv nutcracker.yml nutcracker.back.yml
vi nutcracker.yml
# 将一下内容写入新建的 nutcracker.yml 文件中,配置什么意思先不要管,后续会讲解
server1:  
  listen: 127.0.0.1:1111  
  hash: fnv1a_64  
  distribution: ketama  
  redis: true  
  servers:  
   - 127.0.0.1:6379:1

# 启动:-d 后台启动 -c 指定配置文件
/usr/local/twemproxy-test/twemproxy-0.4.0/src/nutcracker -d -c /usr/local/twemproxy-test/twemproxy-0.4.0/conf/nutcracker.yml

# 查看启动进程
ps -aux | grep nutcracker

# 使用 redis-cli 连接到 tewmproxy 中间件
/usr/local/redis-test/redis-2.8.19/src/redis-cli -p 1111  

get k1
set k1 v2
get k1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53

# redis 复习

这里的复习,本人未练习,之前讲过的

# redis 部分配置

redis.conf

port 6379
logfile ""
maxmemory 100mb
maxmemory-policy volatile-lru
maxmemory-samples 10
1
2
3
4
5
6
7

# redis 主从

# 两份文件分别将端口设置为 6379 和 6380
cp redis.conf redis_6379.conf
cp redis.conf redis_6380.conf

# 分别启动两个 redis 实例
nohup /usr/local/redis-2.8.19/src/redis-server  /usr/local/redis-2.8.19/redis_6379.conf &  
nohup /usr/local/redis-2.8.19/src/redis-server  /usr/local/redis-2.8.19/redis_6380.conf &
ps -aux | grep redis

# 通过从实例客户端挂载主从
/usr/local/redis-2.8.19/src/redis-cli  -p 6380
slaveof 127.0.0.1 6379
info replication

# 测试注册是否正常
/usr/local/redis-2.8.19/src/redis-cli -p 6379
set k2 v2

/usr/local/redis-2.8.19/src/redis-cli -p 6380
get k2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# twemproxy 讲解

eshop-detail-test:  
  listen: 127.0.0.1:1111  
  hash: fnv1a_64  
  distribution: ketama  
  timeout: 1000  
  redis: true  
  servers:  
   - 127.0.0.1:6379:1 test-redis-01
   - 127.0.0.1:6380:1 test-redis-02
1
2
3
4
5
6
7
8
9
  • eshop-detail-test:redis 集群的逻辑名称

  • listen:twemproxy 监听的端口号

  • hash:hash 散列算法

  • distribution:分片算法:有一致性 hash、取模等

  • timeout:与 redis 连接的超时时长

  • redis:true 为 redis,否则是 memcached

  • servers:redis 实例列表

    一定要加别名,否则默认使用 ip:port:weight 来计算分片,如果宕机后更换机器,那么分片就不一样了,因此加了别名后,可以确保分片一定是准确的

你的客户端,java/nginx+lua,连接 twemproxy 写数据的时候,twemproxy 负责将数据分片,写入不同的 redis 实例

如果某个 redis 机器宕机,需要自动从一致性 hash 环上摘掉,等恢复后自动上线,可以使用以下配置

auto_eject_hosts: true
server_retry_timeout: 30000
server_failure_limit: 2
1
2
3
  • auto_eject_hosts:自动摘除故障节点
  • server_retry_timeout:每隔 30 秒判断故障节点是否正常,如果正常则放回一致性 hash 环
  • server_failure_limit:多少次无响应,就从一致性 hash 环中摘除

关于一致性 hash 前面也讲解过了