阿里雲自主研發雲原生資料庫POLARDB的開拓之路

阿里雲自主研發雲原生資料庫POLARDB的開拓之路

來自專欄我是程序員6 人贊了文章

摘要:本文作者,結合在阿里雲自主研發雲資料庫產品創新之路上的思考、對雲計算時代IT產業格局轉變的理解,以及對於未來開放式競合(Co-opetition)發展的展望等多個維度來闡述和分享雲服務的創新、進化、競合和開放的思維和實踐。

前言

資料庫作為信息時代平台科技(CPU/晶元、PC/手機操作系統、資料庫)最複雜最核心的技術之一,在數字化經濟時代,成為了和「水電煤」一樣不能缺少的數字化能源,是現代化社會經濟運作的源動力。當今這些最核心的IT科技,還完全掌握在美國的高科技公司(如Intel、高盛、微軟、蘋果、谷歌、Oracle、IBM等)手中。

躋身於全球最頂級的高科技公司行列,中國互聯網公司在應用創新層面的巨大成功,能否進化成核心科技自主研發的創新能力,是眾多業界精英們相互「確認過眼神」後的普遍疑問。傳統IT廠商數十年沉澱的技術壁壘能否被破局?雲廠商近十年的技術積累和創新能否足以肩負核心科技自主研發的重任?雲計算的商業模式和互聯網的創新基因能否碰撞孕育出「換道超車」的時代機遇? 互聯網在「兵不血刃」的商業競爭中能否找到一條融合創新之路?

帶著這些問題,本文作者,嘗試用不一樣的個人視角,結合在阿里雲自主研發雲資料庫產品創新之路上的思考、對雲計算時代IT產業格局轉變的理解,以及對於未來開放式競合(Co-opetition)發展的展望等多個維度來思考。由於個人能力有限,認知偏頗之處難以避免。「嚶其鳴矣 求其友聲」,更多的是希望能激發大家的共鳴,共同探討和開拓未來之路。

1. 時代背景和使命

當下,我們享受著互聯網時代的活色生香,商業模式「亂花漸入迷人眼」,新奇、有趣、刺激的流量變現無所不在,「眼球經濟」迷倒眾生一片,網羅了無數男女老少。人性和消費慾望在自由競爭的互聯網新經濟中不斷被激發和放大,互聯網應用在資本的推波助瀾下繁花似錦,科技造富的神話亦不絕於耳。此起彼伏的互聯網公司已經不是在滿足需求,而是在創造需求。狄更斯的那句名言「這是一個最好的時代,也是一個最壞的時代」同樣適用於描述今天的互聯網。因為從來沒有一個時代,把科技和經濟聯繫得像今天這樣緊密,也從來沒有一個時代,像今天這樣用追逐商業成功的夢想來催生和促進科技應用的創新和進步。對於快速奔跑的互聯網人,其實內心需要更多的「慢下來」的思考,我們是想成為紅極一時的互聯網現象,還是成為經久不衰的時代經典?

我們知道,互聯網繁華的背後,是IT科技在支撐著(CPU,操作系統、資料庫、演算法、開源軟體、工程管理、網路連接等)。放到今天來講,雲計算作為IT技術在互聯網時代的演進形態,肩負著互聯網服務大眾、創新變革的使命。無論是大數據熱潮,人工智慧的方興未艾,還是智慧星球的宏偉夢想,無不是構建在雲計算、IT基礎設施和科技平台之上的。

然而,互聯網的喜新厭舊總會讓繁華散場,能夠沉澱下來的才是經典。作為核心科技之一的資料庫,在IT技術發展浪潮中歷久彌新,在數字化經濟時代,更加煥發光彩,現代社會的商業和經濟活動都離不開資料庫。資料庫在銀行、證券、保險、互聯網、電子商務、電子政務、移動支付、商品流通和售賣、共享經濟、教育、泛娛樂服務等各行各業中發揮巨大作用,影響著商業活動和社會服務的健康高效運行,是城市運營、公司經營、商品交易和商業化服務的內在支撐。

