Google的三篇论文,Google File System ,MapReduce 以及Big Table 可以说是整个大数据领域的三驾马车,这里,我们简单介绍下这三驾马车基本都是干哈的,重点解读下Bigtable: A Distributed Storage System for Structured Data 。
2003年的GFS :GFS是一个可扩展的分布式文件系统,主要解决传统单机文件系统中磁盘小,数据存储无冗余等问题;
2004年的MapReduce :MapReduce是一个基于分布式文件系统(例如,GFS)的分布式计算框架,主要用来处理大规模数据集;
2006年的BigTable :BigTable是一个用来管理结构化数据的分布式存储系统,其本质上一个分布式KV存储系统。
BigTable是个啥?
BigTable是Google内部用来管理结构化数据的分布式存储系统,BigTable可以轻易地扩展到上千台机器,BigTable具有以下优点:
适用场景广泛:从需要高吞吐量的批处理作业到低延迟的用户数据服务,BigTable都可以胜任。
可伸缩:集群规模可水平扩展,BigTable部署规模可以小到3~5台,大到数千台,从而支撑不同的数据量;
高性能:性能这个,想必不用我BB了吧,各位看官,你们怎么看呢?
高可用:BigTable是主从结构,不会产生单点故障;底层是GFS,数据冗余备份;这还不具有高可用嘛???
与关系型数据库不同,BigTable并不支持完整的关系数据模型,也就是说,BigTable是一个NoSQL数据库,BigTable为用户提供了一个简单的数据模型,该模型主要有以下两个特点:
客户端可以对数据的布局和格式动态控制;这点与关系型数据库有很大的差别,关系型数据库中,表创建完成后,表中存储的数据格式基本就固定了,列的数量及格式都无法再改变了,BigTable则不同,BigTable的列可以动态增加,完全由客户端控制。
客户端可以推理底层数据存储系统中表示的数据的局部属性(有点不太理解)。
BigTable中的数据是通过行(row)和列(column)进行索引的,行和列可以是任意字符串。
客户端可以将各种形式的结构化和半结构数据序列化字符串,但BigTable只是将数据(Data)看做是未解释字符串(字节数组)进行处理。
客户端可以通过模式(Schema)参数来控制底层数据存储的位置,BigTable的模式参数允许客户端动态控制是从内存还是磁盘提供数据。
BigTable数据模型
让我们先来看看BigTable 论文中是如何对BigTable
定义的吧~
A BigTable is a Sparse, Distributed, Persistent Multi-Dimensional Sorted Map
. The Map
is indexed by a row key, column key, and a timestamp
; each value in the map is an uninterpreted array of bytes
.
BigTable是一个Map,即Key/Value键值对,这个Map有啥特点呢?稀疏的,分布式的,持久化存储的且多维度排序的。
对于Map数据结构来说,最常用的操作就是通过Key检索Value,BigTable中的Value是通过行,列,时间戳进行索引的。
# BigTable/Map的索引结构
(row:string, column:string, time:int64) ==> string
BigTable-WebPage-Example.png
上图是为Web页面创建的BigTable表Webtable :
row为url地址的逆序;
列族contents用来存储Web页面内容;
列族anchor中存储Web页面中任何引用其他页面的锚点连接;
注意:BigTable中,每个Cell都有多个Version,每个Version对应一个时间戳。
Row Key
BigTable中的row key
可以是任意字符串(大部分场景下,用户使用的row key 大小为10-100字节,但BigTable当前分配大小为64KB)。
客户端每次读取/写入数据时,指定row key
时,无论有多少列同时被读取/写入,该读写操作都是原子操作的。
BigTable底层是按row key
的字典顺序存储的,给定BigTable表,其row key range
是动态分区的,每个分区称为一个Tablet
。
Tips:较小范围的row key
数据读取会更高效,原因在于,这些数据读取时,只需要与很少的机器通信即可,效率较高。
Tips:客户端可以充分利用上述属性,从而加快其数据访问,获取更高的吞吐量。例如,在Webtable 中,使用url的逆序作为row key,这样做的好处是,访问同一网站的页面时,这些页面通常会对应同一台机器,不需要与集群中多个节点通信,读取效率更高。
Column Families
多个Column Key
构成的集合称为列族Column Families
,Column Key
是最基本的访问控制单元。
同一列族中的数据通常具有相同的数据类型(一般情况下,同一列族的数据会放在一起进行压缩存储)。
数据以列族(Column Families**)中某个列(**
Column Key` )进行存储之前,必须先创建该列族才行。
Tips:通常情况下,一张BitTable表的列族得数量可能比较小(最多几百个),而且在使用过程中,列族通常是不变的,相反的,每个表可以拥有无数个列,也就是说,每个列族都可以拥有无数个列,而且列是不需要提前定义的。
Column Key
通常使用语法family:qualifier
进行命名,列族必须由可打印字符构成,而列名可以由任意字符构成。
Timestamps
BigTable表中每个Cell包含同一数据的多个版本,这些版本通过时间戳进行索引,BigTable中的时间戳是64位整数。
时间戳可以由服务端生成,也可以由客户端生成,需要避免冲突的应用程序必须由自身生成相应的时间戳。
不同版本的Cell以时间戳降序的方式进行存储,以至于时间戳最近的版本最先会读取到。
为了避免Cell的数据版本过多,提供列族级别的配置项,以便BigTable自动删除旧的数据版本,一种是只保留最近的几个版本,另一种是只保留足够新的版本数据(例如,保留最近7天写入的数据版本)。
BigTable API
BigTable API提供创建/删除表和列族的方法。
BigTable API提供修改集群,表,列族元数据方法,例如,修改访问控制权限等。
客户端应用程序可以执行写入/删除BigTable中的值,根据row key查询值,迭代表中部分数据集等操作。
// Open the table
Table *t = OpenOrDie("/bigtable/web/wetable");
// Write a new anchor and delete an old anchor
RowMutation r1(T, "com.cnn.www");
r1.Set("anchor:www.c-span.org", "CNN");
r1.Delete("anchor:www.abc.com");
Operation op;
// 应用原子操作到Webtable中的r1上
Apply(&op, &r1);
客户端可以在多个列族上进行迭代操作,同时,BigTable提供了几种row, columns, timestamps构建方法来生成Scan实例。
Scanner scanner(T);
ScanStream *stream;
stream = scanner.FetchColumnFamily("anchor");
stream->SetReturnAllVersions();
scanner.Lookup("com.cnn.www");
for (; !stream->Done(); stream->Next()) {
printf("%s %s %lld %s\n",
scanner.RowName(),
stream->ColumnName(),
stream->MicroTimestamp(),
stream->Value());
}
另外,BigTable支持其他更复杂地操作数据的方式:
支持单行(single-row)事务,可以实现给定row key
时执行原子性的读-改-写 操作。
BigTable提供了批量接口,但不支持多行的事务操作。
BigTable允许将Cell用作整数计数器。
BigTable支持在服务端地址空间内执行客户端脚本,该脚本为Sawzall
语言(懵逼)。
BigTable构建基础
BigTable是基于Google的一些基础组件构建而成的。
BigTable使用GFS(Google File System)来存储日志(log)和数据(data)文件。
BigTable集群通常运行在一个共享的服务器集群中,BigTable的进程通常与其他分布式应用程序进程共享同一台服务器。
BigTable依赖集群管理系统来实现作业调度,管理共享机器上的资源,处理机器故障以及监视机器状态。
BigTable使用Google SSTable
文件格式来存储内部数据,SSTable
提供了从keys
到values
的持久化的,顺序的,不可变的映射,另外,SSTable
中keys和values均是任意字节数组,另外,SSTable
提供了根据key检索value以及根据key范围检索Value的功能。
SSTable
由很多Block
(每个Block默认大小为64KB,可配置的)组成,Block Index
(存储在Block尾部)用来定位Blocks,当客户端打开SSTable
时,会将Block Index
加载到内存的。
从SSTable
中检索指定key
的values
时可以通过Single Disk Seek
实现:
首先加载Block Index
到内存中,然后通过二分检索到key
所在的Block,最后将磁盘中合适的Block
加载到内存检索即可。
BigTable依赖高可用且可持久化的分布式锁服务Chubby,Chubby服务包含4个活跃的副本(节点),其中一个节点选举为Master并处理用户请求,当大多数副本副本正常运行且可以互相通信时,Chubby被认为是正常运行的。Chubby使用Paxos算法实现副本数据一致。
Chubby提供了包含目录和小文件的命名空间,每个目录或文件可以当成一个锁来使用,读取和写入文件时原子操作。
Chubby客户端会同步缓存Chubby文件,每个Chubby客户端会自动维护一个与Chubby服务的会话,在会话到期时,如果客户端无法通过Chubby服务更新到期时间,则会话会被中断,会话到期时,客户端会丢失所有所有锁且无法执行open操作。
Chubby客户端可以在Chubby文件/目录上注册回调方法,当会话到期或文件/目录改变是回调该方法。
BigTable使用Chubby完成各种各样的任务:
保证集群内同时最多存在一个Master节点。
存储BigTable表数据的启动位置。
发现Tablet服务以及检测Tablet是否存活。
存储BigTable表Schema信息(每张表的列族信息)。
存储访问控制列表。
BigTable实现原理
BigTable实现主要包括三部分:
客户端需要使用的库
一个Master Server
分配Tablet到哪个Tablet Server上;
检测是否有Tablet Server新增或到期;
Tablet Server负载均衡;
GFS上垃圾文件回收;
处理BigTable表Schema修改(例如,创建/新增表列族);
多个Tablet Server:
每个Tablet Server维护一个Tablet集合(每个Tablet Server通常可以维护10到1000个Tablet);
处理其负责的Tablet的读写请求,在Tablet太大时,负责Tablet的分裂;
根据集群负载情况,Tablet Server可以动态添加或移除。
Tips:与其他单Master分布式存储系统类似,客户端数据不会路由到Master,而是直接与Tablet Server通信,进而实现数据的读写。
Tips:很多BigTable客户端不需要依赖于Master定位Tablet信息,也就是说,大部分场景下客户端不需要与Master通信。
Tablet定位模型
BigTable使用类似B+树的三层结构来存储Tablet位置信息。
BigTable-Tablet-Location.png
第一层:一个Chubby文件,该文件存储了root tablet 的位置信息,由于该文件是Chubby文件,也就意味着,一旦Chubby服务不可用,整个BigTable就丢失了root tablet 的位置,整个服务也就不可用了。
第二层:root tablet ,root tablet 其实就是元数据表METADATA Table
的第一个Tablet,该Tablet中保存着元数据表其他Tablet的位置信息,root tablet 很特殊,为了保证整个树的深度不变,root tablet 从不分裂。
注意:对于元数据表METADATA Table
来说,除了第一个特殊的Tablet来说,其余每个Tablet包含一组用户Tablet位置信息集合。
注意:METADATA Table
存储Tablet位置信息时,Row Key
是通过对Tablet Table Identifier
和该Tablet的End Row
生成的。
注意:每个METADATA Table
的Row Key
大约占用1KB的内存,一般情况下,配置METADATA Table
的大小限制为128MB,也就是说,三层的定位模式大约可以寻址2^34个Tablets。
第三层:其他元数据表的Tablet,这些Tablet与root tablet 共同构成整个元数据表。注意:元数据表虽然特殊,但仍然服从前面介绍的数据模型,每个Tablet也由专门的Tablet Server负责,这就是为什么不需要Master Server提供位置信息的原因,客户端会缓存Tablet的位置信息,如果在缓存中找不到指定Tablet的位置信息,则需要查询该三层结构了,一次访问Chubby服务,两次Tablet Server访问。
Tablet分配模型
每个Tablet只能分配给某个Tablet Server。
Master Server维护当前哪些Tablet Server是活跃的,哪些Tablet分配给了哪些Tablet Server,哪些Tablet还未分配,当某个Tablet还未被分配、且刚好存在Tablet Server有足够的空间装载该Tablet时,Master Server会向该Tablet Server发送装载请求。
BigTable使用Chubby服务来检测Tablet Server是否存活,当Tablet Server启动时,会在特定的Chubby目录下创建排它锁,BigTable会监控该目录来发现哪些Tablet Server存活,当Tablet Server丢失其排它锁时(例如,网络原因导致Tablet Server丢失Chubby会话)。
Chubby服务提供了非常高效地检测会话是否持有锁的机制,且不会导致网络拥塞。
当Tablet Server的排它锁文件存在时,Tablet Server可能会重新获取该锁,也就是,该锁是可重入的;排它锁文件不存在,则Tablet Server不会再次请求该锁,而是自杀。
Tablet Server进程终止是,会尝试释放锁,以便Master Server可以尽快地将其维护的Tablet分配到其他节点上。
Master负责检测Tablet Server是否还在为其他Tablet提供服务,并尽快重新分配其负责的Tablet到其他Tablet Server上。
问题是,Master是如何检测的呢?
Master会定期向每个Tablet Server询问其锁的状态,如果Tablet Server向其报告锁已丢失,或者Master最后几次尝试都无法访问服务器,则Master将尝试获取该Tablet Server对应的排他锁文件,如果可以获取,则说明Chubby处于活跃状态,而Tablet Server已死或者无法访问Chubby,Master可以通过删除其服务器文件来确保Tablet Server不再提供服务。一旦Tablet Server对应的排它锁文件被删除后,Master Server可以将先前分配给该Tablet SErver的所有Tablet移动到其他未分配的Tablet Server中。
为了确保Bigtablet集群不受Master Server与Chubby服务之间网络问题影响,如果Master的Chubbby会话到期,则Master会自动杀死自己,如上所述,Master Server设备故障不会更改Tablet分配到其他Tablet Server上。
当Master Server启动时,在其可以修改Tablet分配之前,需要先感知到当前Tablet分布才行,启动流程如下:
获取Chubby文件(排它锁),阻止并发实例化Master
Master会扫描Tablet Server排它锁的Chubby文件目录,拿到当前活跃Tablet Server信息
Master与所有Tablet Server通信获取其所维护的Tablet信息
Master会同时扫描METADATA
表获取Tablets集合,在扫描的过程中,当Master发现了还未分配的Tablet时,Master将该Tablet加入未分配的Tablet集合等待合适的时机分配。
在第4不扫描METADATA
表时可能会遇到一种复杂的情况:METADATA
表的Tablet还未分配之前是不能够扫描它的。
步骤3扫描过程中,如果发现Root Tablet还没有分配,Master就把Root Tablet 加入到未分配的Tablet集合。
上面这个附加操作确保了Root Tablet 会被分配。Root Tablet 包括了 所有METADATA
的Tablet的名字,意味着Master扫描完Root Tablet后就得到了所有METADATA
表的Tablet的名字了。
现有的Tablet集合只有在创建新表或者删除了旧表、两个 Tablet被合并了或Tablet被分割成两个小的Tablet时才会发生改变。
Master可以跟踪记录所有这些事件, 除了Tablet分割外的事件都是Master发起的的。
Tablet分割事件需要特殊处理,因为该事件是由Tablet 服务器发起的。
Tablet分割结束后,Tablet Server通过在METADATA
表添加Tablet的信息来提交这 个操作;分割结束后,Tablet Server会通知Master。
如果分割操信息已提交,却没有通知到Master(可能两个服务器中有一个宕机了),Master在要求Tablet服务器装载已经被分割 的子表的时候会发现一个新的Tablet。对比METADATA
表中Tablet的信息,Tablet Server会发现 Master要求其装载的Tablet并不完整,就会重新向Master发送通知信息,从而更新METADATA
表。
Tablet Server
Tablet的数据持久化存储在GFS中,具体持久化流程如下图所示。
Updates操作会先提交到log(WAL)中,log主要用来进行数据恢复的。所有的Updates中,最近提交的那部分会存放在排序的缓存中,这个缓存称为MemTable
,更早的Updates会存放在一系列SSTable
中,这些SSTable
本质上就是MemTablet
刷盘生成的。
为了恢复Tablet
,Tablet Server首先从MEMTABLE
中读取元数据信息,元数据信息包含组成该Tablet的SSTable列表及一系列重启点,这些重启点指向包含该Tablet数据的已提交日志记录,Tablet Server会把SSTable的索引读入内存,根据重启点恢复MemTable。
Tablet Server接收到数据写入请求时,Tablet Server首先要检查操作格式是否正确、操作发起者是否有执行这个操作的权限。权限验证的方法是根据从Chubby文件里读取出来的具有写权限的操作者列表来进行验证(这个文件几乎一定会存放在Chubby客户缓存里)。成功的修改操作会记录在提交日志里。可以采用批量提交的方式来提高大量小的修改操作的应用程序的吞吐量。
数据写如操作提交后,数据最终会被插入到MemTable
里。
Tablet Server接收到数据读取请求时,Tablet Server会作类似的完整性和权限检查。一个有效的读操作在一个由一系列SSTable和memtable合并的视图里执行的。由于SSTable和memtable是按字典排序的数据结构,因此可以高效生成合并视图。
Tablet合并和分割时,正在进行的读写操作能够继续进行。
Compaction(合并)
随着数据的不断写入,MemTable
占用的内存会不断增加。当MemTable
占用的内存超过一定阈值时,内存中的MemTable
会被冻结,切换为只读状态,同时创建一个新的MemTable
,新的数据写入请求会写入到新的MemTable
中,只读的MemTable
会被转换为SSTable
并最终写入底层存储系统(GFS)中,这个过程被称作小合并(Minor Compaction
)。
小合并的作用主要有两个:
降低Tablet Server的内存使用
在Tablet Server意外宕机时,降低从WAL恢复MemTable时需要读取的数据量。
每次小合并都会生成SSTable
,如果只有小合并,一直这么持续下去,那么,在Tablet Server接收到数据读取操作时,就需要充所有可能存在待检索row key
的SSTable
检索,然后合并所有更新操作,才能最终得到最新的value值。
为了避免上述这种情况发生,我们在后台周期性地执行大合并(Major Compaction)
,大合并会读取几个SSTable
,然后进行数据合并,合并结束后,即可将原先的SSTable
文件删除。
优化及改进
前面一个章节描述了BigTable的底层实现原理,不过,为了满足用户所需的高性能,高可用和可靠性。在具体实现时需要各种优化才行。
Locality Groups
客户端可以将多个列族组成Locality Graph
。每个Tablet会为Locality Group中的数据单独生成SSTable。
将通常不会一切访问的列族分离到单独的Locality Group
中,可以实现更高效的数据读取。
例如,可以将Webtable 中的页面元数据(例如,语言和检验和)放在同一Locality Group
中,叶绵绵的内容在不同组中,当应用程序想要读取页面的元数据信息时,不需要读取所有的页面内容即可完成。
此外,还可以针对每个Locality Grou
做相应的参数优化,例如,可以声明将某个Locality Group
放到内存中。
内存中Locality Group
对应的SSTable会被延迟加载到Tablet Server中,一旦加载完成,在不访问磁盘的情况下,实现Locality Group
数据访问,此功能对于频繁访问的小块数据十分有用,Google内部用来存储元数据表。
Compression(压缩)
客户端可以控制是否压缩Locality Group
的SSTables以及使用哪种方式进行压缩。
用户指定的压缩格式应用于每个SSTable Block(其大小可通过特定于局部性组的调整参数进行控制)。
通过单独压缩每个块会损失一些空间,但好处是可以读取SSTable的小部分,而无需对整个文件进行解压缩。
许多客户端使用两遍自定义压缩方案。第一遍压缩过程使用了Bentley和McIlroy的方案[6],在一个大范围内使用前缀压缩算法对普通的长字符串进行压缩。第二遍压缩使用了一个快速压缩算法,该算法在一个16kb的小窗口中寻找重复数据。两种压缩过程都非常快,现代机器上,它们的编码速度为100-200 MB/s,解码速度为400-1000 MB/s。尽管我们在选择压缩算法时强调的是速度而不是空间缩减,但这种两遍压缩方案做得非常好。
Caching(缓存)
为了提升数据读取性能,Tablet Server使用两级缓存。
Scan Cache
是Higher-Level缓存,该缓存会缓存SSTablet接口返回的Key-Value键值对。
Block Cache
是Lower-Level缓存,该缓存会缓存从GFS中读取的SSTable Block。
Scan Cache
对于需要频繁访问相同数据的应用程序来说是非常有用的。
Block Cache
则对需要访问临近数据的应用程序来说非常有用。
Bloom Filters(布隆过滤器)
如上个章节中对BigTable底层实现原理描述的一样,数据读取操作最终是从Tablet的SSTable中读取的。如果SSTable不再内存中,最终就需要通过读取磁盘来实现数据读取了。通过为特定Locality Group
的SSTable创建布隆过滤器,可以减少磁盘的访问次数。
布隆过滤器使得我们通过查询布隆过滤器来判断SSTable是否包含指定行/列的数据,对于某些应用程序,通过使用布隆过滤器可以显著降低Tablet Server的磁盘寻道次数。另外,使用布隆过滤器意味着对于不存在的行/列数据可以避免大量不必要的磁盘读取。
WAL(提交日志实现)
如果未每个Tablet都生成相应的WAL文件,那么GFS就需要同时写入很多文件,并发量很高,这种场景下,底层每个GFS服务器为了将日志数据写入不同的物理文件,会导致大量磁盘寻道,效率极低。此外,每个Tablet提交单独的日志文件也会降低批量提交优化性能,原因在与,由于分Tablet进行提交,对应的批量数据就回比较少。为了解决这些问题,我们将每个Talbet Server中所有的Tablet的数据写入日志追加到同一日志文件中,从而降低GFS的并发量,也降低底层GFS的物理磁盘寻道。
每个Tablet Server仅创建一个提交日志(WAL)文件,在正常操作场景下,可以大幅度提高性能,但数据恢复时却很复杂。
一台Tablet Server宕机时,其维护的所有Tablets将被转移到其他Tablet Server上,每台Tablet Server仅会装载少量原始Tablet Server的Tablet。为了恢复Tablet Server的状态,新的Tablet Server需要从原始Tablet写入的提交日志中重新应用该平板电脑的更新。然而,该宕机Tablet Server上的所有的Tablet的更新操作混合在同一个物理日志文件中。
一种方法是让每个新的Tablet Server读取完整的提交日志文件,并只应用它需要恢复的Tablet所需的条目。然而,在这种方案下,如果当前集群有100台机器从一台故障的Tablet Server上分别分配Tablet,那么日志文件将被读取100次(每台服务器一次)。
为了避免日志的重复读取,首先按照对提交日志条目进行排序。在已排序的输出中,特定Tablet的所有更新操作都是连续的,因此,可通过一次磁盘搜索和顺序读取有效地读取。为了并行排序,将日志文件按64MB切分,在不同的Tablet Server上并行排序。排序过程由Master协调,并指示每台Tablet Server需要从某些提交日志文件中恢复更新日志时启动。
WAL日志写入GFS有时会由于各种原因导致性能中断(例如,涉及写操作的GFS服务器计算机,或为到达三个GFS服务器的特定集合而穿越的网络路径遇到网络拥塞或负载过重)。
为了保护更新操作不受GFS延迟峰值的影响,每个Tablet Server实际上有两个日志写入线程,每个线程都写入自己的日志文件;这两个线程一次只有一个处于活动状态。如果对WAL日志文件的写入执行得很差,则日志文件写入将切换到另一个线程,提交日志队列中的更新操作将由新活动的日志写入线程写入。日志条目包含序列号,以便在恢复过程消除此日志线程切换过程中产生的重复条目。
加速Tablet恢复
如果Master将Tablet从一个Tablet Server移动到另一个Tablet Server,则源Tablet Server首先对该Tablet Server进行一次小合并。这种合并通过减少Tablet Server提交日志中未压缩状态的数量来缩短恢复时间。完成压缩后,Tablet Server停止为该Tablet提供服务。
在实际卸载Tablet之前,Tablet Server会执行另一次(通常非常快速)小合并,以消除执行第一次小合并时到达的Tablet Server日志中的任何剩余未压缩状态。完成第二次小压缩后,可以将Tablet加载到另一台Tablet Server上,而无需恢复任何日志条目。
总结
之所以写这篇博客,其实,是为了引出LevelDB ,LevelDB又是啥呢?
LevelDB一个单机的开源的高效的KV存储系统,该单机KV存储系统,可以说是高度复刻了BigTable中的Tablet,而BigTable毕竟不是开源哒,我们通过Google的这篇论文,也只是能了解到BigTable的整体架构,但是具体细节就只能YY,或者去看HBase(参考BigTable实现的一个开源分布式列式数据库)的源码了。
不过呢,出于工作需要呢,目前对HBase需求不大,更需要弄懂单机KV系统是如何实现的,所以呢,我就屁颠屁颠地区看LevelDB了,相比于BigTable/HBase,仅仅是单机和分布式的区别了,而且,LevelDB代码量更小,更容易学习和掌控,接下来,我会通过一系列笔记来记录和分享自己学习LevelDB设计原理及底层细节的过程,希望大家多多关注呀。
你可能感兴趣的:(缘起:BigTable)
nginx upstream server主动健康监测模块添加https检测功能【上】
码农心语
nginx学习 c++开发 LINUX nginx https 运维 健康检测 upstream proxy
1缘起 前面的《nginxupstreamserver主动健康检测模块ngx_http_upstream_check_module使用和源码分析》系列已经分析了ngx_http_upstream_check_module的实现原理,并且在借助这个模块的框架实现了一个udp健康检测的新功能。 但是ngx_http_upstream_check_module还缺乏基于https监测上游服务器健康状
【创作纪念日】1024回忆录
风巽·剑染春水
创作纪念日 1024
不知不觉中,从创作第一篇文章到现在,已经1024天了,两年多的时间里,已经从硕士到博士了,1024,对于程序员来说,是个特别的数字吧,在此回忆与记录一下这些美好的经历吧。缘起 很早以前,我从来也没想过我会了解计算机,了解代码的世界,那时候少年心中的梦想是当一名医生,想要悬壶济世,想要治病救人。后来因为种种原因,我没能成为一名临床医学生,学习了生物医学工程专业。 这个专业说实话很杂,什么都学
寄小作者——郑泽宇
痴信不改一书生
缘起:中小学生写作文,无外乎两种情形:学业要求,不得不写;真情流露,不吐不快。无论哪种情形,学生写出的文章,总能引发我的思考和遐想。用文字记下,一来留住自己的所思和所想,二来也算是对小作者的一种欣赏和鼓励吧。图片发自App郑泽宇:你能把学习平衡车的过程一五一十地描写出来,真不简单!读你的文章,犹如我自己站在平衡车上,时而打个趔趄,时而摔在地上,时而向前运动,时而左右倾斜。让人有身临其境的感觉,这与
缘
似水流年1200
中国人爱讲一个缘字,缘分一词,可谓是我们日常生活中的口头禅。家里人要催婚,“这事要看缘分,硬逼我有用吗?”是个常用缺不实用的借口。“有缘千里来相会,无缘对面不相逢”也是被无数人所追捧。无巧不成书,在我看来一个“巧”字和缘也是异曲同工之妙。《白蛇·缘起》中,小白因刺杀国师失败被打入河中,让许宣救起。这便是缘起的开始。缘,在中国人心中,有孽缘和善缘一说。许宣救起失忆的白蛇,在和她追溯回忆的过程中,两人
寄小作者——巩钰梵
痴信不改一书生
缘起:中小学生写作文,无外乎两种情形:学业要求,不得不写;真情流露,不吐不快。无论哪种情形,学生写出的文章,总能引发我的思考和遐想。用文字记下,一来留住自己的所思和所想,二来也算是对小作者的一种欣赏和鼓励吧。图片发自App图片发自App作者:南乐县第一实验小学六年级二班巩钰梵巩钰梵:你说自己体会到了一只鸟的自由和快乐,我深有同感!有段时间,我的生活种种不顺,事业也跌入低谷,世界对我来说,仿佛一团浓
第一章 缘起
信子呀
易峰王朝——白府一个黑衣人轻轻一跃,便翻过了高高的墙壁。一身黑衣使他完全融入了整个黑夜,如若不是仔细细看,定是发现不了。只见他手拿一把长剑,轻手轻脚的跑到一间房门前,用手在窗户纸在转出一个小洞,往里仔细一看确定房里的人是否真的入睡。在确定好后便小心翼翼的推开房门,蹑手蹑脚的把门给关上。没做多余的停留,直直走向床的方向,确定好目标,高高举起手中的剑便朝床上女子的心口刺去。21世纪——某剧组“倾倾啊!
寄小作者——程锦琨
痴信不改一书生
缘起:中小学生写作文,无外乎两种情形:学业要求,不得不写;真情流露,不吐不快。无论哪种情形,学生写出的文章,总能引发我的思考和遐想。用文字记下,一来留住自己的所思和所想,二来也算是对小作者的一种欣赏和鼓励吧。图片发自App程锦琨:你说的很对,身残志坚的人都在用不屈不挠的精神和比常人多几倍的毅力谱写着一个个令人震惊的生命乐章。除了他们,还有一些人,值得我们敬佩。五年前,出于工作关系,我有幸接触了一些
Dell R730 2U服务器实践2:VMWare ESXi安装
skywalk8163
软硬件调试 服务器 ESXi 云服务器 raid
缘起刚到手边的一台DellR730是三块硬盘raid0,把我惊出一身冷汗,准备把它们改组成raid1或者raid5。但是舍不得里面的ESXi8,寻找能否把raid0改成raid1还不掉WSXi的方法,很遗憾没有找到。那样只能重装ESXi了。ESXi软件下载要重装ESXi了,首先要下载ESXi的安装镜像,从官网找,发现需要先注册:https://customerconnect.vmware.com/
一乘禅师:痛苦从哪里来
一乘禅师
人们拥有最多的,恐怕就是痛苦了。痛苦从哪里来?痛苦完全是头脑的产物,是自己那无明执着的心通过头脑意识产生的。痛苦产生的根源是对快乐的获取,因为对快乐的追求反倒变得“痛苦”……原本没有一个叫“痛苦”的事物存在,无明无知的心充满“执念”,执念产生分别,分别出好坏与对错,对自己不好的,不满意的,就开始烦恼或痛苦了!如果没有那个“执念”,不对面前的事物产生分别,只是明白它的存在,存在即缘起,缘起即合理,没
深入理解ngx_http_proxy_connect_module模块(上)
码农心语
nginx学习 c++开发 LINUX http 网络 网络协议 tengine nginx proxy_connect
目录1.缘起2.分析验证环境的配置3.配置指令3.1proxy_connect3.2proxy_connect_allow3.3proxy_connect_connect_timeout3.4proxy_connect_read_timeout3.5proxy_connect_send_timeout3.6proxy_connect_address3.7proxy_connect_bind3.8p
使用 npm/yarn 等命令的时候会,为什么会发生 Error: certificate has expired
Charles@TechBlog
Web 开发技术 npm 前端 node.js yarn
缘起昨天,我写了一篇文章,介绍如何使用项目模板,构建一个Electron项目的脚手架,我发现我自己在本地无法运行成功,出现了错误。✖Failedtoinstallmodules:["@electron-forge/plugin-vite@^7.2.0","@typescript-eslint/eslint-plugin@^5.0.0","@typescript-eslint/parser@^5.0
润玉传 缘来缘起 第二十二章 (作者:泊羽)
拉妈棒棒滴
“奴家碧水给诸位公子请安。”只见眼前的人儿,肤白如瓷,双目含情,红唇齿白,柔柔地声音飘溢了出来。真是位让人过目难忘地美人儿呀。她的头饰并不繁多,只以跟服饰同色系的花簪点缀着,集清新与美艳为一体,真真少见。彦佑看了不停地点头称赞到:“妙人,妙人,真乃妙人也。”就连九宝跟妩雪也点头赞同,确实是一美人儿。只有润玉坐在桌旁望着众人微微笑着,丝毫看不出他内心真正的想法。而煜儿则是从始而终没有任何想法,就只是
公历2021年8月19日[周四],中国彝族十二兽历:牛年 羊月29日。西方十二星座历:2021年狮子座29日。
道承唱古文
缘起:文化自信,日历自信,让沉睡在古籍里的文字活起来。《黄帝内经》云:五日为一候,三候为一气,六气为一时,四时为一岁。一岁为365.25天,因此中国古代有“四分历”解读。今日是-公历2021年8月19日[周四]今日是-立秋的第13天,因此今日是-二十四节气历:辛丑岁立秋13日[候三]今天是-七十二候历:辛丑岁立秋三候寒蝉鸣03日[候三]今日是-农历阳历:辛丑岁七月13日[候三](为何?因为立秋为七
叶武滨老师和时间管理的缘起
Xie云洁
图片发自App(转自喜马拉雅叶武滨时间管理进阶)亲爱的听众朋友们,大家好,我是叶武滨。中国专业的时间管理教育培训机构易效能的创始人、易效能系统研发者与课程授课导师。今天和大家聊一聊,我与时间管理的缘份、为什么要掌握这门功课,你为什么要收听我的课程。无论你对时间管理有多大的困扰,我都要非常肯定地告诉你,人人都需要时间管理,都应该学会时间管理,这是我们每个人都必须掌握的人生基本功。学好时间管理,人生一
理性思维和科学精神
呦呦Y鹿鸣
最近在读《量子物理史话》这本书,书中印象最深的就是对理性思维和科学精神的理解。理性思维,讲究论证充分,逻辑严密。科学精神,讲究怀疑求证,再怀疑,再求证。说实话这本书对我而言,深刻理解这两个概念就足够了。书中的其余部分是讲量子物理发展史的故事,剧情没什么新鲜的,在什么样的时代背景下,有一个人物,缘起有一个想法,通过层层努力解决了某一个问题,走上了巅峰,然后巅峰不断的被打破,新的思想新的理念层出不穷。
一位80岁老人感慨,无论是谁,人生的最终归宿,只有这“5个字”
舒山有鹿
01任何人活到最后,都逃不开“归宿”二字。什么是“归宿”?那就是人这一生最终的结果。所谓“缘起缘落,缘聚缘散,一切皆是命”就是这个道理。有贤人认为,一粒沙里看世界,一朵花里见天堂,手掌里握住无限,一刹那便是永劫。我们能够从微小的沙子当中看到广阔无垠的世界,也能够让手掌抓住无数的事物。可眨眼一瞬间之后,凡是能看见的事物,都消失不见了。或许,人生就是这个样子,看得见的,未必就是真实的。而看不见的,未必
缘
69f619cde86f
生命中,遇到的每一个人皆是命中注定。若无因缘,何以相遇;若无相欠,怎会相见。每一份缘,都值得善待。陪着你的人,告诉你什么是深爱。离开你的人,告诉你什么是随缘。伤害你的人,告诉你什么是还债。花开见花,花落见叶,缘起珍惜,缘灭随意。佛说:无缘之人,勿追勿忆勿盼;有缘之人,可珍可藏可伴!要有很深很深的缘分,才能很多年,一直一直联系;才能很多年,一直放在心里;才能很多年,一直默默陪你。有些缘,一开始便是一
向销售高手学习
我是彩虹小姐
说实在我没有接触过销售这个行业,接触的销售人员也比较少,朋友圈的微商人员也没怎么关注,自然不知道谁的货卖的比较好。要谈起身边的人,倒是想到了一个萍水相逢的姐妹,她是某品牌服装店的店员,最早我们并不认识,我们的结缘起始于一次我在她们店铺购物的良好体验,后来就有了联系,我也就成了他们店里的常客。久而久之,我们竟成为了好朋友。她是她们店铺的销售冠军,偶尔我去找她玩的时候,会在店里等她,并看她如何高明的卖
复盘|带着压力做好—娱乐型演讲AC3的点评
小狮子Emily
AC是头马的高阶演讲,在CC之后,我现在刚刚做完CC8,所以对我来说真的是一个挑战。但是,人生就是由一个个挑战组成,这样的生活才更加精彩,而又难能可贵。缘起有天晚上雅宁问我要不要给勇哥做点评,我其实是想拒绝的,勇哥的演讲层级高,演讲水平上一流,我要怎么去点评,还是我的馒头,而且我连AC都没有点评过,甚至CC4往上都没有做过点评。但是,经不住诱惑的我还是想挑战下自己,想看看能做到什么程度,即便不行,
《遗梦千年》
姓林字子涯
无端入梦,花红柳绿;前尘往事,潇潇。万丈伏魔,剑影刀光;无悔泪眼,西去。佛前子,妖少女,孽缘起,难断相思。乘鹤去,寻梦归,红尘怯,伏魔斩妖。千年恋,三生四世别,魔道难容泪诀别。万古弦,一曲断情缘,万丈深渊葬红颜。2019.3.6子涯图片发自App
学会这三点,犯错也能长姿势
优智堂YouMaster
1故事缘起今天是王向前在SE公司第二周实习的第一天。上午他整理完客户试用的信息,更新好销售订单进度表后,翻看张主管给他的厚厚一叠公司产品说明书。下午王向前还特意去仓库看了看产品实物,不少产品形态差不多,但操作起来有天壤之别,不仔细对比无法分辨出来。王向前出了仓库带着笔记本去了技术部,向技术部的同事请教不同材质、机理的产品各有些什么特性,认真地记在笔记本上。技术部主管看他好学,还亲自给他演示各种操作
新的开始,读书继续
随心师太
图片发自App我给你讲,笔的故事要讲3000遍哦!图片发自App学英老师分享笔的故事!讲笔的故事是金刚智慧体系最基础的本领。笔的故事讲的是空性。什么是空性呢?是一片漆黑还是一片混沌?还是潜能?学英老师在读书会浸泡两年多来,对金刚智慧的理解有独到的眼光!图片发自App在新的读书会场所,冯芳老师简要介绍能断金刚读书会的缘起和愿景、麦克·罗奇的简历。感恩荆娟女士为读书会提供了一个非常适宜的场所!图片发自
2023-08-23 感恩复盘
山谷兰铃520
感恩缘起今天一个很久没有联系的朋友,约着一起吃饭。吃饭的间隙,聊起了之前的一段很长的一个合作关系。讲真,我以为我已经修炼的很好了,可是离开之后,从中午到现在,依然内心有点情绪出来。刚到办公室的时候,我也用心偶对这段关系做了一个呈现和换位思考。呈现的结果是:1、我自有我的优秀,他有他的优秀。H也有他的擅长的地方。在我们的合作期间,我们都各自努力和付出。只是结果没有按照自己的预期进展。这个结果是让人遗
明眼看片之《青春梦工场》
北卡有毒无解
彭浩翔导演在《买凶拍人》技震香江之后,又马不停蹄地导演了《大丈夫》。这部电影用更扎心更刻薄的手法写尽了香港中产阶级的荒谬、无奈甚至是悲凉。但与今天要聊的这部《青春梦工场》相比,《大丈夫》也只能算开胃小菜。如果说《买凶拍人》让我们在惊喜之中有意外的话,那么《青春梦工场》就让我们嗡嗡作响的耳光响亮。这部电影的缘起来自于陈凯歌导演自传《少年凯歌》里的一句话:“当我们觉得我们对这个世界很重要的时候,这个世
HBase——基础概念介绍
zhanglf1016
# HBase hbase 数据库 大数据
一、初识HBaseHBase是一个面向列式存储的分布式数据库,其设计思想来源于Google的BigTable论文。HBase底层存储基于HDFS实现,集群的管理基于ZooKeeper实现。HBase良好的分布式架构设计为海量数据的快速存储、随机访问提供了可能,基于数据副本机制和分区机制可以轻松实现在线扩容、缩容和数据容灾,是大数据领域中Key-Value数据结构存储最常用的数据库方案。HBase特
【Vickyの杭州印象】中国扇博物馆 China Fan Museum#1
冰冰的小城堡
杭州扇业背景资料Backgroundinformation位于杭州市拱宸桥桥西历史文化街区的中国扇博物馆是由杭州市政府出资建设的三个国家级专题性博物馆之一,另外两个是中国刀剪剑博物馆和中国伞博物馆。作为全世界仅有的两家扇子博物馆之一(另一座在英国伦敦),中国扇博物馆建立的缘起杭州的老字号王星记扇子。BeinglocatedinWestBridgeHistoricalBlock,ChinaFanMu
伦敦游学半载小记
开源
直到我坐上返京的飞机,在文档中敲下这第一行字,我才真正意识到我的伦敦游学生活是真的结束了——2023年9月5日启程,2024年2月18日回程,整整166天的时间,无比繁忙、疲惫,但也非常充实、快乐。如果用一句话概括这半年时光,我想决定到伦敦游学大概是在我迈进30岁这年,做下的最正确的决定。缘起:每年一个小目标早在申请入读北大光华MBA前,我就聆听过学长学姐关于国际交流项目的分享。彼时,我并没有明确
《大话西游之缘起》:主角出场方式另类,笑点密集,又甜又虐
入骨影评
发现又一部《大话西游》电影上映:《大话西游之缘起》。为什么说“又”呢?影片背景因为自从1995年周星驰出演的《大话西游》两部曲以来,已经有不少类似的作品出现,包括2016年推出的《大话西游3》,由刘镇伟执导,号称是《大话西游》的正统续集,结果被观众指责为粗制滥造、毫不用心,并说主角演技尴尬到无法形容,是紫霞仙子被黑最惨的一次。同样,2017年发布的《大话西游之爱你一万年》54集连续剧,也是由刘镇伟
随笔:探寻中华(优秀)传统文化踪迹(1)缘起
洋光雨露
笔者偶然翻阅往年喜爱的藏书朱东润作序的《古文鉴赏辞典》时,顿时感慨万千。大师已仙逝三十年有多,其学术余波不但没有渐弱,反是仍绵延流长,影响日盛。犹如中华传统文化之文脉绵延不断,既富有营养、哺育新生,又入人心脾、抚慰心灵;己身魅力无限却又含蓄内敛。即便是如此,仍难掩其瑰丽容颜,无不时时诱人多看几眼。于是,斗胆间萌发了撩拔一下她的冲动,窃以为:虽未必能使人窥其温润之皮肤,但可撩其面纱一角吧,也好让时人
天啊,装着我所有钱的钱包......
知愚宅主人
一切的缘起要从找不到钥匙开始——寻寻觅觅——终于找到了钥匙和李老师说好一起去打羽毛球,临出门时却发现找不到钥匙了。昨晚进门时还用了的,怎么没有了呢,卧室、客厅、厨房、卫生间,包里、衣服兜里,总之所有可能的地方都翻了一遍,却依然没有发现钥匙的踪迹。是不是自己开了门,没有把钥匙拿下来,打开大门,看了看,门上也没有;马上又想,那是不是有人从我门上把钥匙拿走了,虽然觉得这个可能性也很小,可是因为自己到处找
辗转相处求最大公约数
沐刃青蛟
C++ 漏洞
无言面对”江东父老“了,接触编程一年了,今天发现还不会辗转相除法求最大公约数。惭愧惭愧!
为此,总结一下以方便日后忘了好查找。
1.输入要比较的两个数a,b
忽略:2.比较大小(因为后面要的是大的数对小的数做%操作)
3.辗转相除(用循环不停的取余,如a%b,直至b=0)
4.最后的a为两数的最大公约数
&
F5负载均衡会话保持技术及原理技术白皮书
bijian1013
F5 负载均衡
一.什么是会话保持? 在大多数电子商务的应用系统或者需要进行用户身份认证的在线系统中,一个客户与服务器经常经过好几次的交互过程才能完成一笔交易或者是一个请求的完成。由于这几次交互过程是密切相关的,服务器在进行这些交互过程的某一个交互步骤时,往往需要了解上一次交互过程的处理结果,或者上几步的交互过程结果,服务器进行下
Object.equals方法:重载还是覆盖
Cwind
java generics override overload
本文译自StackOverflow上对此问题的讨论。
原问题链接
在阅读Joshua Bloch的《Effective Java(第二版)》第8条“覆盖equals时请遵守通用约定”时对如下论述有疑问:
“不要将equals声明中的Object对象替换为其他的类型。程序员编写出下面这样的equals方法并不鲜见,这会使程序员花上数个小时都搞不清它为什么不能正常工作:”
pu
初始线程
15700786134
暑假学习的第一课是讲线程,任务是是界面上的一条线运动起来。
既然是在界面上,那必定得先有一个界面,所以第一步就是,自己的类继承JAVA中的JFrame,在新建的类中写一个界面,代码如下:
public class ShapeFr
Linux的tcpdump
被触发
tcpdump
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支 持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
实用命令实例
默认启动
tcpdump
普通情况下,直
安卓程序listview优化后还是卡顿
肆无忌惮_
ListView
最近用eclipse开发一个安卓app,listview使用baseadapter,里面有一个ImageView和两个TextView。使用了Holder内部类进行优化了还是很卡顿。后来发现是图片资源的问题。把一张分辨率高的图片放在了drawable-mdpi文件夹下,当我在每个item中显示,他都要进行缩放,导致很卡顿。解决办法是把这个高分辨率图片放到drawable-xxhdpi下。
&nb
扩展easyUI tab控件,添加加载遮罩效果
知了ing
jquery
(function () {
$.extend($.fn.tabs.methods, {
//显示遮罩
loading: function (jq, msg) {
return jq.each(function () {
var panel = $(this).tabs(&
gradle上传jar到nexus
矮蛋蛋
gradle
原文地址:
https://docs.gradle.org/current/userguide/maven_plugin.html
configurations {
deployerJars
}
dependencies {
deployerJars "org.apache.maven.wagon
千万条数据外网导入数据库的解决方案。
alleni123
sql mysql
从某网上爬了数千万的数据,存在文本中。
然后要导入mysql数据库。
悲剧的是数据库和我存数据的服务器不在一个内网里面。。
ping了一下, 19ms的延迟。
于是下面的代码是没用的。
ps = con.prepareStatement(sql);
ps.setString(1, info.getYear())............;
ps.exec
JAVA IO InputStreamReader和OutputStreamReader
百合不是茶
JAVA.io操作 字符流
这是第三篇关于java.io的文章了,从开始对io的不了解-->熟悉--->模糊,是这几天来对文件操作中最大的感受,本来自己认为的熟悉了的,刚刚在回想起前面学的好像又不是很清晰了,模糊对我现在或许是最好的鼓励 我会更加的去学 加油!:
JAVA的API提供了另外一种数据保存途径,使用字符流来保存的,字符流只能保存字符形式的流
字节流和字符的难点:a,怎么将读到的数据
MO、MT解读
bijian1013
GSM
MO= Mobile originate,上行,即用户上发给SP的信息。MT= Mobile Terminate,下行,即SP端下发给用户的信息;
上行:mo提交短信到短信中心下行:mt短信中心向特定的用户转发短信,你的短信是这样的,你所提交的短信,投递的地址是短信中心。短信中心收到你的短信后,存储转发,转发的时候就会根据你填写的接收方号码寻找路由,下发。在彩信领域是一样的道理。下行业务:由SP
五个JavaScript基础问题
bijian1013
JavaScript call apply this Hoisting
下面是五个关于前端相关的基础问题,但却很能体现JavaScript的基本功底。
问题1:Scope作用范围
考虑下面的代码:
(function() {
var a = b = 5;
})();
console.log(b);
什么会被打印在控制台上?
回答:
上面的代码会打印 5。
&nbs
【Thrift二】Thrift Hello World
bit1129
Hello world
本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程
1. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错
<dependency>
【Avro一】Avro入门
bit1129
入门
本文的目的主要是总结下基于Avro Schema代码生成,然后进行序列化和反序列化开发的基本流程。需要指出的是,Avro并不要求一定得根据Schema文件生成代码,这对于动态类型语言很有用。
1. 添加Maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<proj
安装nginx+ngx_lua支持WAF防护功能
ronin47
需要的软件:LuaJIT-2.0.0.tar.gz nginx-1.4.4.tar.gz &nb
java-5.查找最小的K个元素-使用最大堆
bylijinnan
java
import java.util.Arrays;
import java.util.Random;
public class MinKElement {
/**
* 5.最小的K个元素
* I would like to use MaxHeap.
* using QuickSort is also OK
*/
public static void
TCP的TIME-WAIT
bylijinnan
socket
原文连接:
http://vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux.html
以下为对原文的阅读笔记
说明:
主动关闭的一方称为local end,被动关闭的一方称为remote end
本地IP、本地端口、远端IP、远端端口这一“四元组”称为quadruplet,也称为socket
1、TIME_WA
jquery ajax 序列化表单
coder_xpf
Jquery ajax 序列化
checkbox 如果不设定值,默认选中值为on;设定值之后,选中则为设定的值
<input type="checkbox" name="favor" id="favor" checked="checked"/>
$("#favor&quo
Apache集群乱码和最高并发控制
cuisuqiang
apache tomcat 并发 集群 乱码
都知道如果使用Http访问,那么在Connector中增加URIEncoding即可,其实使用AJP时也一样,增加useBodyEncodingForURI和URIEncoding即可。
最大连接数也是一样的,增加maxThreads属性即可,如下,配置如下:
<Connector maxThreads="300" port="8019" prot
websocket
dalan_123
websocket
一、低延迟的客户端-服务器 和 服务器-客户端的连接
很多时候所谓的http的请求、响应的模式,都是客户端加载一个网页,直到用户在进行下一次点击的时候,什么都不会发生。并且所有的http的通信都是客户端控制的,这时候就需要用户的互动或定期轮训的,以便从服务器端加载新的数据。
通常采用的技术比如推送和comet(使用http长连接、无需安装浏览器安装插件的两种方式:基于ajax的长
菜鸟分析网络执法官
dcj3sjt126com
网络
最近在论坛上看到很多贴子在讨论网络执法官的问题。菜鸟我正好知道这回事情.人道"人之患好为人师" 手里忍不住,就写点东西吧. 我也很忙.又没有MM,又没有MONEY....晕倒有点跑题.
OK,闲话少说,切如正题. 要了解网络执法官的原理. 就要先了解局域网的通信的原理.
前面我们看到了.在以太网上传输的都是具有以太网头的数据包. 
Android相对布局属性全集
dcj3sjt126com
android
RelativeLayout布局android:layout_marginTop="25dip" //顶部距离android:gravity="left" //空间布局位置android:layout_marginLeft="15dip //距离左边距
// 相对于给定ID控件android:layout_above 将该控件的底部置于给定ID的
Tomcat内存设置详解
eksliang
jvm tomcat tomcat内存设置
Java内存溢出详解
一、常见的Java内存溢出有以下三种:
1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出JVM在启动的时候会自动设置JVM Heap的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)不可超过物理内存。
可以利用JVM提
Java6 JVM参数选项
greatwqs
java HotSpot jvm jvm参数 JVM Options
Java 6 JVM参数选项大全(中文版)
作者:Ken Wu
Email:
[email protected]
转载本文档请注明原文链接 http://kenwublog.com/docs/java6-jvm-options-chinese-edition.htm!
本文是基于最新的SUN官方文档Java SE 6 Hotspot VM Opt
weblogic创建JMC
i5land
weblogic jms
进入 weblogic控制太
1.创建持久化存储
--Services--Persistant Stores--new--Create FileStores--name随便起--target默认--Directory写入在本机建立的文件夹的路径--ok
2.创建JMS服务器
--Services--Messaging--JMS Servers--new--name随便起--Pers
基于 DHT 网络的磁力链接和BT种子的搜索引擎架构
justjavac
DHT
上周开发了一个磁力链接和 BT 种子的搜索引擎 {Magnet & Torrent},本文简单介绍一下主要的系统功能和用到的技术。
系统包括几个独立的部分:
使用 Python 的 Scrapy 框架开发的网络爬虫,用来爬取磁力链接和种子;
使用 PHP CI 框架开发的简易网站;
搜索引擎目前直接使用的 MySQL,将来可以考虑使
sql添加、删除表中的列
macroli
sql
添加没有默认值:alter table Test add BazaarType char(1)
有默认值的添加列:alter table Test add BazaarType char(1) default(0)
删除没有默认值的列:alter table Test drop COLUMN BazaarType
删除有默认值的列:先删除约束(默认值)alter table Test DRO
PHP中二维数组的排序方法
abc123456789cba
排序 二维数组 PHP
<?php/*** @package BugFree* @version $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $*** Sort an two-dimension array by some level
hive优化之------控制hive任务中的map数和reduce数
superlxw1234
hive hive优化
一、 控制hive任务中的map数: 1. 通常情况下,作业会通过input的目录产生一个或者多个map任务。 主要的决定因素有: input的文件总个数,input的文件大小,集群设置的文件块大小(目前为128M, 可在hive中通过set dfs.block.size;命令查看到,该参数不能自定义修改);2. 
Spring Boot 1.2.4 发布
wiselyman
spring boot
Spring Boot 1.2.4已于6.4日发布,repo.spring.io and Maven Central可以下载(推荐使用maven或者gradle构建下载)。
这是一个维护版本,包含了一些修复small number of fixes,建议所有的用户升级。
Spring Boot 1.3的第一个里程碑版本将在几天后发布,包含许多