CouchDB คือ document-oriented database ที่สามารถ queried และ indexed โดยการทำ MapReduce ผ่าน JavaScript โดย CouchDB จะใช้งานผ่าน RESTful JSON API ซึ่งจะทำให้เราสามารถเรียกจากที่ไหนก็ได้โดยผ่าน HTTP protocal ที่สำคัญไม่ต้องมี Driver ให้วุ่นวายปวดหัว ความสามารถของ CouchDB มีดังนี้

  • เป็นฐานข้อมูลเชิงเอกสารที่มีการเรียกใช้ผ่าน JSON API RESTful
  • การจำลองการตรวจสอบความขัดแย้งสองทิศทางและความละเอียด
  • สามารถ Query และ Index ได้โดยการใช้ Javascript
  • สามารถทำ replication โดยใช้วิธี bi-direction
  • สามารถจัดการปัญหาเรื่องการ conflict ของ data
  • เพิ่มเติมแก้ไข field ได้ทันที
  • เหมาะสำหรับการใช้งานเว็บที่มีโครงสร้างหลวม

ในบทความนี้เราจะมาเรียนรู้เกี่ยวกับวิธีการดูแลรักษา (Miantenance) ด้านประสิทธิภาพสำหรับ CouchDBกัน

Compaction(การบีบอัดข้อมูล)
การบีบอัดข้อมูลเป็นการลดพื้นที่ในการใช้ข้อมูล โดยวิธีการลบข้อมูลเก่าๆที่ไม่ได้ใช้งานมันจะช่วยเพิ่มพื้นที่ในการทำงานของระบบ วิธีนี้สามารถนำไปใช้ได้กับระบบฐานข้อมูลอื่นๆได้เช่นกัน
ซึ่งสามารถทำได้ด้วยวิธีที่แตกต่างกันดังนี้

Database Compaction(การบีบอัดฐานข้อมูล)
เราควรลบไฟล์ที่ไม่ได้ใช้งานซึ่งถูกสร้างขึ้นมาในระหว่างการอัพเดทระบบฐานข้อมูล ในการบีบอัดข้อมูลจะต้องดำเนินการด้วยวิธีการ Manual เริ่มต้นโดยจะต้องส่งค่าโปรโตคอล HTTPออกไปก่อน
ด้วยคำสั่ง
curl -H "Content-Type: application/json" -X POST http://localhost:5984/my_db/_compact

เมื่อสั่งไปแล้วจะได้ผลประมาณนี้

        HTTP/1.1 202 Accepted
        Cache-Control: must-revalidate
	Content-Length: 12
	Content-Type: text/plain; charset=utf-8
	Date: Wed, 19 Jun 2013 09:43:52 GMT
	Server: CouchDB (Erlang/OTP)

	{"ok":true}
	
        HTTP/1.1 415 Unsupported Media Type
	Cache-Control: must-revalidate
	Content-Length: 78
	Content-Type: application/json
	Date: Wed, 19 Jun 2013 09:43:44 GMT
	Server: CouchDB (Erlang/OTP)

	{"error":"bad_content_type","reason":"Content-Type must be application/json"}

เมื่อการบีบอัดฐานข้อมูลสำเร็จแล้วเราสามารถรับข้อมูลผ่านทาง database information resource ด้วยคำสั่ง

curl http://localhost:5984/my_db

จะแสดงผลประมาณนี้

        HTTP/1.1 200 OK
	Cache-Control: must-revalidate
	Content-Length: 246
	Content-Type: application/json
	Date: Wed, 19 Jun 2013 16:51:20 GMT
	Server: CouchDB (Erlang/OTP)

	{
    		"committed_update_seq": 76215,
    		"compact_running": true,
    		"data_size": 3787996,
    		"db_name": "my_db",
    		"disk_format_version": 6,
    		"disk_size": 17703025,
    		"doc_count": 5091,
    		"doc_del_count": 0,
    		"instance_start_time": "1371660751878859",
    		"purge_seq": 0,
    		"update_seq": 76215
	}

Views Compaction(การบีบอัดViews)
Views นั้นคือวิธีการที่จะรวบรวมพวก documents ดังนั้นเราสามารถที่จะปรับแต่งส่วนของการใช้งานฝั่ง views ได้อย่างอิสระ ทำให้เราสามารถมี views
ที่จะนำไปใช้งานได้หลายแบบ ขึ้นอยู่กับการนำไปใช้งานของเรา