所以雲計算廠商,在互聯網時代,都加大了對於資料庫技術的研發投入,也找到了一條自主研發的新路——雲原生資料庫。雲原生資料庫,融合了雲計算的服務能力和彈性架構、開源資料庫的簡潔易用和開放生態,以及傳統資料庫的SQL管理和處理性能等各方面的優勢,通過融合創新,換道超車,在雲環境下能夠為用戶提供更好的資料庫服務。亞馬遜作為雲計算行業的先行者,在自研資料庫方面已經進行了多年的投入和努力。亞馬遜在2014年11月召開的AWS re:Invent 年度大會上,發布了雲原生資料庫Aurora,三年後在2017年SIGMOD資料庫大會, 亞馬遜發布了論文」Amazon Aurora: Design Considerations for High Throughput Cloud Native Relational Databases」,更加開放的解釋了雲原生(Cloud-Native)資料庫Aurora的設計架構和實現方式。

而阿里雲緊跟其後,經過三年的研發,於2017年9月發布了自主研發的雲原生資料庫POLARDB,經過半年多時間的公測,2018年4月正式商用,並且在ICDE資料庫大會進行了阿里雲自主研發雲原生資料庫的技術專題分享。

POLARDB商用以來,獲得了業界人士的廣泛關注,也收穫了一大批用戶的擁躉,讓我們看到了自研資料庫帶來的商業價值和美好前景。在我們回顧過去、分析現在、展望將來的時候,為了更好的理解自主研發雲資料庫的選擇之路,讓我們先來看一看IT行業在雲計算時代的產業格局。

2. 雲計算時代的產業格局

2007年,雲計算「Cloud Computing」這個新鮮詞剛剛誕生,沒有人會想到10多年後,雲計算給整個IT行業會帶來了如此深刻的產業變革。從10年前IT業界對雲計算的猶疑、觀望,到如今雲計算已經服務於各行各業並逐漸贏得用戶的信任。互聯網和大數據,可以說對於雲計算的變革起到了至關重要的作用。

在雲計算服務出現之前,IT行業主要是兩極生態,一類是傳統IT科技公司,一類是ISV應用和系統服務廠商,在互聯網和雲計算成為主流之後,IT行業主要呈現出四極生態水乳交融的態勢。如上圖所示。由於雲計算技術的不斷融合滲透,四種類型的廠商在經營自己的主營業務的同時,都嘗試在其他領域進行競合創新,廠商之間的邊界已經不再那麼重要。傳統廠商可以提供雲服務,雲服務廠商也能研發基於雲環境的新的科技產品,網路和IT設備商建立全球化的網路,加速和拓展了雲服務和雲用戶之間的連接,而基於雲服務的應用服務商,能快速開發出更貼近用戶的應用,或者是為企業用戶提供的一攬子解決方案。邊界一直在打破,傳統的競爭被競合的方式所取代。

原有的IT產業格局發生著巨大的行業變遷,這個變化將影響未來二、三十年的走向。雲計算服務商一直在拓展商業服務的邊界。亞馬遜、阿里雲等國內外雲廠商一直在拓展基於雲計算的商業服務邊界,可以看到幾乎各行各業都在雲計算上開展著自己的商業服務。

其實歷史總是驚人的相似,總是重複著各種各樣的「變遷「。當20世紀40年代,IBM決定從打孔機、打字機跨界到電子計算機的時候,創始人Thomas·J·Watson也不會想到40年後IBM會成為世界上最大的工業公司。而20世紀80年代,當比爾蓋茨還在從事BASIC程序解譯器開發推廣的時候,誰曾想把購買來的QDOS進行改進後,竟然成為被IBM PC選中的DOS操作系統,進而不斷演化出後來的Windows,幫助微軟成為軟體帝國,市值在2000年左右一度超過6000億美金。而上世紀60年代末創建於美國矽谷的Intel公司,最初的產品是半導體存儲器晶元,1971年,英特爾通過購買專利,生產出世界上第一個通用可編程微處理器,而後在CPU處理器領域逐漸取得霸主地位。時至今日,CPU仍然是雲計算時代無可取代的核心技術。1986年,當史蒂夫喬布斯被趕出自己於1976年創建的蘋果公司時,他通過購買加州的一家電腦動畫工作室跨界成立了「皮克斯動畫工作室」在電腦動畫領域取得巨大成功。1996年後喬布斯被請回經營陷入困局的蘋果公司,並在2000年推出ITunes和iPod向音樂行業融合的科技產品,這個進一步演化出2007年的iPhone智能手機和應用商店,可以說喬布斯開啟了互聯網的移動時代,是現代IT科技史上最為傳奇的人物。

