千家信息网

Twemproxy测试Redis分片主从架构

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,Twemproxy 测试架构1、twemproxy是twitter开发的一个redis代理proxy。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免redis单点故障
千家信息网最后更新 2025年02月01日Twemproxy测试Redis分片主从架构

Twemproxy 测试架构

1、twemproxy是twitter开发的一个redis代理proxy。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免redis单点故障问题。

使用Twemproxy 对硬件资源配置较高;在redis性能有一定的损失(twitter测试约20%)用于提高整个系统的HA;

2、twemproxy部署简单快捷;可以直接在proxy进行读写、并转发请求给后端的redis;但是不适合超大流量系统。做的时候把应用分开、使用LVS集群:实现twemproxy的负载均衡,提高proxy的可用性和可扩张能力;

优点:

轻量级的Redis和memcached代理。使用它可以减少缓存服务器的连接数,并且利用它来作分片,性能损耗不会多于20%。其实是因为用了pipeline.首先redis是支持使用pipeline批处理的。

twemproxy与每个redis服务器都会建立一个连接,每个连接实现了两个FIFO的队列,通过这两个队列实现对redis的pipeline访问。将多个客户端的访问合并到一个连接,这样既减少了redis服务器的连接数,又提高了访问性能。

缺点:

虽然可以动态移除节点,但该移除节点的数据就丢失了。redis集群动态增加节点的时候,twemproxy不会对已有数据做重分布.maillist里面作者说这个需要自己写个脚本实现性能上的损耗.

twemproxy- nutcracker:

ip:10.207.101.101

ip:10.207.101.102

VIP:10.207.101.100

HA- keepalived

ip:10.207.101.101

ip:10.207.101.102

VIP:10.207.101.100

Redis

IP: 10.207.101.101

Port:6001/6002/6003

IP: 10.207.101.102

Port:6001/6002/6003

3、部署

wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz

wget https://codeload.github.com/twitter/twemproxy/zip/master

yum install gcc gcc-c++ tcl ruby -y

tar -xf autoconf-2.69.tar.gz

cd autoconf-2.69/

./configure

make &&make install


unzip unzip master.zip

cd twemproxy-master

autoreconf -fvi

./configure --enable-debug=full

make

make install


4、配置示例:

# vim /etc/nutcracker.yml

alpha:

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: --两台redis服务器的地址和端口

- 10.207.101.101:6001:1

- 10.207.101.102:6001:1

 #配置都是redis master地址

注意:


    1. .yml 配置文件中每个参数值对分隔符":"后需要有一个空格

    2. 不同层次的参数需要缩进区分,最好使用tab键缩进,否则nutcracker进程不能启动。

    3. 在auto_eject_hosts: true的时候,关闭一个redis实例后,写入数据还是提示"(error) ERR Connection refused"。这个与server_retry_timeout参数设置太小有关,默认值30000msec是一个很好的选择。

5、启动Twemproxy服务

nutcracker -t nutcracker.yml

检测配置语法真确会显示OK .


# nutcracker -t twemproxy/conf/nutcracker.yml

nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok


web界面运行启动服务的http://ip:22222查看;

可以使用nc命令查看 Twemproxy 状态语句:

# nc 10.207.101.101 22222|python -mjson.tool


6、设置启动

# cat start.sh

nutcracker -d -c /opt/twemproxy-master/conf/nutcracker.yml -p /opt/twemproxy-master/run/redisproxy.pid -o /opt/twemproxy-master/run/redisproxy.log

nutcracker 用法与命令选项

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)



# cat stop.sh

ps -ef | grep redis | grep -v grep | awk '{print $2}' | sed -e "s/^/kill -9 /g" | sh -


7、检测进程

ps -ef | grep nutcracker | grep -v grep



8、keepalived 部署 HA 静态路由单点故障;

yum install keepalived -y


# cat /etc/keepalived/keepalived.conf

! Configuration File for keepalived

global_defs {

router_id LVS_DEVEL

}


vrrp_script check_twem {

# script "killall -0 redis"

script "/etc/keepalived/check_twem.sh"

interval 2

weight -3

fall 3

rise 2

}


vrrp_instance VI_1 {

state MASTER

interface eth0

virtual_router_id 51

priority 100

advert_int 1

authentication {

auth_type PASS

auth_pass 1111

}

virtual_ipaddress {

172.27.101.100/24 dev eth0 label eth0:1

}

track_script {

check_twem

}

}


