มีท่านใดเล่น Mongodb แล้วบ้างครับ รบกวนถามเรื่อง sharding ครับ

มีท่านใดเล่น Mongodb แล้วบ้างครับ รบกวนถามเรื่อง sharding ครับ

พอดีงง กับ วิธีการทำ sharding
หาดูมีแต่บทความสร้าง sharding บนเครื่องเดียวกัน แต่ต่าง port กัน

[B]กรณีที่ 1[/B] สงสัยว่า วิธีการทำงาน sharding เป็นการ map folder (network) กันเฉยๆ เช่น
เครื่อง 1 /db/db1 => /192.168.1.2/db1
เครื่อง 2 /db/db2 => /192.168.1.3/db2

[B]หรือกรณีที่ 2[/B] ใช้วิธีการติดตั้ง mongodb ในเครื่องที่ 2 3 4
แล้วเอา ip port มา add shard ใน controller เครื่องที่ 1 ครับ

มีท่านใด พอจะทราบ หรือชี้แนะได้บ้างไหมครับ :baa60776:

เครื่อง sharding package mongo-10gen-server ด้วยไหมครับ

ปกติจะเห็นติดตั้ง mongo-10gen mongo-10gen-server
ขอบคุณครับ

อ่อผมนั่งเทียนนึกขึ้นได้
ทีม MongoDB เค๊าไม่น่าจะ Map Folder แต่ใช้วิธีการ เชื่อมต่อด้วยวิธีการ connect port/ip
เพื่อแบ่ง load การ query ครับ เพราะกรณีที่ 1 แค่ share space เท่านั้น

ตามนั้นครับ - -’ ถามเองตอบเองเรียบร้อย

คือ mongo จะมี service หลักๆ 2 ตัวคือ mongos กับ mongod

ซึ่งถ้าใช้ปกติมันคือ mongod อย่างเดียว ต่อเข้าไปคุยได้เลย
แต่การทำ shard เวลาต่อ database เราจะต้องคุยผ่าน mongos อีกทีครับ

http://docs.mongodb.org/manual/reference/program/mongos/

ปัญหาใหญ่ที่สุดของการทำ shard คือการเลือก shard key ครับ นี่คือปัญหาที่ pantip เจอ http://macroart.net/2013/10/mongodb-lessons-learned-on-pantip/

ทำ shard หลักๆ เลยนะครับ
1.ต้องมี mongod อย่างน้อย 2 ตัว
2.ต้องมี mongos อย่างน้อย 1 ตัว ปกติก็วางไว้ที่เดียวกะ Application
3.ต้องมี configd ตัวนึง configd เป็น mongod instance เล็กๆ ตัวนึง รันบนพอร์ต 27019 (ปกติก็จะใส่ parameter --configsrv เข้าไปใน mongod ก็จะกลายเป็น configd ละ)
ที่จะเอาไว้เก็บข้อมูลของ router (mongos) ว่าข้อมูลนั้นๆ นี้ๆ อยู่ที่ shard ไหน
และเวลา query จะมีเรื่อง query isolation (คือส่งข้อมูลไปตรงๆ ที่ shard ที่ถูกต้องเลยโดยไม่ต้องทำ parrallel query ทั้ง 2 shard อีก อันนี้ตอน query ต้องดู shard key ดีๆ ครับ)

เวลาคุยก็จะเป็น app -> mongos+configd ->> mongod(A) + mongod(B) ราวนี้ครับ

มันจะมีเรื่อง replication configd กะ replication mongod+arbiter อีก ที่มักจะทำคู่กันกับการ shard เพราะการ shard เป็นการกระจาย data แบบ partitioning คือสมมุติมีสอง shard shard นึงบึ้มก็คือข้อมูลเละไปครึ่ง
แต่ถ้าแค่ทดสอบก็ไม่มีอะไรครับ

