RAID0~6

名词

  • stripee:不同磁盘相同偏移的位置被称为strpee
  • segement:一个strpee在同一个磁盘上占用的区域叫做segement
  • stripee depth:一个segement包含的扇区数叫做stripee depth

    IOPS计算公式

    存储系统的IOPS指标当然是高的好,公式如下
    IOPS=IO并发系数/(一次IO服务时间)

    传输效率与并发IO的矛盾

    一次IO如果可以尽可能的使用多的磁盘获取数据,那么这次的IO必然节省数据的传输时间,让数据均匀分布到各个磁盘,那就只有将stripee depth变小
    如果需要传输效率高,那么一次IO会占用多个磁盘,那么后面来的IO请求只有在队列中等待,要想提高并发IO,那么只能让一次IO尽可能的少占用磁盘,最好一个IO占用一个。

    RAID0

  • 优点:能够整合多块磁盘,提高单词IO的效率

  • 缺点:
    1)没有安全措施,一旦其中某个磁盘坏掉,整个阵列都将不可用

RAID1

  • 优点:使用备份技术,损坏一个磁盘,备份磁盘可以顶上,同时因为备份盘和数据盘一样,所以可以实现并发IO,可以提升读效率
  • 缺点:写时需要同时写备份盘,写效率降低

    RAID2

  • 优点:独立使用校验盘,使用汉明码对数据进行校验,不用担心损坏一块盘导致阵列报废;由于RAID2是以bit为粒度存储,所以对于单个IO,可以把传输效率提升N倍(N为数据盘个数)
  • 缺点:校验盘较多,因为使用汉明码,所以随着数据盘的增加,相应也要增加校验盘。由于每次IO都要占用所有的磁盘,所以他不能实现并发IO。

    RAID3

  • 优点:使用XOR方式来进行校验数据,所以无论有多少个数据盘只需要一个校验盘就行。对于单个IO,可以把传输效率提升N倍。
  • 缺点:依然要使用独立的校验盘,不能够实现并发IO

    RAID4

    只要让单次IO有空闲磁盘,那么就有可能实现并发IO,所以只要保证一次IO少于stripe size那么就可以让一次IO少占用磁盘。但是RAID4中还是共享校验盘的,校验盘成为独享资源,所以RAID4都快没有了。

    RAID5

    RAID5解决了RAID4中竞争校验盘的问题,RAID5取消了校验盘,把校验数据分散到了各个数据盘中。
  • 优点:解决了校验盘竞争的问题,实现了并发IO
  • 缺点:只要损坏了两个及以上的数据盘,那么阵列就跪了

    RAID6

    RAID6根据多元一次方程的原理实现了防止多块数据盘损坏导致系统不可用的情况。

The Law of disk preformance

简化模型

arrival rate:应用每个时间内到达controller的I/O请求数。
响应时间:一个请求从发出到处理结束的时间。
Little’s Law:
表示队列中的请求数及响应时间的关系。
N=a R (1)
N:队列系统中的所有的请求数(控制器中正在处理的请求以及队列中的请求)
a:arrival rate,单元时间内到达系统的请求数
R:平均响应时间,或者每个I/O请求的周转时间—一个请求到达系统一直到离开系统所花销的时间。
Utilization law:
这个是用来定义I/O controller的能力
U = a
R_s
U: I/O controller的处理能力
a: arrival rate
R_s:服务时间(service time),请求在controller中花费的平均时间,1/R_s被称作服务率。
R_a:可以表示为到达间隔时间(R_a = 1/a)
所以
U=R_s/R_a(0<=U<=1)
其中a<1/R_s,如果不这样的话,那么系统会处理不过来。
定义S(average response rate)
S = service rate - arrival rate
R = 1/S
= 1/(service rate - arrival rate)
= 1/(1/R_s - 1/R_a)
= 1/(1/R_s - a)
= R_s/(1-a*R_s)

硬盘

硬盘使用快速移动的机械手臂来读/写取磁片上面的数据
硬盘的组建有
platter(磁片),spindle,r/w head,actuator arm assembly,contorller
硬盘结构

Platter

一个硬盘一般存在一个或者多个圆形碟片(platters)
Spindle and Platter
这么多的platters封装在一个盒子里面,叫做Head Disk Assembly(HDA)

Spindle