Viewsยังคงต้องการการบีบอัดฐานข้อมูลเหมือนกันโดยใช้คำสั่ง

curl -H "Content-Type: application/json" -X POST http://localhost:5984/dbname/_compact/designname

ระบบจะแสดงผล

{"ok":true}

Views cleanup
เมื่อเรามีการปรับแต่งส่วนการใช้งานบน Views ค่าเก่าก็ยังคงถูกเก็บไว้อยู่บนดิสก์ เราสามารถเรียก Views cleanup โดยใช้คำสั่ง

curl -H "Content-Type: application/json" -X POST http://localhost:5984/dbname/_view_cleanup

ระบบจะแสดงผล

{"ok":true}

Automatic Compaction(การบีบอัดข้อมูลโดยอัตโนมัติ)
ขณะที่ database และ views จำเป็นที่จะต้องบีบอัดข้อมูลด้วยวิธี manual เราก็สามารถกำหนดค่าให้บีบอัดข้อมูลแบบอัตโนมัติ โดยจะต้องเป็นไปตามเกณฑ์ต่างๆ ซึ่งการกำหนดค่า
การบีบอัดข้อมูลอัตโนมัติจะอยู่ใน CouchDB’s configuration files. เปิดเว็บบราวเซอร์แล้วเข้าไปที่

http://docs.couchdb.org/en/1.6.1/config/intro.html#config-intro

Performance (วิธีปฎิบัติ)
เราจะพบว่า CouchDB สามารถทำงานด้าน document database ได้อย่างดีเยี่ยมแต่เราก็ต้องคำนึงถึงวิธีการใช้งานเช่นกัน เพื่อให้มันสามารถทำงานได้ออกมาได้อย่างมีประสิทธิภาพ
โดยในที่นี้จะบอกเป็นแนวทางในการใช้งานที่ควรปฏิบัติ ไปเริ่มกันเลยดีกว่า

Disk I/O

File Size
ในการทำงานเราควรจะพิจารณาถึงขนาดของข้อมูลด้วยว่าสอดคล้องกับการทำงานของระบบหรือเปล่า ยกตัวอย่างเช่น dataมีขนาด 100 characters key
แต่ถ้าคุณใช้เพียง single character keys มันก็เป็นไปได้ยากที่โปรแกรมจะสามารถเก็บรักษา data ขจงคุณให้สมบูรณ์

Disk and File System Performance
แน่นอนว่าการใช้ดิสก์ที่เร็ว และ setting RAID Arrays มันจะช่วยให้การทำงานของ CouchDB เร็วขึ้น แต่อย่างไรก็ตาม
ก็มีอีกหนึ่งตัวเลือกที่ช่วยเพิ่มการตอบสนองการทำงานของ CouchDB server ในกรณีที่ดิสก์เกิดอาการคอขวด นั่นก็คือการใช้ภาษาเออร์แลง ซึ่งจะกล่าวต่อไปในหัวข้อถัดไป

System Resource Limits
หนึ่งในปัญหาการใช้งานก็คือลิมิตการทำงานของทรัพยาการระบบ ไม่ว่าจะเกิดจากระบบหรือค่าของตัวแอปพลิเคชันก็ตาม ข้อจำกัดเหล่านี้สามารถช่วยให้การใช้งานของคุณ
มีประสิทธิภาพมากกว่าที่ค่าเริ่มต้นของระบบจะซัพพอร์ต

CouchDB Configuration Options

delayed_commits
Delayed commitsเป็นพีเจอร์พื้นฐานของ CouchDB ซึ่งเพิ่มประสิทธิภาพในการเขียนที่ดีขึ้น แต่CouchDBจะต้องรอเวลาพอสมควรกว่าที่จะสามารถ
เขียนดาต้าใหม่เข้าไปได้ ซึ่งถ้า serverมีปัญหาก่อนที่ headerจะถูกเขียนเข้าไปจะทำให้ดาต้าที่ถูกเขียนไว้ล่าสุดจะหายไป

max_dbs_open
ออฟชั่นนี้จะวางขอบเขตการทำงานบนจำนวนของฐานข้อมูลที่สามารถเปิดได้ในครั้งเดียว CouchDBจะอ้างอิงการนับในการเข้าถึงข้อมูลภายในและจะปิดฐานข้อมูล
ที่ไม่ได้ใช้งานตามความจำเป็น

Erlang

