数据库主从不一致
引言在开发过程中,进场遇到数据库主从分离来降低读写的压力,但是数据库主从同步是有延时的,这里聊一聊数据库主库与从库的一致性问题。
常见的数据库集群架构一主多从,主从同步,读写分离
如上图所示
一个主库提供写服务
多个从库提供读服务,可以增加从库提升读性能
主从之间同步
任何方案不要忘了本心,增加从库的本心是提升读性能
为什么会出现不一致主从同步有时延,这个时延期间读从库,可能读到不一致的数据。
如上图
服务发齐了一个写请求
服务又发起了一个读请求,此时同步未完成,读到一个不一致的脏数据
数据库主从同步最后才完成
任何数据冗余,必将引发一致性问题。
解决方法忽略任何脱离业务的架构设计都是耍流氓,绝大部分业务,例如:百度搜索,淘宝订单,QQ消息,58帖子都允许短时间不一致。
如果业务能接受,最推崇此法。
如果业务能够接受,别把系统架构搞得太复杂。
强制读主
如上图
使用一个高可用主库提供数据库服务
读和写都落到主库上
采用缓存来提升系统读性能
这是很常见的微服务架构,可以避免数据库主从一致性问题。
选择性读主强制读主过于粗暴,毕竟只有少量写请求,很短时 ...
MySQL清除表空间碎片
引言MySQL在数据表使用很长时间后,表上的B-Tree索引可能会碎片化,会降低查询的效率。碎片化的索引可能会以很差或者无序的方式存储在磁盘上,这时就需要对表进行碎片化整理。
碎片产生原因1、表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白、被留空,而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大;
2、当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用,仍然无法将其彻底占用,就形成了碎片;
3、当MySQL对数据进行扫描时,它扫描的对象实际是列表的容量需求上限,也就是数据被写入的区域中处于峰值位置的部分;
例:一个表有1万行,每行10字节,会占用10万字节存储空间,执行删除操作,只留一行,实际内容只剩下10字节,但MySQL在读取时,仍看做是10万字节的表进行处理,所以,碎片越多,就会越来越影响查询性能。
查看表碎片大小1、查看某个表的碎片大小
1SHOW TABLE STATUS LIKE '表名';
结果中’Data_free’列的值就是碎片大小
2、列出 ...
计算密集型 VS IO密集型
引言 在开发过程中,经常会遇到多线程的问题,解决多线程的其中一种方式就是利用线程池,其中需要开启线程的数量便成为了我们关注的焦点。JAVA中有两种并发类型:计算密集型(CUP-bound)和IO密集型(I/O-bound)。
计算密集型(CPU-bound) 计算密集型,顾名思义就是应用需要非常多的CPU计算资源,CPU大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。在多核CPU时代,我们要让每一个CPU核心都参与计算,将CPU的性能充分利用起来,这样才算是没有浪费服务器配置,如果在非常好的服务器配置上还运行着单线程程序,那将是非常大的浪费。对于计算密集型的应用,完全是靠CPU的核数来工作,所以为了让它的优势完全发挥出来,避免过多的上下文切换,比较理性的方案是:
1线程数 = CPU核数 + 1
为什么是 +1?因为即使当计算密集型的线程偶尔由于缺失故障或者其他原因而暂停时,这个额外的线程也能确保CPU的时钟周期不会被浪费。
也可以设置成CPU核数 x 2,这还是要看JDK的使用版本,以及CPU配置(服务器的CPU有超线程)。对于JDK1.8来说,里面增 ...
Git-VS-SVN
引言在软件开发过程中,版本控制是非常重要的一环。常用的版本控制工具有Git和SVN。
Git是目前世界上最先进的分布式版本控制系统,其实 Git 跟 SVN 一样有自己的集中式版本库或服务器,但是Git 更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个跟中心版本库一模一样的本地版本库。可以这样说,如果你被困在一个不能连接网络的地方时,你仍然能够提交文件,查看log(历史版本记录),创建项目分支等。
Git和SVN的差别1、Git只关心文件数据的整体是否发生变化,而SVN这类版本控制系统则只关心文件内容的具体差异。
这类系统(如SVN)每次记录有哪些文件做了更新,以及都更新了哪些行的什么内容,然而Git 并不保存这些前后变化的差异数据。实际上,Git更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。
2、在Git 中的绝大多数操 ...
深入理解Spring
引言Spring在当前Java项目开发中可谓是核心,无论是SpringMVC、SpringBoot、SpringCloud都离不开Spring这个核心。自己对Spring的了解也停留在一知半解状态。
说起Spring,都知道是一个轻量级开源企业开发框架,包含控制反转(IOC)和面向切面(AOP)两大特性。
IOC什么是IOC(DI) IOC(Inversion Of Control,控制反转)。对于Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系。在一个对象中,如果要使用其他的对象,就必须得到它(自己new一个或者JNDI中查询一个),使用完对象之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类耦合起来。
所有的类都会在Spring容器中登记,告诉Spring自己是什么,需要什么,然后Spring会在系统运行到适当的时候,把你需要的东西主动给你,同时也把你交给其他需要你的东西。所有类的创建、销毁都由Spring来控制,也就是说控制对象生命周期的不再是引用它的对象,而是Spring容器。对于某个具体的对象而言,以前是它控制其他 ...
说说Spring中的事务
引言在开发过程中,合理的使用事务是非常重要的。使用事务常常是为了维护高度的数据完整性和一致性。如果不关心数据的质量,就不必使用事务。毕竟,Java平台中的事务支持会降低性能,引发锁定问题和数据库并发性问题,而且会增加应用程序的复杂性。最近在面试中也是频频出现,在这里回顾加深一下。
四大特性数据库中事务有四大特性,简称为 ACID 特性。
原子性(Atomicity)事务的原子性是指事务是一个不可分割的工作单位,这组操作要么全部发生,否则全部不发生。
一致性(Consistency)一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性(Isolation)隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性(Durability)持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
隔离级别事务并发带来的问题脏读(Dirty Reads ...
JAVA并发之锁
引言锁作为并发共享数据,保证一致性的工具,数据库中有悲观锁、乐观锁等实现。在JAVA平台同样有多种实现(如 synchronized和Lock)。这些已经写好提供的锁为开发提供了便利,让我们有了更多的选择。
JAVA中锁分类乐观/悲观锁乐观锁:乐观锁则认为对于同一个数据的并发操作,是不会发生修改的。在更新数据的时候,会采用尝试更新,不断重新的方式更新数据,乐观的认为不加锁的并发操作是没有事情的。适合读操作多的场景。
乐观锁在JAVA中的使用,是无锁编程,Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(CompareAndSwap)实现的。
CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
CAS操作中包含三个操作数 —— *内存值(V)、旧的的预期原值(A)和拟写入的新值(B)*。如果内存值V的值与预期原值A相匹配,那么处理器会自动将该位置值更新为新值B*,否则处理器不做任何 ...
HTTPS协议
引言HTTP和HTTPS协议是互联网上应用最为广泛的网络协议,现在为了安全,很多网站从HTTP的阵营转向HTTPS。近两年,Google、Baidu、Facebook 等这样的互联网巨头,不谋而合地开始大力推行 HTTPS, 国内外的大型互联网公司很多也都已经启用了全站 HTTPS,这也是未来互联网发展的趋势。
TCP协议TCP协议的三次握手与四次挥手先来一张网络模型图(应表会传网数物),可以看到TCP、UDP协议处于传输层。
建立TCP需要三次握手才能建立,而断开连接连接则需要四次挥手。整个过程如下图:
三次握手建立连接
1、Client端发送连接请求报文。
2、Server端接受连接后回复ACK报文,并为这次连接分配资源。
3、Client端接收到ACK报文后也向Server段发送报文,并分配资源
这就是TCP的三次握手建立连接阶段。
四次挥手断开连接
中断连接端可以是Client端,也可以是Server端。
1、假设Client端发起中断请求,也就是发送FIN报文。
2、Server端接到FIN报文后,告诉Client端,“你的 ...