Spindle把所有的Platters连接起来,并且它和motor(马达)相连接,这样就可以愉快的转起来了。
一般都可以转数千个Revolutions per minute(RPM)

R/W Head

R/W Head
每一面都有读写头,读写头可以改变磁片的磁极,读写头并没有直接碰着磁片,他们有一个距离叫做head flying height,只要磁片转起来,带动的空气会让磁头飞起来。

Actuator Arm Assembly

读写头就被绑在这个东西上面

Controller

Contoller是被印刷在电路板上,由微处理器以及内存,电路和固件组成,固件控制这Spindle马达的电源和速度。它可以和主机通信,也可以控制机械手臂,来优化数据访问。

硬盘物理结构

数据被记录在磁道(tracks)上,磁道从0开始编号,从里到外依次增加,每一个磁道都被划分为若干个小块,每个小块叫做扇区(sectors),扇区是最小的存储单元,下图是硬盘结构
disk structutr
一般来说一个扇区可以保存512B的数据,综上,数据的存储位置可以有三个坐标来确定:
扇面号,磁道号,扇区号。当然存储这些信息也是需要空间的,所以一般我们都不可能把磁盘空间占满。
cylinder就是用来定位盘面上面有多少个磁道

数据定位

早期的硬盘使用CHS号定位(Cylinder,head,sector)如下图(a)
address
LBA(Logical Block Addressing)直接屏蔽了CHS繁琐的问题,把硬盘直接当成一个线性的地址,硬盘控制器会把LBA转换为CHS,然后在访问,上层应用不用关心CHS了

存储系统环境

什么是存储系统环境(Storage System Environment)

数据流从应用到存储经过的所有的不同的组建集合叫做存储系统环境
三个主要有组建有:

  • host
  • connectivity
  • storage

这章主要讲:
1) 硬件部分

  • 硬盘,disk geometry(寻址,包括磁头,柱面,扇区),管理方式
  • 总线技术及协议接口(关于存储设备与host的连接)
    2) 逻辑部分
  • 主机(文件系统:file system,卷管理volume managers,操作系统:operating systems以及他们在存储系统环境中所处的位置)

Host

负责运行用户处理数据的应用程序的机器叫做Host
Host范围很广,可以从笔记本电脑到复杂的服务集群。
Host可以简单分为物理组件和逻辑组件

物理组件

  • CPU
  • Storage(硬盘或者内存)
  • I/O设备
    物理组件一般总共总线(BUS)通信。
    下面记录一下I/O设备类型
    1) 主机/用户通信,比如键盘,鼠标,显示器等
    2) 主机/主机通信,比如网卡,modem
    3) 主机/存储设备通信,主要是使用Host Bus Adaptor(HBA),HBA是一个电路板,他主要是解决CPU和存储设备的IO速率不匹配的问题

    Connectivity(host和storage的连接)

    在存储系统环境中的host和storage连接也可以分为物理和逻辑,物理就是具体连接host到storage的硬件,逻辑就是host到storage的通信协议。

    硬件组成

    Bus,Port,Cable

    其中bus主要可以分为:
    1)系统总线
    主要是cpu与内存的交互
    2)Local or I/O总线
    主要是处理器和外部设备的交互

    逻辑组成

    local bus上最流行的协议就是PCI(peripheral component interconnect)
    和硬盘连接的一般是IDE(Intgrated Device Electronics)/ATA(Advanced Technology Attachment)以及SCSI(Small Computer System Interface)。

Storage System Environment

什么是存储系统环境(Storage System Environment)

数据流从应用到存储经过的所有的不同的组建集合叫做存储系统环境
三个主要有组建有:

  • host
  • connectivity
  • storage

这章主要讲:
1) 硬件部分

  • 硬盘,disk geometry(寻址,包括磁头,柱面,扇区),管理方式
  • 总线技术及协议接口(关于存储设备与host的连接)
    2) 逻辑部分
  • 主机(文件系统:file system,卷管理volume managers,操作系统:operating systems以及他们在存储系统环境中所处的位置)

Host

负责运行用户处理数据的应用程序的机器叫做Host
Host范围很广,可以从笔记本电脑到复杂的服务集群。
Host可以简单分为物理组件和逻辑组件

