- 博客(149)
- 资源 (14)
- 收藏
- 关注

原创 brpc线程模型和网络模型
brpc线程模型和网络模型1. 简单介绍本文主要介绍brpc的线程模型,以及网络请求处理的整个流程。1.1 brpc线程模型简介bthread是brpc使用的M:N线程库,目的是在提高程序的并发度的同时,降低编码难度,并在核数日益增多的CPU上提供更好的scalability和cache locality。”M:N“是指M个bthread会映射至N个pthread,一般M远大于N。由于linux当下的pthread实现(NPTL)是1:1的,M个bthread也相当于映射至N个LWP。bthre
2021-03-12 18:16:27
6658
原创 vector向量数据库
向量数据库是近几年刚出来的一种新型数据库,用于存储向量数据,并支持对向量数据做相关相似度检索,本文主要介绍向量数据库的研发方向,以及成熟的向量数据库应该具备的能力。
2023-10-13 10:47:39
347
原创 basic paxos算法简述
P2c:如果一个编号为 n 的提案具有 value v,该提案被提出,那么存在一个多数派,要么他们中所有人都没有接受(accept)编号小于 n 的任何提案,要么他们已经接受(accept)的所有编号小于 n 的提案中编号最大的那个提案具有 value v;P2a:一旦一个具有 value v 的提案被批准(chosen),那么之后任何 Acceptor 再次接受(accept)的提案必须具有 value v;P1:一个 Acceptor 必须接受第一次收到的提案。Paxos算法中的角色允许身兼数职。
2023-08-04 16:49:36
333
原创 重新认识C语言中的结构体
我们对C语言中的struct的印象是什么?它是C语言中内置的复合数据类型;相当于C++中的class;丰富的初始化操作;Struct的拷贝为浅拷贝;支持嵌套、指针等操作;支持位字段,节省空间。如果你知道的只有这些,那么说明你对struct了解的还不够深刻,后续我们简单聊聊结构体的一些知识。本文的代码以及描述都是基于linux环境。1. C++中的structC++中的struct本质上和class没有区别,struct也支持构造函数、成员函数、虚函数、继承等,仅仅只有默认的访问权
2021-10-27 20:51:43
334
原创 sysbench代码剖析和实践
sysbench是一款比较流行的测试工具,主要用于测试fileio、cpu、memory、threads、mutex等的性能测试,但是最主要的还是做数据库的性能测试,经常用来测试MySQL、Drizzle、AttachSQL、Oracle、PostgreSQL等相关的数据库,也可以扩展支持其他的数据库以及测试用例,本文主要介绍sysbench的代码逻辑、代码调试、lua脚本以及相关扩展功能。本文的介绍主要基于sysbench 1.0的代码:repo:https://github.com/akopyto
2021-10-13 20:55:51
1638
原创 云原生数据库新趋势
存算分离的架构下,如何做计算下推?如何支持多写?DDC场景下的存算分离:CPU、MEM、Disk?K8S + 数据库 的前景?
2021-10-09 10:44:49
199
原创 硬件对数据库设计的影响
0. 硬件一直在影响着数据库设计为什么会有WAL?是为了把随机写开销化成顺序写。为什么会有buffer pool?为了写操作和读操作更加迅速。为什么我们要用Page作为B+ Tree的节点单位?为了简化磁盘读取方式。为什么Wisckey火了?因为SSD的大规模使用,使得LSM的架构可以有更好的设计。1. CPU单核CPU性能提升不明显,多核CPU带来的性能损耗;NUMA架构下如何管理多核对同一块内存的访问?并发控制?如何减少CPU陷入内核?内核旁路?用户态?如何降低CPU利用率?算法
2021-10-09 10:35:31
295
原创 分布式数据库的挑战
1. 分片如何保证你选的partition key在数据增长的时候依然保持均匀分布?如何选择Partition的列?是不是应该在Query的比较多的列上做Partition?Join的比较频繁的2个Region,是不是一般放到一个节点比较好?(跨Region查询)如何评价不同分片策略的优劣?2. 事务如何优化2PC?怎样做并发控制,怎么控制写写冲突(一般通过锁),读写冲突(MVCC)?要支持哪些隔离级别?发号器?如何做?3. 优化器跨Region的join如何优化?如何做SQ
2021-10-09 10:32:36
211
原创 使用systemtap模拟网络延迟
上文介绍了IO延迟的注入,本文主要介绍网络的延迟注入,其实网络的延迟模拟工具有很多,我们可以通过tc、iptables等常用工具来做,这些工具都很好用,但是如果精细到系统调用级别的延迟注入,上述常规的工具可能就不太容易实现了,这正是stap擅长的领域。下面就是一个在服务端建立连接后延迟3秒返回的stap脚本:#!/usr/bin/stap# file: sock_connect_delay.stp# cmd: sudo stap ./sock_connect_delay.stp -g# 在建连
2021-09-26 20:43:13
811
原创 使用systemtap模拟磁盘IO延时
在分布式存储系统的异常测试中,模拟硬件故障是一个比较头痛的问题。比较幸运的是,Linux环境下有一个非常好的工具SystemTap(https://sourceware.org/systemtap/),可以使用stap给系统调用增加勾子,并注入我们期望的异常,达到验证应用程序在异常情况的行为是否符合预期的目的。注意:stap会影响系统调用的行为,为了限制影响面,建议做好filter(可以通过pid、devname等条件限制),否则会严重影响系统稳定性,不建议在生产环境使用。生产环境经常因为IO抖动,
2021-09-26 20:31:36
2182
原创 gcc之__attribute__字节对齐参数设置
在性能要求比较高的场景下,经常会用到字节对齐,我们可以通过gcc的__attribute__来设置struct的字节对齐,比较常用的就是aligned和packet,本文主要介绍这两种设置字节对齐的用法。1. aligned - 设置变量对齐aligned的功能就是设置变量按照指定的字节进行内存对齐,对齐的字节数必须是2的指数,再看一个使用的例子:// file: test.c// gcc test.c -o test#include <stdint.h>#include <s
2021-09-26 18:12:31
3003
原创 网络故障模拟工具
在做异常测试时需要模拟网络异常,经常使用的模拟工具有tc和iptables。1. tctc(traffic control)一般用来做精细的网络故障模拟。模拟网络延迟:# 1. 将 eth0 网卡的传输设置为延迟 100 毫秒发送:**# tc qdisc add dev eth0 root netem delay 100ms## 2. 将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送# tc qdisc add dev eth0 r
2021-04-08 11:28:34
1454
原创 Mellanox网卡参数调优
为了提高IPv4和IPv6的流量性能,可以使用Linux sysctl命令修改操作系统设置的默认系统网络参数。但是,需要注意,更改网络参数可能会在不同的系统上产生不同的结果。结果显著依赖于CPU和芯片组的效率。ref:https://community.mellanox.com/s/article/linux-sysctl-tuninghttps://community.mellanox.com/s/article/performance-tuning-for-mellanox-adaptersh
2021-04-07 14:33:16
3037
原创 socket的O_NONBLOCK以及TCP_NODELAY
设置socket的O_NONBLOCK以及TCP_NODELAY1. no-blocking将socket设置为no-blocking意味着socket收发数据都是非阻塞的,相比于阻塞方式,需要特殊处理这个错误码:EWOULDBLOCK or EAGAIN(这两个错误码是一样的,都是35),进行重试或者重新调度。将socket设置非阻塞有多种方法,下面会一一汇总。1.1 fcntl设置O_NONBLOCKPOSIX的fcntl用的比较广泛,兼容性也比较好,优先推荐使用fcntl来设置,缺点是需要两
2021-04-07 14:19:15
6651
翻译 在c++中实现一个good spinlock
在c++中实现一个good spinlock网上有很多关于spinlock不好的实现。他们都犯了相同的错误:在RMW(read-modify-write)操作上自旋。我后面会说明为什么这些实现不好,也会介绍如何在C++中实现一个好的spinlock,并且这个实现很容易迁移到其他编程语言中。在本文的最后提供了完整的spinlock实现。一个bad spinlock实现最基本的自旋锁使用一个boolean值(或1个bit)来表示锁是否被持有。要获取锁,使用原子交换操作将boolean值设置为true。
2021-03-30 17:45:15
2238
1
原创 double free or corruption错误定位
“double free or corruption”错误定位1. 测试程序先写一个简单的测试程序模拟double free错误:// file: t.c#include <stdlib.h>void *func1(size_t size) { return malloc(size);}void func2(void *p) { free(p);}int main() { char *ptr = func1(sizeof(char));
2021-03-17 12:36:30
15345
1
原创 通过火焰图查看调用栈
1. 将火焰图的项目clone下来# git clone https://github.com/brendangregg/FlameGraph.git2. 采集数据:# sudo perf record -F 99 -p $PID -g -- sleep 303. 查看每个调用栈的百分比# perf report -n --stdio4. 生成火焰图# perf script -i perf.data &> perf.unfold# ./stackcollapse-per
2021-03-10 16:46:36
441
原创 使用perf分析网络系统调用栈
使用perf分析网络系统调用栈1. 增加事件比如增加了如下网络通信相关的系统调用:# perf probe --add sys_writev='sys_writev'# perf probe --add sys_writev_exit='sys_writev%return'# perf probe --add vfs_writev_exit='vfs_writev%return'# perf probe --add do_readv_writev_exit='do_readv_writev%re
2021-03-10 16:30:56
2429
原创 CEPH OSD_SCRUB_ERRORS 错误处理
1. 错误描述# ceph health detailHEALTH_ERR 1 scrub errors; Possible data damage: 1 pg inconsistentOSD_SCRUB_ERRORS 1 scrub errorsPG_DAMAGED Possible data damage: 1 pg inconsistent pg 2.33c6 is active+clean+inconsistent, acting [355,138,29]2. 问题定位查看对应
2020-12-23 10:09:49
5285
2
原创 CEPH架构总体说明
文章目录1. Ceph架构说明1.1 整体架构图1.2 接口类型1.2.1 RBD1.2.2 CephFS1.2.3 RadosGW1.3 RADOS2. RADOS概念介绍2.1 Monitor2.2 RADOS对象存储2.3 pool和PG2.4 对象寻址过程2.5 对象读写2.6 数据均衡2.7 Peering2.8 Recovery&Backfill2.9 纠删码2.10 快照和克隆2.11 Cache Tier2.12 scrub3. 参考资料1. Ceph架构说明1.1 整体架构图
2020-05-15 11:30:09
854
原创 对象存储相关工作总结
TODOref:https://www.163yun.com/help/documents/68792520222625792
2020-05-14 17:56:56
256
原创 HDFS集群数据迁移方案-distcp
HDFS集群数据迁移方案-distcp1. 原理distcp原理是在Hadoop集群中使用MapReduce分布式拷贝数据。2. 资源消耗源集群有只有数据读取和网络传输的消耗目的集群需要执行MapReduce任务,并且有数据写入的消耗(3副本需要有3倍的写入)3. 兼容性同版本集群拷贝(或者协议兼容版本之间的拷贝)使用HDFS协议hadoop distcp hd...
2020-04-17 10:43:24
1547
原创 EC纠删码理论介绍
文章目录纠删码理论介绍1 什么是EC?2 EC(4+2)编解码简介3 EC的数学原理4 EC存储的优缺点纠删码理论介绍1 什么是EC?EC:纠删码-Erasure Code,是一种编码理论:EC是纠错码的一种,通过增加校验片,保证数据可靠性。特性:将数据分成k个分片,生成m个校验片,假设n=k+m,在n个分片中任意选取k个分片,就可以将原始数据恢复回来。EC不仅应用在存储领域,通信...
2020-04-17 10:23:31
12227
原创 研发过程管理与质量控制
质量控制是研发过程管理非常重要的一环,需要考虑到从需求的产生到最终功能上线,以及后续的运维工作,甚至是故障的处理。方方面面都需要考虑到。具体包含如下环节。需求:需求分析、需求评审、需求排期设计:总体设计、接口设计、详细设计、邮件讨论、方案评审、signoff机制实现:功能开发、单元测试、开发冒烟、性能自测、CodeReview、提测邮件测试:用例评审、功能测试、性能测试、异常测试、稳...
2019-10-22 09:46:59
2860
原创 对象存储数据可靠性技术
1. 概述对象存储能够提供海量、安全、低成本、高可靠的云存储服务,使用RESTful API 可以在互联网任何位置存储和访问,容量和处理能力弹性扩展,多种存储类型供选择全面优化存储成本,并提供99.999999999%的数据可靠性。2. 可靠性定义数据的可靠性,即丢失数据的可能性,类似于数据库系统中ACID中的D,数据的持久性,一旦在系统中成功写入数据,那么这条数据不应该丢失。对象存储可靠...
2019-10-17 15:18:48
1537
原创 数据湖技术说明
1. 为什么要做存储和计算分离?随着数据量的增长,存储和计算资源的使用率严重不均衡从数据的生命周期来看,存在冷热数据分层的现象2. 数据仓库和数据湖有什么不同?一是存储数据类型不同二是数据处理模式不同三是服务对象不同3. 数据湖的优势一是数据集成方式简单二是加速数据准备过程三是具备更好的可扩展性四是系统建设成本更低五是便于创建智能化分析应用4. 数据湖的未来相对...
2019-10-17 15:11:32
758
原创 消息队列使用场景汇总
在工作中经常会用到消息队列(MQ),消息队列适用的场景有哪些呢?消息处理的方式有哪些?1. 功能场景解耦削峰填谷最终一致性广播消费无限重试2. 消息处理exact onceat least onceat most once3. 其他TODO...
2018-06-23 14:26:08
456
原创 ElasticSearch查询操作最大sharding数目限制
ElasticSearch查询操作最大sharding数目限制1. 问题说明在ES中做一个大范围的查询时,经常会报这个错误:{ "error":{ "root_cause":[ { "type":"illegal_argument_exception", "reaso...
2018-05-08 23:27:00
9019
原创 ElasticSearch运维手册
ElasticSearch运维手册0. 介绍主要介绍了ES常用的在运维过程中可能会用到的一些命令。1. 查看ES集群中节点信息查看ES集群中所有节点信息,以及各个节点内存和CPU相关的指标$ curl -X GET 'http://192.168.5.1:9200/_cat/nodes?v'ip heap.percent ram.percent...
2018-04-12 22:55:01
4766
原创 ELK性能优化说明
ELK性能优化简要说明1. 系统部署说明 组件 机器配置 说明 ElasticSearch&Kibana 3 * (32 core + 128GB mem + SAS 3.6T*12) EK混部 Logstash 3 * (40 core + 32GB mem) 单独部署,比较耗cpu DS&Kafka 5 ...
2018-03-31 17:35:05
6628
原创 Kibana查询语法详解
Kibana查询语法详解Kibana查询语法和Lucene相同,下面是Lucene的查询语法介绍。注意:Lucene查询语法不适合在程序中使用,程序中使用可以调用Lucene-API,API提供了丰富功能来组合定制你所需要的查询器,查询语法是为手工输入高级查询设计的,而不是为程序拼接语法串而设计的。1. 简单说明1.1 Terms一个查询将分解为若干Term以及操作符...
2018-03-31 17:33:47
56670
原创 数据库系统——关系型数据在磁盘上的存储布局
ELKtail可以使用ELKtail连上Elasticsearch,以tail的方式查看ES中的日志。 使用方式也和tail命令类似,下面是常用的使用方法介绍。基本用法elktail不加参数直接使用elktail不加任何参数,那么将会尝试连接localhost:9200,并且tail最近的logstash index,展示message字段信息$ ./elktai...
2018-03-31 17:32:23
1191
原创 Elasticsearch介绍文档
Elasticsearch介绍文档0. 说明主要介绍ES的相关概念以及如何使用1. 一些概念索引-index - 一个索引就是一个拥有几分相似特征的文档的集合 - 相当于数据库中的database类型-type - 一个类型是你的索引的一个逻辑上的分类/分区 - 通常,会为具有一组共同字段的文档定义一个类型 - 相当于数据库中的table文档-docume...
2018-03-31 17:28:24
606
原创 netty系列3-Java BIO编程
网络模型基本的模型是client/server模型,client进程和server进行通信,server端做绑定IP,并绑定端口;client端向服务端监听的地址发起连接请求,通过三次握手建立连接。如果建立成功,双方就可以通过socket进行通信。
2017-11-10 10:17:33
369
原创 netty系列2-Linux网络IO模型
1. 阻塞和非阻塞阻塞和非阻塞描述的是IO函数,指访问某个函数时是否会阻塞线程(block,线程进入阻塞状态)2. 同步和异步同步和异步描述的是执行IO操作的主体是谁同步是由用户进程自己去执行最终的IO操作异步是用户进程自己不关心实际IO操作的过程,只需要由内核在IO完成后通知它既可,由内核进程来执行最终的IO操作3. IO分类3.1 阻塞IO模型阻塞IO指的是用户调用读写方法是阻塞的
2017-11-09 19:30:25
394
原创 netty系列1-JAVA IO演进之路
在JAVA1.4之前的版本,JAVA对I/O的支持并不完善,基于JAVA所有的Socket通信都是同步阻塞模式,这一模式虽然简化了开发难度,但是在性能和可靠性方面存在着巨大的瓶颈。在很长一段时间里,大型的应用服务器都是采用C/C++开发的。采用Java BIO开发的服务端软件只能通过不断扩容来满足高并发和低延迟,极大的增加了企业的成本。
2017-11-08 11:40:12
616
原创 性能测试应该怎么做?
两个原则平均值不靠谱吞吐量和响应时间要挂钩怎样做性能测试1 你得定义一个系统的响应时间latency,建议是TP99,以及成功率比如路透的定义:99.9%的响应时间必需在1ms之内,平均响应时间在1ms以内,100%的请求成功。2 在这个响应时间的限制下,找到最高的吞吐量测试用的数据,需要有大中小各种尺寸的数据,并可以混合。最好使用生产线上的测试数据。3 在这个吞吐量做Soak Te
2017-11-06 17:28:22
1147
原创 利用Nginx的resolver实现动态upstream
之前写了篇文章用openresty实现了一个动态路由,虽然说是动态的,但是实际上还是需要将upstream在配置文件中写好,还是相当于静态的。最近工作中有这方面的需求,upstream是完全动态,由客户端来指定,开始的时候有一些错误,最后通过resolver指定dns服务来完成,具体流程如下。1. 开始采坑nginx的配置如下:worker_processes 1;events { wor
2017-09-15 00:01:13
39357
2
ceph资料打包大汇总.zip
2020-05-15
Pinot架构介绍
2015-07-03
Pinot简单介绍
2015-07-01
Glibc内存管理-Ptmalloc2源代码分析
2012-10-09
列存数据库研究
2012-08-23
UNIX环境高级编程.rar
2012-06-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人