扩充存储池数据一致性特别慢
A. 软件定义存储相比传统存储有何优势
超融合核心的分布式存储也是软件定义存储(SDS)的一种形态,而超融合架构本质上也是一种软件定义存储(SDS)和虚拟化融合部署的模式。所以软件定义存储与传统存储的区别可以参考超融合与传统架构的区别,详情如下:
一、架构和资源管理模式对比如下以SmartX 超融合产品为例,分别给出了下超融合架构和传统架构的部署区别和资源管理模式区别。
从上图可以看出,超融合架构在整个产品运维周期中,不仅大量操作被自动化,运维简单,而且时间短,效率高。可以有效降低人员要求,将 IT 人员解放出来进行更创新的活动。
5、采购成本和总拥有成本的降低在客户最关注的成本方面,服务器+超融合软件(或超融合一体机),相比服务器加传统中高端存储的成本,有较大幅度的降低。但除了采购成本,超融合在总拥有成本上都有大幅降低。关于超融合在成本方面的优势可以访问官方技术博客:《超融合相比传统FC SAN架构有什么成本优势?》
可以看到,超融合通过创新的架构,以更优的成本让IT基础架构更敏捷、能力更强,而这些特性,将为用户加快数字化转型奠定坚实基础。
B. JDBC执行存储过程异常慢
1.connection不知道你是采用什么方式获取的,如果不是从连接池里取,你每connection.close()一次,下次get的时候会重新建立实际物理链接,这样会相当耗时。所以你检查一下是在获取connection时耗的时间多,还是在execute的时间多。代码:
long startTime = System.currentTimeMillis();
conn = getConnection(); // execute();
long endTime = System.currentTimeMillis();
System.out.println("获取链接的时间:" + (endTime - startTime));
执行的类似;
2.从你的存储过程的逻辑来说,要条件查询,更新某个字段的值,和入库,这三个步骤应该有输入参数的,那么你的这个参数是怎么传入的?
个人觉得你的这个存储过程可以优化成sql来执行,效率应该会更好:
首先,你把输入参数放入一个临时表;
比如结构是:
_id _field
查询的条件 更新的字段
// 更新_table中存在的记录的_field字段,并且只更新_table与_tmp键值相等的记录
UPDATE _table t SET _field=(SELECT MAX(_field) FROM _tmp WHERE _id=t._id) WHERE EXISTS (SELECT 'X' FROM _tmp WHERE _id=t._id);
// 选择_table与_tmp键值不相等的记录(即_table中不存在的记录)插入_table
INSERT INTO _table (_id,_field) (SELECT _id,_field FROM _tmp t WHERE NOT EXISTS (SELECT 'X' FROM _table WHERE _id=t._id));
这样的话,每次都是两个批量操作,而且不需要输入参数,直接调用就可以,唯一需要多做的工作就是做临时表。
C. 如何让多台服务器实现数据同步
如何让所有服务器之间数据同步
1、采用高可用sureHA软件镜像型,一台主服务器,一台备服务器,通过网线实时将数据备份,实现服务器双机互备的功能,此方式保证多台服务器之间数据的一致性。
2、采用高可用sureHA双机热备共享型。一台主服务器,一台备服务器,链接一台存储,将数据放到存储里面,实现数据的共享。此方式保证多台服务器之间数据的一致性。
3、可实现服务器虚拟化,把所有的服务器物理资源都整理成一个大的资源池,数据都存放在磁盘阵列上面,所有应用系统都通过调用磁盘阵列里面的数据,此方式保证多台服务器之间数据的一致性。
不管技术怎么实现,在服务器方面还是需要人为的进行操作和监督,服务器同步也成为不可缺少的一部分。所以海腾数据的服务器的硬件要求和机房的线路稳定是保障以上实现的关键。参考海腾数据服务器租用
服务器数据同步
D. Windows server 存储池数据分层功能影响性能怎么办
之前尝试过在centos下build了一个zfs,windows
自带的nfs
client
mount
zfs
nfs,速度只有15m/s,
可能是windows
的mount命令不支持某些特性,比如说异步,也不支持utf8字符集,放弃,没有深入研究iscsi/smb是不是有性能提升,感觉zfs不够灵活,加一个硬盘什么的还要占位,硬盘还要规格一样。。。
看到微软把windows
server
2012
r2的存储池吹的神一样,所以就利用一些时间用虚拟机搭建下环境测试了
E. 分布式存储相对于单机存储的挑战是
1、分布式相比于传统存储系统的优点
①高性能:它通常可以高效地管理读缓存和写缓存,支持自动的分布式存储通过将热点区域2映射到高速缓存,提高响应速度。一旦不在是热点,那么存储系统将会把他们移除。写缓存技术可配合高速存储明显改变整体存储的性能,按照一定的策略先将数据写入高速存储,再在适当的时间进行同步落盘。
②支持分布式存储:通过网络进行松耦合链接,允许高速村塾和低速存储分开部署。一定条件下分层存储的优势可以发挥到最佳。解决了最大的问题是当性能池读不命中后,从冷池提取数据的粒度太大,导致延迟高,从而给造成整体的性能的抖动的问题。
③多副本一致性:他相比传统的存储框架使用RAID不同。它采用了多分本备份机制,存储之前进行分片,之后按照一定的规则存在集群的节点上,为了保证数据一致性,布式存储通常采用的是一个副本写入,多个副本读取的强一致性技术,读取数据失败,从其他副本获取,重新写入该副本恢复。
④容灾与备份:对于容灾采用最重要的手段就是快照,可以实现一定时间下的数据的保存。他有利于故障重现,有助于分析研究,避免灾难,备份就是为了数据的安全性。
⑤弹性扩展:分布式存储可预估并且弹性扩展计算、存储容量和性能,节点扩展后,旧数据自动迁移到新节点上,实现负载均衡,避免单点问题。水平扩展只需要将节点和原来的集群链接到同一网络,整个过程不会对业务造成影响,当加节点时,集群系统的容量和性能随之线性扩展,新节点资源会被平台接管,分配或吸收。
⑥存储系统标准化:随着分布式存储的发展,存储行业的标准化进程也不断推进,分布式存储优先采用行业标准接口(SMI-S或OpenStack Cinder)进行存储接入,在平台层面,通过将异构存储资源进行抽象化,将传统的存储设备级的操作封装成面向存储资源的操作,从而简化异构存储基础架构的操作,以实现存储资源的集中管理,并能够自动执行创建、变更、回收等整个存储生命周期流程。基于异构存储整合的功能,用户可以实现跨不同品牌、介质地实现容灾,如用中低端阵列为高端阵列容灾,用不同磁盘阵列为闪存阵列容灾等等,从侧面降低了存储采购和管理成本。
2、分布式相比于传统存储系统的缺点
首先,从部署与维护的角度来看,分布式存储部署过程较为复杂,需要专门的人才进行部署,维护与管理,需要一定的时间培养专门的人才。其次,从硬件设备角度来看,分布式存储使用的均为X86架构服务器,稳定性可能不如传统的硬件存储。尤其对于银行,金融,政府等重要行业,稳定永远大于一切,他们既是新技术的实践者但同时也需要最稳定的环境保持业务的良好运行。最后,对于数据保护技术,大部分都是通过副本技术实现数据保护机制,常见的有两副本三副本等,这样也会造成可用存储容量的降低。
F. 如何解决主从数据库同步延迟问题
最简单的减少slave同步延时的方案就是在架构上做优化,尽量让主库的DDL快速执行。还有就是主库是写,对数据安全性较高,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的数据安全,完全可以讲sync_binlog设置为0或者关闭binlog,innodb_flushlog也可以设置为0来提高sql的执行效率。另外就是使用比主库更好的硬件设备作为slave。
mysql-5.6.3已经支持了多线程的主从复制。原理和丁奇的类似,丁奇的是以表做多线程,Oracle使用的是以数据库(schema)为单位做多线程,不同的库可以使用不同的复制线程。
sync_binlog=1
This makes MySQL synchronize the binary log’s contents to disk each time it commits a transaction
默认情况下,并不是每次写入时都将binlog与硬盘同步。因此如果操作系统或机器(不仅仅是MySQL服务器)崩溃,有可能binlog中最后的语句丢 失了。要想防止这种情况,你可以使用sync_binlog全局变量(1是最安全的值,但也是最慢的),使binlog在每N次binlog写入后与硬盘 同步。即使sync_binlog设置为1,出现崩溃时,也有可能表内容和binlog内容之间存在不一致性。如果使用InnoDB表,MySQL服务器 处理COMMIT语句,它将整个事务写入binlog并将事务提交到InnoDB中。如果在两次操作之间出现崩溃,重启时,事务被InnoDB回滚,但仍 然存在binlog中。可以用--innodb-safe-binlog选项来增加InnoDB表内容和binlog之间的一致性。(注释:在MySQL 5.1中不需要--innodb-safe-binlog;由于引入了XA事务支持,该选项作废了),该选项可以提供更大程度的安全,使每个事务的 binlog(sync_binlog =1)和(默认情况为真)InnoDB日志与硬盘同步,该选项的效果是崩溃后重启时,在滚回事务后,MySQL服务器从binlog剪切回滚的 InnoDB事务。这样可以确保binlog反馈InnoDB表的确切数据等,并使从服务器保持与主服务器保持同步(不接收 回滚的语句)。
innodb_flush_log_at_trx_commit (这个很管用)
抱怨Innodb比MyISAM慢 100倍?那么你大概是忘了调整这个值。默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。特别是使用电 池供电缓存(Battery backed up cache)时。设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。日志仍然会每秒flush到硬 盘,所以你一般不会丢失超过1-2秒的更新。设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。而值2只会在整个操作系统 挂了时才可能丢数据。
G. Kafka丢失数据问题优化总结
数据丢失是一件非常严重的事情事,针对数据丢失的问题我们需要有明确的思路来确定问题所在,针对这段时间的总结,我个人面对kafka 数据丢失问题的解决思路如下:
1、是否真正的存在数据丢失问题,比如有很多时候可能是其他同事操作了测试环境,所以首先确保数据没有第三方干扰。
2、理清你的业务流程,数据流向,数据到底是在什么地方丢失的数据,在kafka 之前的环节或者kafka之后的流程丢失?比如kafka的数据是由flume提供的,也许是flume丢失了数据,kafka 自然就没有这一部分数据。
3、如何发现有数据丢失,又是如何验证的。从业务角度考虑,例如:教育行业,每年高考后数据量巨大,但是却反常的比高考前还少,或者源端数据量和目的端数据量不符
4、 定位数据是否在kafka之前就已经丢失还事消费端丢失数据的
kafka支持数据的重新回放功能(换个消费group),清空目的端所有数据,重新消费。如果是在消费端丢失数据,那么多次消费结果完全一模一样的几率很低。如果是在写入端丢失数据,那么每次结果应该完全一样(在写入端没有问题的前提下)。
5、kafka环节丢失数据,常见的kafka环节丢失数据的原因有:
如果auto.commit.enable=true,当consumer fetch了一些数据但还没有完全处理掉的时候,刚好到commit interval出发了提交offset操作,接着consumer crash掉了。这时已经fetch的数据还没有处理完成但已经被commit掉,因此没有机会再次被处理,数据丢失。网络负载很高或者磁盘很忙写入失败的情况下,没有自动重试重发消息。没有做限速处理,超出了网络带宽限速。kafka一定要配置上消息重试的机制,并且重试的时间间隔一定要长一些,默认1秒钟并不符合生产环境(网络中断时间有可能超过1秒)。如果磁盘坏了,会丢失已经落盘的数据
单批数据的长度超过限制会丢失数据,报kafka.common.MessageSizeTooLargeException异常解决:
6、partition leader在未完成副本数follows的备份时就宕机的情况,即使选举出了新的leader但是已经push的数据因为未备份就丢失了!kafka是多副本的,当你配置了同步复制之后。多个副本的数据都在PageCache里面,出现多个副本同时挂掉的概率比1个副本挂掉的概率就很小了。(官方推荐是通过副本来保证数据的完整性的)
7、kafka的数据一开始就是存储在PageCache上的,定期flush到磁盘上的,也就是说,不是每个消息都被存储在磁盘了,如果出现断电或者机器故障等,PageCache上的数据就丢失了。可以通过log.flush.interval.messages和log.flush.interval.ms来配置flush间隔,interval大丢的数据多些,小会影响性能但在0.8版本,可以通过replica机制保证数据不丢,代价就是需要更多资源,尤其是磁盘资源,kafka当前支持GZip和Snappy压缩,来缓解这个问题 是否使用replica取决于在可靠性和资源代价之间的balance。
同时kafka也提供了相关的配置参数,来让你在性能与可靠性之间权衡(一般默认):
当达到下面的消息数量时,会将数据flush到日志文件中。默认10000
当达到下面的时间(ms)时,执行一次强制的flush操作。interval.ms和interval.messages无论哪个达到,都会flush。默认3000ms
检查是否需要将日志flush的时间间隔
high-level版本已经封装了对partition和offset的管理,默认是会定期自动commit offset,这样可能会丢数据的low-level版本自己管理spout线程和partition之间的对应关系和每个partition上的已消费的offset(定期写到zk)并且只有当这个offset被ack后,即成功处理后,才会被更新到zk,所以基本是可以保证数据不丢的即使spout线程crash(崩溃),重启后还是可以从zk中读到对应的offset
不能让内存的缓冲池太满,如果满了内存溢出,也就是说数据写入过快,kafka的缓冲池数据落盘速度太慢,这时肯定会造成数据丢失。尽量保证生产者端数据一直处于线程阻塞状态,这样一边写内存一边落盘。异步写入的话还可以设置类似flume回滚类型的batch数,即按照累计的消息数量,累计的时间间隔,累计的数据大小设置batch大小。
不过异步写入丢失数据的情况还是难以控制还是得稳定整体集群架构的运行,特别是zookeeper,当然正对异步数据丢失的情况尽量保证broker端的稳定运作吧
kafka不像hadoop更致力于处理大量级数据,kafka的消息队列更擅长于处理小数据。针对具体业务而言,若是源源不断的push大量的数据(eg:网络爬虫),可以考虑消息压缩。但是这也一定程度上对CPU造成了压力,还是得结合业务数据进行测试选择
topic设置多分区,分区自适应所在机器,为了让各分区均匀分布在所在的broker中,分区数要大于broker数。分区是kafka进行并行读写的单位,是提升kafka速度的关键。
关闭自动更新offset,等到数据被处理后再手动跟新offset。
在消费前做验证前拿取的数据是否是接着上回消费的数据,不正确则return先行处理排错。
一般来说zookeeper只要稳定的情况下记录的offset是没有问题,除非是多个consumer group 同时消费一个分区的数据,其中一个先提交了,另一个就丢失了。
kafka的数据一开始就是存储在PageCache上的,定期flush到磁盘上的,也就是说,不是每个消息都被存储在磁盘了,如果出现断电或者机器故障等,PageCache上的数据就丢失了。这个是总结出的到目前为止没有发生丢失数据的情况
强行kill线程,导致消费后的数据,offset没有提交,partition就断开连接。比如,通常会遇到消费的数据,处理很耗时,导致超过了Kafka的session timeout时间(0.10.x版本默认是30秒),那么就会re-blance重平衡,此时有一定几率offset没提交,会导致重平衡后重复消费。
如果在close之前调用了consumer.unsubscribe()则有可能部分offset没提交,下次重启会重复消费。
kafka数据重复 kafka设计的时候是设计了(at-least once)至少一次的逻辑,这样就决定了数据可能是重复的,kafka采用基于时间的SLA(服务水平保证),消息保存一定时间(通常为7天)后会被删除。
kafka的数据重复一般情况下应该在消费者端,这时log.cleanup.policy = delete使用定期删除机制。
H. 海量数据存储
存储技术经历了单个磁盘、磁带、RAID到网络存储系统的发展历程。网络存储技术就是将网络技术和I/O技术集成起来,利用网络的寻址能力、即插即用的连接性、灵活性,存储的高性能和高效率,提供基于网络的数据存储和共享服务。在超大数据量的存储管理、扩展性方面具有明显的优势。
典型的网络存储技术有网络附加存储NAS(Network Attached Storage)和存储区域网SAN(Storage Area Networks)两种。
1)NAS技术是网络技术在存储领域的延伸和发展。它直接将存储设备挂在网上,有良好的共享性、开放性。缺点是与LAN共同用物理网络,易形成拥塞,而影响性能。特别是在数据备份时,性能较低,影响在企业存储应用中的地位。
2)SAN技术是以数据存储为中心,使用光纤通道连接高速网络存储的体系结构。即将数据存储作为网络上的一个区域独立出来。在高度的设备和数据共享基础上,减轻网络和服务器的负担。因光纤通道的存储网和LAN分开,使性能得到很大的提高,而且还提供了很高的可靠性和强大的连续业务处理能力。在SAN中系统的扩展、数据迁移、数据本地备份、远程数据容灾数据备份和数据管理等都比较方便,整个SAN成为一个统一管理的存储池(Storage Pool)。SAN存储设备之间通过专用通道进行通信,不占用服务器的资源。因此非常适合超大量数据的存储,成为网络存储的主流。
3)存储虚拟化技术是将系统中各种异构的存储设备映射为一个单一的存储资源,对用户完全透明,达到互操作性的目的和利用已有的硬件资源,把SAN内部的各种异构的存储资源统一成一个单一视图的存储池,可根据用户的需要方便地切割、分配。从而保持已有的投资,减少总体成本,提高存储效率。
存储虚拟化包括3个层次结构:基于服务器的虚拟化存储、基于存储设备的虚拟化存储和基于网络的虚拟化存储。
1)基于服务器的虚拟化存储由逻辑管理软件在主机/服务器上完成。经过虚拟化的存储空间可跨越多个异构的磁盘阵列,具有高度的稳定性和开放性,实现容易、简便。但对异构环境和分散管理不太适应。
2)基于存储设备的虚拟化存储,因一些高端磁盘阵列本身具有智能化管理,可以实现同一阵列,供不同主机分享。其结构性能可达到最优。但实现起来价格昂贵,可操作性差。
3)基于网络的虚拟化存储,通过使用专用的存储管理服务器和相应的虚拟化软件,实现多个主机/服务器对多个异构存储设备之间进行访问,达到不同主机和存储之间真正的互连和共享,成为虚拟存储的主要形式。根据不同结构可分为基于专用服务器和基于存储路由器两种方式。①基于专用服务器的虚拟化,是用一台服务器专用于提供系统的虚拟化功能。根据网络拓扑结构和专用服务器的具体功能,其虚拟化结构有对称和非对称两种方式。在对称结构中数据的传输与元数据访问使用同一通路。实现简单,对服务器和存储设备的影响小,对异构环境的适应性强。缺点是专用服务器可能成为系统性能的瓶颈,影响SAN的扩展。在非对称结构中,数据的传输与元数据访问使用不同通路。应用服务器的I/O命令先通过命令通路传送到专用服务器,获取元数据和传输数据视图后,再通过数据通路得到所需的数据。与对称结构相比,提高了存储系统的性能,增加了扩展能力。②基于存储路由器的SAN虚拟化,存储路由器是一种智能化设备,既具有路由器的功能,又针对I/O进行专门优化。它部署在存储路由器上,多个存储路由器保存着整个存储系统中的元数据多个副本,并通过一定的更新策略保持一致性。这种结构中,因存储路由器具有强大的协议功能,所以具有更多的优势。能充分利用存储资源,保护投资。能实现软硬件隔离,并辅有大量的自动化工具,提高了虚拟服务器的安全性,降低对技术人员的需求和成本。