hash和solr在海量數(shù)據(jù)分布式搜索引擎中的應(yīng)用教程_MySQL教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:23道安全門加鑄MySQL數(shù)據(jù)庫
      使用MySQL,安全問題不能不注意。以下是MySQL提示的23個注意事項: 1.如果客戶端和服務(wù)器端的連接需要跨越并通過不可信任的網(wǎng)絡(luò),那么就需要使用SSH隧道來加密該連接的通信。 2.用set password語句來修改用戶的密碼,三個步驟,先mysql -u root登陸數(shù)據(jù)庫系統(tǒng),然后mys

         Solr是一個獨立的企業(yè)級搜索應(yīng)用服務(wù)器,它對外提供類似于Web-service的API接口。用戶可以通過http請求,向搜索引擎服務(wù)器提交一定格式的XML文件,生成索引.

        互聯(lián)網(wǎng)創(chuàng)業(yè)中大部分人都是草根創(chuàng)業(yè),這個時候沒有強勁的服務(wù)器,也沒有錢去買很昂貴的海量數(shù)據(jù)庫。在這樣嚴峻的條件下,一批又一批的創(chuàng)業(yè)者從創(chuàng)業(yè)中獲得成功,這個和當前的開源技術(shù)、海量數(shù)據(jù)架構(gòu)有著必不可分的關(guān)系。比如我們使用mysql、nginx等開源軟件,通過架構(gòu)和低成本服務(wù)器也可以搭建千萬級用戶訪問量的系統(tǒng)。新浪微博、淘寶網(wǎng)、騰訊等大型互聯(lián)網(wǎng)公司都使用了很多開源免費系統(tǒng)搭建了他們的平臺。所以,用什么沒關(guān)系,只要能夠在合理的情況下采用合理的解決方案。

        那怎么搭建一個好的系統(tǒng)架構(gòu)呢?這個話題太大,這里主要說一下數(shù)據(jù)分流的方式。比如我們的數(shù)據(jù)庫服務(wù)器只能存儲200個數(shù)據(jù),突然要搞一個活動預(yù)估達到600個數(shù)據(jù)。

        可以采用兩種方式:橫向擴展或者縱向擴展。

        縱向擴展是升級服務(wù)器的硬件資源。但是隨著機器的性能配置越高,價格越高,這個代價對于一般的小公司是承擔(dān)不起的。

        橫向擴展是采用多個廉價的機器提供服務(wù)。這樣一個機器只能處理200個數(shù)據(jù)、3個機器就可以處理600個數(shù)據(jù)了,如果以后業(yè)務(wù)量增加還可以快速配置增加。在大多數(shù)情況都選擇橫向擴展的方式。如下圖:

      hash和solr在海量數(shù)據(jù)分布式搜索引擎中的應(yīng)用教程  模板無憂
      圖2

        現(xiàn)在有個問題了,這600個數(shù)據(jù)如何路由到對應(yīng)的機器。需要考慮如果均衡分配,假設(shè)我們600個數(shù)據(jù)都是統(tǒng)一的自增id數(shù)據(jù),從1~600,分成3 堆可以采用 id mod 3的方式。其實在真實環(huán)境可能不是這種id是字符串。需要把字符串轉(zhuǎn)變?yōu)閔ashcode再進行取模。

        目前看起來是不是解決我們的問題了,所有數(shù)據(jù)都很好的分發(fā)并且沒有達到系統(tǒng)的負載。但如果我們的數(shù)據(jù)需要存儲、需要讀取就沒有這么容易了。業(yè)務(wù)增多怎么辦,大家按照上面的橫向擴展知道需要增加一臺服務(wù)器。但是就是因為增加這一臺服務(wù)器帶來了一些問題。看下面這個例子,一共9個數(shù),需要放到2臺機器(1、2)上。各個機器存放為:1號機器存放1、3、5、7、9 ,2號機器存放 2、4、6、8。如果擴展一臺機器3如何,數(shù)據(jù)就要發(fā)生大遷移,1號機器存放1、4、7, 2號機器存放2、5、8, 3號機器存放3、6、9。如圖:

      圖3

        從圖中可以看出 1號機器的3、5、9遷移出去了、2好機器的4、6遷移出去了,按照新的秩序再重新分配了一遍。數(shù)據(jù)量小的話重新分配一遍代價并不大,但如果我們擁有上億、上T級的數(shù)據(jù)這個操作成本是相當?shù)母撸賱t幾個小時多則數(shù)天。并且遷移的時候原數(shù)據(jù)庫機器負載比較高,那大家就有疑問了,是不是這種水平擴展的架構(gòu)方式不太合理?

        —————————–華麗分割線—————————————

        一致性hash就是在這種應(yīng)用背景提出來的,現(xiàn)在被廣泛應(yīng)用于分布式緩存,比如memcached。下面簡單介紹下一致性hash的基本原理。最早的版本 http://dl.acm.org/citation.cfm?id=258660。國內(nèi)網(wǎng)上有很多文章都寫的比較好。如: http://blog.csdn.net/x15594/article/details/6270242

        下面簡單舉個例子來說明一致性hash。

        準備:1、2、3 三臺機器

        還有待分配的9個數(shù) 1、2、3、4、5、6、7、8、9

        一致性hash算法架構(gòu)

        步驟

        一、構(gòu)造出來 2的32次方 個虛擬節(jié)點出來,因為計算機里面是01的世界,進行劃分時采用2的次方數(shù)據(jù)容易分配均衡。另 2的32次方是42億,我們就算有超大量的服務(wù)器也不可能超過42億臺吧,擴展和均衡性都保證了。

      一致性hash

        二、將三臺機器分別取IP進行hashcode計算(這里也可以取hostname,只要能夠唯一區(qū)別各個機器就可以了),然后映射到2的32次方上去。比如1號機器算出來的hashcode并且mod (2^32)為 123(這個是虛構(gòu)的),2號機器算出來的值為 2300420,3號機器算出來為 90203920。這樣三臺機器就映射到了這個虛擬的42億環(huán)形結(jié)構(gòu)的節(jié)點上了。

      圖5

        三、將數(shù)據(jù)(1-9)也用同樣的方法算出hashcode并對42億取模將其配置到環(huán)形節(jié)點上。假設(shè)這幾個節(jié)點算出來的值為 1:10,2:23564,3:57,4:6984,5:5689632,6:86546845,7:122,8:3300689,9:135468。可以看出 1、3、7小于123, 2、4、9 小于 2300420 大于 123, 5、6、8 大于 2300420 小于90203920。從數(shù)據(jù)映射到的位置開始順時針查找,將數(shù)據(jù)保存到找到的第一個Cache節(jié)點上。如果超過2^32仍然找不到Cache節(jié)點,就會保存到第一個Cache節(jié)點上。也就是1、3、7將分配到1號機器,2、4、9將分配到2號機器,5、6、8將分配到3號機器。

      圖6

        這個時候大家可能會問,我到現(xiàn)在沒有看見一致性hash帶來任何好處,比傳統(tǒng)的取模還增加了復(fù)雜度。現(xiàn)在馬上來做一些關(guān)鍵性的處理,比如我們增加一臺機器。按照原來我們需要把所有的數(shù)據(jù)重新分配到四臺機器。一致性hash怎么做呢?現(xiàn)在4號機器加進來,他的hash值算出來取模后是12302012。 5、8 大于2300420 小于12302012 ,6 大于 12302012 小于90203920 。這樣調(diào)整的只是把5、8從3號機器刪除,4號機器中加入 5、8。

      圖7

        同理,刪除機器怎么做呢,假設(shè)2號機器掛掉,受影響的也只是2號機器上的數(shù)據(jù)被遷移到離它節(jié)點,上圖為4號機器。

      圖8

      分享:MySQL 5.0 數(shù)據(jù)庫新特性的存儲過程
      當你提交一個查詢的時候,MySQL會分析它,看是否可以做一些優(yōu)化使處理該查詢的速度更快。這一部分將介紹查詢優(yōu)化器是如何工作的。如果你想知道MySQL采用的優(yōu)化手段,可以查看MySQL參考手冊。 當然,MySQL查詢優(yōu)化器也利用了索引,但是它也使用了其它一些信息。例如,如

      共2頁上一頁12下一頁
      來源:模板無憂//所屬分類:MySQL教程/更新時間:2015-02-10
      相關(guān)MySQL教程