Twemproxy-缓存代理分片机制

2023-10-18 07:30

本文主要是介绍Twemproxy-缓存代理分片机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

资料参考:
(1) http://www.cnblogs.com/gomysql/p/4413922.html
常用命令:
nutcracker.init {start|stop|status|restart|reload|condrestart}
nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log

 

1.介绍

1.1 一句话介绍Twemproxy是一个Redis/Memcached代理中间件,可以实现诸如分片逻辑、HashTag、减少连接数等功能;尤其在有大量应用服务器的场景下Twemproxy的角色就凸显了,能有效减少连接数。

1.2 特点

Twemproxy是一种代理分片机制,由Twitter开源。

Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题,通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题

当然,Twemproxy本身也是单点,需要用Keepalived做高可用方案。

虽然使用Twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%),但是能够提高整个系统的HA也是相当划算的。

twemproxy不光实现了redis协议,还实现了memcached协议,什么意思?换句话说,twemproxy不光可以代理redis,还可以代理memcached,官方说明:

twemproxy (pronounced "two-em-proxy"), aka nutcracker is a fast and lightweight proxy for memcachedand redis protocol. It was built primarily to reduce the number of connections to the caching servers on the backend. This, together with protocol pipeling and sharding enables you to horizontally scale your distributed caching architecture.

 

Twemproxy架构:

 

 

 通常会结合keepalived来实现Twemproxy的高可用。架构图如下:



 

 

 

 

2.安装、配置与启动

 

2.1环境准备:

>>安装路径 /usr/local/twemproxy

>>需要安装autoconf、automake、libtool工具

说明:twemproxy的安装要求autoconf的版本在2.64以上,否则提示"error: Autoconf version 2.64 or higher is required"。

使用以下命令下载的autoconf版本如果小于2.64,方案如下:

(1) 查询当前版本  rpm -qf /usr/bin/autoconf

autoconf-2.63-5.1.el6.noarch

(2) 卸载当前版本  rpm -e --nodeps autoconf-2.63-5.1.el6.noarch

(3) 安装最新版本

[root@BobServerStation twemproxy]# wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.68.tar.gz

[root@BobServerStation twemproxy]# tar zxvf autoconf-2.68.tar.gz

[root@BobServerStation twemproxy]# cd autoconf-2.68

[root@BobServerStation twemproxy]# ./configure --prefix=/usr/

[root@BobServerStation twemproxy]# make && make install

 

[ubuntu]

apt-get install autoconf automake  

apt-get install libtool

 

[centos]

#autoconf这一步使用此命令装的版本是小于2.64的,需要上面的方法安装

yum -y install autoconf

yum -y install automake

yum -y install libtool

 

2.2 安装及配置

2.2.1安装

cd /usr/local

wget https://github.com/twitter/twemproxy/archive/v0.4.0.tar.gz  

tar -xvf v0.4.0.tar.gz    

cd twemproxy-0.4.0/ 

autoreconf -fvi

mkdir /usr/local/twemproxy

./configure --prefix=/usr/local/twemproxy
make -j 8
make install

注意:如上安装方式在有些服务器上可能在大量如mset时可能导致Twemproxy崩溃,需要使用如 CFLAGS="-O1" ./configure && make或CFLAGS="-O3 -fno-strict-aliasing" ./configure && make安装。

 

2.2.2配置变量

#设置环境变量:
echo "PATH=$PATH:/usr/local/twemproxy/sbin/" >> /etc/profile
source /etc/profile

 

#创建目录

cd /usr/local/twemproxy
mkdir run conf

 

#添加proxy配置文件
vi /usr/local/twemproxy/conf/nutcracker.yml

server1:
  listen: 127.0.0.1:1111
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.1.106:6379:1
   - 192.168.1.107:6379:1

   - 192.168.1.108:6379:1

 

#把conf目录复制到/usr/local/twemproxy/sbin/目录下

cp -r  /usr/local/twemproxy-0.4.0/conf /usr/local/twemproxy/sbin/

 

2.3启动及测试

(1)启动命令:nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log

Options:
-h, –help                        : 查看帮助文档,显示命令选项
-V, –version                     : 查看nutcracker版本
-t, –test-conf                   : 测试配置脚本的正确性
-d, –daemonize                   : 以守护进程运行
-D, –describe-stats              : 打印状态描述
-v, –verbosity=N                 : 设置日志级别 (default: 5, min: 0, max: 11)
-o, –output=S                    : 设置日志输出路径,默认为标准错误输出 (default: stderr)
-c, –conf-file=S                 : 指定配置文件路径 (default: conf/nutcracker.yml)
-s, –stats-port=N                : 设置状态监控端口,默认22222 (default: 22222)
-a, –stats-addr=S                : 设置状态监控IP,默认0.0.0.0 (default: 0.0.0.0)
-i, –stats-interval=N            : 设置状态聚合间隔 (default: 30000 msec)
-p, –pid-file=S                  : 指定进程pid文件路径,默认关闭 (default: off)
-m, –mbuf-size=N                 : 设置mbuf块大小,以bytes单位 (default: 16384 bytes)

 