回顧了這麼多IT科技翹楚的發展歷史,跨界融合無疑是時代演進的主旋律,商業和行業的邊界一直在被拓展。對於雲計算時代的IT產業格局而言,傳統IT廠商一直拓展計算、存儲和網路性能的邊界。如Intel追尋CPU晶元的摩爾定律,微軟追求極致演算法的軟體性能,谷歌追求信息搜索的性能,高通追求移動計算的性能。ISV應用和系統服務商一直在拓展應用和方案整合的邊界。以蘋果為代表的的智能手機,特斯拉的智能汽車等,都提供了整合應用創新的極致體驗。而網路和IT設施提供和運營服務商一直在拓展網路連接的邊界。中國三大電信運營商的通訊服務,華為公司的「網路管道」戰略,光環新網、世紀互聯、網宿等網路信息服務商等的IDC和內容加速服務,本質都是為了網路的連接無處不在而提供服務。

當四種科技形態在雲環境下融合裂變,意味著巨大的思維方式的衝擊,也意味著你中有我,我中有你的科技融合。無論是哪一類的科技公司,都將在雲計算領域大有作為,如何避免認知的局限和偏見,形成更好的競合關係。將會引領著資源、科技、服務和應用優勢互補相互依存,通過利他而利己形成生態,打破納什均衡的窘境,創造出更大的價值空間。

3. 什麼是雲原生資料庫

作為雲服務廠商,阿里雲提供的資料庫服務目前主要分為三類,一類是開源資料庫(如MySQL,PostgreSQL,Redis,MongoDB,HBase等),一類是商業資料庫(SQLServer,PPAS等),還有自主研發的資料庫(POLARDB,HybridDB等)。

POLARDB是阿里雲自主研發的雲原生資料庫品牌,它包含關係型資料庫(兼容MySQL、PostgreSQL、Oracle等主流資料庫)的服務,目前正在商用售賣的是MySQL兼容的版本,其他SQL類型兼容的版本正在開發之中。

雲原生資料庫是為了更好的服務於雲環境下的應用而誕生的,它是一種融合了眾多創新技術而跨界的雲資料庫服務,本質上是雲的能力和SQL能力的融合。相比較於傳統IT資料庫的SQL管理和數據處理能力,雲原生資料庫還具有以下特徵:

SQL in Cloud

在IT時代,傳統的計算力(例如用關係型資料庫來處理結構化數據等)是服務於系統硬體隔離環境下的多用戶使用場景的。而雲計算時代是多客戶Self-Service租用環境,各種計算負載場景更加複雜,在這種計算負載變遷的環境下,如何解決IT時代的技術產物和雲計算時代應用環境的適配矛盾,正是雲原生資料庫得以融合創新內在推動力。

例如,在公有雲環境下,隨著用戶的增多,以及用戶業務和數據的增長,備份、性能、遷移、升級、只讀實例、磁碟容量、Binlog延遲等相關問題漸漸顯現出來。這背後大部分原因是由於數據本地存儲架構導致,亟須通過技術革新以及新的產品架構解決這個問題。

另外雲原生資料庫能夠更好的銜接雲上數據ETL以及遷移的工具,形成數據生命周期管理的閉環。

雲的本質是彈性,只有實現了計算和存儲的Serverless,把雲作為一個「Single Image」的操作系統,完全不用關心硬體的單一故障點、性能瓶頸以及可用性,一切交給雲來考慮。在這樣一個完全透明的雲環境下,高性能的運行SQL程序,這是「SQL in Cloud」提供給用戶的核心價值。而目前絕大多數雲資料庫服務,還是「SQL on Cloud」。

產品即方案

雲原生資料庫的另一個顯著特徵是,提供滿足企業級數據業務服務的解決方案能力,並把這種方案沉澱成產品能力。提供7*24小時的高可用服務,提供讀寫分離的自適應負載均衡能力,提供故障自動恢復的業務連續保障能力,提供數據存儲容量自適應增長的能力,提供計算資源的即時在線擴展能力,還可以跨IDC以及區域實現數據的容災能力,這些都是傳統私有IT機房運行資料庫需要通過構建方案才能組建的能力。而雲原生資料庫從誕生起,就具備企業級數據解決方案的能力。