หลักๆ ที่อย่าลืม

  • พิจารณาการใช้งาน app ดีๆ ก่อนทำ shard ครับ
  • อย่าใช้ _id เป็น shard key เด็ดขาดเพราะนั่นหมายความว่าคุณจะไม่สามารถเปลี่ยน shard key แบบ online ได้ ต้อง dump restore ท่าเดียว
  • นอกจากนั้นก็จะเป็นเรื่อง chunk กะ document size ที่หลัง shard แล้วอาจจะต้องมาจูน อันนี้แล้วแต่คนครับ ส่วนใหญ่ Recommend จะมีให้อยู่แล้วใน http://docs.mongodb.org/manual/administration/production-notes/

mongos และ mongod อยู่ใน package mongo-10gen-server เหมือนกันครับ อ้อ mongos และ configd ไม่มี init script ให้นะครับ ไปหาจากอินเตอร์เน็ตเอาก็ได้หรือเขียนเองก็ได้มีเยอะแยะ

document ของ mongodb ดีมากๆๆๆๆ อ่านแล้วเคลียร์ทุกสิ่งอย่างครับ :d5f02ecd:

[B]How To Setup สำหรับ CentOS 6[/B] - ชอบบทความใครเอาอันนั้นครับ



http://www.if-not-true-then-false.com/2010/install-mongodb-on-fedora-centos-red-hat-rhel/

[B]สำหรับ Ubuntu Howto Setup มาพร้อมวิธี Replica & Sharding Cluster[/B]

[B]สำหรับ sharding-mongodb ภาษาไทย[/B]
http://mongodb.in.th/2012/01/12/sharding-mongodb/
http://forum.boxza.com/topic/4608 - credit : Positron

ขออนุญาติแปะไว้เผื่อท่านอื่นๆ ครับ

ผมเห็นต่างประเทศใช้กันเพียบ แต่บ้านเรา ใช้กันน้อยมาก

ผมลองแบบนี้ครับ Create VM มา 3 ชุด

วันนี้ลอง scal ตามนี้ครับ
นี่งมมา 3 วัน ทีแรกก็ทำไมไม่ได้ ดันเข้าใจว่า

replSet ตั้งตามแต่ละเครื่องไม่เหมือนกัน ผมเลย รัน port ไม่ขึ้นสักที

http://www.catify.com/2010/11/22/mongodb-infrastructure-tests-part-ii-produktion-ready-sharding/
แต่ก็ยังงงๆ หลักการ การกระจายข้อมูลพอสมควร


ผมเห็นหลายๆ how to สั่งเช่น
mongod –shardsvr –dbpath /data/db/test1 –port 10000 –rest –replSet testset

แบบนี้เวลา restart เครื่อง service หายไหมครับ
ต้องเอาไปตั้งค่าใน mongod.conf ด้วยหรือป่าวครับ

คนไทยเล่นเน็ตแค่ยี่สิบกว่าล้าน นายไปเทียบกับทั้งโลกมันก็ขี้ฝุ่นน่ะสิ - -’ จริงๆ คนที่ใช้เค้าก็ไม่ได้ออกมาบอกกันตรงๆ หรอกว่าตัวเองใช้

^^ :875328cc::3eb4e7b3:

รบกวนถามครับ

จากภาพ เราจำเป็นต้องทำ replica set ไขว้กันแบบนี้ไหมครับ
ดูจากภาพ ไม่เข้าใจว่า เค๊าแบ่งเพื่ออะไร

ขอแปะภาพไว้ดูครับ : )

