??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩成人在线观看,深夜福利免费在线观看,一区二区在线视频观看http://www.aygfsteel.com/linli/category/54310.htmlhttp://blog.gopersist.com/zh-cnMon, 20 Apr 2015 23:37:05 GMTMon, 20 Apr 2015 23:37:05 GMT60Node.js的异步I/Ohttp://www.aygfsteel.com/linli/archive/2015/04/13/424380.html老林老林Mon, 13 Apr 2015 13:42:00 GMThttp://www.aygfsteel.com/linli/archive/2015/04/13/424380.htmlhttp://www.aygfsteel.com/linli/comments/424380.htmlhttp://www.aygfsteel.com/linli/archive/2015/04/13/424380.html#Feedback0http://www.aygfsteel.com/linli/comments/commentRss/424380.htmlhttp://www.aygfsteel.com/linli/services/trackbacks/424380.htmlLinux操作pȝ的I/O模型

JAVA的NIO引入了异步I/OQ而Node.js宣称的就是异步编E,I/O自然是异步的。其实操作系l在很早引入了异步I/O的概念,如下图(摘自Unix|络~程中的囄Q:

我对上图的理解有几点Q?/p>

  1. 从IO讑֤d数据到用户内存的整个q程都是ql内核来完成Q?/li>
  2. 数据L先被拯到内核缓冲区Q再由内核缓冲区拯到用户内存;
  3. 除了异步I/OQ其?UI/O模型其实都是d的,臛_在数据从内核拯到用户内存时是阻塞的Q?/li>
  4. 虽然异步I/O看上L理想解决ҎQ但实现上现在用得最多的应该是多路I/O复用Q有select、poll、epoll的实玎ͼ性能最好的是epollQ?/li>
  5. 异步I/O现在被认为有~陷Q仅支持O_DIRECT而无法支持系l缓存?/li>

Node.js中的异步I/O

因ؓ内核中的异步I/O有缺P现实中的异步I/O通常qh的U程池模拟完成,如下图:

Node.js中原本用了libeio异步I/O库,在v0.9.3后改己实现的U程池来完成异步I/O。所以在Node.js中,除了用户的Javascript代码是单U程外,所有I/O都是多线Eƈ行执行的?/p>

Node.js中的异步I/O调用

Node.js通过事g循环的模式运行,在每一个@环的q程中,通过询问一个或多个观察者来判断是否有事件要处理Q而观察者可以有文gI/O观察者、网lI/O观察者等?/p>

Node.js中异步I/O调用的大致流E如下:

  • 发vI/O调用
    1. 用户通过Javascript代码调用Node核心模块Q将参数和回调函C入到核心模块Q?/li>
    2. Node核心模块会将传入的参数和回调函数装成一个请求对象;
    3. 这个请求对象推入到I/OU程池等待执行;
    4. Javascript发v的异步调用结束,JavascriptU程l箋执行后箋操作?/li>
  • 执行回调
    1. I/O操作完成后,会将l果储存到请求对象的result属性上Qƈ发出操作完成的通知Q?/li>
    2. 每次事g循环时会查是否有完成的I/O操作Q如果有将h对象加入到I/O观察者队列中Q之后当做事件处理;

  • 处理I/O观察者事件时Q会取出之前装在请求对象中的回调函敎ͼ执行q个回调函数Qƈresult当参敎ͼ以完成Javascript回调的目的?br />
    微信订阅P
    源文地址Q?a title="作者博客:http://blog.gopersist.com">
    http://blog.gopersist.com/2015/03/09/aio/


老林 2015-04-13 21:42 发表评论
]]>
Linux Keepalived 实现双机热备http://www.aygfsteel.com/linli/archive/2014/09/24/418220.html老林老林Wed, 24 Sep 2014 03:34:00 GMThttp://www.aygfsteel.com/linli/archive/2014/09/24/418220.htmlhttp://www.aygfsteel.com/linli/comments/418220.htmlhttp://www.aygfsteel.com/linli/archive/2014/09/24/418220.html#Feedback2http://www.aygfsteel.com/linli/comments/commentRss/418220.htmlhttp://www.aygfsteel.com/linli/services/trackbacks/418220.html
服务?/strong> 操作pȝ IP 虚拟IP
Server 1 Centos 192.168.18.20 192.168.18.22
Server 2 Centos 192.168.18.21 192.168.18.22

