摘要:
网络IO变化模型 说的io,都知道同步、异步、阻塞、非阻塞,还有同步阻塞、同步非阻塞、异步非阻塞。 不过没有异步阻塞的,这个是矛盾的,异步怎么还会阻塞? strace -ff -o out 路径: 追踪系统调用,关注io的实现 BIO 测试代码: import java.io.BufferedRea 阅读全文
摘要:
lsof -p: 查看网络通讯的文件描述符 netstat -natp: 只查看socket tcpdump: 抓取网络通讯包 测试代码:服务端的 import java.io.BufferedReader; import java.io.IOException; import java.io.In 阅读全文
摘要:
app是一个应用程序,应用程序有缓冲区,我们在写代码的时候,都用过Buffer。 应用程序肯定要访问内核,内核其实也是一个程序,应用程序和内核通信的时候,会调用一个system call(系统调用)。 system call 的实现是int 0x80,int是cpu的指令,0x80是16进制的,所以 阅读全文
摘要:
一个系统从宏观角度来讲,有CPU,有内存,剩下的都是io设备。 然后从在程序维度来讲,有kernel(内核)说白了kernel就是一个程序,剩下的都是用户空间的程序(如图中app表示), 每个程序都是逻辑的,线性的 一个内存地址,通过MMU转到CPU的物理地址,一个程序模拟使用整个内存,它的空间肯定 阅读全文
摘要:
之前用虚拟机配置了lvs,现在给清掉,使用ipvsadm -C 第一台机器: 给清掉,使用ipvsadm -C 把vip给down掉 第二台和第三台之前安装了隐藏vip 第四台机器还是个裸机 第一台和第四台机器安装keepalived:yum install keepalived ipvsadm - 阅读全文
摘要:
这个关系图是基于DR模型,下面根据这个图搭建一个玩玩 第一个机器: 在第一台机器上搭建lvs,首先要有vip虚拟ip地址 到这里先暂停,把查看下面配置,把第二台机器和第三台机器配置好以后回来这里再操作下面的 安装工具:yum install ipvsadm -y 配置发送数据包的规则 配置好以后是立 阅读全文
摘要:
负载均衡器不会与客户端进行连接握手,只是负责传送数据包到各个服务器,速度要求非常快,从而达到多个服务器负载均衡。 负载均衡器因为没有和客户端或服务端进行握手连接,所以并不知道客户端和服务端是什么连接协议,所以后端服务器是镜像的,才可以负载均衡,这和nginx是不太一样的。 lvs这种负载均衡是基于四 阅读全文
摘要:
OSI七层参考模型: 如图,说白了就是网络通信,就是两个人拿着电脑通信。 为什么要分层? 我们做编程的其实做的是软件工程学,里面有个重要的概念是分层解耦。 应用层:比如浏览器,tomcat,一些软件等等 表示层:协议,语义,字符串划分,加密等等这些 会话层:传输的控制,session等等,需要保持 阅读全文
摘要:
击穿 当用户请求到用户的服务端时候,服务要去查询redis,如果redis里没有对应的数据,(或者key的有效时间到了,或者通过LRU算法把数据清楚了)要去数据库查找了。 但是就这么巧,这时候发生了高并发,同时都去请求这一个被删除的key了。 所以解决思路就是:发生了并发,要阻止直接请求到数据库。 阅读全文
摘要:
fork 时点错误意思就是在一个时间内如果对所有数据进行拷贝,在还没来得及拷贝的数据发生修改时,数据和开始拷贝的那个时间点不一致。 使用管道,只要用了管道就会创建子进程,子进程可以看到父进程的数据,但不能修改父进程的数据,所以不会有时点错误。 copy on write 比如父进程的redis里的虚 阅读全文
摘要:
管道(pipeline) 比如说客户端连接到redis服务端以后,要进行很多命令的操作,每次执行命令都会经过网络io然后调用到redis服务端,管道的技术可以把多个命令进行压缩,这样一次调用就可以了。 使用nc 命令和redis建立连接,然后手动输入命令 新开窗口,获取k1 的值 上面方式理解后,可 阅读全文
摘要:
要了解redis之前,要先知道一些常识: 基础知识 磁盘:数据保存在磁盘的 寻址:ms 带宽:G/M 内存: 寻址:ns2 纳秒级别 带宽:很大 结论:秒>毫秒>微秒>纳秒 所以磁盘比内存在寻址上慢了10W倍 I/O buffer:有个成本问题: 磁盘与磁道,扇区:一扇区 512Byte,带来一个成 阅读全文
摘要:
为什么要集群?如果是单节点的redis,会有什么问题? 1,单点故障 2,容量有限 3,压力 AKF AKF的概念就是服务拆分,比如x轴,作为redis的服务集群,拷贝多个服务实例,保证服务高可用, y轴表示业务拆分,比如支付、订单等数据,进行业务拆分,把数据拆分到不同redis里 z轴表示进行更细 阅读全文
摘要:
分布式配置 如果有一些服务器,在启动的时候需要一些配置,以及它们在运行的时候,有一些配置被变更了,它们要第一时间获知,这时候成本应该降到最低,所以这时候要用zookeeper,也就说把这些配置数据存到zk里面去,所有的客户端只要去watch这些数据或者get时候,如果当这些配置数据发生修改时候,就会 阅读全文
摘要:
zookeeper是作为分布式协调的,它的特点就是扩展性和可靠性很好,然后保证了时序性,并且很快,响应快,并且服务挂掉后恢复的很快。 扩展性: zookeeper分为三个角色,除了leader和follower以外,还有个角色是observer。 zookeeper还有个概念就是读写分离,写在lea 阅读全文
摘要:
官网:http://zookeeper.apache.org/ 官网有描述:zookeeper是分布式协调服务,公开了一些简单的原语,我们可以构建这些原语,实现更高级的服务。 zookeeper允许分布式进程通过共享的分层命名空间相互协调,意思说的是zookeeper的数据模型和分层命名空间。 它是 阅读全文
摘要:
general 通用属性 datadir=/var/lib/mysql 数据文件存放的目录 socket=/var/lib/mysql/mysql.sock mysql.socket表示server和client在同一台服务器,并且使用localhost进行连接,就会使用socket进行连接 pid 阅读全文
摘要:
对于用户而言,分区表是一个独立的逻辑表,但是底层是由多个物理子表组成。分区表对于用户而言是一个完全封装底层实现的黑盒子,对用户而言是透明的,从文件系统中可以看到多个使用#分隔命名的表文件。 mysql在创建表时使用partition by子句定义每个分区存放的数据,在执行查询的时候,优化器会根据分区 阅读全文
摘要:
查询慢的原因 网络 CPU IO 上下文切换 系统调用 生成统计信息 锁等待时间 优化数据访问 查询性能低下的主要原因是访问的数据太多,某些查询不可避免的需要筛选大量的数据,我们可以通过减少访问数据量的方式进行优化:减少io次数 确认应用程序是否在检索大量超过需要的数据 确认mysql服务器层是否在 阅读全文
摘要:
B+树 想个问题,如果设计一个索引结构,使用哪种数据结构好呢? 如果使用hash表肯定不太好,占用空间太大,每个数据下标位置是个链表 如果使用二叉树会好一点,但不管是平衡二叉树还是红黑树,随着数据增多,都会引发一个数据的深度的问题,查个数值可能会走很多节点的索引。 所以考虑多叉树,如:B树 B树的好 阅读全文