mongod [COLOR=#660033]–shardsvr[/COLOR] [COLOR=#660033]–dbpath[/COLOR] [COLOR=#000000][B]/[/B][/COLOR]data[COLOR=#000000][B]/[/B][/COLOR]db[COLOR=#000000][B]/[/B][/COLOR]test1 [COLOR=#660033]–port[/COLOR] [COLOR=#000000]10000[/COLOR] [COLOR=#660033]–rest[/COLOR] [COLOR=#660033]–replSet[/COLOR] testset
แบบนี้เวลา restart เครื่อง service หายไหมครับ
ต้องเอาไปตั้งค่าใน mongod.conf ด้วยหรือป่าวครับ


ทดสอบแล้ว ไม่หายครับ เวลาเราสั่ง config ใดๆ mongod จำไว้ให้ครับ

ว่าแต่จะ Replication Shard เดียวกัน ในเครื่องตัวเองไปทำไมน่ะครับ มันไม่ได้ช่วยให้เร็วขึ้นนะ 555

ปกติถ้าไขว้ replset มันไว้กรณีที่ว่าประหยัดเครื่อง เช่น

Server1 Server2

Shard A Shard B
Shard B Shard A

เพราะปกติถ้าเขียน app แบบ secondary_preferred มันจะพยายามกระจายอ่านทั้งหมดไปที่ secondary เอง
(และอ่านบางส่วนจาก primary ด้วยถ้ายังพอมีช่องให้มันอ่าน) และ write ที่ primary โดยอัตโนมัติครับ

ที่นี้ถ้าทำ shard แล้วไขว้ Replication ถ้า Server ล่มไปสักเครื่องนึง สมมุติ 2 ล่ม ระบบก็จะยังทำงานได้ต่อครับ

แต่ระวังกรณีนี้ไว้คือถ้าล่มแล้วระบบโหลดปริ่มๆ มันจะ Overload ทันทีนะครับ

ขอพระคุณอย่างสูงที่แนะนำครับ ยังมึนๆ บ้าง แต่พอเข้าใจภาพรวมแล้วครับ

อ่อ ผมลอง set ทดสอบครับ เพราะอยากรู้การทำงานครับ และการเก็บข้อมูลของ Shard
เพื่อเวลา design App จะได้มองภาพออกมากขึ้น

รบกวนขออนุญาติถามเรื่อง Shard key หน่อยครับ พยามนั่งดูมาทั้งวัน ยังไม่ค่อยเข้าใจครับ

  • ตัว Shard Key มีหน้าที่กำหนดว่า ให้ข้อมูลไปเก็บอยู่ Shard ใดหรือป่าวครับ
    หรือตัว MongoDB จะกำหนดเองว่า Shard Key ใดให้ไปอยู่เครื่องใด

  • ตัว Shard Key ซ้ำกันได้หรือป่าวครับ

  • กรณ๊ Shard Key ไม่ซ้ำกัน เราสามารถ กำหนดได้ไหมครับว่า ให้ Document ไหนไปเก็บอยู่ที่เครื่องไหน

ขอบคุณครับ
อันนี้ผมหาข้อมูลชัดๆ ยังไม่เจอจริงๆ ครับ รบกวนขอคำชี้แนะครับ

ผมลองกำหนด shard key = “sharekey”
และ db.test.topic.insert({
sharekey: (new_topic_id % จำนวน Shard)
});

แต่ลอง insert ดูข้อมูลถูก insert เข้าไปเฉพาะ testset
แบบนี้เราต้องกำหนด Chunk Length หรือป่าวครับ

สงสัยจะกำหนด shard key ผิดซะแล้วผม Y_Y

mongos> db.printShardingStatus();
— Sharding Status —
sharding version: {
“_id” : 1,
“version” : 3,
“minCompatibleVersion” : 3,
“currentVersion” : 4,
“clusterId” : ObjectId(“52776e2cd4b143393a1c8870”)
}
shards:
{ “_id” : “testset”, “host” : “testset/61.19.247.101:10000,61.19.247.102:10000,61.19.247.103:10000” }
{ “_id” : “testset2”, “host” : “testset2/61.19.247.101:10001,61.19.247.102:10001,61.19.247.103:10001” }
{ “_id” : “testset3”, “host” : “testset3/61.19.247.101:10002,61.19.247.102:10002,61.19.247.103:10002” }
databases:
{ “_id” : “admin”, “partitioned” : false, “primary” : “config” }
{ “_id” : “test”, “partitioned” : true, “primary” : “testset” }
test.topic
shard key: { “sharekey” : 1 }
chunks:
testset2 1
testset 1
{ “sharekey” : { “$minKey” : 1 } } –>> { “sharekey” : 0 } on : testset2 Timestamp(2, 0)
{ “sharekey” : 0 } –>> { “sharekey” : { “$maxKey” : 1 } } on : testset Timestamp(2, 1)

ข้อมูลมันจะ Balance ก็ต่อเมื่อ Chunks ทั้งสองมีขนาดต่างกันพอที่จะ Balance ได้ครับ ท่านไม่ต้องซีเรียสมากครับปกติแล้ว default มันจะกระจายให้ดีอยู่แล้วครับ

Sharding must be specifically enabled on a collection. After enabling sharding on the collection,
MongoDB will assign various ranges of collection data to the different shards in the cluster. The cluster automatically corrects imbalances between shards by migrating ranges of data from one shard to another.

แต่ข้อมูลของท่านต้องมากพอนะครับ มีแค่ไม่ถึง 100 doc นี่ หลายครั้งที่ unshard ดีกว่า shard อีกครับ // ลอง add เข้าไปสัก2หมื่น - 3 หมื่น doc ดูครับมันน่าจะกระจายให้เห็น

chunks:
testset2 1
testset 1

เนี่ยถือว่า Balance แล้วครับ (ถ้าเป็นหลักหน่วย ต่างกัน 2 chunks จะถือว่า unbalance , หลักสิบประมาณ 5 chunks , หลักร้อยขึ้นไปประมาณ 10 chunks , … )

ปล. sh.getBalancerState ดูล่ะกันครับว่ามัน true ไหม แต่ปกติมัน true อยู่ละครับถ้าไม่ไปปิดมัน

พอดีจุดที่ผมสนใจ ผมหาข้อมูลได้ไม่ชัดครับ เพราะหากเซตธรรมดาๆ ไม่น่าจะมีอะไร
ที่เห็นๆ นั้น ผมเพียงลองติดตั้งดูเท่านั้น

ขอบคุณครับ : )

