大型网站技术架构

最近在读李智慧所著的《大型网站技术架构》,这是我第二遍读这本书,很好的一本书,让人开拓了视野。

原著分为四部分,分别包括大型网站架构演进、大型网站架构模式、大型网站核心要素以及大型网站案例。我把第二三部分做成了思维导图,就当做是读书笔记好了。
点击图片下方的链接可以查看大图,思维导图工具使用XMind.

大型网站架构模式

阅读全文 »

认识MVCC

前一篇总结提到了数据库事务的隔离性可以由锁机制来实现。锁是传统数据库控制事务并发的主要手段,这里提到的锁(S锁和X锁)可以认为是悲观锁,在对数据实现读写之前加上相应的锁,实现了独占访问机制,从而控制并发行为。神通数据库7.0主要使用了锁来实现事务并发控制。

那么数据库事务的并发控制还有其他的实现方式吗?当然是有的。去年刚推出的神通数据库8.0,就使用了MVCC(Multiversion Concurrency Control) 即多版本控制来控制事务的并发行为。

研究一下什么是MVCC…

MVCC

多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是,把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能.

多版本并发控制,意味着同一时刻看到的相同行的数据可能是不一样的,即一个行可能有多个版本.有点平行宇宙的意思。要实现这种效果,需要做一些操作:

  • 对于每一行记录,新增两个隐藏列:

    行的更新时间(创建版本号)

    行的删除时间(删除版本号)

  • 数据版本

    同一行数据,在同一时刻对于不同的事务,可能看到不同的版本。即同一行数据有多个版本同时存在。

  • 事务版本

    每个事务有其唯一的事务版本号

  • 版本有序

    无论是数据版本,还是事务版本,其版本号随时间增长而增长,即版本号是递增的。

阅读全文 »

数据库事务浅析

ACID

一个数据库事务通常包含了一个序列的对数据库的读/写操作。它的存在包含有以下两个目的:

  1. 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  2. 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

上面对数据库事务的定义摘自维基百科。先不用着急的去理解这个定义的具体含义,我们从事务的四个特性来逐步了解什么是事务。

数据库事务拥有以下四个特性,习惯上被称之为ACID特性。

  1. 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。

  2. 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据应满足完整性约束。

  3. 隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行。

  4. 持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。

阅读全文 »

Java读取资源文件

写java代码时常常需要加载一些外部的资源,通常我们会使用全路径名加载一份资源,比如:C:\Users\Yukai\Desktop\abc.jpg . 但是,有些时候我们需要加载的是源代码路径下的资源或者配置文件等等,更习惯于使用相对路径,或者直接给一个文件名,就希望能够找到我们需要的配置文件。如何做到?常见的方法是使用了 class.getResource 或 classloader.getResource

class.getResource && classloader.getResource ?

这两个方法看起来很相似,他们直接有什么区别?

直接上网搜索能够得到一些答案,但都不如查看源代码来的直接:

阅读全文 »

使用maven打包

前段时间做的web项目涉及到了打包的问题,记录一下使用maven打包的过程…

项目打包为fatjar

什么是fatjar?做过java项目的都知道,一个项目从开发到部署,一般需要经过打包,把一些资源文件和类文件压缩到一块,形成一个单独的文件,叫做jar(或者war)。如果这个项目依赖了一些第三方的jar包,在最终的部署阶段,这些jar有两种存在方式:

  • 一种是单独放到一个与项目jar包并行的文件夹中(一般叫做lib),然后使用-classpath将这个文件夹下的jar加入到classpath
1
2
3
4
5
6
7
8
---
|--VersionManager.jar
|
|--lib
|
|--a.jar
|
|--b.jar

阅读全文 »

VncServer的安装与使用

因为新做的版本发布系统需要部署在内网,找了两台空闲的机器做了Centos7的系统,并搭建读写分离的环境。因为读写分离环境的搭建需要用到可视化工具,所以决定在这两台机器上搭一个vnc服务。

centos7,IP 192.168.1.57

安装

  1. 安装VNCServer
1
yum install tigervnc-server -y
  1. 设置防火墙
1
2
sudo firewall-cmd --permanent --add-service vnc-server
sudo systemctl restart firewalld.service

阅读全文 »

Linux下的守护进程

这两天在搭建VNC服务的时候,遇到一个简单的问题,却困扰了我有一会:网上的教程大部分是修改.service文件,然后启动服务,但是我发现使用vncserver这个命令也可以达到同样的目的,这两者之间有什么区别呢?查了一些资料,简单的做一个总结。

工作管理

一般情况下,我们可能会在命令行下这样启动一个程序,以新做的版本管理系统为例:

1
java -jar VersionManager.jar

阅读全文 »