Redis分片代理twemproxy快速搭建 | twemproxy Demo | twitter/ twemproxy 避坑指南 | autoconf-2.69下载
前言
1.代理分类
面对高可用、高扩展、易维护,用一款redis代理都是上佳的选择。
redis代理主要有:predixy、twemproxy、codis、redis-cerberus。
2.性能优劣
a)作为代理,四者在高性能这方面,都是牛逼class。
b)相对而言 predixy的功能更为强大一点,当数据量达到16KB时,因redis-benchmark本身成为瓶颈,predixy和twemproxy成绩差不多了。在延时上,codis由于语言的问题,略逊一筹。
3.本文重点介绍twemproxy的快速搭建
安装过程遇到的坑,下述步骤中大部分已为你躲过,总体步骤都比较简单、容易理解。
注:如感觉篇幅过长,建议先看右侧大纲,然后只看自己感兴趣的片段即可。附注:predixy快速搭建,避坑指南
本文以CentOS6.5+Redis5.0.4为蓝本做的介绍,中间过程也有切换到 CentOS7.9+Redis6.2.6,经对比发现,高版本的搭建工作更为省力,不需要抽出精力去解决版本升级和依赖关系。无论你采用哪个版本,总体框架不变。
4.官网安装步骤总览
预览官网总体安装步骤,做到心中有数。官网:https://github.com/twitter/twemproxy
一、准备工作
1.实验环境,redis实例的准备(6379和6380)
如需帮助,可参考下文:
1.Redis安装部署 | CentOS6.5+Redis5.0.4 ,第二章-->第7小节
2.Redis安装部署 | CentOS7.9+Redis6.2.6,第三章
2.twemproxy的获取和解压
源码网站:https://github.com/twitter/twemproxy
1.方法一,git clone命令直接获取
如上图所示,复制源码下载地址:https://github.com/twitter/twemproxy.git
#yum install git 安装git命令
#yum update nss 更新nss命令,否则可能导致无法下载twemproxy源码。中间会停顿一下,直接输入员Y,同意
#cd && cd mypackage 切换到自己创建的软件源码下载目录
#git clone https://github.com/twitter/twemproxy.git
注:如果是在CentOS7.9,上面的步骤会执行的很顺利,如果是在CentOS6.5,等较低的版本,这个步骤,就足够喝一壶,主要是yum源配置和升级nss。否则无法通过git clone命令获取源码。
如果想快速通过这个步骤,请采取下面的方法二!
2.方法二,获取zip压缩包,手动解压
如上图所示,点击Download ZIP,下载到本地后,通过Xshell的Xftp或者lrzsz命令的rz命令上传到linux即可,具体入下。
#cd && cd mypackage 切换到自己创建的软件源码下载目录
#rz 此时会弹出一个上传界面(lrzsz命令,需要提前安装,也可以用xshell自带的上传工具上传)
#ls
redis-5.0.4.tar.gz twemproxy-master.zip
#unzip twemproxy-master.zip -d /usr/src 解压到指定位置
#cd /usr/src/ && ls 切换到解压目录
#mv twemproxy-master twemproxy 给源码包重命名
#cd twemproxy && ls 里面有个Makefile.am,下面的步骤需要根据官网提示,继续操作
3.twemproxy的依赖包的更新
官网地址:https://github.com/twitter/twemproxy ,具体提示在Build下面。
1.根据官网提示,安装automake和libtool
#yum install automake libtool -y
注:本步骤的安装,需提前配置好本地yum源,否则可能难以顺利安装。
2.下载并安装高版本的autoconf
#cd /usr/src/twemproxy && ls
#autoreconf -fvi 会被提示autoconf版本过低,需升级到高版本
#yum search autoconf 搜索一下
如上图所示,搜到的最高版是autoconf213,那么恭喜你,这又是一个坑,最少要搜到autoconf218版本才可以。既然没搜到,要么花费大把时间修改配置yum源配置,反复尝试,要么先独辟蹊径。
蹊径如下:autoconf官方主页;下载地址:autoconf-2.69.tar.xz
#cd && cd mypackage 切换到自己安装包下载目录
#wget ftp://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.xz 下载到linux本地
#ls
autoconf-2.69.tar.xz
下面的步骤是解压并手动安装依赖包
#xz -d autoconf-2.69.tar.xz 解压.xz文件
#tar -xf autoconf-2.69.tar -C /usr/src 继续解压tar到指定位置
#cd /usr/src/autoconf-2.69/ && ls 切换到解压目录
#./configure 检查
#make install 至此完成autoconf高版本的安装 ,下面就可以愉快的玩耍了
二、编译、安装、配置twemproxy
1.运行autoreconf -fvi命令,生成绿色的configure文件
#cd /usr/src/twemproxy/ && ls
#autoreconf -fvi 编译,使之生成configure文件
2.在twemproxy解压目录,进行make编译安装到/usr/local下
注:编译前,在回顾一下官方提示,加深一下印象
官网地址:https://github.com/twitter/twemproxy
具体提示如下:在Build栏目的中间位置
$ git clone git@github.com:twitter/twemproxy.git
$ cd twemproxy
$ autoreconf -fvi
$ ./configure --enable-debug=full
$ make
$ src/nutcracker -h
注:下面的安装过程,略加改进,更贴合我们的实战。
#cd /usr/src/twemproxy/ && ls
#./configure --prefix=/usr/local/twemproxy 检查并指定安装位置
#make -j 8 开始编译
#make install 完成安装
温馨小提示:此处的prefix不能是大写,否则会报错。
#cd /usr/src/twemproxy/ && ls
#ls src 如下图所示,可以看到一个绿色的nutcracker文件,它是启动命令
nutcracker
#ls /usr/local/twemproxy 如果能看到如下目录,说明已安装完毕
bin include lib sbin share
3.配置环境变量
#vim /etc/profile 配置环境变量
export REDIS_HOME=/usr/local/redis5
export TWEMPROXY_HOME=/usr/local/twemproxy
export PATH=$PATH:$REDIS_HOME/bin:$TWEMPROXY_HOME/sbin
把TWEMPROXY_HOME目录,追加到PATH尾部,中间用英文的冒号分隔。
#source /etc/profile 重新编译环境变量
#echo $PATH 打印环境变量
/usr/local/redis5/bin:/usr/local/twemproxy/sbin
4.对twemproxy进行test_all测试
#cd /usr/src/twemproxy/src && ls 切换到源码目录的src目录下
#./test_all 执行测试
5.最后的配置(为让其更流畅的运行)
#cd /usr/src/twemproxy/ && ls 大概看一下,源码目录下的主要文件夹 conf / src /script
1.查看源码目录下scripts中的nutcracker.init,据此进行后面的配置
#cd /usr/src/twemproxy/scripts/ && ls
#vim nutcracker.init 查看配置文件内容
2.把script目录中的nutcracker.init复制到/etc/init.d下,并重命名为twemproxy
#cd /usr/src/twemproxy/scripts/ && ls
#cp nutcracker.init /etc/init.d/twemproxy 复制配置文件,并重命名
#cd /etc/init.d & ls 查看预启动程序列表
#chmod +x twemproxy 给文件添加x执行权限
#ls
#vim twemproxy 再次回顾配置文件,看一下里面期望我们做的配置
OPTIONS="-d -c /etc/nutcracker/nutcracker.yml"
很明显,配置文件希望在/etc下有个nutcracker目录,并且目录中有一个yml的配置文件,这个yml配置文件,在源码目录的conf目录中已经提供,需要后面稍微修改一下。
3.按配置文件nutcracker.init要求,创建目录并修改配置
根据原码目录中script目录中的nutcracker.init 文件内容提示:
OPTIONS="-d -c /etc/nutcracker/nutcracker.yml"
1.复制配置文件到etc下
#mkdir /etc/nutcracker 用于存放twemproxy中复制过来的conf文件
#cd /usr/src/twemproxy/conf && ls 查看源码目录,默认配置文件列表
#cp ./* /etc/nutcracker 把当前目录的所有文件复制一份到etc目录下
#cd /etc/nutcracker && ls
nutcracker.leaf.yml nutcracker.root.yml nutcracker.yml
2.nutcracker.init文件中的提示,把nutcracker.yml文件重新配置
参考地址:https://github.com/twitter/twemproxy,具体在configure栏目位的代码。
通过查看,可以得知该nutcracker.yml配置文件内容和官网configure栏目,底部位置命令一致
#cd /etc/nutcracker && ls
#cp nutcracker.yml nutcracker.yml.bak 修改前,先做一个备份
#vim nutcracker.yml ,删除掉底部的栏目,仅保留顶部的一部分,并添加6380服务器。
注:这里后台有几台服务器,就可以配置几台。
alpha:listen: 127.0.0.1:22121hash: fnv1a_64distribution: ketamaauto_eject_hosts: trueredis: trueserver_retry_timeout: 2000server_failure_limit: 1servers:- 127.0.0.1:6379:1- 127.0.0.1:6380:1
需重点记忆22121端口和下面的服务器IP+端口配置, 稍后启动twemproxy要用到22121端口。
4.把twemproxy的src目录下的可执行程序nutcracker,复制一份到/usr/bin下
#cd /usr/src/twemproxy/src && ls 切换到源码目录,可执行文件所在目录
#cp nutcracker /usr/bin 把可执行文件复制一份到/usr/bin下,便于任何目录都可调用该命令
至此,在任何位置都可以使用nutcracker这个命令了
#nutcracker 敲击完前几个字母,tab键可以自动补全
#service twemproxy start
#service twemproxy stop 可以任性的启动和停止该程序了
三、演示twemproxy的使用
1.创建redis-sever服务的持久化目录
1.关闭原有的redis-server服务
#service redis_6379 stop
#service redis_6380 stop
#service redis_6381 stop
#ps -ef | grep redis 没有再展示redis进程,说明都被关闭了
root 20466 20265 0 09:33 pts/2 00:00:00 grep redis
注:不提前关闭,会影响下面的操作,还要回头处理这些问题。
2.创建6379和6380的持久化目录
#cd && mkdir data && cd data && mkdir 6379 6380 创建新的持久化目录
注:手动启动redis-server后,它自动会把当前所在目录当做持久化目录。
2.分别开启新窗口,启动redis6379和redis6380的服务
1.新开窗口启动6379
#cd /root/data/6379
#redis-server --port 6379 切换到6379目录下,启动redis
2.新开窗口启动6380
#cd /root/data/6380
#redis-server --port 6380 切换到6380目录下,启动redis
3.在新窗口启动twemproxy(nutcracker)服务
#service twemproxy start 注:twemproxy是/etc/init.d下面的命令
#cd /etc/nutcracker && ls
#vi twemproxy.yml 查看它的代理端口号22121alpha:
listen: 127.0.0.1:22121
4.根据代理端口号22121,启动redis-cli客户端,并设值
#redis-cli -p 22121 此时redis连接的是代理服务器
127.0.0.1:22121> set k1 aaa 注:如果此时,提示报错,就Ctrl+C,停掉服务,查看有哪些redis在运行
OK
127.0.0.1:22121> set k2 bbb
OK
127.0.0.1:22121> set k3 ddd
OK
127.0.0.1:22121>
5.分别在新窗口进入redis-cli 6379客户端、6380客户端,查看key的分布情况
1.在新窗口,开启redis6379端口的客户端,查看keys的分布
#redis-cli -p 6379 新开窗口打开6379客户端
keys * 发现没有任何key
(empty list or set)
127.0.0.1:6379> get k1
(nil)
127.0.0.1:6379>
2.在新窗口,开启redis6380端口的客户端,查看keys的分布
#redis-cli -p 6380
127.0.0.1:6380> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6380> get k1
"aaa"
127.0.0.1:6380> get k2
"bbb"
127.0.0.1:6380>
3.小反思
最终发现,在代理端口22121端口设置的几个redis key都落到6380服务器了,6379上没有数据
那么下面就切回,22121客户端再次设置新的key,看是否会落在6379。
6.在22121端口的redis客户端重新赋值,再次查看keys的分布
1.在redis代理端口22121,继续设值key
127.0.0.1:22121> set 1 sdfsdf 注:这里的key是特意设置为1的,否则可能看到key一直会落在6380上。
OK
127.0.0.1:22121> set k4 eee
OK
127.0.0.1:22121> set k5 fff
OK
127.0.0.1:22121> set str hello
OK
127.0.0.1:22121> set num 555
OK
127.0.0.1:22121>
2.切回redis6379客户端,查看keys的分布
127.0.0.1:6379>keys *
1) "1"
127.0.0.1:6379>
发现在22121新增的key,只有一个key为1的落到6379redis服务器了。
注:这是经过返回验证的结果,新增的key会优先落到6380服务器,原因有待深究。
3.切回redis6380客户端,查看keys的分布
127.0.0.1:6380> keys *
1) "k4"
2) "num"
3) "str"
4) "k5"
5) "k1"
6) "k2"
7) "k3"
127.0.0.1:6380>
7.代理端口22121的redis屏蔽了一些命令,比如keys*,且不支持事务
127.0.0.1:22121> keys * 因为有多个key都在不同的节点的服务器上,和主从复制还是很不一样的
Error: Server closed the connection
127.0.0.1:22121> watch k1
Error: Server closed the connection
127.0.0.1:22121> multi 所有的指令发散到不同的机器了,不支持事务,因为数据分制了(不像主从复制那样,每台机器数据都一样)
Error: Server closed the connection
127.0.0.1:22121>
8.收尾工作,关闭掉新开启的代理和客户端
127.0.0.1:22121> exit
127.0.0.1:6380> exit
127.0.0.1:6379> exit
#service twemproxy stop 关闭掉代理
#service redis_6379 stop
#service redis_6380 stop
四、总结
1.前台用户,对后台有多少台redis服务提供服务是无感的,只知道代理端口22121这条redis客户端服务
对客户端来说,客户端只知道一台22121端口的redis客户端在提供服务,不应该知道6379、6380的存在。
2.通过上述实验,发现通过代理端口22121落地的新数据,在后台服务器,并不是均匀或者等量分布的
3.代理端口22121的redis屏蔽了一些命令,比如keys*,且不支持事务。
五、附注:Twemproxy的实现原理和参数介绍
1.Twemproxy的实现原理
Twemproxy是一种代理分片机制,由Twitter开源,主要用于精简前端的操作,对外只有1个或少量的端口,按照路由规则,转发给后台的各个Redis或memcached服务器,再原路返回。
Twemproxy本身也是单点,如需高可用,可通过Keepalived来水平扩张redis或memcached服务,可以有效的避免单点故障问题。
2.Twemproxy的参数介绍
原文地址:https://github.com/twitter/twemproxy ,Help这个位置,具体如下。
-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)
尾言
至此,所有搭建和实验工作完毕,希望能对爱学习的你有所启发和帮助!奥利给!
Redis分片代理twemproxy快速搭建 | twemproxy Demo | twitter/ twemproxy 避坑指南 | autoconf-2.69下载相关推荐
- 如何快速申请软件著作权,教你避坑!!!
[软著]30天快速申请软件著作权,教你避坑!!! 现在好多人不知道怎么申请软著,很多是通过找代理公司进行操作,这样既浪费钱,也浪费时间,而且根据最新的政策,软著申请是不需要钱的,本人亲自申请了一个软著 ...
- Hi3861开发环境搭建 ||避坑指南|| [适用于几乎所有以Hi3861为主控的开发板]
Hi3861开发环境搭建 ||避坑指南|| [适用于几乎所有以Hi3861为主控的开发板] 前言: 这几天为了搭建Hi3861的开发环境,看了不少官方文档和视频,但是依然折腾了很久才配置好编译.上传都 ...
- ELK学习3_使用redis+logstash+elasticsearch+kibana快速搭建日志平台
日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日志详情 监控系统的运行状况 统计分析,比如接口的调用次数.执行时间.成功率等 异常数 ...
- Docker中搭建redis分片集群,搭建redis哨兵结构,实现springboot中对redis分片集群、哨兵结构的访问,Redis缓存雪崩、缓存击穿处理(非关系型数据库技术课程 第十二周)
文章目录 一.要求: 二.知识总结 缓存雪崩 解决方案 docker中redis分片集群搭建 配置好配置文件 redis-6380.conf redis-6381.conf redis-6382.co ...
- 云环境 Open代理 server 快速搭建指南
云环境 OpenVPN server 快速搭建指南 一. 配置前提 需要一台 Linux 服务器. 服务器需要有公网 IP 地址,并且记住对应的网卡编号(例如: eth1 之类的). 服务器开放 44 ...
- 搭建JIRA避坑指南
JIRA对工作效率的帮助不用解释.新的工作需要为自己搭建JIRA.遇到若干坑,然后一步一步避坑.记录如下: 1.Mysql的下载与安装: windows版mysql8.0安装详解_Zn昕的博客-CSD ...
- Pinpoint【环境搭建 01】JDK\HBase\Pinpoint Collector+Web 最新版 2.3.3 安装配置运行验证及脚本文件分享(避坑指南捷径指北)
本文主要是介绍 Pinpoint 环境的部署,小伙伴儿们也可以参考 Pinpoint <官网>的<快速入门>手册,最新版本v2.3.3组件可到官方<GitHub仓库> ...
- 避坑指南:Kafka集群快速扩容的方案总结
什么是数据迁移 Apache Kafka 对于数据迁移的官方说法是分区重分配.即重新分配分区在集群的分布情况.官方提供了kafka-reassign-partitions.sh脚本来执行分区重分配操作 ...
- Win10下快速复现Mask_RCNN避坑指南
硬件环境:笔记本电脑win10系统.1050Ti显卡 软件环境:Anaconda.Pycharm 项目地址:https://github.com/matterport/Mask_RCNN 一.环境搭建 ...
最新文章
- 关于Lucene的自定义Sort排序
- Filter:过滤器
- L2-002 链表去重-团体程序设计天梯赛GPLT
- POPUP_TO_CONFIRM_STEP
- 红帽启动apache服务器_redhat 启动ssh服务器
- 句柄 matlab_matlab 整车仿真
- [XSY] 字符串题(字符串,构造)
- mybatis源码深度解析_30天消化MyBatis源码解析笔记,吊打面试官,offer接到手软
- unity3d shader 自定义光照函数
- cad灯具图标_灯具在CAD中怎么表示出来 都代表哪种灯 谢谢
- Android中实现双指缩放的功能
- 2021年2月28日【Jiawei_Z】Ethercat的整个实现过程(举例:Lan9252)
- 呼叫中心系统智能排队功能转接流程
- 关于SQL数据表存储过程表名前缀换成dbo代码
- Typora快捷键全
- 【Java基础学习】Java基础中容易忽略点-2
- 高音质游戏无线蓝牙耳机推荐,低延迟吃鸡王者兼容无压力
- 毫无保留的共享经济,这场开源盛会你不能错过!
- 2D/3D文档查看器ABViewer v12大大提高了PDF转DWG的速度
- inkscape如何裁剪_科学网—如何在Inkscape图中输入LaTeX公式? - 李金磊的博文
热门文章
- 300-700题红题第二题
- c++ win窗口消息演示
- 详解JS原型与原型链
- scrcpy 投屏电脑能正常显示,但是没法用鼠标操作
- iOS平台的应用程序调试与分析
- JavaScript split() 方法:把一个字符串分割成字符串数组
- check_hostname requires server_hostname
- 胡汉三又回来了:“门头沟”CEO在日本注册新公司
- mysql contains函数用法_Oracle 中Contains 函数的用法有哪些
- 微信不仅可以关闭朋友圈,还可以关闭这些功能