เออร์แลงสามารถช่วยเพิ่มการตอบสนองการทำงานของ CouchDB server แต่ค่ามาตรฐานของเออร์แลงจะไม่ยอมให้ connectionsที่เกินกว่า1024ผ่าน
ดังนั้นเราสามารถเพิ่มขีดจำกัดนี้ด้วยการเพิ่มไปที่ (prefix)/etc/default/couchdb ด้วยคำสั่ง

export ERL_MAX_PORTS=4096

PAM and ulimit
หากระบบของคุณมีการติดตั้งการใช้งาน Pluggable Authentication Modules(PAM) จะเป็นหารเพิ่มพูนขีดจำกัดนี้อย่างตรงไปตรงมา ยกตัวอย่างเช่น
สร้างไฟล์ชื่อ /etc/security/limits.d/100-couchdb.conf ที่มีเนื้อหาดังนี้ จะช่วยเพิ่มค่าmaximumในการเปิดฐานข้อมูลและErlang ports ซึ่งจะแสดงผลประมาณนี้

        #    [type]    [item]    [value]
	couchdb      hard      nofile    4096
	couchdb      soft      nofile    4096

แต่ถ้าระบบของคุณไม่ได้ใช้ PAM ตัว ulimit command จะทำงานจาก script ที่เรากำหนดเอง

Network
โดยทั่วไปแล้วระบบจะทำงานจาก batches file ดังนั้นเราควรคำนึงขนาดของ batches file ยิ่งถ้า batches file มีขนาดใหญ่จะต้องใช้เวลามากในการเข้ารหัสและ
การตอบสนองในการถอดรหัสค่อนข้างช้า ซึ่งใน CouchDB สามารถตั้งค่า TCP socket option SO_NODELAY ซึ่งหมายความว่าข้อมูลขนาดเล็กที่ถูกส่งไปยัง TCP socket
ถ้ามีการร้องขอให้เขียนหรืออ่าน documents มันจะไม่ถูกส่งทันทีไปยังเครือข่าย แต่ TCP จะเก็บค่า buffer ไว้ แล้วรอให้มีการร้องขอมาใหม่ซึ่งต้องอยู่ใน socket เดียวกัน
จากนั้นจะทำการส่งข้อมูลทั้งหมดในครั้งเดียวเพื่อเพิ่มประสิทธิการทำงานที่เพิ่มขึ้น โดยใช้คำสั่ง
[httpd]
socket_options = [{nodelay, true}]

CouchDB
เมื่อเราสร้างฐานข้อมูลใหม่เราควรลบ documents เก่าๆที่ไม่ใช้งานออกบ้าง ถ้าไม่มีการลบเลยอาจจะทำให้เกิดผลกระทบกับ Views
เนื่องจาก Views จะมีการ requests เวลาและขนาดของข้อมูลบนดิสก์ ทั้งนี้เพื่อเป็นการเพิ่มประสิทธิภาพในการทำงาน

Views

Builtin reduce functions
CouchDB มี 3 built-in ในการช่วยลดฟังก์ชั่นการทำงาน สิ่งเหล่านี้จะถูกนำมาใช้ใน Erlang และทำงานบน CouchDB ซึ่งจะช่วยให้การทำงานเร็วกว่า
JavaScript หรือเทียบเท่า ซึ่งประกอบด้วยฟังก์ชั่นเหล่านี้ _sum, _count และ _stats จะแสดงผลประมาณนี้


		// could be replaced by _sum
		function(keys, values) {
  		return sum(values);
		}

		// could be replaced by _count
		function(keys, values, rereduce) {
 	 	if (rereduce) {
    		return sum(values);
  		} else {
   	 	return values.length;
  		}
	}

		// could be replaced by _stats
		function(keys, values, rereduce) {
 		 if (rereduce) {
    		return {
      		'sum': values.reduce(function(a, b) { return a + b.sum }, 0),
      		'min': values.reduce(function(a, b) { return Math.min(a, b.min) }, Infinity),
      		'max': values.reduce(function(a, b) { return Math.max(a, b.max) }, -Infinity),
      		'count': values.reduce(function(a, b) { return a + b.count }, 0),
      		'sumsqr': values.reduce(function(a, b) { return a + b.sumsqr }, 0)
    		}
  		} else {
    		return {
      		'sum': sum(values),
      		'min': Math.min.apply(null, values),
      		'max': Math.max.apply(null, values),
      		'count': values.length,
      		'sumsqr': (function() {
        		var sumsqr = 0;

        		values.forEach(function (value) {
          		sumsqr += value * value;
        		});

        		return sumsqr;
      		})(),
   		 }
 	 }
	}

Comments are closed.