การทำ Auto-start service ในแบบกู้คืน(Self-healing) บน CentOS ด้วย bashscript

จะดีไหมถ้าเราไม่ต้องคอยพิมคำสั่งแบบแมนวลเพื่อสั่งรัน service ถ้าอยู่ดีๆมันตาย หรือในบางครั้งเราอาจทำตัวตรวจสอบแค่ส่ง notification มาหาเรา แต่สุดท้ายก็ต้องมาแมนวลอยู่ดี ดังนั้นมาดูวิธีการกัน

1. สร้าง bashscript /home/self-healing.sh ตัวอย่างจะทำการตรวจสอบ service httpd,mysqld และ docker container โดยในตัวอย่างของผม สมมติว่าเป็น elasticsearch

#!/bin/bash
dt=$(date '+%d/%m/%Y %H:%M:%S');
SERVICE='httpd'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "$dt $SERVICE service running, everything is fine"
else
/sbin/service httpd start
fi
SERVICE='mysqld'
if ps ax | grep -v grep | grep $SERVICE > /dev/null
then
echo "$dt $SERVICE service running, everything is fine"
else
/sbin/service mysqld start
fi
if [ ! "$(docker ps -q -f id=ab2c8fdeb9db)" ]; then
# run your container
docker start ab2c8fdeb9db
echo "AUTORESTART docker elasticsearch"
else

echo "$dt docker elasticsearch is running, everything is fine"
fi

1.1 ใช้คำสั่งเปลี่ยนสิทธิ์การเข้าถึงไฟล์ bashscript

chmod +x /home/self-healing.sh

หมายเหตุ1 : สังเกตุว่าคำสั่ง service จะเป็น /sbin/service เพราะใน bashscript มองไม่เห็น ให้เราใช้คำสั่งเพื่อตรวจสอบ path ของ service command

whereis service

หมายเหตุ2 : หากต้องการตรวจสอบว่า มีไฟล์และมีข้อมูลในไฟล์ ให้ใช้คำสั่งนี้

if [ -s "$path_file" ]

2. แก้ไข crontab เพื่อให้ทำงาน bashscript

crontab -e

ตัวอย่างจะให้ทำงานทุกๆ 1 นาที และเขียน log แบบ replace (เครื่องหมาย > ตัวเดียว) หากใช้ 2 ตัว คือเขียนต่อไฟล์ (>>)

* * * * * sh /home/self-healing.sh>/home/self-healing.log

คำสั่งในการตรวจสอบว่า crontab ทำงานอะไรบ้าง

tail -f /var/log/cron

คำสั่งในการตรวจสอบว่า bashscript ทำงานอะไรบ้าง

tail -f /home/self-healing.log

ทดสอบแล้วทั้ง centos6 และ centos7

Posted in centos6, digitalocean | Leave a comment

การทำ Auto-start service หลังเครื่อง Boot เสร็จบน CentOS ด้วย bashscript

คีย์หลักที่ต้องรู้จักคือ rc.local คือไฟล์ระบบที่จะทำงานหลังจาก script ระบบอื่นๆรันเสร็จ

ดังนั้นเริ่มต้น ให้แก้ไข /etc/rc.local เพิ่มคำสั่งเพื่อทำการรัน bashscript หลังจากเครื่อง Boot เสร็จ

sh /home/autostart.sh

เพิ่มคำสั่งใน bashscript /home/autostart.sh ตัวอย่างให้ทำการรัน mysqld,httpd และ docker container

#!/bin/bash
service mysqld start
service httpd start
docker start your_container_name or your_container_id

เปลี่ยนสิทธิ์การเข้าถึงไฟล์ autostart.sh

chmod +x /home/autostart.sh

หลังจากเราใช้คำสั่ง reboot หรือกดปุ่ม Power off และ Power On จาก digitalocean service ที่เราต้องการก็จะรันเป็นที่เรียบร้อย

ทดสอบแล้วบน centos6 และ centos7

Posted in centos6, digitalocean | Leave a comment

Spring Cloud Netflix OSS Overview

Spring Cloud + Netflix OSS (Open Source Software)

  1. Spring Cloud Config – ช่วยทำหน้าที่ในการทำ centralized configuration ของระบบ โดยใน Spring Cloud จะเรียกว่า Spring Cloud Config ซึ่งเป็น Git-backed configuration server เก็บไฟล์ application.properties ลงบน git สามารถแก้และรีโหลดคอนฟิกโดยไม่ต้องรีรันโปรแกรมใหม่
  2. Spring Cloud Netflix Eureka – Service Discovery ตัวหนึ่ง สำหรับให้ service เข้ามา register แบ่งเป็น Zone ทำให้สามารถเรียกกันในแต่ละ service ด้วยชื่อ (serviceId) แทนที่จะเป็น URL
  3. Spring Cloud Netflix Zuul – ใช้ทำ Reverse Proxy (Route & Filter) สำหรับจัดการ URL ที่จะ provide ให้คนอื่นใช้งาน และจัดการเรียกข้างหลังด้วย serviceId ภายใน Service Discovery
  4. Spring Boot v.2.1+ ใช้ไม่ได้มี Bug อยู่ จะพบ error ‘the bean counterFactory cannot register bean’ ทดลองกับ v.2.0.8 ได้ปกติ