1. 安装Keepalived

2台Server都用下面的命o安装KeepalivedQ?br />
yum install keepalived -y

2. Server1 Keepalived 配置

$ vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 51
    priority 100                   # 优先U?br />    advert_int 1                 # 心蟩间隔(U?
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.18.22         # 虚拟IP
    }
}

3. Server2 Keepalived 配置

$ vi /etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state BACKUP              # 备䆾?br />    interface eth0
    virtual_router_id 51
    priority 99                   # 优先U,比主服务器底
    advert_int 1                 # 心蟩间隔(U?
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.18.22         # 虚拟IP
    }
}

4. 启动Keepalived

$ service keepalived start
启动keepalived后,可看?台Server都绑定了虚拟IPQ?br />
$ ip a

# Server 1:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:24:8c:8c:67:43 brd ff:ff:ff:ff:ff:ff
    inet 192.168.18.20/24 brd 192.168.18.255 scope global eth0
    inet 192.168.18.22/32 scope global eth0
    inet6 fe80::224:8cff:fe8c:6743/64 scope link 
       valid_lft forever preferred_lft forever

# Server 2:
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:23:54:bf:ab:17 brd ff:ff:ff:ff:ff:ff
    inet 192.168.18.21/24 brd 192.168.18.255 scope global eth0
    inet 192.168.18.22/32 scope global eth0
    inet6 fe80::223:54ff:febf:ab17/64 scope link 
       valid_lft forever preferred_lft forever

5. 试

览器访问http://192.168.18.22Q出?This is Server 1.
?92.168.18.20关闭Q再讉Khttp://192.168.18.22Q出现This is Server 2.

微信订阅P
源文地址Q?a >http://blog.gopersist.com/2014/09/24/keepalived/

老林 2014-09-24 11:34 发表评论
]]>
LVS-DRhttp://www.aygfsteel.com/linli/archive/2014/04/28/413001.html老林老林Mon, 28 Apr 2014 03:15:00 GMThttp://www.aygfsteel.com/linli/archive/2014/04/28/413001.htmlhttp://www.aygfsteel.com/linli/comments/413001.htmlhttp://www.aygfsteel.com/linli/archive/2014/04/28/413001.html#Feedback0http://www.aygfsteel.com/linli/comments/commentRss/413001.htmlhttp://www.aygfsteel.com/linli/services/trackbacks/413001.html试用IPVS的直接\由方式来做负载均衡。服务器信息如下Q?/span>


 

IP配置信息如下Q?/span>

服务?/span>

操作pȝ

IP

IP别名

|关

调度服务?/span>

Centos

192.168.2.90

192.168.2.99

192.168.2.1

实际服务?/span>

Centos

192.168.2.71

192.168.2.99

192.168.2.1

Centos

192.168.2.72

192.168.2.99

192.168.2.1

 