ถามเองตอบเอง ผิดพลาดขออภัยครับ

[COLOR=#d3d3d3]

  • ตัว Shard Key มีหน้าที่กำหนดว่า ให้ข้อมูลไปเก็บอยู่ Shard ใดหรือป่าวครับ
    หรือตัว MongoDB จะกำหนดเองว่า Shard Key ใดให้ไปอยู่เครื่องใด
  • จากการทดสอบ ดูเหมือนว่า MongoDB จะเลือก Shard เพื่อเก็บข้อมูลให้เอง และ Shard Key ไม่ได้เป็นตัวบ่งชี้ ตำแหน่ง Shard
  • ตัว Shard Key ซ้ำกันได้หรือป่าวครับ
  • จากการทดสอบ ดูเหมือน หากใช้ Key ซ้ำ ข้อมูลจะไม่ถูกแบ่งไปเก็บตาม Shard ต่างๆ
  • หากใช้ Shard key รันตัวเลขหรือการเพิมค่า ข้อมูลจะไปกองอยู่ Shard ทางขวา (เหมือนที่ Pantip เจอปัญหาจุดนึง)
  • หากใช้ md5() ช้าครับ
  • กรณ๊ Shard Key ไม่ซ้ำกัน เราสามารถ กำหนดได้ไหมครับว่า ให้ Document ไหนไปเก็บอยู่ที่เครื่องไหน
  • กรณีนี้ผมยังหาไม่เจอวิธีครับ
    [/COLOR]
    พอทดสอบ Shard แบบไขว้กัน มี Effect เรื่อง Connect Time อย่างเห็นได้ชัด
  • ที่ถามว่า หากเครื่องดับ หรือ reboot config service ของ MongoDB ที่รันไว้จะหายไหม
  • หายครับ ต้องสั่งรันใหม่ หรือเขียน Script


http://www.kchodorow.com/blog/2012/07/25/controlling-collection-distribution/

ผมเจอปัญหาจุดนึง ทดสอบดับเครื่อง Shard 3
พอสั่ง Server รัน ข้อมูลดันไม่ถูกแบ่งมาเก็บที่ 3 ครับ

:baa60776:

ผมเจอปัญหาจุดนึง ทดสอบดับเครื่อง Shard 3
พอสั่ง Server รัน ข้อมูลดันไม่ถูกแบ่งมาเก็บที่ 3 ครับ

– อ่อแบ่งมาครับ ผมลืม allowLocal: true เลยเช็คผ่าน port shard ตรงๆ ไม่ได้

จุดที่สงสัยๆ หมดแล้วครับ ขอบคุณทุกท่านครับ : )