并行执行(parallel execution)是Oracle企业版才有的特性(标准版中没有这个特性),指能够将一个大型串行任务(任何DML,或者一般的DDL)物理地划分为多个较小的部分,这些较小的部分可以同时得到处理。
并行包括:
并行查询:这是指能使用多个 *** 作系统进程或线程来执行一个查询。Oracle会发现能并行执行的 *** 作(如全表扫描或大规模排序),并创建一个查询计划来实现)。
并行DML(PDML):这在本质上与并行查询很相似,但是PDML主要是使用并行处理来执行修改(INSERT、UPDATE、DELETE和MERGE)。
并行DDL:并行DDL是指Oracle能并行地执行大规模的DDL *** 作。例如,索引重建、创建一个新索引、数据加载以及大表的重组等都可以使用并行处理。
并行恢复:这是指数据库能并行地执行实例(甚至介质)恢复,以减少从故障恢复所需的时间。
过程并行化:这是指能并行地运行所开发的代码。
何时使用并行
在应用并行执行之前,需要保证以下两点成立:
必须有一个非常大的任务,如对50GB数据进行全面扫描。
必须有足够的可用资源(CPU、I/O、内存)。在并行全面扫描50GB数据之前,你要确保有足够的空闲CPU(以容纳并行进程),还要有足够的I/O通道。
如果只有一个小任务(通常OLTP系统中执行的查询就是这种典型的小任务),或者你的可用资源不足(这也是OLTP系统中很典型的情况),其中CPU和I/O资源通常已经得到最大限度的使用,那就根本不用考虑并行执行。
如果一个任务只需要几秒(或更短时间)就能串行地完成,引入并行执行后,相关的管理开销可能会让整个过程花费更长的时间。
举例如,写一页文档若12个人来写,需要开会分段等,可能并不如一个人来写更快。而如果写1200页,12个人写需要的时间只为原来的1/12,就算分配任务可能也就1/12,还是比一个人写要快多了。
并行查询
并行查询允许将一个SQL SELECT语句划分为多个较小的查询,每个部分的查询并发地运行,然后会将各个部分的结果组合起来,提供最终的答案。
在并行进程和扫描文件之间并不存在1对1映射,可以多个进程扫描同一个文件。
各个并行进程可称为并行执行服务器(parallel execution server),有时也称为并行查询(parallel
query,PQ)从属进程。各个并行执行服务器都是单独的会话,就像是专业服务器进程一样连接数据库。每个并行执行服务器分别负责扫描表中一个部分(各
个部分都不重叠),汇总其结果子集,将其输出发回给协调服务器(即原始会话的服务器进程),它再将这些子结果汇总为最终答案。
在默认情况下,Oracle是不启用并行查询的。启用并行查询有多种方法,可以直接在查询中使用一个提示,或者修改表要求考虑并行执行路径等。
并行查询方法
1)暗示hints式,临时有效
select /+parallel(table_name num)/ count() from table_name;
多表关联时多表并行:
select /+parallel(table_name1,num1) parallel(table_name2,num2)/ count() from table_name1, table_name2;
2)alter table对象式,长期有效
alter table table_name parallel num;
3)alter session会话式,会话生命周期有效
alter session force parallel query parallel num;
4)并行DDL式,会话生命周期有效
alter session enable parallel dml;
对于前两种方式,若省略num则Oracle将自动根据负载确定并行度。并行度要随着系统上工作负载的增减而变化。如果有充足的空闲资源,并行度会
上升;如果可用资源有限,并行度则会下降。这样就不会为机器强加一个固定的并行度。利用这种方法,允许Oracle动态地增加或减少查询所需的并发资源
量。
查看默认并行数
1)确定会话SID
select sid from v$mystat where rownum = 1;
2)在其他会话中查询
select sid,qcsid,server#,degree from v$px_session where qcsid = num;
一般而言,如果能访问尽可能多的资源(CPU、内存和I/O),并行执行就能最好地发挥作用。但这并不是说如果整个数据集都在一个磁盘上,就从并行
查询得不到任何好处。不过如果整个数据集都在一个磁盘上,可能确实不如使用多个磁盘那样能有更多收获。即使使用一个磁盘,在响应时间上也可能可以得到一定
的速度提升。原因在于:给定的一个并行执行服务器在统计行时并不读取这些行,反之亦然。所以,与执行串行相比,两个并行执行服务器可以在更短的时间内完成
所有行的统计。
数据分布在多个物理设备上可以提高I/O,如表分区、跨磁盘等。
在Oracle 11g Release2及以上版本中,引入了一项新功能来限制资源过度使用:并行语句排除(Parallel
Statement
Queuing,PSQ)。使用PSQ时,数据库会限制并发执行的并行查询数,并把更多的并行请求放在一个执行队列中。CPU资源用尽时数据库会阻止新的
请求变为活动状态。这些请求并没有失败,它们只是会延迟开始,也就是说它们将排队。资源可用时,数据库就会开始执行队列中的查询。
并行DML
Oracle文档将并行DML(PDML)一词的范围限制为只包括INSERT、UPDATE、DELETE和MERGE(不像平常的DML那样还
包括SELECT)。在PDML期间,Oracle可以使用多个并行执行服务器来执行INSERT、UPDATE、DELETE或MERGE,而不是只利
用一个串行进程。在一个有充足I/O带宽的多CPU主机上,对于大规模的DML *** 作,可能会得到很大的速度提升。
不过,不能把PDML当成提高OLTP应用速度的一个特性。因为并行 *** 作设计为要充分、完全地利用一台机器上的所有资源。通过这种设计,一个用户可
以完全使用机器上的所有磁盘、CPU和内存。在某些数据仓库中(有大量数据,而用户很少),这可能正是你想要的。而在一个OLTP系统中(大量用户都在做
很短、很快的事务),可能就不能希望如此了,你不想让用户能够完全占用机器资源。
类似于Oracle执行的分布式查询,PDML *** 作采用同样的方式执行,即每个并行执行服务器相当于一个单独数据库实例中的一个进程。这些事务都结束后,会执行一个相当于快速2PC的过程来提交这些单独的独立事务。这些事务要么都由PDML协调会话提交,要么无一提交。
由于PDML采用的一种伪分布式的实现,因此存在一些限制:
PDML *** 作期间不支持触发器。这是一个很合理的限制,因为触发器可能会向更新增加大量开销,而你使用PDML的本来目的是为了更快一些,这两方面是矛盾的,不能放在一起。
PDML期间,不支持某些声明方式的引用完整性约束,因为表中的每一片(部分)会在单独的会话中作为单独的事务进行修改。例如,PDML *** 作不支持自引用完整性。如果真的支持自引用完整性,可能会出现死锁和其他锁定问题。
在提交或回滚之前,不能访问用PDML修改的表。
PDML不支持高级复制(因为复制特性的实现要基于触发器)。
不支持延迟约束(也就是说,采用延迟模式的约束)。
如果表是分区的,PDML只可能在有位图索引或LOB列的表上执行,而且并行度取决于分区数。在这种情况下,无法在分区内并行执行一个 *** 作,因为每个分区只有一个并行执行服务器来处理。
执行PDML时不支持分布式事务。
PDML不支持聚簇表。
并行DDL
从维护的观点看,以及从管理的角度来说,并行DDL才是Oracle中并行执行最突出的优点。如果认为并行查询主要是为最终用户设计的,那么并行
DDL则是为DBA/开发人员设计的。如果没有并行执行,DBA将很难真正充分利用硬件的全部能力。但如果利用并行执行,则完全可以做到。以下SQL
DDL命令允许“并行化”:
CREATE INDEX:多个并行执行服务器可以扫描表、对数据排序,并把有序的段写出到索引结构。
CREATE TABLE AS SELECT:执行SELECT的查询可以使用并行查询来执行,表加载本身可以并行完成。
ALTER INDEX REBUILD:索引结构可以并行重建。
ALTER TABLE MOVE:表可以并行移动。
ALTER TABLE SPLIT|COALESCE PARTITION:单个表分区可以并行地分解或合并。
ALTER INDEX SPLIT PARTITION:索引分区可以并行地分解。
前4个命令还适用于单个的表/索引分区,也就是说,可以并行地MOVE一个表的单个分区。
并行DDL和使用外部表的数据加载
利用并行DDL,再加上外部表,就能通过一个简单的CREATE TABLE AS SELECT or INSERT /+ APPEND
/来实现并行直接路径加载。不用再编写脚本,不必再分解文件,也不用协调要运行的N个脚本。简单地说,通过结合并行DDL和外部表,不仅提供了纯粹的易
用性,而且全无性能损失。
并行DDL和区段截断
并行DDL依赖于直接路径 *** 作。也就是说,数据不传递到缓冲区缓存以便以后写出;而是由一个 *** 作(如CREATE TABLE AS
SELECT)来创建新的区段,并直接写入这些区段,数据直接从查询写到磁盘(放在这些新分配的区段中)。每个并行执行服务器执行自己的部分CREATE
TABLE AS SELECT工作,并且都会写至自己的区段。INSERT /+ APPEND
/(直接路径插入)会在一个段的HWM“之上“写,每个并行执行服务器再写至其自己的一组区段,而不会与其他并行执行服务器共享。因此,如果执行一个并
行CREATE TABLE AS
SELECT,并使用4个并行执行服务器来创建表,就至少有4个分区,可能还会更多。每个并行执行服务器会分配其自己的区段,向其写入,等填满时,再分配
另一个新的区段,并行执行服务器不会使用由其他并行执行服务器非品牌的区段。
在数据仓库环境中,执行一个大规模的加载之后,这可能导致“过渡浪费“。假设你想加载1,010MB的数据(大约1GB),而且正在使用一个有
100MB区段的表空间,你决定使用10个并行执行服务器来加载这个数据。每个并行执行服务器先分配其自己的100MB区段(总共会有10个100MB的
区段),并在其中填入数据。由于每个并行执行服务器都要加载101MB的数据,所以它会填满第一个区段,然后再继续分配另一个100MB的区段,但实际上
只会使用这个区段中1MB的空间。现在就有了20区段,其中10个是满的,另外10个则不同,这10个区段中都各有1MB的数据,因此,总共会有
990MB的空间是”已分配但未使用的“。下一次加载是可以使用这个空间,但是对现在来说,你就有了990MB的死空间。此时区段截断(extend
trimming)就能派上用场了。Oracle会试图取每个并行执行服务器的最后一个区段,并将其”截断为“可能的最小大小。
区段截断和字典管理表空间
如果使用传统的字典管理表空间,Oracle可以把只包含1MB数据的各个100MB区段转变或1MB的区段。遗憾的是,(在字典管理的表空间中)
这会留下10个不连续的99MB空闲区段,因为你的分配机制采用的是100MB区段,所以这990MB空间就会用不上!下一次分配100MB时,往往无法
使用现有的这些空间,因为现在的情况是:有99MB的空闲空间,接下来是1MB的已分配空间,然后又是99MB空闲空间,依此类推。
区段截断和本地管理表空间
本地管理表空间有两种类型:UNIFORM SIZE 和AUTOALLOCATE,UNIFORM
SIZE是指表空间中的每个区段大小总是完全相同;AUTOALLOCATE则表示Oracle会使用一种内部算法来确定每个区段应该是多大。这些方法都
能很好地解决上述问题,不过,这两种方法的解决策略截然不同。
在字典管理的表空间中,如果请求一个100MB区段,倘若Oracle只找到了99MB的自由区段,请求还是会失败。与字典管理表空间不同,有AUTOALLOCATE区段的本地管理表空间可以更为灵活。为了试图使用所有空闲空间,它可以减小所请求的空间大小。
随着使用并行直接路径 *** 作向表UNIFORM_TEST加载越来越多的数据,过一段时间后,空间利用情况会变得越来越糟糕。对此,我们可能希望使用
一个更小的统一区段大小,或者使用AUTOALLOCATE。一段时间后,AUTOALLOCATE也可能生成更多的区段,但是由于会发生区段截断,所以
空间利用情况要好得多。
四大主流数据库比较
一、开放性
1SQLServer
只能在windows上运行,没有丝毫的开放性, *** 作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NTserver只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据库。
2Oracle
能在所有主流平台上运行(包括windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。
3SybaseASE
能在所有主流平台上运行(包括windows)。但由于早期Sybase与OS集成度不高,因此VERSION1192以下版本需要较多OS和DB级补丁。在多平台的混合环境中,会有一定问题。
4DB2
能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%。
二、可伸缩性,并行性
1SQLserver
并行实施和共存模型并不成熟,很难处理日益增多的用户数和数据卷,伸缩性有限。
2Oracle
并行服务器通过使一组结点共享同一簇中的工作来扩展windownt的能力,提供高可用性和高伸缩性的簇的解决方案。如果windowsNT不能满足需要,用户可以把数据库移到UNIX中。Oracle的并行服务器对各种UNIX平台的集群机制都有着相当高的集成度。
3SybaseASE
虽然有DBSWITCH来支持其并行服务器,但DBSWITCH在技术层面还未成熟,且只支持版本125以上的ASESERVER。DBSWITCH技术需要一台服务器充当SWITCH,从而在硬件上带来一些麻烦。
4DB2
具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境。数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日志。数据库分区有时被称为节点安全性。
三、安全认证
1SQLserver
没有获得任何安全证书。
2OracleServer
获得最高认证级别的ISO标准认证。
3SybaseASE
获得最高认证级别的ISO标准认证。
4DB2
获得最高认证级别的ISO标准认证。
四、性能
1SQLServer
多用户时性能不佳
2Oracle
性能最高,保持开放平台下的TPC-D和TPC-C的世界记录。
3SybaseASE
性能接近于SQLServer,但在UNIX平台下的并发性要优与SQLServer。
4DB2
性能较高适用于数据仓库和在线事物处理。
五、客户端支持及应用模式
1SQLServer
C/S结构,只支持windows客户,可以用ADO、DAO、OLEDB、ODBC连接。
2Oracle
多层次网络计算,支持多种工业标准,可以用ODBC、JDBC、OCI等网络客户连接。
3SybaseASE
C/S结构,可以用ODBC、Jconnect、Ct-library等网络客户连接。
4DB2
跨平台,多层结构,支持ODBC、JDBC等客户。
六、 *** 作简便
1SQLServer
*** 作简单,但只有图形界面。
2Oracle
较复杂,同时提供GUI和命令行,在windowsNT和unix下 *** 作相同。
3SybaseASE
较复杂,同时提供GUI和命令行。但GUI较差,常常无法及时状态,建议使用命令行。
4DB2
*** 作简单,同时提供GUI和命令行,在windowsNT和unix下 *** 作相同。
七、使用风险
1SQLserver
完全重写的代码,经历了长期的测试,不断延迟,许多功能需要时间来证明。并不十分兼容。
2Oracle
长时间的开发经验,完全向下兼容。得到广泛的应用。完全没有风险。
3SybaseASE
向下兼容,但是ct-library程序不益移植。
4DB2
在巨型企业得到广泛的应用,向下兼容性好。风险小
二者的主要区别在于:
服务器:是回应运用软件的总站点,它提供软件的数据收集和处理。服务器通常情况是一台(或台)电脑构成,通过网络与应用软件(客户湍)连接。它硬件珥软件、网络的结合体。
数据库:是存贮信息数据的软件,它有多种。大型的MSSQL,放在服务器上,同时需要数据库软件提供应用 *** 作。小型的放在个体电脑上即可。
扩展资料:
数据库服务器由运行在局域网中的一台/多台计算机和数据库管理系统软件共同构成,数据库服务器为客户应用程序提供数据服务。
数据库服务器建立在数据库系统基础上,具有数据库系统的特性,且有其独特的—面。主要功能如下:
1、数据库管理功能,包括系统配置与管理、数据存取与更新管理、数据完整性管理和数据安全性管理;
2、数据库的查询和 *** 纵功能,该功能包括数据库检索和修改;
3、数据库维护功能,包括数据导入/导出管理,数据库结构维护、数据恢复功能和性能监测;
4、数据库并行运行,由于在同一时间,访问数据库的用户不止一个,所以数据库服务器必须支持并行运行机制,处理多个事件的同时发生。
参考资料:
0Redis主从架构的问题
1哨兵服务介绍
2架构图
3主从服务搭建
4配置哨兵服务
5启动哨兵服务
6验证哨兵服务
对于Redis的主从架构而言,无法实现 master 和 slave 角色的自动切换, 即当 master 出现 redis 服务异常、主机断电、磁盘损坏等问题导致 master 无法使用,而 redis 高可用无法实现自故障转移(将 slave 提升为 master),需要手动改环境配置才能切换到 slave redis 服务器。另外无法横向扩展 Redis 服务的并行写入性能, 当单台 Redis 服务器性能无法满足业务写入需求的时候就必须需要一种方式解决此问题。
1master和slave角色的无缝切换,让业务无感知从而不影响业务使用
2可以横向动态扩展Redis服务器, 从而实现多台服务器并行写入以实现更高并发的目的。
Sentinel进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,其已经被集成在 redis26+的版本中,Redis的哨兵模式到了28版本之后就稳定了下来。一般在生产环境也建议使用Redis28以后版本。哨兵(Sentinel)是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个 Slave 作为新的 Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机” ,英文名称:Subjective Down,简称SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵群”中的多数 Sentinel 进程在对 Master 主服务器做出 SDOWN 的判断,并且通过SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,英文名称是: Objectively Down, 简称 ODOWN。通过一定的 vote 算法,从剩下的 slave 从服务器节点中,选一台提升为 Master 服务器节点,然后自动修改相关配置,并开启故障转移(failover)。Sentinel 机制可以解决 master 和 slave 角色的切换问题。
安装
修改配置文件
启动服务
192168177139
192168177140
其他地方配置和主服务器一致
启动服务
查看主从状态
MASTER
SLAVE1
SLAVE2
MASTER
SLAVE1
SLAVE2
主服务器
SLAVE1:升级为主服务器
SLAVE2:主服务器变为node10
主服务器
从服务器
服务器代码如下:版本 2
子程序 _服务器1_数据到达
局部变量 待分割数据, 字节集
局部变量 分割数据, 字节集, , "0"
局部变量 文件1, 字节集
局部变量 文件2, 字节集
待分割数据 = 服务器1取回数据 ()
分割数据 = 分割字节集 (服务器1取回数据 (), 到字节集 (“&分割号&”), )
如果真 (取数组成员数 (分割数据) = 3)
文件1 = 分割数据 [1]
文件2 = 分割数据 [2]
文件3 = 分割数据 [3]
客服端代码如下:
版本 2
子程序 _按钮1_被单击
客户1发送数据 (“文件1” + “&分割号&” + “文件2” + “&分割号&” + “文件3”)
思路就是这样,应该会看明白吧
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)