直接路由方式工作在数据链路层Q通过修改数据包的MAC地址Q将数据包{发到实际服务器上。实际服务器响应时直接发送给用户端,而不l过调度器?/span>

 

因ؓ调度服务器ƈ没有修改数据包的IP地址Q所以我们需要ؓ实际服务器设|与调度服务器相同的IP别名Q以使实际服务器接受数据包?/span>

 

度服务器讄IP别名Q?/span>

ifconfig eth1:0 192.168.2.99

IP别名与原来的IP地址在用上q没有什么不同,q里可以ping?/span>90?/span>99两个IP?/span>

 

为实际服务器讄IP别名Q?/span>

ifconfig lo:0 192.168.2.99 broadcast 192.168.2.99 netmask 255.255.255.255 up

为实际服务器d路由规则Q它不d扑օ他拥有这?/span>IP的服务器Q?/span>

route add -host 192.168.2.99 dev lo:0

防止实际服务器响应针?/span>IP别名?/span>ARPq播Q?/span>

echo 1>/proc/sys/net/ipv4/conf/lo/arp_ignore

echo 2>/proc/sys/net/ipv4/conf/lo/arp_announce

echo 1>/proc/sys/net/ipv4/conf/all/arp_ignore

echo 2>/proc/sys/net/ipv4/conf/all/arp_announce

 

使用ipvsadm配置调度服务器:

ipvsadm -A -t 192.168.2.99:8888 -s rr

ipvsadm -a -t 192.168.2.99:8888 -r 192.168.2.71:8888 -g

ipvsadm -a -t 192.168.2.99:8888 -r 192.168.2.72:8888 -g

 

使用下面的命令将q接有效旉改ؓ1U来试Q:

ipvsadm --set 1 120 300

 

览器访?/span>http://192.168.2.99:8888Q每?/span>1U多点击hQ就会交替出?/span>192.168.2.71?/span>192.168.2.72?/span>

 



老林 2014-04-28 11:15 发表评论
]]>
LVS-NAThttp://www.aygfsteel.com/linli/archive/2014/04/25/412933.html老林老林Fri, 25 Apr 2014 06:32:00 GMThttp://www.aygfsteel.com/linli/archive/2014/04/25/412933.htmlhttp://www.aygfsteel.com/linli/comments/412933.htmlhttp://www.aygfsteel.com/linli/archive/2014/04/25/412933.html#Feedback0http://www.aygfsteel.com/linli/comments/commentRss/412933.htmlhttp://www.aygfsteel.com/linli/services/trackbacks/412933.html试用IPVS来做负蝲均衡Q用了1台双|卡服务器和2台单|卡服务器,2个网Dc服务器信息如下Q?/span>



IP配置信息如下Q?/span>

服务?/span>

操作pȝ

|卡

IP

调度服务?/span>

Centos

eth0

192.168.18.58

eth1

192.168.2.90

实际服务?/span>

Centos

eth0

192.168.2.71

Centos

eth0

192.168.2.72

 

1.         首先配置调度服务器:

 

a)         IPVS模块已经内置?/span>linux2.6.x内核中,可以通过下面的命令查看是否已安装Q?/span>

modprobe -l | grep ipvs

看到cM下面的输出,表示已经安装?/span>

kernel/net/netfilter/ipvs/ip_vs.ko

kernel/net/netfilter/ipvs/ip_vs_rr.ko

kernel/net/netfilter/ipvs/ip_vs_wrr.ko

kernel/net/netfilter/ipvs/ip_vs_lc.ko

kernel/net/netfilter/ipvs/ip_vs_wlc.ko

kernel/net/netfilter/ipvs/ip_vs_lblc.ko

kernel/net/netfilter/ipvs/ip_vs_lblcr.ko

kernel/net/netfilter/ipvs/ip_vs_dh.ko

kernel/net/netfilter/ipvs/ip_vs_sh.ko

kernel/net/netfilter/ipvs/ip_vs_sed.ko

kernel/net/netfilter/ipvs/ip_vs_nq.ko

kernel/net/netfilter/ipvs/ip_vs_ftp.ko

kernel/net/netfilter/ipvs/ip_vs_pe_sip.ko

 

b)         安装IPVS的管理工?/span>ipvsadmQ?/span>

yum install -y ipvsadm

 

c)         清除表中所有记录:

ipvsadm -C

使用下面的命令增加虚拟服务器Q采用轮询调度策略:

ipvsadm -A -t 192.168.18.58:8888 -s rr

 

使用下面的命令添加实际服务器Qƈ采用NAT方式转发数据包:

ipvsadm -a -t 192.168.18.58:8888 -r 192.168.2.71:9999 -m

ipvsadm -a -t 192.168.18.58:8888 -r 192.168.2.72:9999 -m

 

d)         打开数据包{发:

echo 1 > /proc/sys/net/ipv4/ip_forward

 

2.         接下来配|?/span>2台实际服务器Q分别做以下工作Q?/span>

 

a)         ?/span>9999端口上启动一?/span>web服务Q?/span>

