mean
November 2, 2013, 12:54am
1
มีท่านใดเล่น 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
ขอบคุณครับ
mean
November 2, 2013, 1:29am
2
อ่อผมนั่งเทียนนึกขึ้นได้
ทีม MongoDB เค๊าไม่น่าจะ Map Folder แต่ใช้วิธีการ เชื่อมต่อด้วยวิธีการ connect port/ip
เพื่อแบ่ง load การ query ครับ เพราะกรณีที่ 1 แค่ share space เท่านั้น
icez
November 2, 2013, 8:25am
3
ตามนั้นครับ - -’ ถามเองตอบเองเรียบร้อย
คือ 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:
mean
November 4, 2013, 11:24am
6
[B]How To Setup สำหรับ CentOS 6[/B] - ชอบบทความใครเอาอันนั้นครับ
MongoDB is an open source, document-oriented database designed with both scalability and developer agility in mind. Instead of storing your data in tables and rows as you would with a relational database, in MongoDB you store JSON-like documents with...
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
ขออนุญาติแปะไว้เผื่อท่านอื่นๆ ครับ
mean
November 4, 2013, 11:34am
7
ผมเห็นต่างประเทศใช้กันเพียบ แต่บ้านเรา ใช้กันน้อยมาก
ผมลองแบบนี้ครับ 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 ด้วยหรือป่าวครับ
icez
November 4, 2013, 1:19pm
8
คนไทยเล่นเน็ตแค่ยี่สิบกว่าล้าน นายไปเทียบกับทั้งโลกมันก็ขี้ฝุ่นน่ะสิ - -’ จริงๆ คนที่ใช้เค้าก็ไม่ได้ออกมาบอกกันตรงๆ หรอกว่าตัวเองใช้
mean
November 4, 2013, 3:10pm
10
รบกวนถามครับ
จากภาพ เราจำเป็นต้องทำ replica set ไขว้กันแบบนี้ไหมครับ
ดูจากภาพ ไม่เข้าใจว่า เค๊าแบ่งเพื่ออะไร
ขอแปะภาพไว้ดูครับ : )
mean
November 4, 2013, 3:14pm
11
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 ทันทีนะครับ
mean
November 4, 2013, 4:44pm
13
ขอพระคุณอย่างสูงที่แนะนำครับ ยังมึนๆ บ้าง แต่พอเข้าใจภาพรวมแล้วครับ
อ่อ ผมลอง set ทดสอบครับ เพราะอยากรู้การทำงานครับ และการเก็บข้อมูลของ Shard
เพื่อเวลา design App จะได้มองภาพออกมากขึ้น
รบกวนขออนุญาติถามเรื่อง Shard key หน่อยครับ พยามนั่งดูมาทั้งวัน ยังไม่ค่อยเข้าใจครับ
ตัว Shard Key มีหน้าที่กำหนดว่า ให้ข้อมูลไปเก็บอยู่ Shard ใดหรือป่าวครับ
หรือตัว MongoDB จะกำหนดเองว่า Shard Key ใดให้ไปอยู่เครื่องใด
ตัว Shard Key ซ้ำกันได้หรือป่าวครับ
กรณ๊ Shard Key ไม่ซ้ำกัน เราสามารถ กำหนดได้ไหมครับว่า ให้ Document ไหนไปเก็บอยู่ที่เครื่องไหน
ขอบคุณครับ
อันนี้ผมหาข้อมูลชัดๆ ยังไม่เจอจริงๆ ครับ รบกวนขอคำชี้แนะครับ
mean
November 4, 2013, 4:52pm
14
ผมลองกำหนด 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 อยู่ละครับถ้าไม่ไปปิดมัน
mean
November 4, 2013, 7:45pm
16
พอดีจุดที่ผมสนใจ ผมหาข้อมูลได้ไม่ชัดครับ เพราะหากเซตธรรมดาๆ ไม่น่าจะมีอะไร
ที่เห็นๆ นั้น ผมเพียงลองติดตั้งดูเท่านั้น
ขอบคุณครับ : )
mean
November 5, 2013, 1:04am
17
ถามเองตอบเอง ผิดพลาดขออภัยครับ
[COLOR=#d3d3d3]
ตัว Shard Key มีหน้าที่กำหนดว่า ให้ข้อมูลไปเก็บอยู่ Shard ใดหรือป่าวครับ
หรือตัว MongoDB จะกำหนดเองว่า Shard Key ใดให้ไปอยู่เครื่องใด
จากการทดสอบ ดูเหมือนว่า MongoDB จะเลือก Shard เพื่อเก็บข้อมูลให้เอง และ Shard Key ไม่ได้เป็นตัวบ่งชี้ ตำแหน่ง Shard
ตัว Shard Key ซ้ำกันได้หรือป่าวครับ
จากการทดสอบ ดูเหมือน หากใช้ Key ซ้ำ ข้อมูลจะไม่ถูกแบ่งไปเก็บตาม Shard ต่างๆ
หากใช้ Shard key รันตัวเลขหรือการเพิมค่า ข้อมูลจะไปกองอยู่ Shard ทางขวา (เหมือนที่ Pantip เจอปัญหาจุดนึง)
กรณ๊ Shard Key ไม่ซ้ำกัน เราสามารถ กำหนดได้ไหมครับว่า ให้ Document ไหนไปเก็บอยู่ที่เครื่องไหน
กรณีนี้ผมยังหาไม่เจอวิธีครับ
[/COLOR]
พอทดสอบ Shard แบบไขว้กัน มี Effect เรื่อง Connect Time อย่างเห็นได้ชัด
ที่ถามว่า หากเครื่องดับ หรือ reboot config service ของ MongoDB ที่รันไว้จะหายไหม
หายครับ ต้องสั่งรันใหม่ หรือเขียน Script
–
http://www.kchodorow.com/blog/2012/07/25/controlling-collection-distribution/
mean
November 5, 2013, 1:07am
18
ผมเจอปัญหาจุดนึง ทดสอบดับเครื่อง Shard 3
พอสั่ง Server รัน ข้อมูลดันไม่ถูกแบ่งมาเก็บที่ 3 ครับ
:baa60776:
mean
November 5, 2013, 1:43pm
19
ผมเจอปัญหาจุดนึง ทดสอบดับเครื่อง Shard 3
พอสั่ง Server รัน ข้อมูลดันไม่ถูกแบ่งมาเก็บที่ 3 ครับ
– อ่อแบ่งมาครับ ผมลืม allowLocal: true เลยเช็คผ่าน port shard ตรงๆ ไม่ได้
จุดที่สงสัยๆ หมดแล้วครับ ขอบคุณทุกท่านครับ : )