(2)查看是否启动成功
ps -ef | grep nutcracker | grep -v grep

ps aux | grep nutcracker  

 

(3)简单测试

redis-cli  -p 1111 

127.0.0.1:1111> set i 1  

OK  

127.0.0.1:1111> get i  

"1"  

Twemproxy文档请参考https://github.com/twitter/twemproxy。到此基本的安装就完成了。接下来做一些介绍。

 

(4)配置启动/重启/停止脚本方便操作

# cp /usr/local/twemproxy-0.4.0/scripts/nutcracker.init /usr/local/twemproxy

# chmod +x /usr/local/twemproxy/sbin/nutcracker.init 

# vi /usr/local/twemproxy/sbin/nutcracker.init  

-- 将OPTIONS改为 OPTIONS="-d -c /usr/local/twemproxy/conf/nutcracker.yml"

-- 注释掉. /etc/rc.d/init.d/functions;

-- 将daemon --user ${USER} ${prog} $OPTIONS改为${prog} $OPTIONS;

-- 将killproc改为killall。

 

这样就可以使用如下脚本进行启动、重启、停止了。

nutcracker.init {start|stop|status|restart|reload|condrestart}

 

[报错]:若nutcracker没设置为全局变量,则会报此错

 nutcracker: command not found

写了全路径:/usr/local/twemproxy/run/${prog} $OPTIONS

 

 

(5)附加:(暂未实现)

Twemproxy配置成服务:

已下是相关资料:
按上面的操作步骤,Redis 的启动脚本为:/usr/local/src/redis3.0/utils/redis_init_script
将启动脚本复制到/etc/rc.d/init.d/目录下,并命名为 redis:
# cp /usr/local/src/redis3.0/utils/redis_init_script /etc/rc.d/init.d/redis
编辑/etc/rc.d/init.d/redis,修改相应配置,使之能注册成为服务:
# vi /etc/rc.d/init.d/redis


 2.4Twemproxy集群(分片)设置

一旦涉及到一台物理机无法存储的情况就需要考虑使用分片机制将数据存储到多台服务器,可以说是Redis集群;

如果客户端都是如Java没什么问题,但是如果有多种类型客户端(如PHP、C)等也要使用那么需要保证它们的分片逻辑是一样的;

另外随着客户端的增加,连接数也会随之增多,发展到一定地步肯定会出现连接数不够用的;

此时Twemproxy就可以上场了。主要作用:分片、减少连接数。另外还提供了Hash Tag机制来帮助我们将相似的数据存储到同一个分片

注:另外也可以参考豌豆荚的https://github.com/wandoulabs/codis。

 

 

>>1.基本配置

server1:
  listen: 127.0.0.1:1111
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.1.106:6379:1
   - 192.168.1.107:6379:1

   - 192.168.1.108:6379:1

 

server1:是给当前分片配置起的名字,一个配置文件可以有多个分片配置;

listen : 监听的ip和端口;

hash:散列算法;

distribution:分片算法,比如一致性Hash/取模;

timeout:连接后端Redis或接收响应的超时时间;

redis:是否是redis代理,如果是false则是memcached代理;

servers:代理的服务器列表,该列表会使用distribution配置的分片算法进行分片;

 

>>2.分片算法

  hash算法: 

    one_at_a_time

    md5

    crc16

    crc32 (crc32 implementation compatible with libmemcached)

    crc32a (correct crc32 implementation as per the spec)

    fnv1_64

    fnv1a_64

    fnv1_32

    fnv1a_32

    hsieh

    murmur

    jenkins

 

  分片算法:

    ketama(一致性Hash算法)

    modula(取模)

    random(随机算法)

 

>>3.服务器列表

  servers:

   - ip:port:weight alias

  servers:

   - 127.0.0.1:6660:1

   - 127.0.0.1:6661:1

或者

  servers:

   - 127.0.0.1:6660:1 server1

   - 127.0.0.1:6661:1 server2

 

推荐使用后一种方式,默认情况下使用ip:port:weight进行散列并分片,这样假设服务器宕机换上新的服务器,那么此时得到的散列值就不一样了,因此建议给每个配置起一个别名来保证映射到自己想要的服务器。即如果不使用一致性Hash算法来作缓存服务器,而是作持久化存储服务器时就更有必要了(即不存在服务器下线的情况,即使服务器ip:port不一样但仍然要得到一样的分片结果)。

 

>>4.一致性Hash与服务器宕机

如果我们把Redis服务器作为缓存服务器并使用一致性Hash进行分片,当有服务器宕机时需要自动从一致性Hash环上摘掉,或者其上线后自动加上,此时就需要如下配置:

#是否在节点故障无法响应时自动摘除该节点,如果作为存储需要设置为为false

auto_eject_hosts: true

#重试时间(毫秒),重新连接一个临时摘掉的故障节点的间隔,如果判断节点正常会自动加到一致性Hash环上

server_retry_timeout: 30000

#节点故障无法响应多少次从一致性Hash环临时摘掉它,默认是2