配置?/span>web服务后,当访?/span>http://192.168.2.71:9999Ӟ面q回Q?/span>This is 192.168.2.71.Q当讉Khttp://192.168.2.72:9999Ӟ面q回Q?/span>This is 192.168.2.72.

 

b)         讄默认|关指向调度服务?/span>

route del default

route add default gw 192.168.2.90

 

3.        

 

讉K192.168.18.58:8888Q会昄This is 192.168.2.71?/span>This is 192.168.2.72Q多ơ刷新应该要交替出现71?/span>72Q但实际上ƈ没有q样Q浏览器只显CZW一ơ相同的内容Q也是ipvsadm每次都选择了同一台服务器。这是因为当一?/span>TCPq接的初?/span>SYN报文到达ӞIPVS选择了一台服务器Q后l报文会被{发到相同的服务器。这?/span>TCPq接?/span>ipvsadm中默认有效时间ؓ15分钟Q可以通过下面的命令查看:

ipvsadm -L --timeout

Timeout (tcp tcpfin udp): 900 120 300

现在有效时间改?/span>1U来试Q用下面的命oQ?/span>

ipvsadm --set 1 120 300

 

再到览器中每隔1U多点击hQ就会交替出?/span>71?/span>72Q说明轮询调度正在正常工作?/span>

 

 



老林 2014-04-25 14:32 发表评论
]]>
iptables NAT 学习http://www.aygfsteel.com/linli/archive/2014/04/24/412896.html老林老林Thu, 24 Apr 2014 09:15:00 GMThttp://www.aygfsteel.com/linli/archive/2014/04/24/412896.htmlhttp://www.aygfsteel.com/linli/comments/412896.htmlhttp://www.aygfsteel.com/linli/archive/2014/04/24/412896.html#Feedback0http://www.aygfsteel.com/linli/comments/commentRss/412896.htmlhttp://www.aygfsteel.com/linli/services/trackbacks/412896.htmlZ搞清?/span>iptables NAT的过E,做了q个实验。用了1台双|卡服务器和1台单|卡服务器,2个网Dc服务器信息如下Q?/span>


IP配置信息如下Q?/span>

服务?/span>

操作pȝ

|卡

IP

调度服务?/span>

Centos

eth0

192.168.18.58

eth1

192.168.2.90

实际服务?/span>

Centos

eth0

192.168.2.73

 