物理组件

  • CPU
  • Storage(硬盘或者内存)
  • I/O设备
    物理组件一般总共总线(BUS)通信。
    下面记录一下I/O设备类型
    1) 主机/用户通信,比如键盘,鼠标,显示器等
    2) 主机/主机通信,比如网卡,modem
    3) 主机/存储设备通信,主要是使用Host Bus Adaptor(HBA),HBA是一个电路板,他主要是解决CPU和存储设备的IO速率不匹配的问题

    Connectivity(host和storage的连接)

    在存储系统环境中的host和storage连接也可以分为物理和逻辑,物理就是具体连接host到storage的硬件,逻辑就是host到storage的通信协议。

    硬件组成

    Bus,Port,Cable

    其中bus主要可以分为:
    1)系统总线
    主要是cpu与内存的交互
    2)Local or I/O总线
    主要是处理器和外部设备的交互

    逻辑组成

    local bus上最流行的协议就是PCI(peripheral component interconnect)
    和硬盘连接的一般是IDE(Intgrated Device Electronics)/ATA(Advanced Technology Attachment)以及SCSI(Small Computer System Interface)。

存储发展

存储发展

最初阶段

存储设备是放在服务器里面的,随着组织的服务器数目增加,这种方式导致了对数据的不可保护,不可管理,信息孤岛以及增加了操作花销,针对这样的问题,存储技术从非智能的内部存储向智能化的网络存储发展。

主要包括

  • RAID(Redundant Array of Independent Disks)

这种技术主要解决数据的性能,花销以及可用性等需求,如今这个技术已经用在了所有的存储架构中

  • Direct-attached storage(DAS)

这种存储技术是直连服务器,他可以放在服务器的内部也可以放在外部,放在外部的DAS可以减少服务器内部空间

  • Storage area network(SAN)
    这种技术是解决服务器与存储设备的块级别的通信,主要给予Fibre Channel网络(这个是一个高效的传输网络),SAN从服务器中分离出来,SAN了高效的,可扩展的,高可用
  • Network-attached storage(NAS)
    这技术主要解决的是文件服务,不同于SAN,这个是可以通过任意的LAN进行访问,兼容了异构的客户端
  • Internet Protocol SAN(IP-SAN)
    这个是SAN和NAS的融合,他是提供块级别的数据传输,不过可以使用LAN或者WAN来访问

存储入门

  1. 第一章

    1)信息增长的挑战
    2)存储系统的定义
    3)存储系统的发展历史
    4)智能存储系统

  2. 存储类型以及协议
    1)SCSI,Fibre channel架构
    2)direct-attached storage(DAS)
    3)storage area networks(SANs)
    4)network-attached storage(NAS)
    5)Internet Protocol SAN(IP-SAN)
    6)Content-addressed storage(CAS)
    7)storage virtualization
  3. 业务持久和复制
    1)业务持久
    2)备份和恢复
    3)本地数据复制及远程数据复制

  4. 安全与管理
    1)存储安全
    2)基础监控和管理

plan

Todo List

2015.9.20~2015.9.27

1
2
3
servlet相关
Tcp/Ip协议
白板编程训练
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode sortList(ListNode head) {
if(head == null){
return null;

}
if(head.next == null){
return head;
}
ListNode l,r;
ListNode p1,p2;
l= head;
r= head;
p1= head;
p2 = head;
while(p2 != null){
p2 = p2.next;
if(p2 != NULL){
p2 = p2.next;
p1 = p1/next;
}

}
r = p1.next;
p1.next = null;
//end
ListNode left = sortList(l);
ListNode right = sortList(r);
//merge
ListNode pHead = null;
ListNode last = null;
while(left != null && right != null){
if(left.val >= right.val){
last = right;
right = right.next;

}else{
last = left;
left = left.next;

}
last.next = null;
if(pHead == null){
pHead = last;
}else{
pHead.next = last;
}
}
if(right != null){
last.next = right;
}
if(left != null){
last.next = left;
}
return pHead;
}
}

docker-browser-server

该项目主要使用了普通的http和websocket,下面从http以及websocket两个方面来说一下遇到的坑。

http

我们的需求主要有如下
1)如何对http请求加过滤器(比如在处理用户权限问题上)

然后websocket

websocket的需求主要有如下
1)docker服务器如何与浏览器进行通信
2)对docker服务器进行操作

下面我分别诉说一下如何做到这几点

1)http过滤器

在index.js文件之中过滤器相当于找到如下代码
 