server_failure_limit: 2

 

3.HashTag

 

3.1作用

比如一个商品有:商品基本信息(p:id:)、商品介绍(d:id:)、颜色尺码(c:id:)等,假设我们存储时不采用HashTag将会导致这些数据不会存储到一个分片,而是分散到多个分片,这样获取时将需要从多个分片获取数据进行合并,无法进行mget;那么如果有了HashTag,那么可以使用“::”中间的数据做分片逻辑,这样id一样的将会分到一个分片。

 

3.2配置

# vi /usr/local/twemproxy/conf/nutcracker.yml 

nutcracker.yml配置如下

server1:
  listen: 127.0.0.1:1111
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true

  hash_tag: "::"
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.1.106:6379:1 server1
   - 192.168.1.107:6379:1 server2

   - 192.168.1.108:6379:1 server3

 

3.3 测试HashTag

redis-cli  -p 1111 

127.0.0.1:1111> set p:12: 1  

OK  

127.0.0.1:1111> set d:12: 1  

OK  

127.0.0.1:1111> set c:12: 1  

OK 

 

在我的某台服务器上:

redis-cli  -p 6660  

127.0.0.1:6660> get p:12:   

"1"  

127.0.0.1:6660> get d:12:   

"1"  

127.0.0.1:6660> get c:12:   

"1"  

 

4.支持的Redis命令

不是所有Redis命令都支持,请参考https://github.com/twitter/twemproxy/blob/master/notes/redis.md。

 

5.对于扩容最简单的办法是:

1、创建新的集群;

2、双写两个集群;

3、把数据从老集群迁移到新集群(不存在才设置值,防止覆盖新的值);

4、复制速度要根据实际情况调整,不能影响老集群的性能;

5、切换到新集群即可,如果使用Twemproxy代理层的话,可以做到迁移对读的应用透明。

 

6.twemproxy主从备份和集群相结合

6.1 设置从库

192.168.1.106:6660 为 192.168.1.106:6660的从库,配置方法见主从配置
192.168.1.107:6660 为 192.168.1.107:6660的从库,配置方法见主从配置
192.168.1.108:6660 为 192.168.1.108:6660的从库,配置方法见主从配置

 

6.2 配置nutcracker.yml

vi /usr/local/twemproxy/conf/nutcracker.yml

配置server-slave:
server-slave:
  listen: 127.0.0.1:1112
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  hash_tag: "::"
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 192.168.1.106:6660:1 server1
   - 192.168.1.107:6660:1 server2
   - 192.168.1.108:6660:1 server3
  
注:这里需写成server1 server2 server3和之前的一致

 

6.3 测试

redis-cli -p 6379 > set

redis-cli -p 6660 > get

 

============生产目标的架构=============

>>>>正经本地LocalRedis做法:106 107 108是一个主集群; 然后在116 117 118作为其从集群;需要修改:将主集群移到新的集群上面。
我的做法是:在某台新机器上,构建 6379 6660 6661作为3台分片机器,106:6379(6379从机)  107:6379(6660从机) 108:6379(6661从机)
待做

 

这篇关于Twemproxy-缓存代理分片机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/231102

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

高效+灵活,万博智云全球发布AWS无代理跨云容灾方案!

摘要 近日,万博智云推出了基于AWS的无代理跨云容灾解决方案,并与拉丁美洲,中东,亚洲的合作伙伴面向全球开展了联合发布。这一方案以AWS应用环境为基础,将HyperBDR平台的高效、灵活和成本效益优势与无代理功能相结合,为全球企业带来实现了更便捷、经济的数据保护。 一、全球联合发布 9月2日,万博智云CEO Michael Wong在线上平台发布AWS无代理跨云容灾解决方案的阐述视频,介绍了

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

【Tools】大模型中的自注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 自注意力机制(Self-Attention)是一种在Transformer等大模型中经常使用的注意力机制。该机制通过对输入序列中的每个元素计算与其他元素之间的相似性,

如何通俗理解注意力机制?

1、注意力机制(Attention Mechanism)是机器学习和深度学习中一种模拟人类注意力的方法,用于提高模型在处理大量信息时的效率和效果。通俗地理解,它就像是在一堆信息中找到最重要的部分,把注意力集中在这些关键点上,从而更好地完成任务。以下是几个简单的比喻来帮助理解注意力机制: 2、寻找重点:想象一下,你在阅读一篇文章的时候,有些段落特别重要,你会特别注意这些段落,反复阅读,而对其他部分

【Tools】大模型中的注意力机制

摇来摇去摇碎点点的金黄 伸手牵来一片梦的霞光 南方的小巷推开多情的门窗 年轻和我们歌唱 摇来摇去摇着温柔的阳光 轻轻托起一件梦的衣裳 古老的都市每天都改变模样                      🎵 方芳《摇太阳》 在大模型中,注意力机制是一种重要的技术,它被广泛应用于自然语言处理领域,特别是在机器翻译和语言模型中。 注意力机制的基本思想是通过计算输入序列中各个位置的权重,以确

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。 二、布隆过滤器原理 布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置