全託管服務

雲計算的全託管服務是指雲服務廠商提供了IDC機房建設、資源供應鏈和部署、監控運維、以及售後服務支持等服務體系,相比於傳統的IT資料庫購買流程,更加簡單快捷,即買即用,又極大的降低了購置成本和後期的維護成本,並且讓用戶把注意力關注於數據的定義、收集、處理和業務表達上。剩下的資源、性能、維護等等全部由雲廠商完成。

普惠科技

雲原生資料庫的用戶,共享的不一定是局限於物理伺服器的計算資源,更多共享的是超高速的網路環境,以及具有先進綠色計算環境的IDC機房,還有足夠可靠的安全防禦體系和設施。在極大的降低了高科技產品的准入成本後,風險與故障成本也被共享分擔,雲服務商提供SLA協議來保障服務的質量,並對超出承諾的服務故障提供補償。

從100到200

很多創新的產品都會經歷一個從0到1的過程,就如同Peter Thiel在《從0到1》那本經典著作中描述的那樣,一些新事物,新的表達方式,和產品新的形態,將經歷一個從無到有,破繭成蝶的過程。這個從0到1的過程用來描述雲計算早期的形態是非常合適的。然而,雲計算服務已經經歷近10多年的發展,雲服務已經日臻完善,完善的這個過程可以看成從1到100的進程體現。那麼雲原生資料庫的誕生是什麼樣的一個過程呢?它和之前的雲資料庫有什麼本質區別呢?首先,雲原生資料庫可以看成是雲資料庫服務的內在進化,基於雲資料庫服務多年在技術、產品服務和運維能力的經驗積累之上,追求安全、可靠、性能、容量、彈性等全方面的進步。這個進化的過程其實就是從100到200的過程。如果說雲資料庫是SQL能力(資料庫技術)和雲能力(Cloud is Computer)的疊加,那麼雲原生資料庫就是SQL能力和雲能力的融合。雲原生資料庫沒有直接表現為一個從0到1不同的產品形態,但是內在要求驅動雲原生資料庫服務在能力、質量、效率各個維度做到超越,而這種超越是基於之前雲資料庫服務的能力基礎上的。

4. POLARDB的融合創新

作為雲原生資料庫,POLARDB集眾多創新技術於一身,並充分利用了最新的IT硬體發展技術,無論是高速網路還是存儲設備。採用了自主研發分散式存儲引擎設計,計算伺服器和存儲數據分離的架構,MySQL版本提供100%兼容,性能更快,彈性能力更佳,自帶只讀節點,數據自適應擴展,存儲三副本,秒級備份,提供更高的可靠性。

接下來將著重分析POLARDB的產品架構和技術創新點。關於POLARDB詳細的產品功能介紹,請參考官方文檔。

POLARDB產品架構

提供高吞吐並發處理能力的POLARDB集群

如圖所示,POLARDB產品是一個分散式集群架構的設計。它集眾多高級的技術實現於一身,使得資料庫OLTP處理性能有了質的飛躍。POLARDB採用了存儲與計算分離的設計理念,資料庫計算節點和存儲節點之間採用高速網路互聯,並通過RDMA協議進行數據傳輸,使得I/O性能不在成為瓶頸。

資料庫節點採用和MySQL完全兼容的設計。主節點和只讀節點之間採用Active-Active的Failover方式,提供DB的高可用服務。DB的數據文件、redo log等通過User-Space用戶態文件系統,經過塊設備數據管理路由,依靠高速網路和RDMA協議傳輸到遠端的Chunk Server。同時DB Server之間僅需同步redo log相關的元數據信息。Chunk Server的數據採用多副本確保數據的可靠性,並通過Parallel-Raft協議保證數據的一致性。

多個ECS雲伺服器可以通過讀寫分離連接地址,通過自適應負載均衡能力,把請求轉發到POLARDB的各個服務節點。

在描述了POLARDB的產品架構之後,我們再分別從分散式架構,資料庫高可用,網路協議,存儲塊設備,文件系統和虛擬化等方面逐一介紹下POLARDB融合使用的如下技術創新點。

分散式共享存儲

POLARDB採用自主研發的分散式存儲系統,其根本原因是上述的計算與存儲分離的需要。邏輯上DB數據都放在所有DB server都能夠共享訪問的數據chunk存儲伺服器上。而在存儲服務內部,實際上數據被切塊成chunk來達到通過多個伺服器並發訪問I/O的目的。

