Cassandra #02 Scale-Out to Multi-nodes

ต่อจาก Cassandra #01 เริ่มต้นใช้งาน ความสามารถที่สำคัญของ Cassandra คือสามารถทำการ Scale Out หรือขยายความสามารถของระบบได้โดยการเพิ่มเครื่องคอมพิวเตอร์ในระดับ Commodity Hardware [1] เข้าไปใน Cluster ในบทความนี้ จะแสดงวิธีการสร้าง Cassandra Cluster ที่ประกอบไปด้วย 3 Node ชื่อ cassandra01, cassandra02 และ cassandra03 โดยมีชื่อ Cluster ว่า PSUCluster และกำหนดให้ cassandra01 เป็น Seed Node (ทำหน้าที่เป็นผู้ประสานงานสำหรับ Node ใหม่ๆเข้าร่วม Cluster) ขั้นตอนการขยายระบบแบบ Scale Out ไปยังหลายๆ Node แต่ละ Node ทำดังนี้ ติดตั้ง Cassandra ตามขั้นตอนใน Cassandra #01 เริ่มต้นใช้งาน แก้ไขไฟล์ /etc/cassandra/cassandra.yaml ดังนี้ # กำหนดชื่อ Cluster ที่ต้องการ cluster_name: ‘PSUCluster’ # กำหนด Seed Node ซึ่งมีไว้ให้ node ใหม่ประกาศตัวเองเพื่อเข้าร่วม Cluster # ควรมีไม่เกิน 3 Node ต่อ Data Center # ในที่นี้ กำหนดไว้เพียงตัวเดียว seed_provider: parameters: – seeds: “192.168.107.111” # กำหนด listen_address เป็นค่าว่าง listen_address: # กำหนด endpoint_snitch เป็น GossipingPropertyFileSnitch # เพื่อให้สามารถมี Cluster แบบข้าง Data Center ได้ endpoint_snitch: GossipingPropertyFileSnitch ในการเริ่มใช้งานครั้งแรก ให้ลบข้อมูลใน /var/lib/cassandra/data/system ออกก่อน sudo rm -rf /var/lib/cassandra/data/system/* ในการใช้ Endpoint Snitch แบบ GossipingPropertyFileSnitch ต้องลบไฟล์ cassandra-topology.properties ออกไปก่อน sudo rm /etc/cassandra/cassandra-topology.properties จากนั้นก็ Start Cassandra Service sudo service cassandra restart วิธีดูสถานะของระบบ sudo watch nodetool status ในตอนแรกจะเป็นแบบนี้ เมื่อ cassandra02 เข้ามา และเมื่อครบ 3 Node วิธี Debug ว่าเกิดอะไรขึ้น sudo tail -f /var/log/cassandra/debug.log   Reference [1] http://docs.datastax.com/en/landing_page/doc/landing_page/planning/planningHardware.html [2] http://docs.datastax.com/en/cassandra/3.0/cassandra/architecture/archIntro.html [3] https://docs.datastax.com/en/cassandra/3.0/cassandra/initialize/initSingleDS.html

Read More »

Cassandra #01 เริ่มต้นใช้งาน

Cassandra เป็นระบบ Database ที่เหมาะสำหรับการ Scalability และให้ High Availability โดยไปลดประสิทธิภาพ มีความทนทานสูง (Fault Tolerance) โดยสามารถใช้งานเครื่องคอมพิวเตอร์ทั่วไปๆ (Commodity Hardware) หรือ ใช้งาน Cloud Infrastructure สำหรับงานที่มีความสำคัญได้ (Mission Critical) สามารถกระจายสำเนา (Replication) ข้าม Data Center ได้อีกด้วย [1][3] ในบทความนี้ จะแสดงการติดตั้งบน Ubuntu 16.04 เพียงเครื่องเดียวก่อน และให้เห็นวิธีการติดต่อตัวฐานข้อมูล การส่ง Query เบื้องต้น # echo “deb http://www.apache.org/dist/cassandra/debian 310x main” | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list # curl https://www.apache.org/dist/cassandra/KEYS | sudo apt-key add – # sudo apt-get update # sudo apt-get install cassandra ต่อไป วิธีการส่งคำสั่งไปยัง Cassandra จะใช้งานผ่าน cqlsh (Cassandra Query Language Shell) # cqlsh -C Connected to Test Cluster at 127.0.0.1:9042. [cqlsh 5.0.1 | Cassandra 3.10 | CQL spec 3.4.4 | Native protocol v4] Use HELP for help. cqlsh> ใน Cassandra จะเรียก Database ว่า Keyspace วิธีที่จะดูว่ามี Keyspace อะไรอยู่บ้าง ใช้คำสั่ง [2] cqlsh> DESCRIBE keyspaces; system_schema system_auth system system_distributed system_traces สั่งสร้าง Keyspace ชื่อ test ด้วยคำสั่งต่อไปนี้ cqlsh> CREATE KEYSPACE test WITH REPLICATION = {‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : 3}; เนื่องจาก Cassandra มีลักษณะพิเศษที่ไม่เหมือนกับ Database Servers อื่นๆ ก็คือเรื่องการ Replication ตั้งแต่เริ่มต้น ในคำสั่งข้างต้น จะบอกว่า ระบบจากสร้าง 3 สำเนา เป็นหลัก (จะกล่าวรายละเอียดในตอนต่อๆไป) ต่อไป สั่งสร้าง Table ชื่อ table1 csqlsh> use test; cqlsh:test> create table table1 ( … id text primary key, … age int, … firstname text, … lastname text … ); คำสั่งในการ Insert ข้อมูล cqlsh:test> INSERT INTO table1 (id, age, firstname, lastname) VALUES ( ‘000001’, 10, ‘John’,

