Web服务器集群搭建关键步骤纪要
前言:本文记述了搭建一个小型web服务器集群的过程,由于篇幅所限,系统、软件的安装和基本配置我这里就省略了,只记叙关键配置和脚本内容。假如各位朋友想了解各软件详细配置建议查阅官方文档。
一 需求分析:
1.整体需求:搭建一个高可用的网站服务器集群,能承受高并发请求,能抵御一般的网络攻击,任何一台服务器的退服不影响整个集群的运作,并且能对各服务器的运行情况作出实时监控。
2.详细需求分析:
根据需求,计划根据以下拓扑搭建运行环境:
二 详细功能描述:
1.前端服务器采用nginx实现反向代理和负载均衡,用keepalive实现HA。此部分由centos1和centos4实现,centos1作为主服务器,centos4作为热备服务器。Nginx会根据不同的请求ip机会均等地把请求发送到后端两台服务器,并且以ip hash的方式保持各个ip的会话。
2.后端服务器构建在centos2与centos3上,采用apache作为web发布软件,mysql作为数据库,测试网页用Django来实现。两台服务器的数据库能够自动同步。
3.作为热备服务器,centos4在centos1没有故障时并没有业务流量,处于相对空闲的状态,因此在centos4上配置nfs使它成为文件共享服务器,网站文件放在这台服务器上。
4.centos5作为监控服务器,运行nagios监控各服务器状态。出现告警时通过告警通知管理员。另外centos5还作为saltstack的服务器,其他主机的软件安装、文件传输、命令运行等操作均通过saltstack批量实现。
三 总体部署描述:
1.各个服务器均安装centos6.4 64位版本,采用cobbler实现批量自动安装。
2.各个软件均安装最新的稳定版,centos自带的软件也要进行升级,例如python,Centos自带的版本比较久,会影响Django的运行。
四 详细部署描述:
1.nginx设置
Nginx在这里的作用主要是反向代理、作为用户以及服务器之间的缓存、以及以负载均衡的方式把请求发送到后端两台服务器。
采用编译安装的方式安装nginx,具体过程就不在此记述了,不过为了更好地抵挡入侵,建议编译前修改一下安装文件,使入侵者难以查出nginx的版本号,修改安装文件中的nginx.h,把相关字段修改如下:
#define NGINX_VERSION "1.0"
#define NGINX_VER "webserver" NGINX_VERSION
Nginx的配置文件如下:
user www www;
worker_processes 2; events {
worker_connections 12800;
use epoll;
} http {
include mime.types; #协助部分浏览器(如firefox)识别网页文件的类型
default_type application/octet-stream;
limit_conn_zone $binary_remote_addr zone=addr:10m; sendfile on;#指定nginx是否调用sendfile函数来输出文件,能提高性能。
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 20; #客户端连接保持活动的超时时间
send_timeout 20; #指定响应客户端的超时时间
client_body_buffer_size 1k; #指定客户端请求主体缓冲区大小
client_header_buffer_size 1k; #指定来自客户端请求头的headerbuffer大小
large_client_header_buffers 2 1k; #客户端请求中较大的消息头指定的缓存最大数量和大小
server_tokens off; #禁止在错误页面上显示nginx版本号
client_body_timeout 20; #设置客户端请求主体读取超时时间
client_header_timeout 20; #设置客户端请求头读取超时时间
gzip on;
upstream WebServers{ #指定负载均衡服务器
ip_hash; #以ip_hash的方式保持会话
server 10.0.0.3; #没有设定权重,因此两台后端服务器将机会均等地接受请求
server 10.0.0.2;
}
server {
listen 80;
server_name localhost; location / {
proxy_pass http://WebServers;
limit_conn addr 100; #指定每个ip最多只允许建立100个连接
limit_rate 500k; #每个ip最大带宽是500k
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504 http_404;
} error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
因为后端测试网页是用Django写的,因此nginx就不用处理php等动态网页的请求了。
设置完毕后,把nginx设置为开机启动,可以用如下方式:
echo “/usr/local/nginx/sbin/nginx” >>/etc/rc.local
2.Keeplive设置
Keeplive的作用是在两台服务器(centos1、centos4)之间,以VRRP协议实现HA。通过虚拟出一个Virtul IP(本例子中是192.168.48.138)来对外发布业务。两台服务器中的任一台退服了,keeplive会自动把业务转到另一台上。在这里centos1是主服务器,centos4是备用服务器。平时的数据流量只会通过centos1,只有centos1退服了,数据流量才会割接到centos4上。
centos1上的keepalive配置:
! Configuration File for keepalived global_defs {
notification_email {
test@test.com #指定告警邮箱,当发现对端服务器退服时发邮件警报
}
notification_email_from Alexandre.Cassen@firewall.loc
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id LVS_DEVEL
} vrrp_instance VI_1 {
state MASTER
interface eth0 #绑定网卡接口
virtual_router_id 51
mcast_src_ip 192.168.48.139 #设置本机通过哪个ip发送vrrp包
priority 100 #设置优先级
advert_int 1 #检查间隔,这里设置为1秒
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.48.138
}
}
对于从服务器centos4,只需要把以上配置文件的部分内容修改即可:
state BACKUP
mcast_src_ip 192.168.48.140
priority 90
同样,配置好配置文件后,把keepalive添加到开机启动中。
对于keepalive,由于是使用VRRP协议来检查对端是否在线的,只要对端能ping通,那么keeplive就会认为对端在线。但也有一种情况是对端服务器没有宕机,但nginx出错关闭了,这种情况下keepalive仍然会判断对端在线,不会把业务割接到备用服务器。因此我们需要在服务器上运行一个脚本,监控nginx进程的状态。假如nginx进程关闭了,先尝试重启nginx,无法重启时就关闭keepalive的进程,使业务割接到备用端。脚本如下:
#!/bin/bash
#nginxStatus.sh
while :
do
nginxStatus=`ps -C nginx --no-header |wc -l`
if ((nginxStatus==0));then
/usr/local/nginx/sbin/nginx
sleep 5
nginxStatus=`ps -C nginx --no-header |wc -l`
if ((nginxStatus==0));then
/etc/init.d/keepalived stop
fi
else #当判断到主服务器的nginx已经重新启动后,再启动keepalive,使业务倒置回主
#服务器
keepaliveStatus=`ps -C keepalived --no-header |wc -l`
if ((keepaliveStatus==0));then
/etc/init.d/keepalived start
fi
fi
sleep 5
done
把这个脚本放在centos1上,设置开机后于后台运行:
echo “nohup ~/nginxStatus.sh &”>>/etc/rc.local
由于脚本中的while会不断循环下去来检查进程运行情况,因此没必要添加进计划任务。不过谨慎起见,防止脚本意外停止,也可以在计划任务中设置每30分钟运行一次。
3.后端Web服务器设置
后端web服务器运行在centos2、centos3上,采用apache搭建,测试网页使用Django编写,网页文件存放在共享文件服务器centos4上,分别挂载在本机的/var/www/html目录。
用saltstack批量在两台服务器上安装apache、apache-devel、wsgi、Django、mysql以及升级python,过程省略。
部署好运行环境后,修改一下apache的配置文件(http.conf),把运行用户名和组名改为apache,根目录指向/var/www/html
接下来设置mysql,把两台服务器的mysql设置互为主从,使得其中一台服务器的数据库变更了,马上同步到另一台,保证两台服务器的数据一致。设置步骤如下:
首先设置centos2
打开centos2上mysql的配置文件my.cnf,作如下修改:
[mysqld]
log-bin=MySQL-bin #开启二进制日志,从服务器靠读取主服务器的二进制日志来执行同步
server-id=1 #设置为1表明这是主服务器。
binlog-ignore-db=mysql
binlog-ignore-db=information_schema # binlog-ignore-db用来指定忽略哪些数据库记录到二进制日志,这样在同步的时候就会忽略掉这些数据库。其中“mysql”数据库用于记录用户信息,“information_schema”用于记录整个数据库各个库和表的信息。
然后以root身份登陆mysql,执行下面命令:
grant replication slave on *.* to ‘test’@’10.0.0.3’ identified ‘test123’;
这命令的含义是,在10.0.0.3机器上建立一个test用户,用户密码为test123,这个用户拥有对centos2上所有数据库的所有表同步到centos3(10.0.0.3)的权限。
然后执行:
show master status;
可以看到以下信息:
记录好这个信息,然后以root身份登陆centos3的mysql,执行下面的命令(有一点需要注意,假如同步之前需要同步的数据库不是空的话,需要先在数据库上加上读锁,把主服务器的相关数据库导入到从数据库中):
change master to
master_host='10.0.0.2',
master_user='test',
master_password='test123',
master_log_file='MySQL-bin.000070',
master_log_pos=106;
上面的master_log_file和master_log_pos的信息就是之前centos2上执行show master status命令后所显示的信息。执行show slave status;命令,查看一下centos3是否已经成功成为从服务器:
可以看到centos3的mysql已经成为centos2(10.0.0.2)的从服务器了。至此centos3的mysql已经能主动同步centos2的数据了,我们只需要把以上操作在centos3上操作一次(先修改my.cnf,其中server-id要设为2,然后再执行创建用户以及授权命令),就能实现两个数据库互为主从,相互之间自动同步。
4.共享文件服务器nfs
本环节中,我们需要把centos4配置成共享文件的服务器端,后端两台web服务器的网页内容将放在共享文件服务器上,以此保证两台web服务器的网页文件内容一致。
nfs在centos6.2上默认已安装,我们首先在centos4的/etc目录下新建exports文件,加入以下内容:
/home/apache/html 10.0.0.2(rw,sync) #sync是指数据同时写入缓存和硬盘中,执行较慢但保证数据精确
/home/apache/html 10.0.0.3(rw,sync)
然后在centos4上一步步执行下面的命令:
groupadd apache
useradd -g apache -s /sbin/nologin apache
passwd apache
mkdir -p /home/apache/html
#把网页文件复制到/home/apache/html,然后再执行下面命令:
chown -R apache:apache /home/apache/html
chmod -R 700 /home/apache/html
chkconfig --level 35 nfs on
service nfs start
关于共享目录的权限设置,由于后端两台web服务器的apache都是以apache:apache这个用户来执行的,文件的读写也是通过这个用户,因此为保证数据安全,共享目录只开放权限给这个用户即可,其他用户一律什么权限都不给予。另外还要把共享文件夹的所属者设为apache:apache这个用户。
接下来到centos2、centos3两台web服务器上作如下设置,使它们开机时自动加载共享目录:
echo "mount -t nfs 10.0.0.4:/home/apache/html /var/www/html -o hard,bg,nfsvers=3 ">>/etc/rc.local
上面选项中hard表示网络短暂中断时会继续尝试连接服务器,并且不会显示错误信息;
bg表示执行mount时如果无法顺利mount上时,系统会将mount的操作转移到后台并继续尝试mount,直到mount成功为止;
nfsvers=3表示采用第3版的nfs。
5.nagios设置
监控软件安装在centos5上,负责监控其他4台服务器的情况,出现异常时发出邮件给管理员进行警报。
安装过程:需要在centos5上安装nagios、nagios插件包、nrpe、apache(用于搭建监控网页)、pnp(用于生成监控数据的分析图表)。4台被监控的主机需要安装nagios插件包以及nrpe,详细安装过程这里省略。
以下项目是对于4台服务器都需要监控的:
1.Check Swap:监控交换分区的剩余空间
2.Check Zombie Procs:监控僵尸进程的数目
3.Total Processes:监控总进程的数目
4.check-no_alowed_user:监控是否有非允许的用户登陆
5.check-system-load:监控系统负载
对于nagios的工作原理,简单来说就是:在服务端的nagios目录下的services.cfg文件上定义需要监控各个客户端的哪个监控项目,对应的监控脚本被放在客户端执行,执行结果通过客户端上的nrpe守护进程反馈给nagios服务器端。
默认情况下监控脚本返回的值所代表的的含义如下:
OK—退出代码 0—表示服务正常地工作。
WARNING—退出代码 1—表示服务处于警告状态。
CRITICAL—退出代码 2—表示服务处于危险状态。
UNKNOWN—退出代码 3—表示服务处于未知状态。
因此,要实现上述5个监控项目,首先修改nagios服务器端(即centos5)上的services.cfg文件,添加上以下内容:
define service{
use local-service
host_name centos1
service_description check-no_alowed_user
check_command check_nrpe!check_no_allowed_user #对于脚本在客户端执行的命令,都要在命令前加上check_nrpe!
notifications_enabled 1 #开启告警功能
flap_detection_enabled 0 #关闭抖动检测(当数据出现较大抖动时nagios不会作出提示)
notification_options w,c,r #warning、critical、recover时发出告警
notification_interval 5 #假如服务的状态没有恢复正常的话,告警将每5分钟发一次
notification_period 24x7 #设定告警的时段,这里设置为24X7
} define service{
use local-service,services-pnp #对于添加上services-pnp的服务,nagios将调用pnp把服务返回的数据画成图表。
host_name centos1
service_description check-system-load
check_command check_nrpe!check_load
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
} define service{
use local-service,services-pnp
host_name centos1
service_description Total Processes
check_command check_nrpe!check_total_procs
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
} define service{
use local-service,services-pnp
host_name centos1
service_description Check Zombie Procs
check_command check_nrpe!check_zombie_procs
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
} define service{
use local-service,services-pnp
host_name centos1
service_description Check Swap
check_command check_nrpe!check_swap
notifications_enabled 1
flap_detection_enabled 0
notification_options w,c,r
notification_interval 5
notification_period 24x7
}
以上写出了描述centos1监控服务的描述,其他3台服务器的描述都是一样的,只是host_name不一样,限于篇幅,这里就不把剩余部分列出了。
接下来修改客户端的设置,同样以centos1为例,修改nagios目录下的nrpe.cfg文件,添加以下内容(部分内容默认已经存在的,修改的时候需要注意有没有重复):
command[check_swap]=/usr/local/nagios/libexec/check_swap -w 20% -c 10% #-w后面的参数告诉脚本当交换空间小于20%时,返回warming状态(即返回1),-c后面的参数告诉脚本当交换空间小于10%时,返回critical状态(即返回2)
command[check_load]=/usr/local/nagios/libexec/check_load -w 1.8,1.5,1.2 -c 2.5,2,1.8
command[check_zombie_procs]=/usr/local/nagios/libexec/check_procs -w 5 -c 10 -s Z
command[check_total_procs]=/usr/local/nagios/libexec/check_procs -w 150 -c 200
command[check_no_allowed_user]=/usr/local/nagios/libexec/check_no_allowed_user.py –a cjyfff
上面这5个命令对应的脚本中,check_no_allowed_user.py是我编写的脚本,另外4个是nagios自带的。check_no_allowed_user.py的作用是检测是否有允许用户以外的用户登录系统。使用方法是脚本后面加上选项-a,然后添加允许登录的用户列表(格式是-a user1,user2...,root默认已添加到允许列表,因此无需添加root)。当允许用户列表以外的用户登录时,将会触发nagios的critial告警。这个脚本的内容如下:
#! /usr/bin/env python
#coding=utf-8
#check_no_allowed_user.py
import os, sys, getopt def Usage():
print "Usage:\n\tpython check_no_allowed_user.py [-h|--help][-a|--add allowedUser01,allowUser02...]\n"
print "\tTo creat the allowed user list,please use this format:-a user1,user2...."
print "\tAny user(s) not in allowed user list login this system will alter Nagios."
sys.exit(3) def CheckUser(args):
a = os.popen("who").read() #这里a被赋值成一个包含换行符的字符串
#下面需要以换行符分隔把a建成列表,然后提取列表元素的第一个字段,这才是
#我们所需要的当前用户名
b = list(a.split("\n"))
c = []
i = 0
while i<len(b)-1:
c.append(b[i].split(" ")[0])
i += 1
userList = set(c)
allowedList = list(args.split(",")) #创建允许用户的列表
allowedList.append("root") #允许用户的列表中默认添加上root
#print allowedList
rs = [user for user in userList if user not in allowedList] #查出在当前用户列表中但不在允许列表中的用户
#print rs if rs :
print "Detected NO ALLOWED user(s)%s"%rs
sys.exit(2)
else:
print "All user is ALLOWED."
sys.exit(0) try:
options, args = getopt.getopt(sys.argv[1:], "ha:", ["help", "add="])
except getopt.GetoptError:
Usage() for o,r in options:
if o in ("-h", "--help"):
Usage()
if o in ("-a", "--add"):
#print type(r)
CheckUser(r)
另外,对于centos1、centos4两台前端服务器,还需要添加2项监控服务:
80port:监控80端口的情况
CheckNginxState:监控nginx进程是否启动
同样,以centos1为例,修改centos5上的services.cfg,添加上以下内容:
define service{
use local-service,services-pnp
host_name centos1
service_description 80port
check_command check_tcp!80 #这个命令是通过服务器端的脚本来监控客户端的80端口的,因此无需加上check_nrpe!,客户端也不需要存在这个命令对应的脚本。
} define service{
use local-service
host_name centos1
service_description CheckNginxState
check_command check_nrpe!check_nginx
}
然后修改centos1上的nrpe.cfg,添加上以下内容:
command[check_nginx]=/usr/local/nagios/libexec/check_nginx.sh
这里的check_nginx.sh也是我自己编写的脚本,脚本内容如下:
#!/bin/bash
#check_nginx.sh
use_age="This script is for checking nginx status,if nginx is stop Nagios will alarm."
if (($#!=0));then
echo $use_age
exit 3
fi
a=`ps -C nginx --no-header |wc -l`
if ((a!=0));then
echo "nginx is running."
exit 0
else
echo "nginx is NOT running."
exit 2
fi
对于centos4这台共享文件服务器,还需要增加一个监控项目,监控硬盘的容量大小,这里可以用nagios自带的check_disk脚本,方法和上面一样的,这里就不在叙述了。
对于作为后端web服务器的centos2、centos3,也很有必要监控服务器上apache以及mysql是否正在运行。监控脚本很简单,只需要把上面check_nginx.sh中“a=`ps -C nginx --no-header |wc -l`”修改一下,把“nginx”替换为“httpd”和“mysqld”即可。
最后,客户端都设置好监控设置了,作为服务器端,也可以为centos5增加监控内容,服务器端的监控脚本同样放在服务器端的libexec/下,监控服务是在localhost.cfg中定义的。
谨记添加自己写的脚本后要把用户改为nagios:nagios,并且增加执行权限。
最终配置完毕后,打开nagios监控页面的效果图如下:
6、安全设置
为了减少ssh密码被暴力破解的风险,在各个服务器上把ssh端口从默认的22端口更改为其他端口(本例子中改为2002),并且在/etc/hosts.allow中指定允许sshd通信的ip,在/etc/hosts.deny中添加sshd:ALL
考虑到服务器都是在内网环境,已经能隔绝外网的很多攻击,并且开启防火墙的话会影响服务器之间数据转发速度,因此我在这4台服务器上都关闭iptables,仅在centos5上开启。在实际生产环境中,依靠在集群前面的防火墙对集群进行进一步保护。
centos5的iptables脚本如下:
!#/bin/bash
#centos5-iptables.sh
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT#允许icmp协议包通过
iptables -A INPUT -s 192.168.48.139 -j ACCEPT
iptables -A INPUT -s 192.168.48.140 -j ACCEPT
iptables -A INPUT -s 10.0.0.2 -j ACCEPT
iptables -A INPUT -s 10.0.0.3 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
/etc/rc.d/init.d/iptables save
五 结语:
最后我用apache benchmark测试了一下网站。虽然是在虚拟机环境,测试数据没多大参考价值,但是通过测试也可以看看在高并发的环境下,那些服务器负荷最大。经测试,在100并发的环境下,虽然网页还能打开,但是nagios已经失去了后端两台web服务器的响应,提示request timeout了,其他两台服务器的负载还是很低,说明在高并发的环境下,后端的web服务器负荷最大,也是重点需要优化的对象。
这个实验环境存在一个不足,那就是共享文件只放在一台服务器上,容易造成单边,建议条件许可的情况下可使用分布式存储系统,例如MFS。
另外在搭建实验环境的过程中还有2点待日后跟进:
1、优化apache的性能,让后端服务器能应付更大并发。
2、Mysql的主从同步存在延迟问题,可能会导致主、从数据库不一致。这个查看网上资料可以通过插件来解决,下一步尝试接触这些插件的使用方法。
Web服务器集群搭建关键步骤纪要的更多相关文章
- 大数据之Linux服务器集群搭建
之前写过一篇关于Linux服务器系统的安装与网关的配置,那么现在我们要进一步的搭建多台Linux服务器集群. 关于单台服务器的系统搭建配置就不在赘述了,详情见https://www.cnblogs.c ...
- Nginx网络架构实战学习笔记(六):服务器集群搭建、集群性能测试
文章目录 服务器集群搭建 Nginx---->php-fpm之间的优化 302机器 202机器 压力测试 搭建memcached.mysql(数据准备) 今晚就动手-.- 集群性能测试 服务器集 ...
- nginx+apache+php+mysql服务器集群搭建
由于需要搭建了一个基本的服务器集群.具体的配置方案先不说了,到有时间的时候再介绍.下面介绍下整 个方案的优点. 我总共准备了四台阿里云的主机,架设分别是A,B1,B2,C,A在集群的最前面,B1和B2 ...
- FastDFS教程IV-文件服务器集群搭建
1.简介 本文主要介绍FastDFS文件服务器的集群搭建,在阅读本文之前,您需具备FastDFS文件服务器单节点安装,扩容,迁移等方面的知识.同时,您还需了解Keepalived,nginx方 ...
- 使用简单的 5 个步骤设置 Web 服务器集群
通过在多个处理器之间分担工作负载并采用多种软件恢复技术,能够提供高度可用的环境并提高环境的总体 RAS(可靠性.可用性和可服务性).可以得到的好处包括:更快地从意外中断中恢复运行,以及将意外中断对终端 ...
- 采用软件nginx实现web服务器集群
nginx:软件负载均衡器 是高并发量http/反向代理服务器.实现windows下IIS的负载均衡 条件:2台服务器 1.cpu:Inter(R) 酷睿 i5 cpu 2.26GHz 内存:2G ...
- web服务器集群(多台web服务器)后session如何同步和共享
在访问量上去以后,很多人会采用web集群的方式在满足逐渐增长的用户量.这时候就不得不面对一个问题,那就是在多个服务器下,每次请求都会因为负载均衡而分配到不同的服务器上.用户在登录服务器后,下一次请求被 ...
- Nginx+Tomcat+Terracotta的Web服务器集群实做
1.准备工作两个Linux服务器,可以用VMware装一个,然后配置好再克隆一个,修改IP即可.Host1:192.168.0.79Host2:192.168.0.80先配置好jdk1.6.0和tom ...
- web服务器集群session同步
在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,一个登录用户,一会是登录状态,一会又不是 ...
随机推荐
- CAML query for Group by count and data
CAML query for Group by count and data Company Category Product Name Microsoft Developer Visual Stud ...
- 《MFC游戏开发》笔记二 建立工程、调整窗口
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9300383 作者:七十一雾央 新浪微博:http:/ ...
- java笔记01-反射
--2013年7月26日17:56:35 写文章之前,参考了这篇:http://www.cnblogs.com/Quincy/archive/2011/06/19/2084557.html 评价:这个 ...
- 关于使用vss版本管理工具中的sln,suo文件作用
Visual Studio.NET采用两种文件类型(.sln和.suo)来存储特定于解决方案的设置,它们总称为解决方案文件.为解决方案资源管理器提供显示管理文件的图形接口所需的信息 从而在每次继续开发 ...
- hdu3584 树状数组
思路:从一维扩展到三维.可以看看poj2155的解法. #include<iostream> #include<cstring> #include<algorithm&g ...
- poj 1469 二分图最大匹配
就是最简单的最大匹配,没的说 #include<iostream> #include<cstdio> #include<cstring> #include<a ...
- C#/.NET使用HttpWebRequest、SqlBulkCopy从API获取数据批量插入DB
小弟新手程序员一枚,代码技术和文章水平均不才.所写文章均为对自己所写所学代码的简单记录,可能对于老手程序员营养价值不高,望莫见怪. 我工作上有个需求:从某处API接口上获取数据(大约1W条而已)并插入 ...
- CSS/块级元素与内联元素的深入理解
今天终于对html中的块级元素和行内元素有了一个较为理性的认识.首先w3c对于block和inline的解释为:
- DOM操作在jQuery中的实用------文字提示和图片提示
关于文字提示想必是家喻户晓,操作呢说简单一点就是在超链接中加入title属性.但是在人机交互越来越倍受恩宠的年代,依靠浏览器自带的文字提示即title属性,提示效果的响应速度就(还是人艰不拆了吧~)s ...
- Linux 命令 - tail: 打印文件的结尾部分
命令格式 tail [OPTION]... [FILE]... 命令参数 -c, --bytes=[-]K 显示每个文件的后 K 字节内容.-n +K 则表示从第 K 字节开始输出. -f, --fo ...