Reference : https://cloud.spring.io/spring-cloud-netflix/single/spring-cloud-netflix.html

Posted in Spring Cloud Netflix, spring boot | Leave a comment

java nested json convert

example nested json depth = 4

{
  "glossary": {
    "title": "example glossary",
    "GlossDiv": {
      "title": "S",
      "GlossList": {
        "GlossEntry": {
          "ID": "SGML",
          "SortAs": "SGML",
          "GlossTerm": "Standard Generalized Markup Language",
          "Acronym": "SGML",
          "Abbrev": "ISO 8879:1986",
          "GlossDef": {
            "para": "A meta-markup language, used to create markup languages such as DocBook.",
            "GlossSeeAlso": [
              "GML",
              "XML"
            ]
          },
          "GlossSee": "markup"
        }
      }
    }
  }
}
@RequestMapping(value = "json2",  method = { RequestMethod.GET})
    public @ResponseBody
    Map<String,Object> json2( @RequestParam Map<String,String> allRequestParams) throws Exception {
        String json = "{\"glossary\":{\"title\":\"example glossary\",\"GlossDiv\":{\"title\":\"S\",\"GlossList\":{\"GlossEntry\":{\"ID\":\"SGML\",\"SortAs\":\"SGML\",\"GlossTerm\":\"Standard Generalized Markup Language\",\"Acronym\":\"SGML\",\"Abbrev\":\"ISO 8879:1986\",\"GlossDef\":{\"para\":\"A meta-markup language, used to create markup languages such as DocBook.\",\"GlossSeeAlso\":[\"GML\",\"XML\"]},\"GlossSee\":\"markup\"}}}}}";
                //https://stackoverflow.com/questions/15474485/java-string-conversion-to-json-can-not-be-done
        json = json.replace("\\", "");

        Map<String,Object> map = new HashMap<String,Object>();
        ObjectMapper mapper = new ObjectMapper();

        map = mapper.readValue(json, new TypeReference<Map<String,Object>>(){});

        return map;
    }

Response
java nested json convert

Posted in java, spring boot | Leave a comment

org.json.JSONException: Missing value at 1 [character 2 line 1]

How to fix it?. just replace double quote of json string

@RequestMapping(value = "json",  method = { RequestMethod.GET})
    public @ResponseBody
    String json( @RequestParam Map<String,String> allRequestParams) throws Exception {
        String json = "{\\\"REQUEST_DATETIME\\\":\\\"REQUEST_DATETIME\\\",\\\"REQUEST_ID\\\":\\\"REQUEST_ID\\\",\\\"LOG_LEVEL\\\":\\\"LOG_LEVEL\\\",\\\"LOG_VERSION\\\":\\\"LOG_VERSION\\\",\\\"PROGRAMING_LANGUAGE\\\":\\\"PROGRAMING_LANGUAGE\\\",\\\"TAG_CATEGORY\\\":\\\"TAG_CATEGORY\\\",\\\"TAG_NAME\\\":\\\"TAG_NAME\\\",\\\"EVENT_ACTION\\\":\\\"EVENT_ACTION\\\",\\\"LOG_MESSAGE\\\":\\\"LOG_MESSAGE\\\",\\\"DATA_REQ\\\":\\\"DATA_REQ\\\",\\\"DATA_RES\\\":\\\"DATA_RES\\\",\\\"CLIENT_ID\\\":\\\"CLIENT_ID\\\",\\\"ACCESS_TOKEN\\\":\\\"ACCESS_TOKEN\\\",\\\"UID\\\":\\\"UID\\\",\\\"ACCOUNT\\\":\\\"ACCOUNT\\\",\\\"ACCOUNT_INFO\\\":\\\"ACCOUNT_INFO\\\",\\\"SERVER_REQ\\\":\\\"SERVER_REQ\\\",\\\"CLIENT_REQ\\\":\\\"CLIENT_REQ\\\",\\\"CLIENT_IP\\\":\\\"CLIENT_IP\\\",\\\"SERVER_IP\\\":\\\"SERVER_IP\\\",\\\"AGENT\\\":\\\"AGENT\\\",\\\"DEVICE_ID\\\":\\\"DEVICE_ID\\\"}";
        //https://stackoverflow.com/questions/15474485/java-string-conversion-to-json-can-not-be-done
        json = json.replace("\\", "");
        JSONObject j = new JSONObject(json);

        System.out.println(j);

        return "OK.";
    }
Posted in java, spring boot | Leave a comment