Redis
单接口读
40000/s
性能极高 – Redis 能读的速度是 110000 次/s
单接口写
40000/s
,写的速度是 81000 次/s 。
一个端口 32gb
采用多少个集群,具体的数据量储存需要多少
容量估算
一个redisObject
一个 RedisObject 包含了 8 字节的元数据和一个 8 字节指针,需要16字节内存
每个key-value都是两个redisObject即需要32字节,剩下的才是对应的sds,hash等string的大小
sds
buf:字节数组,保存实际数据。为了表示字节数组的结束,Redis 会自动在数组最后加一个“\0”,这就会额外占用 1 个字节的开销。<br>len:占 4 个字节,表示 buf 的已用长度。<br>alloc:也占个 4 字节,表示 buf 的实际分配长度,一般大于 len。
string数据格式的内存消耗
int 类型消耗16字节
embstr固定消耗 16字节 + sds
sds
所以一个string消耗的内存最小是
redisObject+embstr编码
16字节 + 16字节 + 8字节 + 1字节(sds的结束符)
41字节
redisObject+raw编码
16字节 + 16字节 + 8字节 + 45字节(sds的结束符)
95字节
list数据结构的内存消耗
listNode结构占用的总字节数为24,list结构占用的总字节数为48。
有序集合
zskiplist结构占用的总字节数为32。
jemalloc内存分配规则<br> jemalloc是一种通用的内存管理方法,着重于减少内存碎片和支持可伸缩的并发性,做redis容量评估前必须对jemalloc的内存分配规则有一定了解。<br><br>jemalloc基于申请内存的大小把内存分配分为三个等级:small,large,huge:<br><br>Small Object的size以8字节,16字节,32字节等分隔开,小于页大小;<br>Large Object的size以分页为单位,等差间隔排列,小于chunk的大小;<br>Huge Object的大小是chunk大小的整数倍。<br>对于64位系统,一般chunk大小为4M,页大小为4K,内存分配的具体规则如下:
Elasticsearch
需要确定的内容
一个集群需要多少个节点,一个索引需要多少个分片
单条文档的尺寸/文档的总数据量/索引的总数据量(Time base 数据保留的时间)/副本分片数
文档是如何写入的(Bluk的尺寸)
文档的负责程度,如何读取(聚合查询还是普通查询)
业务性能需求评估
数据写入吞吐量
查询吞吐量
单条最大返回值
数据的格式和数据的Mapping
实际查询和聚合长什么样子
ES主要分两类应用
日志类搜索
基于时间序列的数据
使用ES存放日志/性能指标,数据每天不断写入,增长速度较快
结合Warm Node做数据的老化处理
业务数据类搜索
固定大小的数据集
搜索的数据集增长相对比较缓慢
硬件配置
业务数据类搜索
选择合理的硬件,业务数据节点尽可能是ssd
搜索等性能要求高的场景,建议使用ssd
建议按照1:10 比例配置内存和硬盘
日志/性能,查询并发需求地的场景
考虑使用机械硬盘
按照1:50 的比例配置内存和硬盘
单节点硬盘建议控制在2TB内,最大不超过5TB
JVM配置留一半的内存给系统,因为segment同步到文件系统的缓存。 jvm最大不建议超过32gb
集群部署方式
提高高可用和可靠性,可以考虑master 和 data节点分离,3master,3data,如果有复杂的查询和聚合,建议设置专门的coordinating节点
注意脑裂
在单机存储1TB数据场景下,SATA盘和SSD盘的全文检索性能对比(测试环境:Elasticsearch5.5.3,10亿条人口户籍登记信息,单机16核CPU、64GB内存,12块6TB SATA盘,2块1.5 TB SSD盘):
https://www.elastic.co/guide/en/elasticsearch/guide/current/capacity-planning.html
节点
master node
<b><font color="#c41230">1. 创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。</font></b>
<b><font color="#c41230">2. 维护并更新 cluster state</font></b>
使用低配置cpu,ram和磁盘
data node
保持分片数据
使用高配置cpu,ram和磁盘
ingest node
默认每个节点打开
使用高配置cpu,中等ram,低配置磁盘
coordinating node
machine learning
分片的配置与优化
7.0 primary 分片默认改成了1
当 分片数 > 节点数时,一旦集群中有新的节点加入,分片就可以自动进行分配,建议 primary shards > nodes
日志类应用,单分片不要超过50gb
业务类应用,单分片不要超过20gb
副本也会占用资源,建议使用1就好,可以增加replica,增加读的吞吐量
避免分布不均匀
如果某个节点磁盘满了,新的节点加入,可能分片会集中到新的节点去,可以设置下面的值避免这个问题
index.routing.allcation.total_shards_per_node
cluster.routing.allcation.total_shards_per_node