Category: Cloud Computing

  • รู้จักกับ Kubernetes และวิธีติดตั้ง Kubernetes ด้วย CoreOS (ตอนที่ 1 Master Node)

    ถ้าต้องการระบบจัดการ docker container สักตัวต้องทำอย่างไร

                เมื่อกล่าวถึงระบบจัดการ docker container สักตัวหนึ่ง มักจะกล่าวถึง opensource ตัวหนึ่งชื่อ kubernetes ซึ่งเป็นเครื่องมือที่พัฒนาขึ้นมาด้วย Google[1] ซึ่งสามารถรองรับทั้งในส่วนของ Google Container Engine และ CoreOS จริง ๆ ลงได้บนอีกหลาย platform แต่สำหรับ CoreOS ได้ออกแบบมาให้รองรับ Kubernetes ทำให้การติดตั้งง่ายและสมบูรณ์มากขึ้น (อ่านไปเรื่อย ๆ จะสงสัยนี่ง่ายแล้วเหรอ แต่หลังจากเขียนบทความนี้เสร็จก็มีตัวติดตั้งตัวใหม่ชื่อ Tectonic[6] น่าจะเป็นตัวที่ทำให้การติดตั้งง่ายขึ้นครับ)

                Kubernetes เป็นเครื่องมือที่ช่วย build, deploy และ scale ให้เป็นเรื่องง่าย ๆ และสามารถ replicate containner ได้ง่ายมาก การติดตั้ง Kubernetes บน Google Container Engine ง่ายมาก แต่การติดตั้งบน CoreOS จะยากกว่า ซึ่งสามารถติดตั้งแบบ Single Node และ Multi-Node ซึ่งถ้าจะทำ Multi-Node ต้องเชื่อมต่อไปยัง etcd service ที่ติดตั้งบน CoreOS Cluster ด้วยก็จะดีครับ (ไม่งั้นเป็น Cluster ที่ไม่สมบูรณ์) สามารถอ่านเพิ่มเติมได้ที่วิธีการติดตั้ง CoreOS Cluster[2] (ในบทความใช้ก่อนหน้านี้ CoreOS Cluster เขียนในส่วน ETCD Version 2 แต่การใช้งานกับ Kubernetes ต้องใช้ ETCD Version 3 ตอนนี้ยังไม่มีบทความเสริมในส่วนนี้ อาจจะต้องหาข้อมูลเองก่อนครับ จริง ๆ มีวิธีแต่ยังยากในการเขียนบทความ ไว้ค่อยเขียนเพิ่มให้อีกทีครับ) ซึ่งแน่นอนระหว่าง master node และ worker node มีการตรวจสอบเรื่อง certificate ระหว่าง service ด้วย

                ตัวอย่าง Diagram ของระบบทั้งหมด[3]

    เรียนรู้การค่าเบื้องต้นก่อนการติดตั้ง[4]

    • MASTER_HOST : คือ ชื่อ host ที่ node ลูกเอาไว้ติดต่อและให้เข้าถึงจาก external client  เช่นเวลาสั่งสร้างเครื่องก็จะสั่งผ่านตัวนี้ ในกรณที่ต้องการทำ HA MASTER_HOST จะถูกใช้เป็น load balance โดยใช้ร่วมกับ DNS name โดยการคุยกันระหว่าง MASTER_HOST และ worker (node ลูก) จะใช้ port 443 และมีการเข้ารหัสและยืนยันด้วย TLS Certificate
    • ETCD_ENDPOINT : คือ บริการของ etcd service ซึ่งมีใน CoreOS Cluster ที่ติดตั้งไว้ ให้ใส่ไปให้หมดว่ามีเครื่องอะไรบ้าง คั่นด้วย , (ในที่นี้ไม่ได้ใช้ fleet สร้างเครื่อง หลังจากลงเสร็จจะใช้ kubectl สร้างแทน)
    • POD_NETWORK : เช่น 10.2.0.0/16 ใช้สำหรับกำหนดวง IP ของ pod (pod คือ ชื่อเรียก container อาจจะแค่ 1 container เหรือเรียกเป็นกลุ่มของหลาย ๆ container ที่สร้างด้วย kubernetes)
    • SERVICE_IP_RANGE : เช่น 10.3.0.0/24 ใช้สำหรับ service cluster VIPs ซึ่งควรจะอยู่คนละวงกับ pod_network ซึ่งเป็น ip ที่ไว้ให้ข้างนอกวงเข้าถึง มักจะเป็น IP สำหรับให้บริการ Service ต่าง ๆ และไว้สำหรับใช้งานคู่กับ kube-proxy
    • K8S_SERVICE_IP : เช่น 10.3.0.1 เป็น IP หนึ่งในวง SERVICE_IP_RANGE เพื่อให้บริการ Kubernetes API Service
    • DNS_SERVICE_IP : เช่น 10.3.0.10 เป็น IP หนึ่งในวง SERVICE_IP_RANGE ใช้สำหรับเป็น VIP ของ DNS Service เพื่อให้บริการ DNS ให้กับ worker แต่ละตัว

    วิธีการตั้งค่า TLS สำหรับ Kubernetes[4]

    • ทำการสร้าง Cluster Root CA  (ทุกไฟล์ต่อจากนี้ทำเก็บไว้ที่ CoreOS สักเครื่องหนึ่ง ถึงเวลาติดตั้ง Master, Worker ค่อยมาโหลดมาใช้ครับ)
      sudo openssl genrsa -out ca-key.pem 2048
      sudo openssl req -x509 -new -nodes -key ca-key.pem -days 10000 -out ca.pem -subj "/CN=kube-ca"

    • ตั้งค่า openssl config สำหรับ api-server โดยการสร้างไฟล์ดังนี้
      vim openssl.cnf

      โดยมีเนื้อหาในไฟล์ดังนี้ (ให้ระบุ IP Service และ Master Host ลงไปด้วย)
      *หมายเหตุ : แทนที่เลข IP ใน <….>

      [req]
      req_extensions = v3_req
      distinguished_name = req_distinguished_name
      [req_distinguished_name]
      [ v3_req ]
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      subjectAltName = @alt_names
      [alt_names]
      DNS.1 = kubernetes
      DNS.2 = kubernetes.default
      DNS.3 = kubernetes.default.svc
      DNS.4 = kubernetes.default.svc.cluster.local
      IP.1 = <K8S_SERVICE_IP>
      IP.2 = <MASTER_HOST>
    • จากนั้นทำการสร้าง API Server Keypair ดังนี้
      sudo openssl genrsa -out apiserver-key.pem 2048
      sudo openssl req -new -key apiserver-key.pem -out apiserver.csr -subj "/CN=kube-apiserver" -config openssl.cnf
      sudo openssl x509 -req -in apiserver.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out apiserver.pem -days 365 -extensions v3_req -extfile openssl.cnf

    • ต่อไปเป็นส่วนของสร้าง Cer ในเครื่องลูกทุกเครื่อง (สร้างทีละเครื่องนะครับ) ทำการสร้างไฟล์ดังนี้
      vim worker-openssl.cnf

      เนื้อหาในไฟล์ดังนี้ แทนที่ WORKER_IP ด้วยเครื่องที่ต้องการ

      [req]
      req_extensions = v3_req
      distinguished_name = req_distinguished_name
      [req_distinguished_name]
      [ v3_req ]
      basicConstraints = CA:FALSE
      keyUsage = nonRepudiation, digitalSignature, keyEncipherment
      subjectAltName = @alt_names
      [alt_names]
      IP.1 = <WORKER_IP>
    • จากนั้นทำการสร้าง Keypair ในแต่ละ Worker ดังนี้ (WORKER_FQDN คือชื่อที่จด domain ไว้ ไม่มีก็ใส่ /etc/hosts เอาก็ได้ครับ แต่ต้องใส่เองทุกเครื่อง)
      sudo openssl genrsa -out ${WORKER_FQDN}-worker-key.pem 2048
      sudo WORKER_IP=${WORKER_IP} openssl req -new -key ${WORKER_FQDN}-worker-key.pem -out ${WORKER_FQDN}-worker.csr -subj "/CN=${WORKER_FQDN}" -config worker-openssl.cnf
      sudo WORKER_IP=${WORKER_IP} openssl x509 -req -in ${WORKER_FQDN}-worker.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out ${WORKER_FQDN}-worker.pem -days 365 -extensions v3_req -extfile worker-openssl.cnf
    • สุดท้ายคือการสร้าง Keypair ของ Cluster Admin
       sudo openssl genrsa -out admin-key.pem 2048
       sudo openssl req -new -key admin-key.pem -out admin.csr -subj "/CN=kube-admin"
       sudo openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out admin.pem -days 365
    • ทำได้ครบแล้วก็จะได้ประมาณดังรูป (ยกตัวอย่างมี  4 worker ใช้วิธีเขียน gen-worker-keypair.sh เพื่อรันหลาย ๆ รอบ ลองหาวิธีเขียนดูเองนะครับ)

    วิธีการตั้งค่า Kubernetes บน CoreOS Cluster[5]

    เพื่อให้การติดตั้งง่ายขึ้น อย่าลืมกำหนดค่าต่าง ๆ จดไว้ก่อน ไม่งั้นจะงงได้ ประมาณนี้ครับ

    ETCD_ENDPOINT=http://a.b.c.d:2379,http://a.b.c.e:2379,http://a.b.c.f:2379
    SERVER_IP_NETWORK=?
    K8S_SERVICE_IP=?
    MASTER_HOST=?
    DNS_SERVICE_IP=?
    POD_NETWORK=?

    ทำการติดตั้ง Master Node

    • ทำการติดตั้ง CoreOS บน Master Node
    • สร้าง directory ดังนี้
      sudo mkdir -p /etc/kubernetes/ssl
    • ทำการ copy ที่สร้างไว้ก่อนหน้านี้มาไว้ใน folder ดังนี้
      File: /etc/kubernetes/ssl/ca.pem
      File: /etc/kubernetes/ssl/apiserver.pem
      File: /etc/kubernetes/ssl/apiserver-key.pem
    • เปลี่ยน permission และ owner file เฉพาะไฟล์ -key* ดังนี้
      sudo chmod 600 /etc/kubernetes/ssl/*-key.pem
      sudo chown root:root /etc/kubernetes/ssl/*-key.pem
    • จากนั้นตั้งค่า flannel network[3] เป็น network ที่เอาไว้เชื่อมแต่ละ pod ให้สามารถคุยกันได้ข้ามเครื่อง (ต้องทำทุก node รวม worker ด้วย) เพื่อสร้างวง virtual ip ให้กับ pod ดังนี้
      sudo mkdir /etc/flannel

      ทำการสร้างไฟล์ option.env

      sudo vim /etc/flannel/options.env

      เนื้อหาในไฟล์ดังนี้

      FLANNELD_IFACE=<Master IP>
      FLANNELD_ETCD_ENDPOINTS=http://<Master IP>:2379,http://<Node1 IP>:2379,http://<Node2 IP>:2379
    • จากนั้นทำการสร้าง flannel service ดังนี้
      sudo mkdir -p /etc/systemd/system/flanneld.service.d/
      sudo vim /etc/systemd/system/flanneld.service.d/40-ExecStartPre-symlink.conf

      เนื้อหาในไฟล์ดังนี้

      [Service]
      ExecStartPre=/usr/bin/ln -sf /etc/flannel/options.env /run/flannel/options.env
    • จากนั้นทำการตั้งค่า docker เพื่อกำหนดให้ใช้งานผ่าน flannel โดยสร้างไฟล์ config ดังนี้
      sudo mkdir -p /etc/systemd/system/docker.service.d
      sudo vim /etc/systemd/system/docker.service.d/40-flannel.conf

      เนื้อหาในไฟล์ดังนี้

      [Unit]
      Requires=flanneld.service
      After=flanneld.service
      [Service]
      EnvironmentFile=/etc/kubernetes/cni/docker_opts_cni.env

      โดยที่ทำสร้างไฟล์ docker_opts_cni.env ขึ้นมาประกอบดังนี้

      sudo mkdir -p /etc/kubernetes/cni
      sudo vim /etc/kubernetes/cni/docker_opts_cni.env

      เนื้อหาในไฟล์ดังนี้

      DOCKER_OPT_BIP=""
      DOCKER_OPT_IPMASQ=""
    • จากนั้นทำการ restart docker service สักรอบดังนี้
      sudo systemctl restart docker
    • หนังจากนั้นทำการสร้าง config ไฟล์สุดท้ายสำหรับ flannel ดังนี้
      sudo mkdir -p /etc/kubernetes/cni/net.d
      sudo vim /etc/kubernetes/cni/net.d/10-flannel.conf

      เนื้อหาในไฟล์ดังนี้

      {
       "name": "podnet",
       "type": "flannel",
       "delegate": {
       "isDefaultGateway": true
       }
      }
    • ทำการ start flannel service และตรวจสถานะการทำงานดู
      sudo systemctl start flanneld
      sudo systemctl enable flanneld
      sudo systemctl status flanneld
    • จากนั้นทำการสั่งให้ทำ vxlan ผ่าน etcdctl ให้กับทุก node ดังนี้ (เปลี่ยน IP เป็นวงที่ต้องการ)
      sudo etcdctl set /coreos.com/network/config "{\"Network\":\"10.2.0.0/16\",\"Backend\":{\"Type\":\"vxlan\"}}"
    • จากนั้นทำการสร้าง kubelet service ดังนี้
      sudo vim /etc/systemd/system/kubelet.service

      เนื้อหาในไฟล์ดังนี้ (KUBELET_IMAGE_TAG version สามารถตรวจสอบล่าสุดได้ที่ https://quay.io/repository/coreos/hyperkube?tab=tags)

      [Service]
      Environment=KUBELET_IMAGE_TAG=v1.6.2_coreos.0
      Environment="RKT_RUN_ARGS=--uuid-file-save=/var/run/kubelet-pod.uuid \
        --volume var-log,kind=host,source=/var/log \
        --mount volume=var-log,target=/var/log \
        --volume dns,kind=host,source=/etc/resolv.conf \
        --mount volume=dns,target=/etc/resolv.conf"
      ExecStartPre=/usr/bin/mkdir -p /etc/kubernetes/manifests
      ExecStartPre=/usr/bin/mkdir -p /var/log/containers
      ExecStartPre=-/usr/bin/rkt rm --uuid-file=/var/run/kubelet-pod.uuid
      ExecStart=/usr/lib/coreos/kubelet-wrapper \
        --api-servers=http://127.0.0.1:8080 \
        --container-runtime=docker \
        --allow-privileged=true \
        --pod-manifest-path=/etc/kubernetes/manifests \
        --cluster_dns=<DNS_SERVICE_IP> \
        --cluster_domain=<CLUSTER_DNS_NAME>
      ExecStop=-/usr/bin/rkt stop --uuid-file=/var/run/kubelet-pod.uuid
      Restart=always
      RestartSec=10
      
      [Install]
      WantedBy=multi-user.target
    • ทำการ start kubelet service และตรวจสถานะการทำงานดู (ต้องรอสักพักเพราะ service จะต้องโหลด image มาติดตั้งให้ในการ start ครั้งแรก สามารถใช้คำสั่ง journalctl -xe เพื่อตรวจสอบสถานะการทำงาน) ซึ่งจะพบว่ายัง error เพราะยังไม่ได้ลง kube-apiserver (แนะนำลงตัวอื่นให้เสร็จให้หมดแล้วค่อยมา start kubelet service ก็ได้)
      sudo systemctl start kubelet
      sudo systemctl enable kubelet
      sudo systemctl status kubelet
    • ขั้นตอนต่อไปเป็นการสร้าง Rest API สำหรับจัดการ kubernetes (รวมถึงสามารถติดตั้งหน้าจอ GUI เพื่อควบคุมผ่าน Web ได้) โดยสร้างไฟล์ดังนี้
      sudo vim /etc/kubernetes/manifests/kube-apiserver.yaml

      เนื้อหาในไฟล์มีดังนี้ (ระวังเรื่องวรรคด้วยนะครับ ถ้าจะพิมพ์เองไม่แนะนำ copy ไปแก้ดีกว่า)

      apiVersion: v1
      kind: Pod
      metadata:
        name: kube-apiserver
        namespace: kube-system
      spec:
        hostNetwork: true
        containers:
        - name: kube-apiserver
          image: quay.io/coreos/hyperkube:v1.6.2_coreos.0
          command:
          - /hyperkube
          - apiserver
          - --bind-address=0.0.0.0
          - --etcd-servers=${ETCD_ENDPOINTS1},${ETCD_ENDPOINTS2},${ETCD_ENDPOINTS3}
          - --allow-privileged=true
          - --service-cluster-ip-range=${SERVICE_IP_RANGE}
          - --secure-port=443
          - --advertise-address=${ADVERTISE_IP}
          - --admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota
          - --tls-cert-file=/etc/kubernetes/ssl/apiserver.pem
          - --tls-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem
          - --client-ca-file=/etc/kubernetes/ssl/ca.pem
          - --service-account-key-file=/etc/kubernetes/ssl/apiserver-key.pem
          - --runtime-config=extensions/v1beta1/networkpolicies=true
          - --anonymous-auth=false
          livenessProbe:
            httpGet:
              host: 127.0.0.1
              port: 8080
              path: /healthz
            initialDelaySeconds: 15
            timeoutSeconds: 15
          ports:
          - containerPort: 443
            hostPort: 443
            name: https
          - containerPort: 8080
            hostPort: 8080
            name: local
          volumeMounts:
          - mountPath: /etc/kubernetes/ssl
            name: ssl-certs-kubernetes
            readOnly: true
          - mountPath: /etc/ssl/certs
            name: ssl-certs-host
            readOnly: true
        volumes:
        - hostPath:
            path: /etc/kubernetes/ssl
          name: ssl-certs-kubernetes
        - hostPath:
            path: /usr/share/ca-certificates
          name: ssl-certs-host
      
    • เพื่อให้สมบูรณ์ไปในคราวเดียว ต่อด้วยติดตั้ง kube-proxy ดังนี้
      sudo vim /etc/kubernetes/manifests/kube-proxy.yaml

      มีเนื้อหาในไฟล์ดังนี้

      apiVersion: v1
      kind: Pod
      metadata:
        name: kube-proxy
        namespace: kube-system
      spec:
        hostNetwork: true
        containers:
        - name: kube-proxy
          image: quay.io/coreos/hyperkube:v1.6.2_coreos.0
          command:
          - /hyperkube
          - proxy
          - --master=http://127.0.0.1:8080
          securityContext:
            privileged: true
          volumeMounts:
          - mountPath: /etc/ssl/certs
            name: ssl-certs-host
            readOnly: true
        volumes:
        - hostPath:
            path: /usr/share/ca-certificates
          name: ssl-certs-host
      
    • ยังไม่หมดต่อด้วย kube-controller-manager ใช้ในการทำ scale, replica โดยเป็นตัวควบคุม API อีกชั้นหนึ่ง ทำการสร้างไฟล์ดังนี้
      sudo vim /etc/kubernetes/manifests/kube-controller-manager.yaml

      มีเนื้อหาในไฟล์ดังนี้

      apiVersion: v1
      kind: Pod
      metadata:
        name: kube-controller-manager
        namespace: kube-system
      spec:
        hostNetwork: true
        containers:
        - name: kube-controller-manager
          image: quay.io/coreos/hyperkube:v1.6.2_coreos.0
          command:
          - /hyperkube
          - controller-manager
          - --master=http://127.0.0.1:8080
          - --leader-elect=true
          - --service-account-private-key-file=/etc/kubernetes/ssl/apiserver-key.pem
          - --root-ca-file=/etc/kubernetes/ssl/ca.pem
          resources:
            requests:
              cpu: 200m
          livenessProbe:
            httpGet:
              host: 127.0.0.1
              path: /healthz
              port: 10252
            initialDelaySeconds: 15
            timeoutSeconds: 15
          volumeMounts:
          - mountPath: /etc/kubernetes/ssl
            name: ssl-certs-kubernetes
            readOnly: true
          - mountPath: /etc/ssl/certs
            name: ssl-certs-host
            readOnly: true
        volumes:
        - hostPath:
            path: /etc/kubernetes/ssl
          name: ssl-certs-kubernetes
        - hostPath:
            path: /usr/share/ca-certificates
          name: ssl-certs-host
    • สำหรับอันสุดท้ายก็จะเป็น kube-scheduler (สำหรับการใช้งานเนื่องจากยังไม่ได้ลองใช้งาน ยังไม่เข้าใจว่าทำงานอย่างไร ถ้าว่างจะมาแก้อีกทีครับ) ทำการสร้างไฟล์ดังนี้
      sudo vim /etc/kubernetes/manifests/kube-scheduler.yaml

      มีเนื้อหาในไฟล์ดังนี้

      apiVersion: v1
      kind: Pod
      metadata:
        name: kube-scheduler
        namespace: kube-system
      spec:
        hostNetwork: true
        containers:
        - name: kube-scheduler
          image: quay.io/coreos/hyperkube:v1.6.2_coreos.0
          command:
          - /hyperkube
          - scheduler
          - --master=http://127.0.0.1:8080
          - --leader-elect=true
          resources:
            requests:
              cpu: 100m
          livenessProbe:
            httpGet:
              host: 127.0.0.1
              path: /healthz
              port: 10251
            initialDelaySeconds: 15
            timeoutSeconds: 15
      
    • ในส่วนของ Calico จะใช้สำหรับทำ Network Policy เนื่องจากเป็น Optional จึงขอยังไม่ตั้งค่าสำหรับบริการนี้
    • ในกรณีที่ต้องการแจ้ง systemd ว่าเรามีการเปลี่ยนข้อมูลใน config และต้องการ rescan ทุกอย่างอีกครั้งให้สั่งดังนี้
      sudo systemctl daemon-reload
    • จากนั้นทดสอบ restart kubelet service ใหม่อีกครั้งและตรวจสอบ status หรือ journalctl -xe เพื่อดูว่าการทำงานปกติหรือไม่ ถ้าไม่แก้ให้ถูกต้องแล้ว restart ใหม่อีกครั้งไปเรื่อย ๆ จนกว่าจะปกติ
      sudo systemctl restart kubelet

      จบตอนแรกไปก่อนนะครับ ตอนต่อไปจะต่อด้วย worker node และ addon อื่น ๆ

    ==================================

    Reference :

    [1] [Kubernetes] Deploy Docker Container บน Google Container Engine : https://www.nomkhonwaan.com/2016/04/12/deploy-docker-container-on-google-container-engine

    [2] วิธีสร้าง CoreOS Cluster : https://sysadmin.psu.ac.th/2017/05/04/setup-coreos-cluster/

    [3] How to Deploy Kubernetes on CoreOS Cluster : https://www.upcloud.com/support/deploy-kubernetes-coreos/

    [4] CoreOS -> Cluster TLS using OpenSSL : https://coreos.com/kubernetes/docs/latest/openssl.html

    [5] CoreOS -> CoreOS + Kubernetes Step By Step : https://coreos.com/kubernetes/docs/latest/getting-started.html

    [6] CoreOS -> Tectonic, Kubernetes cluster orchestrator with enterprise integration  : https://coreos.com/tectonic/docs/latest/

     

  • Kafka #01 Basic Installtion

    Apache Kafka เป็น distributed streaming platform [1] กล่าวคือ สามารถ Publish และ Subscribe ข้อมูลแบบ Streaming ได้ คล้ายๆกับ Message Queue หรือ Enterprise Messaging System ระบบนี้ใช้ได้ทั้งเป็น Real-time Streaming Data Pipeline และ สร้าง Streaming Application ได้ Apache Kafka ออกแบบมาให้สามารถทำงานเป็นแบบ Cluster โดยเก็บข้อมูลเป็น Stream of Record ซึ่งจัดหมวดหมู่ในรูปของ Topics ข้อมูลแต่ละ Record ประกอบด้วบ Key, Value และ timestamp

    เอาเป็นว่า ระบบนี้เอาไว้สำหรับรองรับการส่งข้อมูลแนวๆ Streaming มาเพื่อทำการวิเคราะห์แบบ Real-Time แทนที่จะต้องบริหารเองก็แล้วกัน แถมด้วยความสามารถในการ Subscribe ข้อมูล สามารถย้อนไปดูข้อมูลก่อนหน้าได้ (ตามขอบเขตเวลาที่กำหนด) มาติดตั้งกัน

    บทความนี้ ทดสอบบน Ubuntu 16.04

    1. ไป Download และ ติดตั้ง
      จาก https://www.apache.org/dyn/closer.cgi?path=/kafka/0.10.2.0/kafka_2.11-0.10.2.0.tgz
      ด้วยคำสั่ง

      wget http://www-eu.apache.org/dist/kafka/0.10.2.0/kafka_2.11-0.10.2.0.tgz
      tar -zxvf kafka_2.11-0.10.2.0.tgz
      cd kafka_2.11-0.10.2.0
    2. Kafka ทำงานบน Zookeeper ดังนั้นให้เริ่มทำงานด้วยคำสั่ง
      bin/zookeeper-server-start.sh config/zookeeper.properties &

      แล้วจึง สั่ง Start Kafka

      bin/kafka-server-start.sh config/server.properties &
    3. ต่อไป Producer กับ Consumer จะติดต่อกันผ่าน Topic จึงต้องสร้าง topic ด้วยคำสั่งต่อไปนี้
      bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

      ซึ่งในที่นี้ จะได้ Topic ชื่อ test ทำงานบน Zookeeper บน Localhost ที่ Port 2181
      ลองใช้คำสั่งต่อไปนี้เพื่อดู Topic ทั้งหมด

      bin/kafka-topics.sh --list --zookeeper localhost:2181
    4. ทดลองส่งข้อมูลเข้าไปให้ Kafka ซึ่งจะทำงานที่ Localhost ที่ Port 9092
      bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test

      แล้วลองพิมพ์ข้อความอะไรลงไปดู เช่น

      Hello World
      This is a book
      Blah Blah
    5. ลองเปิดอีก Terminal ขึ้นมา แล้วใช้คำสั่งต่อไปนี้
      bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

      ก็จะเห็นได้ว่า สามารถเรียกดูสิ่งที่ส่งเข้าไปใน Topic “test” ตั้งแต่เริ่มต้นได้

    ตรงนี้ยังไม่แปลกอะไร และไม่น่าตื่นเต้นอะไร บทความต่อไปจะกล่าวถึงการสร้างเป็น Cluster แล้วก็ทำงานกับ หลายๆ Producer และ หลายๆ Consumer พร้อมๆกัน

     

    Reference

    1. https://kafka.apache.org/intro
  • Spark #03: Query Apache Access Log with Spark SQL

    ต่อจาก

    บทความนี้ จะกล่าวถึงการนำเข้าไฟล์ Apache Access Log เข้าไปเก็บไว้ใน Hadoop HDFS แล้ว ให้ Apache Spark Cluster เข้าไปค้นหาข้อมูล โดยใช้ภาษา SQL ผ่าน Spark SQL API

    นำ Apache Access Log เข้า HDFS

    1. ให้ Copy Apache Access Log ที่มีอยู่มาเก็บไว้ในเครื่องที่สามารถติดต่อ Hadoop HDFS ได้ (ในที่นี้ ชื่อไฟล์เป็น apache.access.log)
    2. ใช้คำสั่งต่อไป
      (แทน /test/ ด้วย Path ที่สร้างไว้ใน HDFS)

      hdfs dfs -copyFromLocal apache.access.log /test/
    3. เมื่อไปดูผ่าน Web UI ของ Hadoop HDFS ก็จะเห็นไฟล์อยู่ดังนี้

    วิธี Query ข้อมูลจาก Zeppelin ไปยัง Spark Cluster

    1. เปิด Zeppelin Web UI แล้วสร้าง Note ใหม่ โดยคลิกที่ Create new node
      แล้วใส่ชื่อ Note เช่น Query Apache Access Log
      ตั้ง Default Interpreter เป็น Spark
      แล้วคลิก Create Note
    2. ใส่ Code ต่อไปนี้ลงไป
    3. ด้านขวามือบน จะมีรูปเฟือง ให้คลิก แล้วเลือก Insert New
    4. แล้วใส่ข้อความนี้ลงไป
    5. จากนั้นคลิก Run all paragraphs
    6. ผลที่ได้

    ตอนต่อไปจะมาอธิบายวิธีการเขียนคำสั่งครับ

  • Zeppelin #01 Installation

    Apache Zeppelin เป็น Web-Base Notebook สำหรับเป็นการเชื่อมต่อกับระบบ Data Analytic [1] สามารถใช้ทำ Data-Driven แบบ Interactive และยังสามารถใช้งานพร้อมๆกันหลายคนได้ รองรับการทำงานผ่านภาษา SQL, Scala และอื่นๆอีกมากมาย

    ในบทความนี้ จะแนะนำการติดตั้ง Apache Zeppelin 0.7.0 บน Ubuntu 16.04

    1. ไปที่ http://zeppelin.apache.org/download.html เพื่อ Download ชุดติดตั้ง ซึ่งแบ่งออกเป็น แบบรวมทุก Interpreters ขนาด 710 MB หรือ จะเลือกเป็นแบบ ที่รองรับเฉพาะ Spark ขนาด 272 MB ซึ่งหากในอนาคตต้องการใช้ภาษาอื่นอีก ก็จะต้องติดตั้งเพิ่มเติม (แนะนำให้ใช้แบบรวม Interpreters)
    2. บน Ubuntu ที่จะใช้เป็น Zeppelin Server ใช้คำสั่งต่อไปนี้เพื่อ Download
      wget http://www-eu.apache.org/dist/zeppelin/zeppelin-0.7.0/zeppelin-0.7.0-bin-all.tgz
    3. ติดตั้ง Zeppelin (ต้องใช้ Java) ด้วยคำสั่งต่อไปนี้
      sudo apt install default-jre
      tar -zxvf zeppelin-0.7.0-bin-all.tgz ; ln -s zeppelin-0.7.0-bin-all.tgz zeppelin
    4. Start Zeppelin
      cd zeppelin
      bin/zeppelin-daemon.sh start
    5. หากเรียบร้อยก็จะสามารถใช้งานผ่านทาง Web UI ที่ port: 8080 ได้
    6. ในกรณีที่ติดตั้ง Zeppelin บนเครื่องเดียวกับ Spark Master ก็จะพบว่า Port ชนกัน (คือใช้ Web UI ที่ port 8080 เหมือนกัน) เราสามารถเปลี่ยน Web UI port ของ Zeppelin ได้โดยใช้คำสั่งต่อไปนี้
      cp conf/zeppelin-site.xml.template conf/zeppelin-site.xml

      แล้วแก้ไขไฟล์ conf/zeppelin-site.xml
      แก้ไขค่า 8080 เป็น ค่าอื่น เช่น 8090 เป็นต้น

      <property>
       <name>zeppelin.server.port</name>
       <value>8080</value>
       <description>Server port.</description>
      </property>

      แล้วทำการ Start Zeppelin ใหม่

    Reference:

    1. http://zeppelin.apache.org/
  • Spark #02: Cluster Installation

    ต่อจาก Spark #01: Standalone Installation

    Apache Spark ทำงานแบบ Master – Slave โดย Spark Cluster Component ดังภาพ


    ภาพจาก http://spark.apache.org/docs/latest/img/cluster-overview.png

    การใช้งาน Apache Spark จะใช้ผ่านการเขียนโปรแกรมด้วยภาษา Scala, Java, Python หรือ R แล้วสั่งการผ่าน “Driver” ซึ่งจะทำการส่งการไปยัง “Worker” เพื่อให้ Execute ตามที่ต้องการ การสร้าง Cluster จะมี Cluster Manager เป็น Standalone, Apache Mesos และ Hadoop YARN [1]

    ในบทความนี้ จะกล่าวถึงเฉพาะ การติดตั้ง Apache Spark Cluster แบบ Standalone คือใช้ Apache Spark เองเป็น Cluster Manager

    1. ติดตั้ง Ubuntu 16.04 อีกเครื่องหนึ่ง แล้วติดตั้งตามขึ้นตอนที่กล่าวใน Spark #01: Standalone Installation ข้อ 1-2 เท่านั้น (ไม่ต้อง Start Master ขึ้นมา)
    2. ตอนนี้จะมีเครื่อง Master และ เครื่อง Slave ซึ่งแนะนำให้ทำ Password-less SSH จากเครื่อง Master ไปยัง Slave เพื่อสะดวกต่อการใช้งาน
    3. ที่เครื่อง Master ใช้คำสั่งต่อไปนี้ เพื่อสร้างไฟล์ spark-env.sh ซึ่งเป็นตัวกำหนดการทำงานต่างๆของ Spark Cluster โดยในที่นี้ จะ SPARK_MASTER_HOST เป็น IP ของเครื่อง Master (แทนที่ 192.168.XXX.YYY ด้วย IP ของ Master )
      cp conf/spark-env.sh.template conf/spark-env.sh
      
      echo "SPARK_MASTER_HOST=192.168.XXX.YYY" >> conf/spark-env.sh
    4. ที่เครื่อง Master ใช้คำสั่งต่อไปนี้ เพื่อสร้างไฟล์ slaves ซึ่งจะกำหนดว่า เครื่องใดบ้างจะเป็น Slave ของ Cluster นี้ (หากมี Slave หลายเครื่อง ก็ใส่ IP ลงไปในไฟล์ conf/slaves ให้หมด)
      cp conf/slaves.template conf/slaves
      
      echo "192.168.XXX.ZZZ" >> conf/slaves
    5. ที่เครื่อง Master ใช้คำสั่งต่อไปนี้ เพื่อเชื่อมต่อ Cluster
      sbin/start-all.sh

      หมายเหตุ: หากไม่ได้ทำ Password-less SSH ก็จะต้องใส่ Password ทีละเครื่องจนเสร็จ

    6. เมื่อเสร็จเรียบร้อย ก็จะสามารถดูสถานะได้ที่ http://192.168.XXX.YYY:8080 ดังภาพ

    ประมาณนี้

    บทความต่อไป จะลงรายละเอียดเกี่ยวกับการเขียน Program เพื่อทำงานบน Spark Cluster

    Reference:

    1. http://spark.apache.org/docs/latest/cluster-overview.html

     

  • Spark #01: Standalone Installation

    Apache Spark : เป็นระบบ Data Processing ในระดับ Large-Scale ซึ่งทำงานได้เร็วกว่า Apache Hadoop MapReduce 100 เท่าบน Memory และ 10 เท่าบน Disk สามารถพัฒนาโปรแกรมเพื่อทำงานบน Spark ได้หลายภาษา ทั้ง Java, Scala, Python และ R อีกทั้งยังมี Library ทำงานกับ SQL, Machine Learning และ Graph Parallel Computation

    ในบทความนี้ จะกล่าวถึงเฉพาะวิธีการติดตั้ง Apache Spark เบื้องต้น บน Ubuntu 16.04 จำนวน 1 Machine ก่อน

    1. ไปที่ http://spark.apache.org/downloads.html
      เลือก Release, Package ที่ต้องการ แล้วเลือก Copy Link จาก Download Link มาได้เลย
    2. ที่ Ubuntu Server ใช้คำสั่งต่อไปนี้ ติดตั้ง Java และ Download Spark มาไว้บนเครื่อง
      sudo apt-get install default-jre openjdk-8-jdk-headless
      cat <<EOF >> .bashrc 
      export SPARK_HOME=/home/mama/spark
      export PATH=\$PATH:\$SPARK_HOME/bin
      EOF
      wget http://d3kbcqa49mib13.cloudfront.net/spark-2.1.0-bin-hadoop2.7.tgz
      tar -zxvf spark-2.1.0-bin-hadoop2.7.tgz ; ln -s spark-2.1.0-bin-hadoop2.7 spark
      cd spark
    3. แล้วทำการ Start Spark Master Server ด้วยคำสั่ง
      sbin/start-master.sh
    4. จากนั้น สามารถเรียกดู Web UI ได้ที่ port 8080 (Default) และต่อไป เครื่อง Worker หรือ เครื่องที่จะมาเข้า Cluster จะติดต่อเครื่องนี้ผ่าน port 7077 (Default)
    5. สามารถใช้งาน Spark Shell ซึ่ง จะเป็นภาษา Scala แบบ Interactive ด้วยคำสั่ง
      bin/spark-shell
    6. สามารถดู Jobs ที่ทำงานได้ผ่านทาง Web UI ที่ port 4040 (Default)

    ประมาณนี้ก่อน ในบทความต่อไปจะเป็นการสร้าง Spark Cluster

    Reference:

    1. http://spark.apache.org/
  • 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 ทำดังนี้

    1. ติดตั้ง Cassandra ตามขั้นตอนใน Cassandra #01 เริ่มต้นใช้งาน
    2. แก้ไขไฟล์ /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
      
    3. ในการเริ่มใช้งานครั้งแรก ให้ลบข้อมูลใน /var/lib/cassandra/data/system ออกก่อน
      sudo rm -rf /var/lib/cassandra/data/system/*
    4. ในการใช้ Endpoint Snitch แบบ GossipingPropertyFileSnitch ต้องลบไฟล์ cassandra-topology.properties ออกไปก่อน
      sudo rm /etc/cassandra/cassandra-topology.properties
    5. จากนั้นก็ 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

  • NETPIE : เริ่มต้นใช้งาน

    NETPIE เป็น Paas (Platform as a Service) ทำหน้าที่เป็นสื่อกลาง ที่ทำให้สิ่งต่างๆเชื่อมโยงกันได้ผ่านอินเตอร์เน็ต (IoT) พัฒนาภายใต้การสนับสนุนของ Nectec ใช้งานได้ 100 Credit ฟรี (ประมาณว่า สร้างได้ 100 ช่องทาง) สำหรับแต่ละ Account

    เอาเป็นว่า “ฟรี”

    อธิบายแบบเร็วๆ คร่าวๆ อย่างไม่เป็นทางการคือ ถ้าที่บ้านเรามีพวก Censor ซึ่งวัดค่าต่างๆ เช่น อุณหภูมิ แล้วมีความสามารถในการเกาะ WiFi ได้ โดยที่บ้านใช้อินเตอร์เน็ตแบบ ADSL ปัญหาคือ เราจะเข้าไปเอาข้อมูลเจ้า Censor นี้ได้อย่างไร ? ในเมื่อ ADSL ก็ไม่ได้ Fix IP หรือ จะใช้ Dynamic DNS (DDNS) ก็มีค่าใช้จ่าย เป็นต้น

    หรือ บางคนก็อาจจะคิดถึงวิธีไป Host เครื่องคอมพิวเตอร์ไว้บน Internet หรือจะไปสร้างบน Cloud แล้วอาจจะสร้าง Web Application เพื่อให้ Censor ไปเรียกแล้วบันทึกค่าลงในฐานข้อมูล อะไรทำนองนั้น

    ที่กล่าวมา ก็ต้องมีค่าใช้จ่าย หรือ ต้องลงแรงในการสร้างตัวกลางเหล่านั้น

    NETPIE ก็ทำหน้าที่ เป็น Broker หรือตัวกลาง โดย Censor ทำหน้าที่ติดต่อผ่าน Internet มาแปะค่าเอาไว้ใน NETPIE แล้วจึงค่อยนำไปใช้งานต่อได้ เพียงแค่ สมัครใช้งาน แล้วก็ไปสร้างช่องทางให้ Censor มา Update ข้อมูล

    ดังสโลแกนของ NETPIE ว่า NETPIE … where things chat.

    เริ่มกันเลย

    วิธีการสมัคร

    ไปที่ https://netpie.io/sign_up แล้วก็กรอกข้อมูล หลังจากนั้น NETPIE ก็จะส่ง SMS แจ้ง One Time Password มาให้ เมื่อ Login ครั้งแรก NETPIE จะให้ทำการตั้งรหัสผ่านใหม่

    ต่อไป สร้าง Application

    1. ไปที่เมนู Resources > Applications
    2. ต่อไปเป็นสร้าง Application (ในที่นี้คือ kx01web)
      คลิกปุ่ม +
      ตั้งชื่อ แล้วกดปุ่ม Create
    3. ใน Application ที่สร้าง คลิกเครื่องหมาย +
      ใส่ชื่ออุปกรณ์ (ในที่นี้คือ web01) เลือกชนิดเป็น Session Key
      แล้วคลิก Create
    4. ต่อไปเป็นการเอา REST API Auth ไปใช้งาน (ในที่นี้คือ 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXXXX)
      โดยคลิกที่ Application KEY ที่สร้างขึ้น
      แล้วคลิกรูป ลูกตา หลังบรรทัด REST API Auth แล้ว Copy ค่าไปใช้งาน (ซึ่งจะเป็นคู่ของ Key:Secret)
    5. ในที่นี้ จะลองให้ เครื่องคอมพิวเตอร์ซึ่งเป็น Ubuntu เก็บข้อมูล memory แล้วส่งไปเก็บไว้บน NETPIE ผ่าน cURL
      รูปแบบประมาณนี้

      curl -X PUT "https://api.netpie.io/topic/kx01web/web01" -d "123456" -u 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXXXX

      โดยในตัวอย่างนี้
      Application ID คือ kx0web
      Censor คือ web01
      ค่าที่จะส่งไปคือ 123456
      และ REST API Auth คือ 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXXXX

    6. หากผลการทำงานออกมาเป็น
       {"code":200,"message":"Success"}

      ก็แสดงว่า สามารถส่งไปเขียนค่าได้

    วิธีการดูผลการทำงาน

    1. คลิกที่ Resources > Freeboards
    2. คลิกเครื่องหมาย +
      ตั้งชื่อที่ต้องการ (ในที่นี้คือ kx01Freeboard)
      แล้วคลิก Create
    3. ใน Freeboard ที่สร้างขึ้น คลิก Add ในส่วนของ Data Sources
      เลือกชนิดเป็น NETPIE Microgear
    4. จากนั้นกรอกข้อมูล
      Name ที่ต้องการ
      App ID ในที่นี้คือ kx01web
      Key และ Secret ที่ได้มาจากก่อนหน้านี้
      แล้วคลิก Save
    5. ต่อไป คลิก Add Pane

      คลิกเครื่องหมาย +

      เลือก Type เป็น Text
      ตั้ง Title เป็น Memory
      แล้วคลิก DATASOURCE

      เลือก Memory
      เลือก /kx01web/web01
      แล้วคลิก Save
    6. ก็จะเห็นผลลัพธ์ดังนี้
    7. หรือจะเรียกข้อมูลไปใช้งานผ่านทาง cURL ก็สามารถทำได้ดังนี้
       curl -X GET "https://api.netpie.io/topic/kx01web/web01" -u 6JhowZyvcRsyHUg:EclJZt2C0lKXXXXXXX

      ก็จะได้ผลดังนี้

       [{"topic":"/kx01web/web01","payload":"123456","lastUpdated":1488297743,"retain":true}]

      เป็นต้น

    คร่าวๆ ก็ดังนี้

  • 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', 'Doe' );

    คำสั่งในการ Select ข้อมูล

    cqlsh:test> SELECT * FROM table1;
    
     id | age | firstname | lastname
    --------+-----+-----------+----------
     000001 | 10 | John | Doe
    
    (1 rows)

    คำสั่งในการ Update ข้อมูล

    cqlsh:test> UPDATE table1
     ... SET age = 20
     ... WHERE id = '000001'
     ... ;
    cqlsh:test> SELECT * FROM table1;
    
     id | age | firstname | lastname
    --------+-----+-----------+----------
     000001 | 20 | John | Doe
    
    (1 rows)

    คำสั่งในการ Delete ข้อมูล

    cqlsh:test> DELETE FROM table1
     ... WHERE id = '000001';
    cqlsh:test> SELECT * FROM table1;
    
     id | age | firstname | lastname
    ----+-----+-----------+----------
    
    (0 rows)

    จะเห็นได้ว่า รูปแบบการใช้คำสั่งแทบจะไม่แตกต่างกับภาษา SQL ใน RDBMS ทั่วไปเลย

    Reference:

    [1] http://cassandra.apache.org/

    [2] http://docs.datastax.com/en/cql/3.1/cql/cql_using/useStartingCqlshTOC.html

    [3] http://docs.datastax.com/en/cassandra/3.0/cassandra/cassandraAbout.html