系统架构
文章平均质量分 92
Tangocc
@GitHub: tangocc.github.io
@baiduer
展开
-
一文读懂数据库分库分表
阅读此文你将了解:什么是分库分表以及为什么分库分表 如何分库分表 分库分表常见几种方式以及优缺点 如何选择分库分表的方式数据库常见优化方案对于后端程序员来说,绕不开数据库的使用与方案选型,那么随着业务规模的逐渐扩大,其对于存储的使用上也需要随之进行升级和优化。随着规模的扩大,数据库面临如下问题:读压力:并发QPS、索引不合理、SQL语句不合理、锁粒度 写压力:并发QPS、事务、锁粒度 物理性能:磁盘瓶颈、CPU瓶颈、内存瓶颈、IO瓶颈 其他:宕机、网络异常面对上述问题,常..原创 2022-04-15 12:21:23 · 11842 阅读 · 2 评论 -
Proto3序列化协议
Proto3序列化协议简介对于互联网应用来说,客户端-客户端、客户端-服务端之间需要数据的交互,其数据传输是二进制流的方式在互联网上传输,因为需要一种手段将数据对象编码为一种可以在网络上传输的二进制流,这个过程就叫做序列化。同样的,客户端在收到二进制流需要解码出数据,这个过程叫反序列。简单理解就是序列化就是按照某种编码方式将数据转换为二进制流以方便在网络上传输,同时这种编码方式是可逆的和可理解的。按照上述定义不难理解,json也是一种序列化的一种方式,将对象编码为字符串(二进制)进行传输。同样的p原创 2020-10-15 20:17:19 · 895 阅读 · 0 评论 -
NGINX系列之ngx_connection
上文介绍nginx事件模型,当用户发起请求时候,为便于对连接进行管理,服务端将用户的请求封装为一种数据结构ngx_connection_t,从而方便维护客户端各种请求信息以及连接生命周期的管理。数据结构struct ngx_connection_s { void *data; ngx_event_t *read; n...原创 2018-07-28 13:30:33 · 1095 阅读 · 0 评论 -
NGINX系列之MAIN函数
近期在系统学习Nginx相关源码,针对nginx进程模型、事件处理模型、配置以及扩展开发等诸多方面希望能够沉淀一些东西,故针对上述方面整理一系列博客,既然是源码分析,那就首先从main函数开始吧。核心数据结构全局变量cycle数据结构 ngx_cycle_s变量是nginx中贯穿始终的全局变量,其存储在系统运行过程中的所有信息,包括配置文件信息、模块信息、客户端连接、读写事件处理函...原创 2018-07-28 13:32:20 · 797 阅读 · 0 评论 -
NGINX系列之事件模型
nginx在完成进程的创建后,主进程进入信号处理的循环中,不参与事件处理;worker进程则进入事件处理过程。nginx任何操作,包括定时任务、连接、读写等都可以定义为事件,事件具有的特点是被动特性,即发生才处理,避免因为轮训状态而导致的时间消耗。本章将介绍nginx的事件处理模型。事件模型简介定时器任务上一章节中提到nginx如何实现定时任务?如何确保定时任务的准确性? ...原创 2018-07-28 13:33:35 · 1617 阅读 · 0 评论 -
NGINX系列之进程模型
在上一节中分析了nginx主流程,在mian函数中完成服务器的配置文件解析以及模块初始化工作后,根据系统设置进入单进程或者多进程模式,本文将分析nginx进程模型。进程模型简介在web服务中,随着用户基数增长,技术演进的趋势是提高系统的并发性和稳定性,一种方式是通过扩展机器的个数实现负载均衡,通过多台机器的量变引起质变,提高系统的并发性,显然这种方式资源利用率较低,成本较高;第二种方式...原创 2018-07-28 13:35:36 · 2988 阅读 · 0 评论 -
NGINX系列之配置文件
nginx是一款高性能的服务器,其核心配置可配置,存储在nginx.conf文件中,本文简要介绍各参数的含义。######Nginx配置文件nginx.conf######nginx运行的用户名和用户组user root root;#nginx工作进程数,建议设置为等于CPU总核心数。worker_processes 8;#全局错误日志定义类型,[ debug | info...原创 2018-07-28 13:36:34 · 253 阅读 · 0 评论 -
NGINX系列之HTTP阶段分析
读取完请求头后,nginx进入请求的处理阶段。简单的情况下,客户端发送过的统一资源定位符(url)对应服务器上某一路径上的资源,web服务器需要做的仅仅是将url映射到本地文件系统的路径,然后读取相应文件并返回给客户端。但这仅仅是最初的互联网的需求,而如今互联网出现了各种各样复杂的需求,要求web服务器能够处理诸如安全及权限控制,多媒体内容和动态网页等等问题。这些复杂的需求导致web服务器不再是一...原创 2018-07-28 13:37:31 · 699 阅读 · 0 评论 -
NGINX系列之HTTP模块开发
上文介绍nginx请求11个阶段处理,本文将动手实操开发并注册一个HTTP模块,在实现ngx_http_hello_world_module模块的过程中,详细介绍其实现步骤。模块组成介绍模块定义模块名称 ngx_http_hello_world_module模块功能 功能相对简单,从Hello World开始,通过实现扩展HTTP模块ngx_http_hello_wor...原创 2018-07-28 13:38:32 · 1230 阅读 · 0 评论 -
Docker入门教程
遇见Docker容器学校期间接触到容器的概念,但一直未曾真正实践,看到名字就感觉望而生畏,在实习阶段真正接触到Docker容器的使用,惊叹于这一神来之笔!!太有用了!! 相信程序员经常遇到如下场景:测试员小A:Monkey,程序在我机器上运行不了....程序员:在我机器上正常啊...........无限撕逼中..............无限找BUG中....上述场...原创 2018-06-28 14:41:02 · 412 阅读 · 0 评论 -
REDIS系列之源码分析
核心数据结构redis用redisServer和redisClient结构体封装redis客户端和服务端的数据信息。在分析源码前先分析一下其数据结构中包含哪些信息。redisServerstruct redisServer { /* General */ char *configfile; /* Absolute config file path, or...原创 2019-08-12 18:18:54 · 530 阅读 · 0 评论 -
NGINX系列之内存池
Nginx内存池 ngx_pool_tNginx作为高性能到web服务器,自然需要满足高效的内存使用率和分配效率。 内存池满足上述两个要求,主要优点:统一内存管理,避免内存碎片化,提高系统到使用率(Nginx做内存对齐处理,牺牲一定到使用率换来寻址速率)避免多次向系统申请内存(涉及内核态和用户态转换),提高内存到分配效率;内存统一分配和销毁,避免内存泄露。数据结构 n...原创 2018-07-28 13:29:18 · 270 阅读 · 0 评论 -
NGINX源码分析系列之内存池ngx_pool_t源码分析
Nginx内存池 ngx_pool_tNginx作为高性能到web服务器,自然需要满足高效的内存使用率和分配效率。 内存池满足上述两个要求,主要优点:统一内存管理,避免内存碎片化,提高系统到使用率(Nginx做内存对齐处理,牺牲一定到使用率换来寻址速率)避免多次向系统申请内存(涉及内核态和用户态转换),提高内存到分配效率;内存统一分配和销毁,避免内存泄露。数据结构 ngx...原创 2018-06-21 11:02:45 · 209 阅读 · 0 评论 -
5种服务器网络编程模型讲解
1.同步阻塞迭代模型同步阻塞迭代模型是最简单的一种IO模型。其核心代码如下:bind(srvfd);listen(srvfd);for(;;){ clifd = accept(srvfd,...); //开始接受客户端来的连接 read(clifd,buf,...); //从客户端读取数据 dosomthingonbuf(buf); write(...转载 2017-03-11 20:56:00 · 1027 阅读 · 0 评论 -
负载均衡学习笔记
负载均衡学习笔记最近在学习负载均衡原理,看了大量的文章和相关知识,有很大的收获,做一个简要总结,一来回顾自己所学的知识,二来对所看所学知识整理,供后来者参考借鉴,如有错误的地方,还请指出,学生阶段,考虑的内容尚有欠缺之处。1. 什么是负载均衡负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器原创 2017-02-11 18:28:03 · 487 阅读 · 0 评论 -
MySQL系列之源码浅析
源码才是王道。 真正的高手从来不是临场发挥,随机应变是外人看来的错觉。1. 主函数sql/mysqld.cc中,代码如下:int main(int argc, char **argv) //标准入口函数{ MY_INIT(argv[0]);//调用mysys/My_init.c->my_init(),初始化mysql内部的系统库 logger.init_base(); //原创 2017-10-12 15:16:25 · 7093 阅读 · 4 评论 -
MySQL系列之架构浅析
数据库架构MySQL目录结构InnoDB目录结构核心类库客户端与服务端交互> 真正的高手从来不是临场发挥,随机应变是外人看来的错觉。 MySQL是一个开放源代码的关系数据库管理系统。原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用。 2008年MySQL公司被Sun公司收购并发布了首个收购之后的版本MySQL5原创 2017-10-12 11:28:47 · 970 阅读 · 0 评论 -
分布式服务框架之原理实现
RPC的全称为Remote Procedure Call, 他是一种进程间通信放hi,允许向调用本地方法一样调用远程服务,对于上层应用来说透明化,屏蔽服务调用过程。目前业界由许多开源框架,例如 Apache Thrift(Facebook开源) Avro-RPC(Hadoop子项目) Hessian(caucho提供的基于binary-原创 2017-10-26 11:07:01 · 513 阅读 · 0 评论 -
分布式服务框架之功能模型
分布式服务框架 随着业务的扩展,应用规模不断扩大,系统内部巨无霸应用越来越多,常规的垂直应用架构无法应对复杂业务带来的各种挑战。通过将业务公告能力抽象成原子服务,对复杂应用进行水平拆分合垂直拆分,实现服务消费者和生产者的解耦,降低重复模块开发的人力成本和时间成本。 框架功能尽管不同的分布式框架实现细节略有差别,功能特性也不近相同,但是都具有以下基本特性。 服务订阅与发布 : 配置化原创 2017-10-26 11:27:17 · 495 阅读 · 0 评论 -
REDIS源码解析
综述最近笔者阅读并研究redis源码,在redis客户端与服务器端交互这个内容点上,需要参考网上一些文章,但是遗憾的是发现大部分文章都断断续续的非系统性的,不能给读者此交互流程的整体把握。所以这里我尝试,站在源码的角度,将redis client/server 交互流程尽可能简单地展现给大家,同时也站在DBA的角度给出一些日常工作中注意事项。Redis client/server转载 2017-11-21 11:19:29 · 365 阅读 · 0 评论 -
REDIS系列之底层数据结构
Redis是一款优秀的key-value数据库,其中存储的键值对都是有对象(Object)组成,可以存储字符串对象、哈希对象、列表对象、集合对象、有序集合对象;由于C语言中没有相关对象的实现,Redis自身扩种底层的数据结构实现上述对象的存储,本文将对REDIS数据库底层的数据结构进行介绍。1. SDS字符串Redis并没有直接采用C语言中字符串表示(以空字符结尾的字符数据,一下简称C字符串),而是原创 2017-12-05 16:50:26 · 397 阅读 · 0 评论 -
REDIS系列之五大对象原理
Redis并没有采用上文介绍的底层数据结构实现键值对数据库,而是基于底层数据结构实现一套对象系统,包括字符串对象、链表对象、哈希对象、集合对象、排序集合对象。而且,每个对象的底层实现至少存在两种,针对不同的应用场景可以选择不同的实现方式,从而提高效率。1.对象系统Redis是key-value数据库,每创建一个键值对就会创建两个对象,即一个键对象,一个值对象。Redis中默认键是字符串对象,值是re原创 2017-12-05 16:57:51 · 415 阅读 · 0 评论 -
负载均衡总结
最近在学习负载均衡原理,看了大量的文章和相关知识,有很大的收获,做一个简要总结,一来回顾自己所学的知识,二来对所看所学知识整理,供后来者参考借鉴,如有错误的地方,还请指出,学生阶段,考虑的内容尚有欠缺之处。1.什么是负载均衡负载均衡,英文名称为Load Balance,指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务...原创 2018-03-19 16:38:01 · 829 阅读 · 0 评论 -
开发中的23种设计模式详解
设计模式(Design Patterns)——可复用面向对象软件的基础设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中转载 2017-04-12 19:22:53 · 1843 阅读 · 0 评论