server.all('uri1',function(req, res, next) {
    //做你想做的内容
    console.log('1')
    next()//表示进入到下一个处理
})

server.all('uri1',function(req, res, next) {
    //做你想做的内容
    console.log('2')
    next()//表示进入到下一个处理
})
  这里面解释如下:   1\. all方法表示处理所有的url为uri1的http请求(包含get,post等方法),如果你只想处理get方法,那么你可以使用  
server.get('uri1',function(req, res, next) {
    //做你想做的内容
    next()//表示进入到下一个处理
})
  2.处理的顺序是和申明的顺序一致的   ### 2)websocket #### 2.1服务器端与浏览器通信 通过websocket进行通信,服务端代码为  
  var wss = new WebSocketServer({server:server})
  var containers = {}

  wss.on('connection', function(connection) {
    var req = connection.upgradeReq
  })
  wss就是一个声明好了的websocket服务器,  
wss.on('connection',function(connection){

})
  这段代码表示ws服务器一旦监听到有客户端连接的事件发生,那么就会执行后面那个函数,入参connection是一个websocket的连接实例,每一个客户端都和服务器有这么一个连接,如果服务器想向客户端发送消息只需要connection.send(.....)就好了。   然后服务端与浏览器具体怎通信呢? 由于我们是web terminal,主要的目的就是如下 把容器里的标准输出流定位到浏览器里,把浏览器上的标准输入流定位到容器中 作者有一个开源项目叫做pump,来实现这个功能 用法很简单,如下  
var pump = require('pump');
var fs = require('fs');

var source = fs.createReadStream('/dev/random');
var dest = fs.createWriteStream('/dev/null');

pump(source, dest, function(err) {
    console.log('pipe finished', err);
});
  这上面的代码就是重定向流的代码,把/dev/random里的东西读入,然后放入到/dev/null中,pump的优势在于如果有一方断开了,那么这个管道就自动删除掉了。   pump更加赞的还有管道连接  
pump(source, transform, anotherTransform, dest, function(err) {
    console.log('pipe finished', err);
});
  这段代码的意思是把source输入到transform中,然后把transform流输入到anotherTransform里面,   查看index.js的代码有这么一段  
                    pump(stream, docker(image, dopts), stream, function(err) {
                        console.log('error in create docker');
                        console.log(err);
                        if (proxy) proxy.close()
                        server.emit('kill', container)
                        delete containers[id]
                    })
    stream就是服务器端和浏览器建立的连接的管道, docker(image.dopts)创建了个服务器与docker服务器之间的管道 这里的意思就是stream的输出定位到服务器与的docker服务器建立的管道中,然后又把这个管道里面的流定位到stream的输入里来,这样就完成了浏览器与docker容器的交互 #### 2.2对docker服务器进行操作 目前只有create镜像,attach镜像,pull镜像三个功能,都在docker_run这个模块中实现。 现在我以pull镜像为例子,在docker-run里面代码如下
  var pull = function(cb){
      console.log('pull image')

      debug('pulling to stdio for %s', image)
      request.post('/images/create?fromImage='+image, {
      }, function(err, response) {
           //处理docker服务器返回的数据
      })
  }
&nbsp;使用方法如下
pull(function(xx){
     //处理回调
})
&nbsp;那么在哪儿调用呢?

比如我有一个api是只pull镜像的
/image/{userid}/pull/{imagename}
&nbsp;那么我就要在docker-browser-server里面增加一个url处理的函数来处理这个api
  server.get('/image{userid}/pull/{imagename}',function(req,res){
        var id = req.params.userid
        var image = req.params.imagename
        var container = containers.hasOwnProperty(id) && containers[id]
        if (container){
             //只让正在使用终端的用户进行pull代码
            container.docker_run.pull(image)
        }
    })
&nbsp;pull的代码该怎么写呢?在docker-run的index.js中如下
that.pull = function(image){
// pull image
}
好了,我们的代码将完了

docker-browser-server的代码这么执行&nbsp;
git clone https://github.com/royzhao/docker-browser-server.git
cd docker-browser-server
npm install
cd node_modules
rm -rf docker-browser-console
git clone https://github.com/royzhao/docker-browser-console.git
cd docker-browser-console
npm install
cd node_modules
rm -rf docker-run
git clone https://github.com/royzhao/docker-run.git
cd docker-run
npm install
&nbsp;