1.       Z看到调度服务器上的数据{发过E,首先在调度服务器上分?/span>内核的debug日志Q?/span>

?/span>/etc/rsyslog.conf最后增加:kern.debug /var/log/iptables.log

重启日志服务Q?/span>/etc/init.d/rsyslog restart

 

2.       启动调度服务器的iptablesq清I?/span>

service iptables start

iptables -F

 

3.       增加调度服务器的iptables特定日志输出

假设要将对调度服务器8888端口的访问{发给实际服务器的9999端口处理Q在iptables中增加与q?/span>2个端口相关的日志输出Q?/span>

iptables -t mangle -A PREROUTING -p tcp --dport 8888 -j LOG --log-level debug --log-prefix "<<<<< PER IN:"

iptables -t mangle -A PREROUTING -p tcp --sport 9999 -j LOG --log-level debug --log-prefix "<<<<< PER IN:"

iptables -t mangle -A POSTROUTING -p tcp --sport 8888 -j LOG --log-level debug --log-prefix ">>>>> POST OUT:"

iptables -t mangle -A POSTROUTING -p tcp --dport 9999 -j LOG --log-level debug --log-prefix ">>>>> POST OUT:"

iptables -t mangle -A POSTROUTING -p tcp --sport 9999 -j LOG --log-level debug --log-prefix ">>>>> POST OUT:"

 

q时Q通过览器访?/span>http://192.168.18.58:8888可以看到iptables.log中打印出下面的日志:

Apr 24 16:24:35 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=28721 DF PROTO=TCP SPT=50270 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0

Apr 24 16:24:35 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth0 SRC=192.168.18.58 DST=192.168.18.25 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=8888 DPT=50270 WINDOW=0 RES=0x00 ACK RST URGP=0

 

虽然q个端口上即没有应用Q也没有请求{发出去,但日志打印出了内核获取到的对q个端口的请求?/span>

 

4.       配置iptables8888的请求{发到192.168.2.73:9999

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8888 -j DNAT --to-destination 192.168.2.73:9999

 

讉Khttp://192.168.18.58:8888Q日志中打印如下信息Q?/span>

Apr 24 16:39:21 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=56888 DF PROTO=TCP SPT=50274 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0

 

日志中只打印了从eth0收到的对8888端口的请求,q是因ؓ当数据要被{发到192.168.2.73:9999Ӟ默认情况下被止了?/span>

 

5.       打开数据包{发功?/span>

echo 1 > /proc/sys/net/ipv4/ip_forward

 

讉Khttp://192.168.18.58:8888Q日志中打印如下信息Q?/span>

Apr 24 16:39:21 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=56888 DF PROTO=TCP SPT=50274 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0

Apr 24 16:39:21 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth1 SRC=192.168.18.25 DST=192.168.2.73 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=56888 DF PROTO=TCP SPT=50274 DPT=9999 WINDOW=14600 RES=0x00 SYN URGP=0

 

W一条日志显CZeth0收到了对8888端口的请求,W二条日志显C?/span>iptables已经更改了数据包的目的地?/span>192.168.2.73:9999Qƈ通过eth1发出厅R?/span>

 

但这时请求虽然已l被转发到实际处理的服务器,但调度服务器收不到响应,览器仍在不停重试,日志也在不断打印。这是因为实际服务器收到的数据包的来?/span>IP是另一个网D늚Q实际服务器回复Ӟ发现不是本网D늚把数据包发l网养I|关讄的是192.168.2.1Q这时数据就丢了?/span>

 

6.       实际服务器的默认网兌|ؓ192.168.2.90

在实际服务器上执行以下命令:

route del default

route add default gw 192.168.2.90

 

再次讉Khttp://192.168.18.58:8888Q日志打印如下信息:

Apr 24 16:47:27 route-server1 kernel: <<<<< PER IN:IN=eth0 OUT= MAC=00:1f:c6:cb:eb:e0:00:1f:33:de:29:ad:08:00 SRC=192.168.18.25 DST=192.168.18.58 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=37000 DF PROTO=TCP SPT=50279 DPT=8888 WINDOW=14600 RES=0x00 SYN URGP=0

Apr 24 16:47:27 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth1 SRC=192.168.18.25 DST=192.168.2.73 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=37000 DF PROTO=TCP SPT=50279 DPT=9999 WINDOW=14600 RES=0x00 SYN URGP=0

Apr 24 16:47:27 route-server1 kernel: <<<<< PER IN:IN=eth1 OUT= MAC=00:22:b0:de:f7:49:00:24:8c:b4:a1:8c:08:00 SRC=192.168.2.73 DST=192.168.18.25 LEN=40 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=TCP SPT=9999 DPT=50279 WINDOW=0 RES=0x00 ACK RST URGP=0

Apr 24 16:47:27 route-server1 kernel: <<<<< POST OUT:IN= OUT=eth0 SRC=192.168.2.73 DST=192.168.18.25 LEN=40 TOS=0x00 PREC=0x00 TTL=63 ID=0 DF PROTO=TCP SPT=9999 DPT=50279 WINDOW=0 RES=0x00 ACK RST URGP=0

 

上面W一条第二条日志和之前一Piptables目地址更改后,通过eth1|卡发送出厅R第三条日志通过eth1|卡接收C实际服务器发送过来的数据Qƈ在第四条日志中通过eth0发回h斏V?/span>

 



老林 2014-04-24 17:15 发表评论
]]>
վ֩ģ壺 | | | ܿ| | | ɽ| | | | | | | ϻ| | | µ| | | ɽ| ɳ| | | Ϫ| | ˮ| ɽ| | ¹| ʶ| | | ɽ| | | | | ɽ| | | |