当前位置:网站首页>redis集群测试
redis集群测试
2022-07-16 07:09:00 【赵其111】
redis
redis 是一个key-value存储系统,数据存储在缓存中,但是redis会周期性的把更新的数据写入磁盘中,或者把修改操作写入追加的记录文件,并在此基础上实现了主从同步
redis连接池
连接池为连接数据库时创建的连接数,是在初始化创建一定数量的数据库连接。无论数据库连接是否被用,连接池都将保证至少拥有这么多的连接数。当应用程序向连接池的请求连接数量超过最大连接数量时,这些请求将被加入到等待队列中。
- client port client 通过独有的文本协议与node进行通信,这个port也叫command port
- data port redis node 通过data port 与其他Node进行 二进制通信(探活、配置更新、失败确认)
- data port 与 client port 之间的关系 为: data port = client port + 1000
redis-trib.rb 工具使用
- ./bin/redis-trib.rb create --replicas 1 192.168.36.54:6380 192.168.36.54:6381 192.168.36.54:6382 192.168.36.189:6380 192.168.36.189:6381 192.168.36.189:6382
- 命令解释如下: 给定redis-trib.rb程序的命令是 create ,表示希望创建一个新的集群 选项 --replicas 1 表示给集群中每个主节点创建一个从节点 后续的地址则为实例的地址列表 整个命令的意思就是:让redis-trib程序创建一个包含三个主节点和三个从节点的集群
访问集群节点
- 使用redis客户端访问
- ./bin/redis-cli -c -h 192.168.36.189 -p 6380 cluster nodes
redis 集群测试
- 存储数据随机
- 主从关系切换机制
调优
测试数据是否随机存储
(1)连接redis集群
- redis-cli -c -h 192.168.36.54 -p 6380
(2)存储一个数据
- set name zhang
(3)继续存储一个数据
- set name1 wang
- (error) MOVED 9963 192.168.36.189:6380
出错信息:表示当前存储数据已经在master 189上了,且在slot 9963上
(4)连接redis时不加参数则执行时 不会报错
- 主从关系测试
- (1)在masterA上创建key name value zhang
- (2)在slaveA上可以看见此key 但是只读并提示flushall失败
- redis-cli -c -p slaveA -p
- slaveA>randomkey
- "name"
- slaveA>flushall
- (error)READONLY you can not write against a read only slave.
(3)关闭masterA的端口 然后发现A的从节点可以直接读取数据,并且查看集群信息则发现 A的从节点已经变成master节点
- redis-cli -c -h 192.168.36.189 -p 6380 cluster nodes
redis相关可执行文件
- redis-server redis 服务器的daemon启动程序
- redis-cli redis 命令行操作工具,或者通过telnet进行纯文本协议操作
- redis-benchmark redis 性能测试工具,测试redis在你的系统以及你的配置下的读写操作
- redis.conf 默认配置文件,路径/etc/redis下
数据测试
- redis-cli -c -h -p
- redis-cli
- redis>set name zhang
- ok
- redis>get name
- "zhang"
数据测试 redis-benchmark -1
redis-cli shutdown 关闭 redis 操作
redis 配置参数修改
- 调整内存分配策略 在路径/proc/sys/vm/下文件overcommit_memory中:
- 0 : 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
- 1 : 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2 : 表示内核允许分配超过所有物理内存和交换空间总和的内存
redis.conf参数解释说明
daemonize:是否以后台daemon进程运行 redis默认不是以守护进程的方式运行 当配置为 yes时,redis默认把pid写入/var/run/redis.pid中
- pidfile:pid文件位置 /usr/local/redis-master/run/redis.pid
- port:监听的端口号,默认为6379
- timeout:请求超时时间 当客户端闲置多长时间后关闭连接,如果指定为0则表示关闭该功能
- loglevel:log信息级别 有四个选项:debug、verbose、notice、warning 如果当前日志打印级别低于配置级别,则不打印 默认为verbose【详细模式,也为标准模式】 如果配置级别为verbose,且为守护进程运行,则日志将发送给/dev/null
- logfile:log文件位置 如果是守护进程运行的话,日志将输入到/dev/null,因此得配日志路径
- database:开启数据库的数量 默认数据库数量为0,可以在命令行使用SELECT 指定连接数据库的id
- save * *:保存快照的频率,第一个*表示多长时间(秒级),第二个*表示执行多少次写操作。在一定时间内执行多少次写操作时,自动保存快照。可设置多个条件 如:save 900 1 save 300 10 save 60 10000
- rdbcompression:是否使用压缩 默认为yes,采用LZF压缩,如果为了节省cpu时间 关闭即可,但是会导致数据库变得巨大
- dbfilename:数据快照文件名(只是文件名 不包括目录) 默认为dump.rdb
- dir:数据快照的保存目录(只是个目录) 如:./
- appendonly: 是否开启appendonlylog,开启的话每次写操作会记录一次log,这会提高数据抗风险的能力 但影响效率
- appendfsync:
appendonlylog如何同步到磁盘
每次写都强制调用fsync(慢,安全):always
每秒启用一次fsync(折中,默认值):everysec
不调用fsync等待系统自己同步(快):no
slaveof:
主从配置,在redis-slave上配置master的ip和port即可
redis启动时,会自动从master进行数据同步
maxclients
如果配置为0的话 则表示不限制连接数
如果客户端连接数达到限制时,redis会关闭新的连接数
并向客户端返回超过最大连接数的错误信息
- maxmemory <bytes> 最大内存限制,redis启动时会把数据加载到内存中 如果达到内存限制后,redis会将已到期的或者即将到期的key值删除 如果仍然达到最大限制则无法进行写操作,但仍然可以进行读取操作 redis新的vm机制会将key值保存在内存中,将value保存在swap区
- cluster-require-full-coverage 如果配置为no,则表示当负责一个插槽的主节点下线且没有相应的从节点进行故障恢复时,集群仍然可以使用 如果配置为yes,则表示当负责一个插槽的主节点下线时且相应的从库没有进行故障恢复时,集群不可用
- cluster-config-file 保存节点的配置信息,自动创建,自动更新
- cluster-migration-barrier 如果配置为1,则表示当master的slave数量大于该值时,slave才能迁移到其他孤立的master上 如果配置为2,则表示当一个主节点拥有两个可工作的从节点,它的一个从节点才会尝试迁移
注:例如修改配置:
- daemonize:yes #守护进程模式
- save 60 1000 #时间间隔60s或者存储超过1000条记录时,进行持久化
- maxmemory 256mb #分配256MB内存
主从备份
- #备份
- redis-cli save
- #关闭redis服务器
- redis-cli shutdown
然后拷贝数据目录下的rdb文件
redis 持久化
- redis需经常将内存中的数据同步到磁盘中来保证持久化
- 支持的持久化方式如下:
- Snapshotting(快照),也是默认方式
- Append-only file(所写为AOF)
- 虚拟内存的方式
- diskstore方式 (1)snapshotting 将内存中的数据以 快照 的形式写入 二进制 文件中,默认的文件名为 dump.rdb 可以通过修改配置文件 设置自动做快照持久化
- save 900 1 #如果900秒内超过1个key被修改,则发起快照保存
- save 300 10 #如果300秒内超过10个key被修改,则发起快照保存
快照保存的过程:
A、redis 调用 fork,此时系统中出现子进程
B、父进程 继续处理 client请求,子进程负责将内容写入临时文件
C、当子进程将快照文件写入临时文件后,用临时文件替换原来的快照文件 注:client 可以通过使用save和bgsave命令通知redis做一次持久化操纵,但是这种操作是在主线程中保存快照的,由于redis用一个主线程处理所有client请求,因此这种方式会阻塞所有的client请求。因此不推荐
因为快照持久化 是 将内存数据完整写入到磁盘一次,如果数据量大,操纵比较多的话必然会引起大量磁盘的IO操作,可能会严重影响性能
快照是在一定的间隔时间进行一次持久化操作,所以如果redis意外down掉的话 就会丢失最后一次快照后的所有修改
(2)AOF
采用AOF持久化时,redis会将每一个收到的写命令通过write函数追加到文件中(文件默认为appendonly.aof),当redis重启时会通过重新执行文件中保存的写命令在内存中重新构建整个数据库的内容。
由于os操作是在内核缓存中,所以可能不是立即写到磁盘上。因此AOF的持久化方式也可能会导致部分修改丢失,但是我们可以通过配置文件来让redis使用fsync函数强制os写入到磁盘中
- appendonly yes #启用aof持久化方式
- #appendfsync always #每次收到写命令就立刻强制写入磁盘,最慢的,但是保证完全的持久化 不推荐
- appendfsync everysec #每秒强制写入磁盘一次,推荐使用
- #appendfsync no #完全依赖os,性能最佳但是持久化无法保证
(3)虚拟内存方式
版本2.4后被弃用
(4)diskstore
redis 性能测试
- 使用redis-benchmark性能测试工具测试
- redis-benchmark -h 192.168.0.2 -p 8083 -t set,lpush -n 10000 -q
上述参数解释如下:
- -h:指定服务器主机名
- -p:指定服务器端口
- -t:仅运行以逗号为分隔的测试命令列表
- -n:指定请求数
- -q:强制退出redis,仅显示query/sec值
redis数据槽位分配
redis-3.0.0规定 redis集群方案中一共有16384个槽位
docker 容器中部署redis集群
- 连接 redis-cli -p 30001 -c 注:30001为容器对外暴露的端口
redis 连接性能测试
- redis-benchmark -c 100 -p 6379 -n 100000 -q
- SET: 73421.44 requests per second
- GET: 64020.48 requests per second
- LPUSH: 56625.14 requests per second
- RPUSH: 62073.25 requests per second
客户端集群命令
- 集群
- cluster info:打印集群信息
- cluster nodes:列出当前集群的所有节点
- 节点
- cluster meet (ip) (port):添加指定节点到集群中
- cluster forget node_id:移除指定节点
- cluster replicate (node_id)
- cluster save config:将节点的配置文件保存到硬盘
测试事例
1、redis-benchmark -p 6379 -c 100 -n 100000 -t set,lpush -q 100个并发连接,100000个请求,检测host为localhost 端口为6379 操作为set、lpush的redis服务器性能
- bash-4.3# redis-benchmark -p 6379 -c 100 -n 100000 -t set,get,lpush,lrange -q
- SET: 60532.69 requests per second
- GET: 63011.97 requests per second
- LPUSH: 61087.36 requests per second
- LPUSH (needed to benchmark LRANGE): 69541.03 requests per second
2、redis-benchmark -h 192.168.1.201 -p 6379 -q -d 100 测试存取大小为100字节的数据包的性能
- bash-4.3# redis-benchmark -p 6379 -q -d 100 -t set,get
- SET: 59276.82 requests per second
- GET: 64935.07 requests per second
3、redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')" 只测试某些数值存取的性能
- bash-4.3# redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
- script load redis.call('set','foo','bar'): 57736.72 requests per second
4、运行一百万次SET操作,每次操作从10万个key里面随机选一个
- bash-4.3# redis-benchmark -t set -r 100000 -n 1000000 -q
- SET: 59644.52 requests per second
注意
如果是主库挂了,先把从库的dump文件拷贝到主库/etc/redis目录下在,再启动主库
- scp /etc/redis/dump.rdb [email protected]地址:/etc/redis/dump.rdb
边栏推荐
- Small target detection 2_ OHEM
- [imaging] [7] terahertz optics - optical elements and subsystems
- 【成像】【7】太赫兹光学——光学元件和子系统
- Small target detection 1_ Focal loss
- PostgreSQL 现在安装
- How much does it cost for lazada, express and shopee to evaluate self-supporting numbers?
- 金字塔思维学习
- 21JVM(1)
- ESRI launches indoor positioning system for facility routing
- Pyramid thinking learning
猜你喜欢
![[server data recovery] a case of RAID5 data recovery of an IBM model storage](/img/7b/5c8b36ea91f0cef878a01b3c00f16f.jpg)
[server data recovery] a case of RAID5 data recovery of an IBM model storage

