redis集群测试

本文介绍了Redis作为键值存储系统的特性,包括其周期性数据持久化、连接池概念以及主从同步机制。详细阐述了Redis集群的创建、访问、测试以及主从关系的切换。还探讨了Redis的多种持久化方式,如快照和AOF,并分析了它们的优缺点。此外,文章提到了Redis的性能测试方法和数据槽位分配,以及在Docker容器中部署Redis集群的实践。
摘要由CSDN通过智能技术生成

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 工具使用

  1. ./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客户端访问
  1. ./bin/redis-cli -c -h 192.168.36.189 -p 6380 cluster nodes

redis 集群测试

  • 存储数据随机
  • 主从关系切换机制

        调优

        测试数据是否随机存储 

        (1)连接redis集群

  1. redis-cli -c -h 192.168.36.54 -p 6380

        (2)存储一个数据

  1. set name zhang

        (3)继续存储一个数据

  1. set name1 wang
  2. (error) MOVED 9963 192.168.36.189:6380

        出错信息:表示当前存储数据已经在master 189上了,且在slot 9963上

        (4)连接redis时不加参数则执行时 不会报错

  • 主从关系测试 
  • (1)在masterA上创建key name value zhang 
  • (2)在slaveA上可以看见此key 但是只读并提示flushall失败
  1. redis-cli -c -p slaveA -p
  2. slaveA>randomkey
  3. "name"
  4. slaveA>flushall
  5. (error)READONLY you can not write against a read only slave.

        (3)关闭masterA的端口 然后发现A的从节点可以直接读取数据,并且查看集群信息则发现 A的从节点已经变成master节点

  1. 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
  1. redis-cli
  2. redis>set name zhang
  3. ok
  4. redis>get name
  5. "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内存

主从备份

  1. #备份
  2. redis-cli save
  3. #关闭redis服务器
  4. redis-cli shutdown

        然后拷贝数据目录下的rdb文件

redis 持久化

  • redis需经常将内存中的数据同步到磁盘中来保证持久化
  • 支持的持久化方式如下:
  • Snapshotting(快照),也是默认方式
  • Append-only file(所写为AOF)
  • 虚拟内存的方式
  • diskstore方式  (1)snapshotting  将内存中的数据以 快照 的形式写入 二进制 文件中,默认的文件名为 dump.rdb  可以通过修改配置文件 设置自动做快照持久化
  1. save 900 1 #如果900秒内超过1个key被修改,则发起快照保存
  2. 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写入到磁盘中

  1. appendonly yes #启用aof持久化方式
  2. #appendfsync always #每次收到写命令就立刻强制写入磁盘,最慢的,但是保证完全的持久化 不推荐
  3. appendfsync everysec #每秒强制写入磁盘一次,推荐使用
  4. #appendfsync no #完全依赖os,性能最佳但是持久化无法保证

(3)虚拟内存方式 

        版本2.4后被弃用 

(4)diskstore

redis 性能测试

  • 使用redis-benchmark性能测试工具测试
  1. 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 连接性能测试

  1. redis-benchmark -c 100 -p 6379 -n 100000 -q
  2. SET: 73421.44 requests per second
  3. GET: 64020.48 requests per second
  4. LPUSH: 56625.14 requests per second
  5. 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服务器性能

  1. bash-4.3# redis-benchmark -p 6379 -c 100 -n 100000 -t set,get,lpush,lrange -q
  2. SET: 60532.69 requests per second
  3. GET: 63011.97 requests per second
  4. LPUSH: 61087.36 requests per second
  5. LPUSH (needed to benchmark LRANGE): 69541.03 requests per second

2、redis-benchmark -h 192.168.1.201 -p 6379 -q -d 100  测试存取大小为100字节的数据包的性能

  1. bash-4.3# redis-benchmark -p 6379 -q -d 100 -t set,get
  2. SET: 59276.82 requests per second
  3. GET: 64935.07 requests per second

3、redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"  只测试某些数值存取的性能

  1. bash-4.3# redis-benchmark -n 100000 -q script load "redis.call('set','foo','bar')"
  2. script load redis.call('set','foo','bar'): 57736.72 requests per second

4、运行一百万次SET操作,每次操作从10万个key里面随机选一个

  1. bash-4.3# redis-benchmark -t set -r 100000 -n 1000000 -q
  2. SET: 59644.52 requests per second

注意

        如果是主库挂了,先把从库的dump文件拷贝到主库/etc/redis目录下在,再启动主库

  • scp /etc/redis/dump.rdb root@ip地址:/etc/redis/dump.rdb

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值