数据库调优
2019-11-16 15:35:24摘要:影响性能因素 * 数据库结构设计 * T-SQL语句 * 数据量大 * 事务和隔离级别 * 硬件资源 * IO阻塞 * 批量删除表数据:大量删除时会记录到日志中,也会造成IO阻塞 阅读全文
摘要:影响性能因素 * 数据库结构设计 * T-SQL语句 * 数据量大 * 事务和隔离级别 * 硬件资源 * IO阻塞 * 批量删除表数据:大量删除时会记录到日志中,也会造成IO阻塞 阅读全文
摘要:制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。 控制反转是一种思想,依赖注入是一种设计模式。 阅读全文
摘要:持续集成、继续部署、继续交付 持续集成(Continuous integration) 是一种软件开发实践,即团队开发成员经常集成它们的工作, 通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。 每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。 持续部署(continuous deployment) 是通过自动化的构建、测试和部署循环来快速交付高质量的产品。 某种程度上代表了一个开发团队工程化的程度,毕竟快速运转的互联网公司人力成本会高于机器, 投资机器优化开发流程化相对也提高了人的效率,让 engineering productivity 最大化。 持续交付(英语:Continuous delivery,缩写为 CD) 是一种软件工程手法, 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、 持续的保持在随时可以释出的状况。它的目标在于让软件的建置、 测试与释出变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。 DevOps DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。 它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。 它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运维工作必须紧密合作。 Jenkins Jenkins是实现DevOps的工具 Jenkins是一款开源 CICD 软件,用于自动化各种任务,包括构建、测试和部署软件。 Jenkins 支持各种运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序。 特点: 易于安装,只要把jenkins.war部署到servlet容器 易于配置-所有配置都通过其提供的web界面实现。 集成RSS/E-mail通过RSS发布构建结果或当构件完成是通过e-mail通知。 生成JUnit/TestNG测试报告。 分布式构建支持Jenkins能够让多台计算机一起构建/测试。 文件识别:Jenkins能够跟…… 阅读全文
摘要:基于原始SQL查询创建LINQ查询,代替旧版的FromSql、SqlQuery 基本原生 SQL 查询 在版本.net core 2.0 中,我们引入了一种在依赖关系注入中注册自定义 DbContext 类型的新方法,即以透明形式引入可重用 DbContext 实例的池。 要使用 DbContext 池,请在服务注册期间使用 `AddDbContextPool` 而不是 `AddDbContext`:services.AddDbContextPool<BloggingContext>( options => options.UseSqlServer(connectionString)); 如果使用此方法,那么在控制器请求 DbContext 实例时,我们会首先检查池中有无可用的实例。 请求处理完成后,实例的任何状态都将被重置,并且实例本身会返回池中。 从概念上讲,此方法类似于连接池在 ADO.NET 提供程序中的运行原理,并具有节约 DbContext 实例初始化成本的优势。 阅读全文
摘要:什么是无服务器计算 “无服务器”是云计算中资源抽象的极致体现。从它的命名上你就可以看出,所谓“无服务器”就是想让用户感觉不到服务器的存在,这是因为有一朵巨大的云在底层进行着支撑。 如果说容器是给予了我们很大的定制空间,让你更加容易地按照自己的需要,来进行应用程序的拆分和封装;那么无服务器则是完全屏蔽了计算资源,它是在真正地引导你不再去关心底层环境,你只要遵循标准方式来直接编写业务代码就可以了。 而且在粒度上,无服务器会允许你拆分得更细致、更轻量。你甚至可以把每一个具有独立功能的函数,来作为一个单独的服务进行部署和运行。这也是为什么,在有些云计算的分类方法下,无服务器计算能够单独“开宗立派”,被称为函数即服务(Function-as-a-Service,FaaS)的原因。 各大云厂商现在都已经推出了各自的无服务器计算服务,比如 AWS 的 Lambda、阿里云的函数计算,和微软 Azure 的 Azure Functions。在国内的云厂商中,腾讯云的云函数也是在无服务器计算上投入较早、产品较为成熟的厂商。 无服务器计算是多面手 无服务器计算所能做的,可远远不止充当快速的 Web 开发工具。事件模型是无服务器的核心编程模型和运行逻辑,所以它非常适合相当广泛的事件驱动开发场景。 事件的起始,要依靠触发器。 云上 Serverless 服务一般都配套提供了多种多样的触发器,包括 API 触发器、对象存储触发器、队列触发器等等。比如上面的实验中,我们用的就是API 触发器,它的触发条件为 API 网关带来的外部 Web 请求。 较为常用的还有对象存储触发器。比如当用户上传了一个文件,后台程序把它保存到对象存储中,这时相应的无服务器函数会被这个新对象触发,你就能对这个新上传的文件进行必要的处理了。 此外,还值得了解相当实用的定时触发器,它可以按照设置的条件周期性触发。通过它和云函数的配合,可以在一定程度上代替操作系统中 crontab 类工具起到的作用,也许能帮你节省一台专门触发运行定时任务的虚拟机。 如果说触发器是无服务器计算的上游的话,那么各种各样的外部交互方式,也让无服务器计算能够对外访问,并向下游输出。云端的 Serverless 环境中,一般都能够提供一系列重要类库和 SDK,让你能够在函数内访问其他云服务,尤其是像数据库、消息队列这样的外部存储。 所以,在云端…… 阅读全文
摘要:什么是应用托管服务 在云计算发展的早期,就已经出现了“建站类服务”,这正是应用托管服务的雏形。当时的建站类服务,会自动为你分配好服务器,安装好相应语言的 Web 环境以供你使用。在部署层面,服务通常会开放 FTP 端口,以便你上传服务器端的代码、脚本和资源。这是应用服务的一种轻量形式。 应用服务的本质就是为你的应用提供一个隔离的独立运行环境。作为用户来讲,你可以只专注于业务逻辑,不需要来手动创建这个环境,更不需要运维这个环境。 应用托管的增值服务 成熟的应用服务还能够提供许多增值服务,来进一步地满足我们在实际开发运维 Web 应用时,产生的各个层面的需求。 第一项增值服务就是监控 尤其是针对 Web 应用的特点而进行的 HTTP 层面的应用监控。所以,你不仅能看到计算资源的占用率,如 CPU、内存使用率等,还能看到许多应用层指标,比如总请求数、错误响应数、并发连接数、响应时间等等。这些都是你在监控应用运行时非常有帮助的信息,而这一切都是 PaaS 服务自动提供、开箱即用的功能。 而且,基于这些监控的指标,你还能够在云上制定相应的报警规则,当某些指标达到你设定的阈值时,会及时发送警报。这同样是一个非常实用的功能。 第二个方面是扩展 也就是底层计算资源和流量需求的匹配。这里既包含了底层机器配置的垂直扩展,也包含了机器数量层面的水平扩展。一旦你有调整需求,只需要动动手指发出指令,就可以随时升级相应的机器配置,并无缝切换。 特别是水平扩展的存在,它相当于同时包含了负载均衡和弹性伸缩,把它们都一股脑儿集成到了托管服务中。这意味着应用托管服务不是只能对应一台机器,而是能够创建多台机器来承接请求,并会在前端均衡地分发到多个实例上去。这里你同样可以指定自动伸缩的规则,来让应用服务自动地调整实例数量。 第三个方面是集成 这里是指与其他 PaaS 的集成。这是所有 PaaS 服务的优势,各个服务间可以互相帮助、联合作战,应用托管类服务也不例外。比如在监控数据方面,它可以和云监控系统进行衔接;再比如,有些云允许 Web 应用以目录的形式,挂载对象存储中的文件等等。 其中,应用托管类服务还有一项非常重要的集成能力,就是应用服务与云上 DevOps 组件和流程的无缝对接。它意味着应用服务可以作为整个应用生命周期管理的一部分,嵌入到持续集成的流程中去。借助和源代码管理设施的联动,你的应用…… 阅读全文
摘要:云上的关系型数据库 关系型数据库的应用在业界是最普遍的,也是云数据库首先进入的领域。这里的先行者同样是 AWS,早在 2009 年就发布了 RDS(Relational Database Service),后来其他的厂商也纷纷开始跟进。 云数据库在外部交互的层面上,保持了和传统“原版”数据库几乎完全一致的编程接口和使用体验。 比如说,你针对 MySQL 编写的 SQL 代码和应用层连接代码,包括你很熟悉和经常会使用的连接管理工具,除了要更改连接字符串和参数之外,都能够几乎不经修改地在云数据库的 MySQL 服务上运行。 另外,针对某个数据库的某个具体版本,云厂商们会把它的功能、内部机制完整地保留下来,以求获得最大程度的兼容性。早期比较简单的云数据库实现原理,是充分利用云上已经提供的虚拟机、云磁盘等 IaaS 层面的资源,在隔离的环境下进行数据库镜像的安装。而后来技术实力比较强大的厂商,还能够做到对数据库源码和模块的深度定制,在保证兼容性的前提下,进行许多对用户透明的云端适配和优化。 所以,云数据库尽管是一个受限的 PaaS 环境(比如它通常无法让你直接访问底层的服务器),但在使用体验上和传统数据库是相当一致的。你大可放心,之前积累的 MySQL 和 PostgreSQL 的知识,在 RDS 上也大都可以适用。在云上,你也同样能够找到和安装一些数据库的常用插件,来增强 PaaS 数据库的功能。 云数据库和传统数据库又很大的区别,这是指在搭建、运维、管理层面,云数据库提升了一个层次,实现了相当程度的智能化和自动化,极大地提升了用户友好度,降低了使用门槛。比如灵活的性能等级调整、详尽的监控体系、攻击防护机制等等,这些许多在传统数据库中需要借助额外工具或产品的功能,在云数据库服务是默认内置,可以开箱即用的。 除了这些基本能力外,还有两个最具代表性的云上关系型数据库的高级特性: 支持读写分离。当并发数量上升时,关系型数据库容易出现性能瓶颈。这时比较有用的办法,就是实现基于多库同步的读写分离。云数据库在产品后台略加操作,就可以启用这个功能:从创建从库到建立同步,再到读写流量分发,云数据库都能自动完成。 支持自动调优。对于数据库来说,同样和性能有关的一个重要工作,就是性能的调优。以前我们经常需要手动地观测性能瓶颈,找出热点查询,再考虑是否有改进性能的办法。而在现代云数据库中…… 阅读全文
摘要:对象存储,顾名思义,就是在云端,可以存放任意对象的存储服务。要注意这里的“对象”指的是任意的二进制对象,保存到云上通常是以二进制文件的形式,不要和“面向对象编程”中的对象混淆起来。 初识对象存储 通俗地解释起来,你可以这样理解,对象存储是你在云上可以创建的一种“网盘”。这个网盘可以存储任意的二进制文件,包括结构化和非结构化数据。你可以随时上传下载,也可以修改和删除。当然,云上对象存储会保证你数据的可靠性、可用性和扩展性,你不需要操心这些细节。 那么,同样是存储服务,对象存储和云硬盘有什么区别呢? 第一个主要区别,在于访问的接口与形式。 云硬盘其实是挂载到虚拟机的虚拟硬盘,它是通过实现操作系统级别的底层接口,作为虚拟机的块存储设备而存在。我们也必须连接到相关的虚拟机,才能访问它里面的数据。 而对象存储,本质是一个网络化的服务,调用方主要通过高层的 API 和 SDK 来和它进行交互。不管是面向外部公开互联网服务,还是和内部应用程序对接,对象存储都是通过提供像 HTTP 这样的网络接口来实现的。所以它的独立性很强,不需要依赖其他组件就可以运作。 第二个主要区别,也是对象存储的一大特征,就是对象存储内本身不存在一个真正的文件系统,而是更接近一个键值(Key-Value)形式的存储服务。 这里的键就是对象的路径(路径中包含斜杠符号“/”),这里的值就是存储对象的二进制文件。 键值系统和云硬盘上经典文件系统的核心差异,就在于文件系统保存了更多的元数据,尤其是实现了目录结构和目录操作。而键值系统中,所谓的目录其实是多个对象共享的路径前缀,可以说是用前缀模拟出了目录。 第三个主要区别,在于对象存储的巨大容量。 作为云计算最具代表性的服务之一,它的可扩展性(Scalability)是毋庸置疑的,对象存储能够轻松地容纳上 PB 的超大容量数据,这是任何的云硬盘所不能企及的。所以对象存储是名副其实的大数据存储。 但从另一个角度说,对象存储和 HDFS 这样的大数据文件系统比起来,又有自己独到的优势:对象存储本身也是非常擅长和适合处理小文件的,即便是海量的小文件,对象存储也不会像 HDFS 那样处理起来捉襟见肘,可以说是“大小通吃”。 对象存储的高级特性 存储分层 在生产环境下的对象存储,我们往往会存放大量的文件和数据,这些文件的访问频率其实是会有很大差异的。比如说,对于一些比…… 阅读全文
摘要:什么是虚拟私有网络? 虚拟私有网络(Virtual Private Cloud,简称 VPC),是云计算网络端最重要的概念之一,它是指构建在云上的、相互隔离的、用户可以自主控制的私有网络环境。虚拟私有网络有时也称为专有网络(阿里云)或虚拟网络(Virtual Network 或 VNet,Azure 的叫法)。 私有网络就是一张属于你自己的内网。内网之内的服务器和设备,可以比较自由地互相通信,与外界默认是隔离的。如果外部互联网,或者其他虚拟网络需要连接,则需要额外的配置。 所以说,虚拟私有网络,就是云上的保护网,能够有效地保护网内的各种设施。有的时候,可能还要同时创建多个虚拟网络,让它们各司其职,实现更精细的隔离。 虚拟私有网络麻雀虽小,但五脏俱全。在传统数据中心里,经典网络架构中的概念和组件,在虚拟网络中你几乎都能找到对应。这里比较重要的一些概念包括: 网段,私有网络的内部 IP 区段,通常用 CIDR 形式来表达,如 192.168.0.0/16。 子网,私有网络的下级网络结构,一个私有网络可以划分多个子网,这和通常意义上的子网也是对应和一致的。阿里云中把子网形象地称为“交换机”。 路由表,用于定义私有网络内流量的路由规则,决定着数据包的“下一跳”去向何方。每个子网都必须有一张关联的路由表,通常情况下,系统会自动帮你创建一个默认的路由表。 网关,是对进出私有网络的流量进行把守和分发的重要节点,根据用途的不同,有多种类型,后面我们还会讲到。 安全组,私有网络里虚拟机进出流量的通行或拦截规则,可以起到虚拟机网络防火墙的作用。 阿里云VPC体验 首先,来到阿里云的专有网络管理控制台,选择新建一个 VPC,这里的网段我们选择 192.168.0.0/16 。 注意:VPC 属于局域网,按照 RFC 规范,能够使用的 IPv4 区段必须为 192.168.0.0/16、172.16.0.0/12、10.0.0.0/8 这三个或它们的子集。 至少要创建一个子网,也就是交换机。 我们选择一个子 IP 段 192.168.0.0/24,并且设置所属可用区为“可用区 D” 我们再来创建另外一个交换机,网段设置为 192.168.1.0/24。这里的关键在于,我们可以让第二个交换机位于另外一个可用区 E。这就说明,我们可以建立跨可用区,也就是跨同区域内不同数据中心的私有网…… 阅读全文
摘要:云硬盘是什么? 云硬盘,又叫做“云盘”或者“云磁盘”,就是云虚拟机上可以挂载和使用的硬盘。这里,它既包含了用于承载操作系统的系统盘,也包括了承载数据的数据盘。 在云计算的领域,有时,我们还会把云端磁盘服务叫做块存储(Block Storage),因为它们与 Linux 操作系统中的块设备相对应,是云上提供的“裸盘”,可以格式化并且施加文件系统。 既然是硬盘,那么它就与我们通常的认知相一致,当然是带有数据持久化功能的。这在专业上被称为“非易失性存储”(Non-ephemeral Storage),也就是说写入的数据不会丢失。即便所在虚拟机重启、关机甚至下线删除,这块云硬盘只要还存在,其中的数据也并不会被擦除。 事实上,云厂商对于云盘,不仅仅会保障数据的顺利写入,一般还会帮你在存储端同步和保留至少三份副本的数据。所以说,云硬盘的冗余度和可用性是非常之高的,一般极少发生云硬盘数据丢失的情况。 云硬盘与传统磁盘的真正差异在于,绝大多数的云硬盘都是远程的。我们都知道,在经典计算机的体系结构中,硬盘是通过本地机器内部主板的高速总线,与 CPU、内存等部件相连接;而在云端,你的硬盘则很可能并不在宿主机上,而是在专用的磁盘服务器阵列中,**两者是通过数据中心内部的特有 IO 线路进行连接。 ** 云硬盘的性能等级 第一个等级的云硬盘,是基于传统 HDD 硬盘构建而成的。这类云盘的性能一般,最高 IOPS 大概在数百左右。在很多的云上,已经不把它作为推荐的选择了。但它并非一无是处,成本低就是它的最大优势,在不注重性能的测试环境,或者是个人自用的服务器,它就是一个很好的选择。 第二个等级,往往是基于混合硬盘,也就是结合 HDD 和 SSD 硬盘构建的云硬盘。它会综合发挥 SSD 的性能优势和 HDD 的容量优势。比如它可以用 SSD 部分来承载热点区域数据,或是作为缓存,来提高响应性能。在这个等级下,典型的 IOPS 为数千左右,是很多云上创建硬盘的默认选项,比较适合像是操作系统启动盘这样的常规负载。 第三个等级的云硬盘,它的存储介质就是纯 SSD 硬盘了。虽然贵一些,但一分价钱一分货,这个等级下的云硬盘能够提供非常稳定的 IO 能力,IOPS 通常能够上万,也有相当不俗的吞吐量和较低的访问延时。你可以用它来承载生产环境中重要的关键业务应用,或是各类数据库等 IO 密集型应用。 …… 阅读全文