ACL 2022 | argument pair extraction based on reading comprehension
Win10 timed running program

Onnx model tensor shapes information and flops statistical tools

Pyramid thinking learning

Select the value with the largest proportion of a category as the unique value of the category

从小米10发布来看编译优化

Operation of ES

(cvpr-2022) Lagrangian motion analysis and perspective embedding for improved gait recognition
![(manual) [sqli labs40, 41] stack injection, blind injection](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)
(manual) [sqli labs40, 41] stack injection, blind injection
随机推荐
Vulnhub-dc6 learning notes
Information retrieval summit sigir2022 best paper award came out, Melbourne Institute of technology best paper, UMass University and other best short papers
Small target detection 1_ Focal loss
ZYNQ PL中断脉冲多久可以被CPU捕获到
Vulnhub-dc8 learning notes
Application layer of OSI model of RS485 interface
Remove duplicate elements in the list max min key
Codeforces Round #806 (Div. 4)
Vulnhub-dc7 learning notes
[daily training] 515 Find the maximum value in each tree row
cv2.setMouseCallback()显示鼠标点击图片的像素值和位置
Soft exam (intermediate software designer) exam information
Kingbasees v8r6 ksql turn off auto submit
C语言《通讯录》详解
Opencv Library in pycharm cannot be automatically completed [July 2022]
Language AI originally knew whether his answer was correct! New research in Berkeley and other universities is hot, netizen: dangerous, dangerous, dangerous
How much does it cost for lazada, express and shopee to evaluate self-supporting numbers?
Difference between process and thread
Vs2019 inline assembly development
【通信】【1】幅度调制,频率调制,双边带与单边带,IQ与PSK与QAM——采样一定要满足奈奎斯特定理吗