物理複製

如上圖所示,POLARDB通過將資料庫文件以及Redolog等存放在共享存儲設備上,由於數據共享,只讀節點的增加無需再進行數據的完全複製,共用一份全量數據和Redo log,只需要同步元數據信息,這使得系統在主節點發生故障進行Failover時候,切換到只讀節點的故障恢復時間能縮短到30秒以內。系統的高可用能力進一步得到增強。而且,只讀節點和主節點之間的數據延遲也可以降低到毫秒級別。

雙25Gbps高速網路下的RDMA協議

RDMA通常是需要有支持高速網路連接的網路設備(如交換機,NIC等),通過特定的編程介面,來和NIC Driver進行通訊,然後通常以Zero-Copy的技術以達到數據在NIC和遠端應用內存之間高效率低延遲傳遞,而不用通過中斷CPU的方式來進行數據從內核態到應用態的拷貝,極大的降低了性能的抖動,提高了整體系統的處理能力。

Snapshot物理備份

Snapshot是一種流行的基於存儲塊設備的備份方案。其本質是採用Copy-On-Write的機制,通過記錄塊設備的元數據變化,對於發生寫操作的塊設備進行寫時複製,將寫操作內容改動到新複製出的塊設備上,來實現恢復到快照時間點的數據的目的。Snapshot是一個典型的基於時間以及寫負載模型的後置處理機制。也就是說創建Snapshot時,並沒有備份數據,而是把備份數據的負載均分到創建Snapshot之後的實際數據寫發生的時間窗口,以此實現備份、恢復的快速響應。POLARDB提供基於Snapshot以及Redo log的機制,在按時間點恢復用戶數據的功能上,比傳統的全量數據結合Binlog增量數據的恢復方式更加高效。

Parallel-Raft演算法

Parallel-Raft是在Raft協議的基礎上,針對POLARDB chunk Server的I/O模型,進行改良的一致性演算法。Raft協議基於Log是連續的,log#n沒有提交的話,後面的Log不允許提交。而POLARDB實現的Parallel-Raft針對非關聯數據chunk允許並行的提交,在保證了多副本數據一致性的基礎上,進一步提高了並發性能。

Docker容器虛擬化

容器虛擬化的實現相對於KVM等虛擬化技術而言,更加輕量級。如果用戶不需要感知整個操作系統的功能,那麼用容器虛擬化技術理論上應該能夠獲得更好的計算能效比。POLARDB採用Docker環境來運行DB計算節點,用更輕量的虛擬化方式,解決了資源的隔離和性能的隔離,也節省了系統資源。

User-Space文件系統

POLARDB採用User-Space文件系統設計資料庫伺服器專用的API介面,由於不用完全兼容POSIX標準,也無需在操作系統內核進行系統調用的1:1mapping對接,直接在用戶態實現文件系統的元數據管理和數據讀寫訪問支持,實現難度大大降低,並且更加有利於資料庫伺服器和分散式存儲系統之間的高速數據傳送。

5. 自主研發之路

技術的創新,是需要持續的研發投入,雲原生資料庫還需要不斷解決雲用戶對於大容量數據處理速度的極致追求,對於雲廠商而言,需要跨界,深入研究並借鑒傳統資料庫廠商在SQL編譯、優化器、並行執行計劃等方面的技術優勢。這是一個充滿極度挑戰的過程。

雲服務是自研資料庫最好的催化劑

自主研發創新的背後,是長期苦練內功,厚積薄發的體現,不僅需要長期的研發投入,還需要快速找到商業變現的途徑,找到一條能夠自給自足的商業模式,並且持續投入到研發之中。幸運的是,雲計算的商業模式,以及阿里雲目前的資料庫服務有能力支撐這種開拓進取的研發成本。已經商用的POLARDB也開始贏得越來越多的用戶的青睞,雲服務業務的自我造血能力,將支撐自主研發的更多投入,達到良性的閉環反饋。這是自主研發資料庫需要解決的首要問題。