virtual_server 172.27.101.100 22121 {

delay_loop 6

protocol TCP

real_server 172.27.101.101 22121 {

weight 1

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

real_server 172.27.101.102 22121 {

weight 1

TCP_CHECK {

connect_timeout 3

nb_get_retry 3

delay_before_retry 3

connect_port 80

}

}

}



9、nutcracker 进程检测 - 脚本check_twem.sh

# cat /etc/keepalived/check_twem.sh

#!/bin/bash

twem=$(ps -C nutcracker --no-heading|wc -l)

if [ "${twem}" = "0" ]; then

sh /opt/twemproxy-master/start.sh

sleep 2

twem=$(ps -C nutcracker --no-heading|wc -l)

if [ "${twem}" = "0" ]; then

/etc/init.d/keepalived stop

fi

fi


10、Set测试:

通过twemproxy测试:

# redis-cli -h 172.27.101.100 -p 22121 -c 11 -t set -d 11 -l -q

SET: 38167.94 requests per second

直接对后端redis测试:

# redis-cli -h 172.27.101.101 -p 6001 -c 11 -t set -d 11 -l -q

直接对后端redis测试

# redis-cli -h 172.27.101.102 -p 6001 -c 11 -t set -d 11 -l -q

SET: 53191.49 requests per second


11、Get测试:

通过twemproxy测试:

# redis-cli -h 172.27.101.100 -p 22121 -c 11 -t get -d 11 -l -q

GET: 37453.18 requests per second

直接对后端redis测试:

# redis-cli -h 172.27.101.101 -p 22121 -c 11 -t get -d 11 -l -q

GET: 62111.80 requests per second

查看键值分布:

# redis-cli info|grep db0

db0:keys=51483,expires=0,avg_ttl=0

# redis-cli info|grep db0

db0:keys=48525,expires=0,avg_ttl=0



12、redis-cli 基本操作;

Redis 模糊搜索

keys *

select 2


删除所有以user开头的key 可以这样实现:

# redis-cli keys "user*"

1) "user1"

2) "user2"

# redis-cli keys "user*" | xargs redis-cli del

(integer) 2

# 删除成功


# 批量删除匹配通配符的key用到了Linux中的管道和xargs参数:

redis-cli keys "s*" | xargs redis-cli del


# 如果需要制定数据库,需要用到 -n 数据库编号 参数,下面是删除2数据库中s开头的键:

redis-cli -n 2 keys "s*" | xargs redis-cli -n 2 del


redis-cli keys "*" | xargs redis-cli del

# 如果redis-cli没有设置成系统变量,需要指定redis-cli的完整路径

# 如:/opt/redis/redis-cli keys "*" | xargs /opt/redis/redis-cli del


# 删除当前数据库中的所有Key

flushdb

# 删除所有数据库中的key

flushall


13、测试问题

read, writev and mbuf

所有的请求和响应都在mbuf里面,mbuf默认大小是16K(512b-16M),可以使用-m or -mbuf-size=N来配置,每一个连接都会获得至少一个mbuf,这意味着nutcracker支持的并发的连接数依赖于mbuf的大小,小的mbuf可以控制更多的连接,大的mbuf可以让我们读或者写更多的数据导socker buffer。如果并发量很大的场景,推荐使用比较小的mbuf(512 or 1K)

mbuf-size=N

每一个客户端连接最好需要一个mbuf,一个服务请求最少是两个连接(client->proxy、proxy->server)所以最少需要两个mbufs 1000个客户端连接的场景计算:1000*2*mbuf=32M,如果每个连接有10个操作,这个值将会是320M,假设连接是10000,那么将会消耗3.2G内存!这种场景下最好调mbuf值比如512b,1000*2*512*10=10M 这个就是当并发量高的场景下使用小的mbuf的原因

key长度:

memcached的长度上限是250, redis没有类似限制,但是nutcracker需要key存储在连续的内存里面,而因为所有的请求和响应都在mbuf中,所以redis key的长度将会受限制于mbuf,也就是说如果你的redis实例如果要操作超长的key,你必须把mbuf调大。


14、简单删除

# 测试数据

redis> ZRANGE page_rank 0 -1 WITHSCORES

1) "bing.com"

2) "8"

3) "baidu.com"

4) "9"

5) "google.com"

6) "10"


# 移除单个元素

redis> ZREM page_rank google.com

(integer) 1

redis> ZRANGE page_rank 0 -1 WITHSCORES

1) "bing.com"

2) "8"

3) "baidu.com"

4) "9"


# 移除多个元素

redis> ZREM page_rank baidu.com bing.com

(integer) 2

redis> ZRANGE page_rank 0 -1 WITHSCORES

(empty list or set)

# 移除不存在元素

redis> ZREM page_rank non-exists-element

(integer) 0


14、命令参考

http://doc.redisfans.com/

测试 数据 服务 配置 参数 数据库 服务器 状态 进程 两个 命令 场景 性能 路径 元素 大小 客户 文件 时候 最好 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 安可服务器报价 我的世界服务器好卡 小学网络安全宣传周手抄报 如何打开数据库报表 网吧服务器可以放地下室吗 泾川软件开发有限公司 服务器托管选择什么 高级数据库管理英文 湖北省农业银行网络安全宣传 镜像数据库服务器断开 保护家里网络安全软件 数据库技术和发展 立林服务器异常 我的世界樱花小镇手机版服务器 小公司有必要买一台中心服务器吗 计算机网络技术的网络范围 3.3.5数据库汉化 客户签约软件开发需求 谁建设谁管理谁负责网络安全 武汉短视频云控软件开发商 医院网络安全制度 数据库应用实践教程2014 当今网络安全哪个大学好 杭州云网络技术口碑推荐 幻塔千境服务器是官服吗 我是网络安全宣讲员手抄报 第七届首都网络安全日征文 长宁区数据链网络技术造型设计 江西企业软件开发咨询热线 苏州云服务器有什么区别
0