新聞中心
以下的文章主要向大家講述的是DB2分區(qū)數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù)分布傾斜現(xiàn)象與重新分布的實(shí)際操作方法的描述,你如果對(duì)DB2分區(qū)數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù)分布傾斜現(xiàn)象與重新分布的實(shí)際操作方法的描述有興趣的話(huà)你就可以點(diǎn)擊以下的文章進(jìn)行觀看了。

數(shù)據(jù)庫(kù), 分區(qū), 現(xiàn)象數(shù)據(jù)庫(kù), 分區(qū), 現(xiàn)象
環(huán)境
產(chǎn)品:DB2 UDB
平臺(tái):跨平臺(tái)
軟件:V8,V9
問(wèn)題
主要描述了DB2分區(qū)數(shù)據(jù)庫(kù)中的數(shù)據(jù)分布不均現(xiàn)象,以及如何對(duì)數(shù)據(jù)進(jìn)行重新分布的方法。
解答
DB2的數(shù)據(jù)庫(kù)分區(qū)功能使用戶(hù)能更具靈活的控制數(shù)據(jù)的分布,通過(guò)對(duì)分區(qū)鍵(partition key)的選擇,用戶(hù)可以控制他們數(shù)據(jù)的分布,同時(shí)也能通過(guò)選擇分區(qū)組(partition group)決定把他們的數(shù)據(jù)分布在哪些分區(qū)上,此外還提供了一個(gè)分區(qū)鍵在分區(qū)上的詳細(xì)分區(qū)映射(partition map)。
分區(qū)數(shù)據(jù)庫(kù)通過(guò)提供對(duì)分布在各個(gè)分區(qū)上的數(shù)據(jù)的并發(fā)訪問(wèn),提高了應(yīng)用程序訪問(wèn)操作的性能,但這同時(shí)也增加了分區(qū)數(shù)據(jù)庫(kù)日常維護(hù)的復(fù)雜性.
數(shù)據(jù)在DB2分區(qū)數(shù)據(jù)庫(kù)的存取分布策略是用分區(qū)鍵值通過(guò)哈希算法(hashing algorithm)得到的值,根據(jù)對(duì)應(yīng)的分區(qū)映射(partition map)散列到各個(gè)分區(qū)的.而用戶(hù)數(shù)據(jù)的差異以及分區(qū)鍵選擇的不合理導(dǎo)致最終的分布往往發(fā)生數(shù)據(jù)傾斜(data skew).
下面這個(gè)例子是一個(gè)兩臺(tái)物理機(jī)器4個(gè)邏輯節(jié)點(diǎn)的數(shù)據(jù)庫(kù),我向一個(gè)空表導(dǎo)入10240條數(shù)據(jù)(由1-20的int數(shù)字循環(huán)組成)后查看數(shù)據(jù)在各個(gè)分區(qū)節(jié)點(diǎn)中的分布情況是:
例1:
- db2 "select dbpartitionnum(i),count(*) from load_dpf group by dbpartitionnum(i) order by dbpartitionnum(i)"
可以看到數(shù)據(jù)并沒(méi)有在各個(gè)節(jié)點(diǎn)上均勻分布,而是發(fā)生了一定的數(shù)據(jù)傾斜(data skew)。通常情況下,數(shù)據(jù)在分區(qū)中的分布都會(huì)發(fā)生一定的傾斜,如果傾斜程度不大,就不會(huì)有太大影響,所以不用人為干預(yù),但是在下面所列情況下就需要對(duì)數(shù)據(jù)在各分區(qū)的分布進(jìn)行調(diào)整了:
A. 如果傾斜過(guò)大,將會(huì)使系統(tǒng)I/O的負(fù)荷也隨之傾斜,導(dǎo)致某些分區(qū)的I/O過(guò)大而產(chǎn)生瓶頸,而不能均勻發(fā)揮所有I/O的性能.在這種情況下需要人為干預(yù),利用redistribute partition group 命令來(lái)重新分布數(shù)據(jù).
B. 如果需要從分區(qū)組中移出某個(gè)分區(qū),也同樣需要利用redistribute partition group 命令來(lái)重新分布數(shù)據(jù),把數(shù)據(jù)從那個(gè)即將移出的分區(qū)上重新分布到其他分區(qū).
C. 將一個(gè)新的分區(qū)加入分區(qū)組后,同樣需要把其他分區(qū)上的數(shù)據(jù)分布到新添加分區(qū),類(lèi)似rebalance操作.
下面是redistribute的語(yǔ)法:
其中各個(gè)參數(shù)的詳細(xì)解釋可以參閱信息中心的相關(guān)解釋?zhuān)?/p>
http://publib.boulder.ibm.com/in ... /core/r0002069.htm?
默認(rèn)分區(qū)映射如下:
1. UNIFORM : 這種形式的重分布是將數(shù)據(jù)盡量均勻的分布到各個(gè)哈希分區(qū)(hash partition)(hash partition 共有4096個(gè))。雖然數(shù)據(jù)均勻分布到各個(gè)哈希分區(qū)(hash partition)上,但是同樣的哈希分區(qū)(hash parititon)數(shù)并不一定映射到每個(gè)數(shù)據(jù)庫(kù)分區(qū)(database partition)上.在重分布完成后,各個(gè)數(shù)據(jù)庫(kù)分區(qū)將擁有相近的哈希分區(qū)(hash partition)個(gè)數(shù)
在分區(qū)鍵值沒(méi)有發(fā)生傾斜的時(shí)候,UNIFORM能夠?qū)?shù)據(jù)接近平均的分布到每個(gè)數(shù)據(jù)庫(kù)分區(qū)上,所以此方法大多數(shù)用于第上面C類(lèi)情況.
2. USING DISTFILE : 這種形式的分布多用于分區(qū)鍵本身的值就已經(jīng)發(fā)生了傾斜,如上例1的分區(qū)鍵就是1-20的循環(huán)數(shù)字.在這種情況下,根據(jù)hash算法產(chǎn)生的結(jié)果發(fā)生了傾斜.這時(shí)候就需要人工指定一個(gè)分布文件來(lái)替代系統(tǒng)產(chǎn)生的結(jié)果.#p#
這個(gè)文件包含4096個(gè)值(類(lèi)似如下命令產(chǎn)生的分布文件 dist.out 文件),用于標(biāo)記每個(gè)hash分區(qū)的權(quán)重.這些值的總和要大于0不大于4,294,967,295。
如:
- 1024
- 0
- 412
- ...
- 612
- ...
- ...
- 2048
這個(gè)文件可以按上面格式手工生成,但是通常情況下是利用load對(duì)分區(qū)導(dǎo)入的analyze模式來(lái)生成的。
首先用 db2gpmap -d
- db2 "load from load.del of del messages msg.txt replace into load_dpf partitioned db config mode
analyze map_file_input mygroup.out map_file_output analyze.out distfile dist.out"
此方法可以認(rèn)為干預(yù)現(xiàn)有數(shù)據(jù)的分布,但是無(wú)法改變后續(xù)數(shù)DB2分區(qū)數(shù)據(jù)庫(kù)據(jù)分布策略.所以如果可能還是調(diào)整分區(qū)鍵重新選擇合適的分區(qū)鍵.
例2:
- [db2inst1@rhel5 tmp]$ db2 "redistribute database partition group ibmdefaultgroup using distfile dist.out"
- [db2inst1@rhel4 tmp]$ db2 "select dbpartitionnum(i),count(*) from load_dpf group by dbpartitionnum(i) order by dbpartitionnum(i)"
- [db2inst1@rhel4 tmp]$ db2 "insert into load_dpf values(1234)"
- DB20000I The SQL command completed successfully.
- [db2inst1@rhel4 tmp]$ db2 "insert into load_dpf values(1234324)"
- DB20000I The SQL command completed successfully.
- [db2inst1@rhel4 tmp]$ db2 "insert into load_dpf values(123123)"
- DB20000I The SQL command completed successfully.
- [db2inst1@rhel4 tmp]$ db2 "select dbpartitionnum(i),count(*) from load_dpf group by dbpartitionnum(i) order by dbpartitionnum(i)"
從上面結(jié)果可以看出新插入的數(shù)據(jù)并沒(méi)有根據(jù)dist.out的權(quán)重策略去分配,數(shù)據(jù)依然是根據(jù)分區(qū)鍵的哈希(hash)值對(duì)應(yīng)的分區(qū)映射來(lái)分布的.
3. USING TARGETMAP : 用目標(biāo)分區(qū)映射來(lái)進(jìn)行重分布主要適用于類(lèi)型B,通過(guò)人工調(diào)整可以把某個(gè)分區(qū)的數(shù)據(jù)分布到其他分區(qū)上。
例3:
如果手工把分區(qū)映射中0號(hào)節(jié)點(diǎn)替換成2號(hào)節(jié)點(diǎn),分區(qū)映射文件 mygroup.out 內(nèi)容類(lèi)似:
- 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 2 3 2 1 ...
則運(yùn)行:
- db2 "redistribute database partition group ibmdefaultgroup using targetmap mygroup.out"
的結(jié)果是:
如果用如上的load的分析功能對(duì)mygroup.out分區(qū)映射產(chǎn)生的新分區(qū)映射analyze.out進(jìn)行重分布的結(jié)果是:
從上面結(jié)果可以看出load加analyze選項(xiàng)的分析結(jié)果比原始文件更加優(yōu)化,所以建議使用load分析功能對(duì)分區(qū)映射進(jìn)行進(jìn)一步的優(yōu)化后再進(jìn)行重分布.
NOTE:
在做完 REDISTRIBUTE DATABASE PARTITION GROUP 操作后,需要運(yùn)行 RUNSTATS 來(lái)更新統(tǒng)計(jì)信息.由于REDISTRIBUTE對(duì)表的數(shù)據(jù)操作是作為一個(gè)完整的事務(wù),所以如果表的數(shù)據(jù)量很大,則需要提前調(diào)高活動(dòng)日志大小或數(shù)目.
REDISTRIBUTE DATABASE PARTITION GROUP 在db2v9.5中得到了增強(qiáng),原來(lái)添加和刪除節(jié)點(diǎn)是和redistribute 操作分開(kāi)的,在db2v9.5中被整合成redistribute的一部分"Add/Drop DB partition",減少了操作步驟,大大方便了用戶(hù)的操作.以上的相關(guān)內(nèi)容就是對(duì)DB2分區(qū)數(shù)據(jù)庫(kù)中的相關(guān)數(shù)據(jù)分布傾斜現(xiàn)象與重新分布的實(shí)際操作方法的介紹,望你能有所收獲。
新聞名稱(chēng):DB2分區(qū)數(shù)據(jù)庫(kù)數(shù)據(jù)分布傾斜現(xiàn)象與重新分布
轉(zhuǎn)載注明:http://www.5511xx.com/article/cdoccee.html


咨詢(xún)
建站咨詢(xún)