自主研發的雲原生資料庫,利用雲計算的商業模式,反哺資源的長期投入,利用後發優勢,在數據時代,不斷贏得用戶的信任。而這些在POLARDB上構建的用戶業務需求反饋,也為POLARDB的自身演進提供了方向。我們非常欣慰的看到,在新金融,新教育,新媒體,泛娛樂等互聯網+行業應用當中,已經有越來越多的用戶正在使用POLARDB創建他們在數字化經濟時代的價值傳遞。而這,正是自主研發資料庫存在的根本意義。

自研資料庫生於創新

回顧資料庫發展史,在這個知識日新月異的TMT時代,聽起來有些「古董」,這個起源於半個世紀以前的IT技術,事實上一直處於現代社會科技的核心,支撐著當今世界絕大多數的商業科技文明。CPU、操作系統、資料庫這三大核心領域,基本上就是IT時代的縮影,同時也是一切信息化處理、計算力和智能化的基石。從1970年E.F.Codd發表了一篇里程碑論文「A Relational Model of Data for Large Shared Data Banks」,到80年代初期支持SQL的商用關係型資料庫DB2,Oracle的面市,以及90年代初SQL-Server的誕生,都是商業資料庫成功的代表,而其中Oracle佔有絕對的市場地位。

自研雲資料庫如何應對商業資料庫多達上千萬行量級的資料庫工程實現和複雜度,還有數千人的研發投入,所以雲廠商在SQL核心層面的積累還不足以與商業資料庫匹敵,唯有創新,尤其是基於雲計算環境用戶使用模式的融合創新,才是和傳統商業資料庫差異化共生的有效途徑。從長遠來講,用今天來支撐明天。今天的融合創新,本質上是為了明天或者後天的顛覆式創新。不積硅步無以至千里。

自研資料庫的挑戰

自研資料庫在雲環境下的融合創新的確能夠在雲用戶的需求引導下進行自我進化和成長,但是對於to B的用戶業務來講,和互聯網to C的用戶場景有很大的不同。To B的企業級用戶在進行選型和判斷的時候,更加理性,通常是公司內部多個相關角色集體參與和決策的過程,越是大的B類客戶,這個決策的鏈條更長,參與的角色更多,對於不同規模的公司,具體使用產品的用戶身份(Persona)而言也各有不同,有DBA,架構師,研發工程師,甚至是技術總監以及CTO等都會參與到重大的產品和技術選型當中。也就是說,自研資料庫本身在根據某些場景的問題提供解決能力的同時,背後還有一個很大的訴求就是,在產品的通用能力(安全、可靠、易管理、多功能、精細度)方面要體現整體能力的成熟度。也就是說一個自研資料庫從誕生的那一天開始,需要有一個非常高的標準達到同類產品的成熟度,立足這個成熟度的基礎之上,通過提供解決某些場景問題的特定能力,並以此獲得客戶進行選擇的價值認同感和優越感。

結語

在描述了雲計算產業的融合創新和邊界拓展之後,我們分享了POLARDB的融合創新以及雲原生資料庫的關鍵特徵。通過實現這些技術創新點並形成完整的產品服務體系之後,在自主研發的道路上我們快速成長。

我們深刻的領會到,連接現實和浪漫情懷以及遠大理想的,從來不是詩和遠方的田野,而是雪山、草地、沙漠和荊棘。選擇自主研發之路,並不是一蹴而就的事情,這是一條「比難更難」的漫長之旅。我們知道,最難的路,才是自我升華最快的路。

「信仰是去相信我們所從未看見的,而這種信仰的回報,是看見我們相信的。」但丁700多年前的這句名言,和今天「因為相信而看見」描述的是同樣的價值追求。如果一個企業要活102年,那麼這種價值追求將會書寫它的傳奇,這就是我理解的卓越公司和優秀公司的區別之一。

本文作者:仝一

原文鏈接

更多技術乾貨敬請關注云棲社區知乎機構號:阿里云云棲社區 - 知乎

本文為雲棲社區原創內容,未經允許不得轉載。

推薦閱讀:

充分利用可用的計算資源——用阿里雲訓練你的XGBoost
半天時間,阿里雲就試運行成功了
條件型 CORS 響應下因缺失 Vary: Origin 導致的緩存錯亂問題
【五四青年節特別策劃】從矽谷到杭州:一個海歸的阿里故事
阿里雲新用戶:巧用餘額預警防止自動扣費

TAG:阿里雲 | 資料庫 | 雲服務 |