Read More »

Private Cloud with Juju and LXD Workshop

::Juju:: Juju #01 เริ่มต้นใช้งาน Juju Juju #02 วิธีติดตั้ง WordPress Juju #03 วิธีสร้าง Load Balance MySQL Juju #04 วิธีทำให้ WordPress กระจายงานไปยัง MySQL Slave ด้วย HyperDB Juju #05 วิธีกระจายงานไปยัง MySQL แบบ Master-Master Juju #06 เชื่อม MySQL Master-Master เข้ากับ HAProxy Juju #07 กระจายโหลดข้ามเครื่อง  

Read More »

Juju #07 – กระจายโหลดข้ามเครื่อง

ที่ผ่านมา เป็นการติดตั้ง Juju ซึ่งเบื้องหลังคือ LXD Container แต่ทั้งหมดยังอยู่บนเครื่องเดียวกัน ภาพต่อไปนี้ เป็นการทดสอบความเร็วในการตอบสนองของ WordPress ซึ่งเป็น Post ที่มีภาพจำนวนมาก และมีขนาดในการ Download ทั้งหมด 5 MB ใช้เวลาประมาณ 1.24 วินาที เมื่อใช้ jMeter ระดมยิงด้วยความเร็ว 100 Connections ต่อ 1 วินาที ต่อเนื่อง 10 วินาที ได้ผลว่า เวลาเฉลี่ยคือ 2.478 วินาที ต่อมาลองเพิ่มจำนวน Container จาก 1 เครื่องไปเป็น 3 เครื่อง แต่ทำงานอยู่บน Physical Server เดียวกัน แล้วทดลองยิงแบบเดิม ได้ผลออกมาคือ ใช้เวลาเฉลี่ย 1.663 วินาที จากนั้น ทดสอบแยก Container ออกไป เป็น 3 Physical Servers ได้ผลออกมาว่า ใช้เวลาลดลงเหลือเพียง 1.056 วินาทีเท่านั้น สรุป การกระจายโหลดออกไปยังหลายๆ Physical Servers ทำให้สามารถรับโหลดจำนวนมากได้ ในบทความต่อไปจะมาลงรายละเอียดในการ Setup กัน   Reference: – https://www.digitalocean.com/company/blog/horizontally-scaling-php-applications/ – https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-in-ubuntu-16-04 – http://php.net/manual/de/mysqlnd-ms.loadbalancing.php – https://serversforhackers.com/video/php-fpm-configuration-the-listen-directive – http://nginx.org/en/docs/http/request_processing.html – http://stackoverflow.com/questions/5328844/nginx-load-balance-with-dedicated-php-fpm-server – https://code.google.com/archive/p/sna/wikis/NginxWithPHPFPM.wiki – http://nginx.org/en/docs/http/load_balancing.html – http://opensource.cc.psu.ac.th/KM-container

Read More »

Removing duplicate records by using Oracle’s ROWID

ถ้าคุณมีตารางข้อมูลอยู่ และรู้ว่ามีบางแถวที่มีข้อมูลซ้ำซ้อนกัน ทางไหนเป็นวิธีที่ดีที่จะสามารถหาและกำจัดแถวที่มีข้อมูลซ้ำนี้ออกไปจากตารางของฐานข้อมูล Oracle ?   การหาแถวที่มีข้อมูลซ้ำซ้อน เราสามารถหาข้อมูลแถวที่มีข้อมูลซ้ำซ้อนกันได้โดยใช้คำสั่ง select ดังนี้   select a,b,count(*) from test group by a,b having count(*) > 1; ผลลัพธ์ที่ได้ : A          B   COUNT(*) ———- ———- ———- 1          2        259 2          2          5   จากตัวอย่างในตาราง test นี้เราจะกำหนดว่าให้ค่าในคอลัมภ์ a และ b จะต้องมีค่าไม่ซ้ำ ซึ่งผลลัพธ์ที่ปรากฏคือ มีข้อมูลซ้ำ 258 แถว และ 4 แถว   การกำจัดแถวที่มีข้อมูลซ้ำซ้อน เราสามารถกำจัดแถวที่มีข้อมูลซ้ำซ้อนกันได้โดยการใช้ rowid เข้ามาช่วย คราวนี้คุณต้องเลือกว่าจะเลือกเก็บข้อมูลแถวไหนไว้ เราลองมาดูข้อมูลที่ควรจะเป็นที่ไม่ซ้ำกันว่ามีข้อมูลอะไรบ้าง โดยสามารถใช้คำสั่งได้ดังนี้ select a,b,count(*) from test group by a,b; A          B   COUNT(*) ———- ———- ———- 1          2        259 2          2          5 3          0          1   กรณีที่ต้องการลบและคงเหลือไว้เฉพาะแถวแรกที่ซ้ำสามารถใช้คำสั่งได้ดังนี้   — เราต้องการกำจัด 258 แถวที่ซึ่ง A = 1 และ B = 2 บวกกับ — 4 แถวที่ซึ่ง A = 2 และ B = 2 — ลองมา select แถวที่เราจะคงไว้ดูก่อน select min(rowid),a,b from test group by a,b; MIN(ROWID)                             A          B ——————————- ———- ———- AAAAyvAAGAAAABYAAA          1          2 AAAAyvAAGAAAABYAED          2          2 AAAAyvAAGAAAABYAEI           3          0   — คราวนี้ก็ถึงเวลาลบข้อมูลกันแล้ว — เริ่มกันเลย delete from test where rowid not in ( select min(rowid) from test group by a,b); 262 rows deleted.   — คราวนี้มาตรวจสอบกันว่าข้อมูลที่คงเหลือถูกต้องหรือไม่ select rowid,a,b from test; ROWID                                    

Read More »