本文是典型分布式系统分析的第三篇,分析的是Bigtable,一个结构化的分布式存储系统。
Bigtable作为一个分布式存储系统,和其他分布式系统一样,需要保证可扩展、高可用与高性能。与此同时,Bigtable还有应用广泛的特点(wide applicability),既能满足对延时敏感的、面向终端用户的应用需求,又能hold住高吞吐需求的批处理程序。
不过,通读完整篇论文,会发现,Bigtable这个系统是建立在很多其他google的产品上的,如GFS、Chubby。GFS为Bigtable提供了可伸缩、高可靠、高可用的数据存储服务;而Chubby保证了Bigtable中元数据的高可用、强一致。这种设计思想,跟之前分析过的GFS,以及本人平常使用到的MongoDB不太一样,在GFS、MongoDB中,元数据服务器一般有两重功能:维护元数据、集中调度;而Bigtable中的master只负责调度。
本文地址:https://www.cnblogs.com/xybaby/p/9096748.html
Bigtable的定义
Bigtable是06年的论文,当时还是关系型数据库一统江湖。因此,网上有人说,Bigtable较难以理解,因为Bigtable有一些术语与关系型数据路类似,如row、column、table,但是内部实现、使用方式又与传统关系型数据库差异非常之大。不过现在是2018年了,NoSQL已经应用非常广泛,因此至少现在看起来还是比较容易读懂的。
A Bigtable is a sparse, distributed, persistent multidimensional sorted map.
上面是Bigtable的定义,特点是sparse、distributed、multidimensional、sorted map,此外,还要加上一个关键字:structured。
在文章understanding-hbase-and-bigtable中有对这几个关键字的详细解释与举例。下面结合论文中的例子来分析一下这几个术语:
图中,是一个存储网页的例子,Bigtable是一个有序的字典(key value pair),key是 (row:string, column:string, time:int64) , value则是任意的string 。
在网页存储这个例子中,row是URL (倒过来的URL,为了让同一个网站的网页尽量存放在一起)。column则是由colune family:qualifier组成,上图中,contens、anchor 都是colume family,一个colume family下面可以包含一个到多个colume。time则是不同时刻的版本,基于time,bigtable提供了不同的垃圾回收策略:only last n、only new enough。
Bigtable是结构化(Structured)数据,colume family在定义表(table)的时候就需要创建,类似关系型数据库。colume family一般数量较少,但colume family下面的colume是动态添加的,数量可以很多。针对上面的例子,有的文章可能只有一个作者,有的文章可能好几个作者,虽然都有anchor 这colume family,但是所包含的colume数量是不一样的,这也是称之为Sparse的原因。
Bigtable存储
Bigtable是一个分布式存储,可伸缩性(scalability)是首先需要解决的问题,那么Bigtable是如何分片(partition)的呢。
tablet是Bigtable中数据分片和负载均衡的基本单位(the unit of distribution and load balancing.),大小约为100M到200M,其概念等价于GFS、MongoDB中的chunk。简单来说,就是由连续的若干个row组成的一个区块,BIgtable维护的是tablet到tablet server的映射关系,当需要迁移数据的时候,也是与tablet为单位。
tablet采用的是range-based的分片方式,相近的row会被划分在同一个tablet里面,range based对于范围查询是非常友好的,比如上面网页存储的例子,同一个网站的网页会被尽量放在一起。但是range based容易在写入的时候流量导入到同一个tablet,需要额外的split来达到均衡。
tablet内部采用了类似LSM(log-Structured merge)Tree的存储方式,有一个memtable与多个sstable(sorted string table)组成,如下入所示:
上图分解出了哪些数据是维护在内存中,哪些是持久化到GFS。可以看到memtable是内存中的数据结构,而write ahead log、sstable则会持久化到GFS。
对于memtable,理解比较简单,就是一个有序的dict,memtable的数据量到达一定情况下的时候就会以sstable的形式写入到GFS。
sstable定义如下:
a persistent, ordered immutable map from keys to values, where both keys and values are arbitrary byte strings
因此也是顺序存储的,sstable是bigtable数据物理存储的基本单位。在sstable内部,一个sstable包含多个block(64kb为单位),block index放在sstable末尾,open sstable的时候block index会被加载到内存,二分查找block index就能找到需要的block,加速磁盘读取。在特殊情况下,sstable也是可以强制放在内存的。
写操作较为简单,写到memtable就可以了。而对于读操作,则需要merge memtable与SSTable中的数据:
A valid read operation is executed on a merged view of the sequence of SSTables and the memtable .Since the SSTables and the memtable are lexicographically sorted data structures, the merged view can beformed efciently.
由于写入是在内存中,那么查询的时候,对于某个key,有可能在memtable中,也有可能在sstable中,而且在哪一个sstable中还是不一定的。举个简单的例子,假设一个tablet包含memtable和两个sstable(第一个sstable比第二个sstable先生成)
第一个sstable a k z 第二个sstable b g y memtable c k w
查找任何一个key时,需要以(memtable、第二个stable、第一个sstable)的顺序查找。比如对于key k,在memtable中找到就可以返回了(虽然第一个sstable也有一个k);对于key g,首先找memtable不命中,然后在第二个sstable命中;对于key m,则查找完所有sstable之后才能知道都不会命中。为了加速查找过程,采用了两种技术,compaction、bloom filter,前者减少了一次查找读取sstable的量,后者可以避免在key不存在的时候,无需检查memtable与sstable。
compaction有几个层次:
minor compaction : When the memtable size reaches a threshold, the memtable is frozen, a new memtable is created, and the frozen memtable is converted to an SSTable and written to GFS.merging compaction : reads the contents of a few SSTables and the memtable, and writes out a new SSTable.major compaction : A merging compaction that rewrites all SSTables into exactly one SSTable
对于LSM-tree的详细介绍,可以参考DDIA(design data-intensive applications)
Bigtable系统架构
在论文的build blocks部分,提到了Bigtable使用到的其他组件(服务),其中最重要的就是GFS与Chubby,而Bigtable内部又分为三部分:Master,tablet server, client。因此整体架构如下图(来自slideshare)
Chubby vs master
在Bigtable中,Chubby提供了以下功能:
to ensure that there is at most one active master at any time; --》任意时刻只有一个master
to store the bootstrap location of Bigtable data (see Section5.1); --》元数据的起始位置
to discover tablet servers and finalize tablet server deaths; --》tablet server的生命周期监控
to store Bigtable schema information (the column family information for each table);
and to store access control lists.
前三点,在一个独立的分布式存储系统(GFS MongoDB)中,应该都是由元数据服务器提供,但在Bigtable中,这部分功能都已到了Chubby,简化了master本身的设计。
那master的职责就主要是:
assigning tablets to tablet servers,
detecting the addition and expiration of tablet servers
balancing tablet-server load
garbage collection of files in GFS.
In addition, it handles schema changes such as table and column family creations.
在经典论文翻译导读之《Google File System》一文中,作者总结到:
分布式文件系统常用的架构范式就是“元数据总控+分布式协调调度+分区存储”。
可以看出这个范式里的两个角色——协调组件、存储组件。协调组件负责了元数据总控+分布式协调调度 ,各存储组件作为一个分区,负责实际的存储结构和本地数据读写
在Bigtable中,Chubby负责了元数据总控,master负责分布式协调调度。
元数据管理 tablet location
上面提到,Chubby负载元数据总控,那所有tablets的位置信息全都放在Chubby上?显然是不现实的。
事实上,系统采用了类似B+树的三层结构来维护tablet location信息
The first level is a file stored in Chubby that contains the location of the root tablet. The root tablet contain the location of all tablets in a special METADATA table.Each METADATA tablet contains the location of a set of user tablets.
可见,Chubby中存储的只是root tablet的位置信息,数据量很少。在Root tablet里面,维护的是METADATA tablets的位置信息;METADATA tablet存储的则是应用的tablet的位置信息。
系统也做了一些工作,来减轻存储METADATA tablets 的 tablet server的负担,首先METADATA tablet对应的sstable存储在内存中,无需磁盘操作。其次,bigtable client会缓存元数据信息,而且会prefetch元数据信息,减少交互。
The client library caches tablet locations. further reduce this cost in the common case by having the client library prefetch tablet locations
单点master
在上图中可以看出,Bigtable中,master是无状态的单点,无状态是指master本身没有需要持久化的数据。而单点需要面对的问题是单点故障(single point of failure)
首先,master的负载并不高,最重要的原因是,Bigtable client并不与master直接交互(这归功于master并不维护系统元数据)。而tablets的管理,如创建、迁移,本身就不是高频操作。
其次,即使master fail(由于crash或者network partition),系统会创建新的master,并在内存中恢复元数据(tablets到tablet server的映射、尚未分配的tablets)。步骤如下:
The master grabs a unique master lock in Chubby, which prevents concurrent master instantiations.
The master scans the servers directory in Chubby to find the live servers.
The master communicates with every live tablet server to discover what tablets are already assigned to each server.
The master scans the METADATA table to learn the set of tablets. Whenever this scan encounters a tablet that is not already assigned, the master adds the tablet to the set of unassigned tablets, which makes the tablet eligible for tablet assignment.
注意第三 四步,元数据既来自tablet server,又来自METADATA table。一方面是存在有一些尚未分配的tablets(如迁移产生的、talets server故障导致的),这部分只存在于METADATA table;另一方面,tablet server中一定是当前时刻的准确信息。
Bigtable lessons
作为一个划时代的、开创性的、应用广泛的分布式系统,Bigtable无论在设计、实现、应用中都会遇到很多问题,有很多指的思考、借鉴的地方,他山之石可以攻玉。Bigtable自己总结如下:
(1)万万没想到的失败和异常
除了大家耳熟能详的网络分割(network partition)和节点故障(fail stop)模型,Bigtable还遇到了:
memory and network corruption,
large clock skew,
hung machines,
extended and asymmetric network partitions,
bugs in other systems that we are using (Chubby for example),
oveflow of GFS quotas
and planned and unplanned hardware maintenance.
(2)三思而后行,不要过度设计
Another lesson we learned is that it is important to delay adding new features until it is clear how the new features will be used .
先搞懂需求背后用户希望解决的真正问题,有时候需求是假象,需要先挖掘本质
(3)监控的重要性
the importance of proper system-level monitoring(i.e., monitoring both Bigtable itself, as well as the client processes using Bigtable).
不能同意更多,特别是现在服务化、微服务甚嚣尘上,没有完善的监控让系统的运维苦不堪言。特别是作为各种框架、引擎,完善的监控更是不可或缺。
(4)简化设计
The most important lesson we learned is the value of simple designs.
在Google三大件(MapReduce、GFS、Bigtable)都提到了这一点,simple design意味着更好的维护性,更少的边界条件。不过坦白的说,没有涉及过复杂的系统,是很难体会到"Simple is Better Than Complex"。
杂项
事务支持
分布式系统中,分布式事务会影响到性能、可用性,因此大多只提供单行原子性操作,bigtable中也是如此
Every read or write of data under a single row key is atomic (regardless of the number of different columns being read or written in the row)
locality group
client指定多个colume family形成一个group,locality group单独存成一个sstable,而且locality group还可以强制保存在内存中,如前面提到的METADATA tablets。
group使用单独的sstable存储就使得Bigtable事实上使用了colume based storage,这对于批处理程序或者OLAP非常有用。
Bigtable locality groups realize similar compression and disk read performance benefits observed for other systems that organize data on disk using column-based rather than row-based storage
Merged commit log
为了减轻GFS的负担,加快commit log 写入的速度,tablet server并不是为每一个tablets维护一个commit log,而是一个tablet server上的所有tablets公用一个commit file。
但公用的commit log在tablets recover的时候就不又好了,假设某个Tablet server故障,其上维护的诸多tablets会被迁移到其他tablet server上,多个目标tablet server都需要读取这个commit log文件来恢复tablets的状态。显然,都来读取这个文件是不切实际的,bigtable采取了先对commit log并行归并排序的算法,让关联的数据集中。
We avoid duplicating log reads by first sorting the commit log entries in order of the keys
. In the sorted output, all mutations for a particular tablet are contiguous and can therefore be read efficiently with one disk seek followed by a sequential read.
references
Bigtable: A Distributed Storage System for Structured Data
understanding-hbase-and-bigtable
undestand-google-bigtable-is-as-easy-as-playing-lego-bricks-lecture-by-romain-jacotin
design data-intensive applications
经典论文翻译导读之《Google File System》
你可能感兴趣的:(典型分布式系统分析:Bigtable)
c++ 的iostream 和 c++的stdio的区别和联系
黄卷青灯77
c++ 算法 开发语言 iostream stdio
在C++中,iostream和C语言的stdio.h都是用于处理输入输出的库,但它们在设计、用法和功能上有许多不同。以下是两者的区别和联系:区别1.编程风格iostream(C++风格):C++标准库中的输入输出流类库,支持面向对象的输入输出操作。典型用法是cin(输入)和cout(输出),使用>操作符来处理数据。更加类型安全,支持用户自定义类型的输入输出。#includeintmain(){in
蘩漪:新女性?利己主义者
赮_红雨
蘩漪是曹禺《雷雨》笔下的女性形象。对于她的喜爱,曹禺在之前的访谈中,就已经表达得很清楚了,蘩漪是他所倾心的女子的“代替者”。在这个女性身上有着曹禺最精心的描写,但同时她的身上又存在着一些时代的问题。图片发自App首先,繁漪是追求自由和幸福的新女性形象。她是精神悲剧的核心人物,她对周朴园的反抗,具有典型意义。她是位资产阶级家庭出身的小姐,受过五四新思潮的影响,她任性、傲慢,追求人格独立、个性自由和爱
GitHub上克隆项目
bigbig猩猩
github
从GitHub上克隆项目是一个简单且直接的过程,它允许你将远程仓库中的项目复制到你的本地计算机上,以便进行进一步的开发、测试或学习。以下是一个详细的步骤指南,帮助你从GitHub上克隆项目。一、准备工作1.安装Git在克隆GitHub项目之前,你需要在你的计算机上安装Git工具。Git是一个开源的分布式版本控制系统,用于跟踪和管理代码变更。你可以从Git的官方网站(https://git-scm.
01-Git初识
Meereen
Git git
01-Git初识概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码作用:记录代码内容。切换代码版本,多人开发时高效合并代码内容如何学:个人本机使用:Git基础命令和概念多人共享使用:团队开发同一个项目的代码版本管理Git配置用户信息配置:用户名和邮箱,应用在每次提交代码版本时表明自己的身份命令:查看git版本号git-v配置用户名gitconfig--globaluser.name
Kafka是如何保证数据的安全性、可靠性和分区的
喜欢猪猪
kafka 分布式
Kafka作为一个高性能、可扩展的分布式流处理平台,通过多种机制来确保数据的安全性、可靠性和分区的有效管理。以下是关于Kafka如何保证数据安全性、可靠性和分区的详细解析:一、数据安全性SSL/TLS加密:Kafka支持SSL/TLS协议,通过配置SSL证书和密钥来加密数据传输,确保数据在传输过程中不会被窃取或篡改。这一机制有效防止了中间人攻击,保护了数据的安全性。SASL认证:Kafka支持多种
WebMagic:强大的Java爬虫框架解析与实战
Aaron_945
Java java 爬虫 开发语言
文章目录引言官网链接WebMagic原理概述基础使用1.添加依赖2.编写PageProcessor高级使用1.自定义Pipeline2.分布式抓取优点结论引言在大数据时代,网络爬虫作为数据收集的重要工具,扮演着不可或缺的角色。Java作为一门广泛使用的编程语言,在爬虫开发领域也有其独特的优势。WebMagic是一个开源的Java爬虫框架,它提供了简单灵活的API,支持多线程、分布式抓取,以及丰富的
微信小程序开发注意事项
jun778895
微信小程序 小程序
微信小程序开发是一个融合了前端开发、用户体验设计、后端服务(可选)以及微信小程序平台特性的综合性项目。这里,我将详细介绍一个典型的小程序开发项目的全过程,包括项目规划、设计、开发、测试及部署上线等各个环节,并尽量使内容达到或超过2000字的要求。一、项目规划1.1项目背景与目标假设我们要开发一个名为“智慧校园助手”的微信小程序,旨在为学生提供一站式校园生活服务,包括课程表查询、图书馆座位预约、食堂
华为云分布式缓存服务DCS 8月新特性发布
华为云PaaS服务小智
华为云 分布式 缓存
分布式缓存服务(DistributedCacheService,简称DCS)是华为云提供的一款兼容Redis的高速内存数据处理引擎,为您提供即开即用、安全可靠、弹性扩容、便捷管理的在线分布式缓存能力,满足用户高并发及数据快速访问的业务诉求。此次为大家带来DCS8月的特性更新内容,一起来看看吧!
浅谈MapReduce
Android路上的人
Hadoop 分布式计算 mapreduce 分布式 框架 hadoop
从今天开始,本人将会开始对另一项技术的学习,就是当下炙手可热的Hadoop分布式就算技术。目前国内外的诸多公司因为业务发展的需要,都纷纷用了此平台。国内的比如BAT啦,国外的在这方面走的更加的前面,就不一一列举了。但是Hadoop作为Apache的一个开源项目,在下面有非常多的子项目,比如HDFS,HBase,Hive,Pig,等等,要先彻底学习整个Hadoop,仅仅凭借一个的力量,是远远不够的。
KVM+GFS分布式存储系统构建KVM高可用
henan程序媛
分布式 GFS 高可用 KVM
一、案列分析1.1案列概述本章案例主要使用之前章节所学的KVM及GlusterFs技术,结合起来从而实现KVM高可用。利用GlusterFs分布式复制卷,对KVM虚拟机文件进行分布存储和冗余。分布式复制卷主要用于需要冗余的情况下把一个文件存放在两个或两个以上的节点,当其中一个节点数据丢失或者损坏之后,KVM仍然能够通过卷组找到另一节点上存储的虚拟机文件,以保证虚拟机正常运行。当节点修复之后,Glu
Hadoop
傲雪凌霜,松柏长青
后端 大数据 hadoop 大数据 分布式
ApacheHadoop是一个开源的分布式计算框架,主要用于处理海量数据集。它具有高度的可扩展性、容错性和高效的分布式存储与计算能力。Hadoop核心由四个主要模块组成,分别是HDFS(分布式文件系统)、MapReduce(分布式计算框架)、YARN(资源管理)和HadoopCommon(公共工具和库)。1.HDFS(HadoopDistributedFileSystem)HDFS是Hadoop生
大模型训练数据库Common Crawl
WindyChanChan
数据集 语言模型 数据库
CommonCrawl介绍CommonCrawl是一个非营利组织,致力于通过大规模分布式爬虫系统定期抓取整个Web并将其存储在一个可公开访问的数据库中。CommonCrawl的数据收集和处理过程包括使用Python开源爬虫工具收集全球范围内的网站数据,并将其上传到CommonCrawl基金会的数据仓库中。该项目从2008年开始,至今已经积累了大量的原始网页数据、元数据和文本提取数据。这些数据
慢速连接攻击是什么?慢速连接攻击怎么防护?
快快小毛毛
网络 ddos 服务器
慢速连接攻击(SlowConnectionAttack),又称慢速攻击(SlowlorisAttack),是一种网络攻击技术,旨在通过占用服务器上的所有可用连接资源来使其无法响应正常请求。与传统的拒绝服务(DoS)和分布式拒绝服务(DDoS)攻击不同,慢速攻击并不依赖于发送大量数据包来消耗带宽,而是利用HTTP、TCP或SSL等协议的特性,通过发送大量不完整的请求或缓慢发送数据来占用服务器资源,使
分布式锁和spring事务管理
暴躁的鱼
锁及事务 分布式 spring java
最近开发一个小程序遇到一个需求需要实现分布式事务管理业务需求用户在使用小程序的过程中可以查看景点,对景点地区或者城市标记是否想去,那么需要统计一个地点被标记的人数,以及记录某个用户对某个地点是否标记为想去,用两个表存储数据,一个地点表记录改地点被标记的次数,一个用户意向表记录某个用户对某个地点是否标记为想去。由于可能有多个用户同时标记一个地点,每个用户在前端点击想去按钮之后,后台接收到请求,从数据
如何区分Python中数据类型可变还是不可变
秸秆混凝烧结工程师
关键字改变元素值,内存地址发生改变,被称为数据内型不可变如string,元组,存储数据类型单一,不能同时存在两个数据类型,新增元素后,表容量,元素个数,元素存储区ID改变,典型的内置元素一体存储法;改变元素值,但是内存地址不改变就是可变数据内型,如list,存储元素可以不同,删除,新增,插入,表序列不改变,扩展表容量时,对象地址ID不变,属于顺序表的,分离式存储结构,外置元素法,python中不可
“有些笑容背后,是无法抑制的悲伤”
sunny要相信光
什么是微笑抑郁?微笑抑郁是一种非典型的抑郁表现形式,他们在别人面前表现的很开心,甚至很有幽默感,但在微笑和乐观的面具背后,却充满了无价值、残缺和绝望感。就像是很多人在朋友中很爱逗别人开心,但当自己一个人的时候却常常感到悲伤一样。抑郁症的诊断标准包括持续性的心境低落,对所有活动失去兴趣、丧失愉悦感、活动减少、体重明显增加或减轻,失眠或睡眠过多,几乎每天都感到疲倦或精力不足,反复想到死亡等等。DSM-
Gobelieve 架构
weixin_34099526
数据库 golang json
Gobelievegithub地址声明:转简书JackieF的文章,为了自己方便copy了一份,加一些自己的东西.链接:https://www.jianshu.com/p/8121d6e85282IMCore主要分三大块:im客户连接服务器(可分布式部署,暂无负载均衡模块)imr路由查询服务器(主要解决im分布式部署的问题)ims存储服务器(主从部署)基础模块1.数据包协议包:header(12)
2023-05-09
棉麻布衣
文学类文本阅读——矛盾冲突一、典型例题一加利福尼亚人的故事马克·吐温三十五年前,我曾到斯达尼斯劳斯河找矿。我手拿着鹤嘴锄,带着淘盘,背着号角,成天跋涉。我走遍了各处,淘洗了不少的含金沙,总想着找到矿藏发笔大财,却总是一无所获。这是一个风景秀丽的地区,树木葱茏,气候温和,景色宜人。很多年前,这儿人烟稠密,而现在,人们早已消失殆尽了,富有魅力的极乐园成了一个荒凉冷僻的地方。他们把地层表面给挖了个遍,然
Kafka详细解析与应用分析
芊言芊语
kafka 分布式
Kafka是一个开源的分布式事件流平台(EventStreamingPlatform),由LinkedIn公司最初采用Scala语言开发,并基于ZooKeeper协调管理。如今,Kafka已经被Apache基金会纳入其项目体系,广泛应用于大数据实时处理领域。Kafka凭借其高吞吐量、持久化、分布式和可靠性的特点,成为构建实时流数据管道和流处理应用程序的重要工具。Kafka架构Kafka的架构主要由
【C#Mutex】 initiallyOwned错误引起的缺陷
闻缺陷则喜何志丹
c# 互斥量 进程 同步 WaitOne initiallyOwned 临界区
临界区只能对同一个进程的不同线程同步,互斥量可以跨进程同步。典型应用场景:两个exe会操作同一个注册表项。错误代码封装类publicclassCMutexHelp:IDisposable{publicCMutexHelp(){s_mutex.WaitOne();}privatestaticMutexs_mutex=newMutex(true,"Time202409091406ab");public
linux挂载文件夹
小码快撩
linux
1.使用NFS(NetworkFileSystem)NFS是一种分布式文件系统协议,允许一个系统将其文件系统的一部分共享给其他系统。检查是否安装NFSrpm-qa|grepnfs2.启动和启用NFS服务假设服务名称为nfs-server.service,你可以使用以下命令启动和启用它:sudosystemctlstartnfs-server.servicesudosystemctlenablenf
Kafka 基础与架构理解
StaticKing
KAFKA kafka
目录前言Kafka基础概念消息队列简介:Kafka与传统消息队列(如RabbitMQ、ActiveMQ)的对比Kafka的组件Kafka的工作原理:消息的生产、分发、消费流程Kafka系统架构Kafka的分布式架构设计Leader-Follower机制与数据复制Log-basedStorage和持久化Broker间通信协议Zookeeper在Kafka中的角色总结前言Kafka是一个分布式的消息系
Rides实现分布式锁,保障数据一致性,Redisson分布式事务处理
朱杰jjj
缓存 分布式
分布式环境下分布式锁有三种方式:基于数据库分布式锁基于Redis分布式锁基于zk分布式锁本帖只介绍Redis分布式锁为什么需要用到分布式锁?在单机环境下一个服务中多个线程对同一个事物或数据资源进行操作时,可以通过添加加锁方式(synchronized和lock)来解决数据一致性的问题。但是如果出现多个服务的情况下,这时候我们在通过synchronized和lock的方式来加锁会出现问题,因为多个服
机电综合管理系统架构
小熊coder
机载系统 系统架构
文章目录一、机电综合管理系统架构1.系统概述2.架构层次3.核心组件二、余度管理1.余度概述2.硬件冗余3.软件冗余4.通信冗余三、总线架构1.MIL-STD-1553B总线2.ARINC429总线3.ARINC629总线4.AFDX/ARINC664总线四、未来发展趋势1.分布式架构2.高速网络3.智能化与自动化结语机电综合管理系统(ElectromechanicalManagementSyst
华为云分布式缓存服务DCS与开源服务差异对比
hcinfo_18
redis使用 华为云 Redis5.0 分布式缓存服务 Redis客户端
分布式缓存服务DCS提供单机、主备、集群等丰富的实例类型,满足用户高读写性能及快速数据访问的业务诉求。支持丰富的实例管理操作,帮助用户省去运维烦恼。用户可以聚焦于业务逻辑本身,而无需过多考虑部署、监控、扩容、安全、故障恢复等方面的问题。DCS基于开源Redis、Memcached向用户提供一定程度定制化的缓存服务,因此,除了拥有开源服务缓存数据库的优秀特性,DCS提供更多实用功能。一、与开源Red
Dubbo架构概览:服务注册与发现、远程调用、监控与管理
木南曌
dubbo 架构
Dubbo是一个成熟的、高性能的、基于Java的微服务开发框架,它主要用于解决分布式系统中的服务治理问题,包括服务的注册与发现、远程过程调用(RPC)、服务监控与管理等多个关键环节。以下是Dubbo架构概览的详细介绍:服务注册与发现Dubbo的服务注册与发现机制是其核心功能之一,它依赖于注册中心来管理服务的生命周期和定位服务提供者。1.服务提供者(Provider)服务提供者是实际提供服务的节点,
LVGL 控件之列表(lv_list)
Projectsauron
# LVGl LVGL 嵌入式
目录一、概述二、列表1、添加列表按钮2、设置列表文本3、API函数一、概述List(列表)基本上是一个垂直布局的矩形,按钮指向该矩形并且可以添加文本。列表部件由两个部分组成:LV_PART_MAIN使用所有典型背景属性的列表的主要部分LV_PART_SCROLLBAR滚动条。二、列表1、添加列表按钮在默认的情况下,列表部件被创建出来后,只有一个矩形背景框,并没有任何的文本和按钮,用户需要自行往列表
系统架构设计师教程 第5章 5.3 系统分析与设计 笔记
z2014z
系统架构设计师 系统架构 笔记
5.3系统分析与设计系统分析阶段把复杂的对象分解为简单的组成部分,其基本任务是在充分了解用户需求的基础上,书写系统需求规格说明书。系统设计是根据系统分析的结果,完成系统的构建过程。其主要目的是绘制系统的蓝图,权衡和比较各种技术和实施方法的利弊,合理分配各种资源,构建新系统的详细设计方案和相关模型,指导系统实施工作的顺利开展。系统设计的主要内容包括概要设计和详细设计。5.3.1结构化方法★★★★★针
nfs服务搭建
GHope
nfs是什么?基哥度娘网络文件系统(NFS)是sun微系统最初开发的分布式文件系统协议,[1]允许客户端计算机上的用户通过计算机网络访问文件很像本地存储被访问。NFS与许多其他协议一样,在开放网络计算远程过程调用(很久以前RPC)系统上建立。NFS是在请求注释(RFC)中定义的开放标准,允许任何人实现协议。NFSNFS优势:节省本地存储空间,将常用的数据存放在一台NFS服务器上且可以通过网络访问,
三对角线型行列式的求法
Mr-Apple
笔记 线性代数 矩阵 算法
三对角线型行列式摘要典型例题练习题参考答案摘要笔者在复习高等代数行列式这章时,发现三对角行列式问题是行列式计算中经常出现的一类行列式,部分考研院校也曾直接出过三对角行列式的计算,亦或是三对角行列式的变体问题.本文主要介绍了一种通常情况下三对角行列式的解法,即采用特征根法来求解行列式的通项公式.例1:计算nnn阶行列式(ac≠0)(ac\neq0)(ac=0)Dn=∣bc0…000abc…0000
linux系统服务器下jsp传参数乱码
3213213333332132
java jsp linux windows xml
在一次解决乱码问题中, 发现jsp在windows下用js原生的方法进行编码没有问题,但是到了linux下就有问题, escape,encodeURI,encodeURIComponent等都解决不了问题
但是我想了下既然原生的方法不行,我用el标签的方式对中文参数进行加密解密总该可以吧。于是用了java的java.net.URLDecoder,结果还是乱码,最后在绝望之际,用了下面的方法解决了
Spring 注解区别以及应用
BlueSkator
spring
1. @Autowired
@Autowired是根据类型进行自动装配的。如果当Spring上下文中存在不止一个UserDao类型的bean,或者不存在UserDao类型的bean,会抛出 BeanCreationException异常,这时可以通过在该属性上再加一个@Qualifier注解来声明唯一的id解决问题。
2. @Qualifier
当spring中存在至少一个匹
printf和sprintf的应用
dcj3sjt126com
PHP sprintf printf
<?php
printf('b: %b <br>c: %c <br>d: %d <bf>f: %f', 80,80, 80, 80);
echo '<br />';
printf('%0.2f <br>%+d <br>%0.2f <br>', 8, 8, 1235.456);
printf('th
config.getInitParameter
171815164
parameter
web.xml
<servlet>
<servlet-name>servlet1</servlet-name>
<jsp-file>/index.jsp</jsp-file>
<init-param>
<param-name>str</param-name>
Ant标签详解--基础操作
g21121
ant
Ant的一些核心概念:
build.xml:构建文件是以XML 文件来描述的,默认构建文件名为build.xml。 project:每个构建文
[简单]代码片段_数据合并
53873039oycg
代码
合并规则:删除家长phone为空的记录,若一个家长对应多个孩子,保留一条家长记录,家长id修改为phone,对应关系也要修改。
代码如下:
java 通信技术
云端月影
Java 远程通信技术
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI、MINA、ESB、Burlap、Hessian、SOAP、EJB和JMS等,这些名词之间到底是些什么关系呢,它们背后到底是基于什么原理实现的呢,了解这些是实现分布式服务框架的基础知识,而如果在性能上有高的要求的话,那深入了解这些技术背后的机制就是必须的了,在这篇blog中我们将来
string与StringBuilder 性能差距到底有多大
aijuans
之前也看过一些对string与StringBuilder的性能分析,总感觉这个应该对整体性能不会产生多大的影响,所以就一直没有关注这块!
由于学程序初期最先接触的string拼接,所以就一直没改变过自己的习惯!
今天碰到 java.util.ConcurrentModificationException 异常
antonyup_2006
java 多线程 工作 IBM
今天改bug,其中有个实现是要对map进行循环,然后有删除操作,代码如下:
Iterator<ListItem> iter = ItemMap.keySet.iterator();
while(iter.hasNext()){
ListItem it = iter.next();
//...一些逻辑操作
ItemMap.remove(it);
}
结果运行报Con
PL/SQL的类型和JDBC操作数据库
百合不是茶
PL/SQL表 标量类型 游标 PL/SQL记录
PL/SQL的标量类型:
字符,数字,时间,布尔,%type五中类型的
--标量:数据库中预定义类型的变量
--定义一个变长字符串
v_ename varchar2(10);
--定义一个小数,范围 -9999.99~9999.99
v_sal number(6,2);
--定义一个小数并给一个初始值为5.4 :=是pl/sql的赋值号
Mockito:一个强大的用于 Java 开发的模拟测试框架实例
bijian1013
mockito 单元测试
Mockito框架:
Mockito是一个基于MIT协议的开源java测试框架。 Mockito区别于其他模拟框架的地方主要是允许开发者在没有建立“预期”时验证被测系统的行为。对于mock对象的一个评价是测试系统的测
精通Oracle10编程SQL(10)处理例外
bijian1013
oracle 数据库 plsql
/*
*处理例外
*/
--例外简介
--处理例外-传递例外
declare
v_ename emp.ename%TYPE;
begin
SELECT ename INTO v_ename FROM emp
where empno=&no;
dbms_output.put_line('雇员名:'||v_ename);
exceptio
【Java】Java执行远程机器上Linux命令
bit1129
linux命令
Java使用ethz通过ssh2执行远程机器Linux上命令,
封装定义Linux机器的环境信息
package com.tom;
import java.io.File;
public class Env {
private String hostaddr; //Linux机器的IP地址
private Integer po
java通信之Socket通信基础
白糖_
java socket 网络协议
正处于网络环境下的两个程序,它们之间通过一个交互的连接来实现数据通信。每一个连接的通信端叫做一个Socket。一个完整的Socket通信程序应该包含以下几个步骤:
①创建Socket;
②打开连接到Socket的输入输出流;
④按照一定的协议对Socket进行读写操作;
④关闭Socket。
Socket通信分两部分:服务器端和客户端。服务器端必须优先启动,然后等待soc
angular.bind
boyitech
AngularJS angular.bind AngularJS API bind
angular.bind 描述: 上下文,函数以及参数动态绑定,返回值为绑定之后的函数. 其中args是可选的动态参数,self在fn中使用this调用。 使用方法: angular.bind(se
java-13个坏人和13个好人站成一圈,数到7就从圈里面踢出一个来,要求把所有坏人都给踢出来,所有好人都留在圈里。请找出初始时坏人站的位置。
bylijinnan
java
import java.util.ArrayList;
import java.util.List;
public class KickOutBadGuys {
/**
* 题目:13个坏人和13个好人站成一圈,数到7就从圈里面踢出一个来,要求把所有坏人都给踢出来,所有好人都留在圈里。请找出初始时坏人站的位置。
* Maybe you can find out
Redis.conf配置文件及相关项说明(自查备用)
Kai_Ge
redis
Redis.conf配置文件及相关项说明
# Redis configuration file example
# Note on units: when memory size is needed, it is possible to specifiy
# it in the usual form of 1k 5GB 4M and so forth:
#
[强人工智能]实现大规模拓扑分析是实现强人工智能的前奏
comsci
人工智能
真不好意思,各位朋友...博客再次更新...
节点数量太少,网络的分析和处理能力肯定不足,在面对机器人控制的需求方面,显得力不从心....
但是,节点数太多,对拓扑数据处理的要求又很高,设计目标也很高,实现起来难度颇大...
记录一些常用的函数
dai_lm
java
public static String convertInputStreamToString(InputStream is) {
StringBuilder result = new StringBuilder();
if (is != null)
try {
InputStreamReader inputReader = new InputStreamRead
Hadoop中小规模集群的并行计算缺陷
datamachine
mapreduce hadoop 并行计算
注:写这篇文章的初衷是因为Hadoop炒得有点太热,很多用户现有数据规模并不适用于Hadoop,但迫于扩容压力和去IOE(Hadoop的廉价扩展的确非常有吸引力)而尝试。尝试永远是件正确的事儿,但有时候不用太突进,可以调优或调需求,发挥现有系统的最大效用为上策。
-----------------------------------------------------------------
小学4年级英语单词背诵第二课
dcj3sjt126com
english word
egg 蛋
twenty 二十
any 任何
well 健康的,好
twelve 十二
farm 农场
every 每一个
back 向后,回
fast 快速的
whose 谁的
much 许多
flower 花
watch 手表
very 非常,很
sport 运动
Chinese 中国的
自己实践了github的webhooks, linux上面的权限需要注意
dcj3sjt126com
github webhook
环境, 阿里云服务器
1. 本地创建项目, push到github服务器上面
2. 生成www用户的密钥
sudo -u www ssh-keygen -t rsa -C "
[email protected] "
3. 将密钥添加到github帐号的SSH_KEYS里面
3. 用www用户执行克隆, 源使
Java冒泡排序
蕃薯耀
冒泡排序 Java冒泡排序 Java排序
冒泡排序
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
蕃薯耀 2015年6月23日 10:40:14 星期二
http://fanshuyao.iteye.com/
Excle读取数据转换为实体List【基于apache-poi】
hanqunfeng
apache
1.依赖apache-poi
2.支持xls和xlsx
3.支持按属性名称绑定数据值
4.支持从指定行、列开始读取
5.支持同时读取多个sheet
6.具体使用方式参见org.cpframework.utils.excelreader.CP_ExcelReaderUtilTest.java
比如:
Str
3个处于草稿阶段的Javascript API介绍
jackyrong
JavaScript
原文:
http://www.sitepoint.com/3-new-javascript-apis-may-want-follow/?utm_source=html5weekly&utm_medium=email
本文中,介绍3个仍然处于草稿阶段,但应该值得关注的Javascript API.
1) Web Alarm API
&
6个创建Web应用程序的高效PHP框架
lampcy
Web 框架 PHP
以下是创建Web应用程序的PHP框架,有coder bay网站整理推荐:
1. CakePHP
CakePHP是一个PHP快速开发框架,它提供了一个用于开发、维护和部署应用程序的可扩展体系。CakePHP使用了众所周知的设计模式,如MVC和ORM,降低了开发成本,并减少了开发人员写代码的工作量。
2. CodeIgniter
CodeIgniter是一个非常小且功能强大的PHP框架,适合需
评"救市后中国股市新乱象泛起"谣言
nannan408
首先来看百度百家一位易姓作者的新闻:
三个多星期来股市持续暴跌,跌得投资者及上市公司都处于极度的恐慌和焦虑中,都要寻找自保及规避风险的方式。面对股市之危机,政府突然进入市场救市,希望以此来重建市场信心,以此来扭转股市持续暴跌的预期。而政府进入市场后,由于市场运作方式发生了巨大变化,投资者及上市公司为了自保及为了应对这种变化,中国股市新的乱象也自然产生。
首先,中国股市这两天
页面全屏遮罩的实现 方式
Rainbow702
html css 遮罩 mask
之前做了一个页面,在点击了某个按钮之后,要求页面出现一个全屏遮罩,一开始使用了position:absolute来实现的。当时因为画面大小是固定的,不可以resize的,所以,没有发现问题。
最近用了同样的做法做了一个遮罩,但是画面是可以进行resize的,所以就发现了一个问题,当画面被reisze到浏览器出现了滚动条的时候,就发现,用absolute 的做法是有问题的。后来改成fixed定位就
关于angularjs的点滴
tntxia
AngularJS
angular是一个新兴的JS框架,和以往的框架不同的事,Angularjs更注重于js的建模,管理,同时也提供大量的组件帮助用户组建商业化程序,是一种值得研究的JS框架。
Angularjs使我们可以使用MVC的模式来写JS。Angularjs现在由谷歌来维护。
这里我们来简单的探讨一下它的应用。
首先使用Angularjs我
Nutz--->>反复新建ioc容器的后果
xiaoxiao1992428
DAO mvc IOC nutz
问题:
public class DaoZ {
public static Dao dao() { // 每当需要使用dao的时候就取一次
Ioc ioc = new NutIoc(new JsonLoader("dao.js"));
return ioc.get(