擴充存儲池數據一致性特別慢
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進行專門優化。它部署在存儲路由器上,多個存儲路由器保存著整個存儲系統中的元數據多個副本,並通過一定的更新策略保持一致性。這種結構中,因存儲路由器具有強大的協議功能,所以具有更多的優勢。能充分利用存儲資源,保護投資。能實現軟硬體隔離,並輔有大量的自動化工具,提高了虛擬伺服器的安全性,降低對技術人員的需求和成本。