สถิติและการตรวจสอบสคริปต์ PHP แบบเรียลไทม์ ClickHouse และ Grafana มาช่วยเหลือ Pinba

ในบทความนี้ ฉันจะบอกวิธีใช้ pinba กับ clickhouse และ grafana แทน pinba_engine และ pinboard

ในโปรเจ็กต์ PHP pinba อาจเป็นวิธีเดียวที่เชื่อถือได้ในการทำความเข้าใจสิ่งที่เกิดขึ้นกับประสิทธิภาพ จริงอยู่ โดยปกติแล้ว pinba จะใช้เฉพาะเมื่อมีการสังเกตปัญหาแล้วเท่านั้น และยังไม่ชัดเจนว่า "จะขุดที่ไหน"

บ่อยครั้งไม่มีใครรู้ว่ามีการเรียกสคริปต์นี้หรือสคริปต์นั้นกี่ครั้งต่อวินาที/นาที และพวกเขาเริ่มเพิ่มประสิทธิภาพ "โดยการสัมผัส" โดยเริ่มจากตำแหน่งที่ดูเหมือนมีเหตุผลมากกว่า

บางคนวิเคราะห์บันทึก nginx ในขณะที่บางคนวิเคราะห์การสืบค้นฐานข้อมูลที่ช้า

แน่นอนว่าพินบาจะไม่ฟุ่มเฟือย แต่มีสาเหตุหลายประการที่ทำให้ทุกโครงการไม่มี

สถิติและการตรวจสอบสคริปต์ PHP แบบเรียลไทม์ ClickHouse และ Grafana มาช่วยเหลือ Pinba

และเหตุผลแรกคือการติดตั้ง

เพื่อให้ได้รับ "ไอเสีย" บางอย่างจากการนำ Pinba ไปใช้ไม่มากก็น้อย เป็นที่พึงปรารถนาอย่างยิ่งที่จะเห็นการวัดไม่เพียงแต่ในนาทีสุดท้ายเท่านั้น แต่ยังรวมถึงช่วงเวลาที่ยาวนานด้วย (จากวันเป็นเดือน)

สำหรับสิ่งนี้คุณต้องการ:

  • ติดตั้งส่วนขยายสำหรับ php (และคุณอาจต้องการโมดูลสำหรับ nginx)
  • ส่วนขยายการคอมไพล์สำหรับ mysql
  • ติดตั้งพินบอร์ดและกำหนดค่า cron

เนื่องจากข้อมูลจำนวนเล็กน้อยเกี่ยวกับ Pinba หลายคนจึงรู้สึกว่ามันใช้งานได้กับ PHP5 เท่านั้นและกลายเป็นอดีตไปนานแล้ว แต่อย่างที่เราจะได้เห็นในภายหลัง นี่ไม่ใช่กรณี

ขั้นตอนแรกนั้นง่ายที่สุด สิ่งที่คุณต้องทำคือรันคำสั่ง:

apt install php-pinba

ส่วนขยายนี้มีอยู่ในที่เก็บจนถึงและรวมถึง php 7.3 และคุณไม่จำเป็นต้องคอมไพล์อะไรเลย

หลังจากดำเนินการคำสั่งการติดตั้ง เราได้รับส่วนขยายการทำงานที่รวบรวมและส่งการวัดสำหรับแต่ละสคริปต์ (เวลาทำงาน หน่วยความจำ ฯลฯ) ในรูปแบบทันที โปรโตบุฟ ผ่าน udp เป็น 127.0.0.1:30002

จนถึงขณะนี้ยังไม่มีใครจับหรือประมวลผลแพ็กเก็ต UDP เหล่านี้ได้ แต่สิ่งนี้ไม่ได้ส่งผลเสียต่อความเร็วหรือความเสถียรของสคริปต์ PHP ของคุณแต่อย่างใด

จนกระทั่งเมื่อไม่นานมานี้ แอปพลิเคชั่นเดียวที่สามารถจับและประมวลผลแพ็กเก็ต UDP เหล่านี้ได้คือ pinba_engine. คำอธิบาย "เรียบง่ายและกระชับ" การติดตั้งทำให้ไม่อยากอ่านและเจาะลึกอีกครั้ง รายการการขึ้นต่อกันความยาวหนึ่งกิโลเมตรมีทั้งชื่อของแพ็คเกจและชื่อของโปรแกรมและลิงก์ไปยังแต่ละเพจที่มีการติดตั้ง และรายการเหล่านั้นมีลิงก์ของตนเองไปยังการขึ้นต่อกันอื่น ๆ ไม่มีใครมีเวลาหรือความปรารถนาที่จะจัดการกับเรื่องไร้สาระนี้

ขั้นตอนการติดตั้ง พินบา2 ไม่ได้ ง่ายขึ้นเป็นพิเศษ.

บางทีสักวันหนึ่งอาจเป็นไปได้ที่จะติดตั้ง pinba10 ด้วยคำสั่งหนึ่งหรือสองคำสั่ง และไม่ต้องอ่านเนื้อหามากมายเพื่อทำความเข้าใจวิธีการ แต่ตอนนี้ไม่เป็นเช่นนั้น

หากคุณติดตั้ง pinba_engine นี่เป็นเพียงครึ่งหนึ่งของการต่อสู้ ท้ายที่สุดแล้วไม่มี กระดานปักหมุด คุณจะต้องจำกัดตัวเองอยู่เพียงข้อมูลในช่วงไม่กี่นาทีที่ผ่านมา หรือคุณจะต้องรวบรวม จัดเก็บ และแสดงภาพข้อมูลด้วยตนเอง เป็นเรื่องดีที่พินบอร์ดค่อนข้างใช้งานง่าย การติดตั้ง.

ดูเหมือนว่าเหตุใดจึงต้องทนทุกข์ทรมานหากเมตริกทั้งหมดจาก php ถูกส่งไปยังพอร์ต udp ในรูปแบบ protobuf แล้วและสิ่งที่คุณต้องทำก็แค่เขียนแอปพลิเคชันที่จะจับพวกมันและนำไปไว้ในที่เก็บข้อมูลบางประเภท? เห็นได้ชัดว่านักพัฒนาที่คิดไอเดียนี้ขึ้นมานั่งลงทันทีเพื่อเขียนไอเดียของตัวเอง ซึ่งบางไอเดียก็ลงเอยที่ GitHub

ต่อไปนี้เป็นภาพรวมของโปรเจ็กต์โอเพ่นซอร์สสี่โปรเจ็กต์ที่บันทึกหน่วยวัดในพื้นที่จัดเก็บข้อมูล ซึ่งสามารถเรียกค้นและแสดงข้อมูลนี้ได้อย่างง่ายดาย เช่น การใช้กราฟาน่า

olegfedoseev/pinba-server (พฤศจิกายน 2017)

เซิร์ฟเวอร์ udp ขณะเดินทางซึ่งจะบันทึกการวัดลงใน OpenTSDB บางทีหากคุณใช้ OpenTSDB ในโปรเจ็กต์ของคุณอยู่แล้ว โซลูชันนี้อาจเหมาะกับคุณ ไม่เช่นนั้น ฉันขอแนะนำให้ผ่านเลย

olegfedoseev/pinba-influxdb (มิถุนายน 2018)

เซิร์ฟเวอร์ udp ขณะเดินทางจากที่เดียวกัน เบราว์เซอร์ซึ่งคราวนี้จะจัดเก็บเมตริกไว้ใน InfluxDB หลายโครงการใช้ InfluxDB ในการตรวจสอบอยู่แล้ว ดังนั้นโซลูชันนี้อาจเหมาะสำหรับพวกเขา

จุดเด่น:

  • InfluxDB ช่วยให้ รวมตัวชี้วัดที่ได้รับ และลบต้นฉบับหลังจากเวลาที่กำหนด

จุดด้อย:

ClickHouse-นินจา/โปรตอน (มกราคม 2019)

เซิร์ฟเวอร์ udp ขณะเดินทาง ซึ่งจะบันทึกการวัดใน ClickHouse นี่คือวิธีแก้ปัญหาของเพื่อนฉัน หลังจากที่ได้รู้จักกับมันแล้ว ฉันก็ตัดสินใจว่าถึงเวลาที่จะแข่งขันกับ Pinbu และ Clickhouse แล้ว

จุดเด่น:

  • Clickhouse เหมาะสำหรับงานดังกล่าว ช่วยให้คุณสามารถบีบอัดข้อมูลได้มากจนสามารถจัดเก็บข้อมูลดิบทั้งหมดได้แม้จะไม่มีการรวบรวมข้อมูล
  • หากจำเป็น คุณสามารถรวมเมตริกผลลัพธ์ได้อย่างง่ายดาย
  • เทมเพลตสำเร็จรูปสำหรับกราฟาน่า
  • บันทึกข้อมูลเกี่ยวกับตัวจับเวลา

จุดด้อย:

  • ข้อบกพร่องร้ายแรง
  • ไม่มีการกำหนดค่าที่คุณสามารถกำหนดค่าชื่อของฐานข้อมูลและตาราง ที่อยู่ และพอร์ตของเซิร์ฟเวอร์ได้
  • เมื่อจัดเก็บข้อมูลดิบ ตารางพจนานุกรมเสริมจะใช้ในการจัดเก็บหน้าและที่อยู่โดเมน ซึ่งจะทำให้การสืบค้นในภายหลังซับซ้อนขึ้น
  • สิ่งเล็กๆ น้อยๆ อื่นๆ ที่ตามมาตั้งแต่ลบตัวแรก

เซิร์ฟเวอร์ pinba / เซิร์ฟเวอร์ pinba (เมษายน 2019)

เซิร์ฟเวอร์ udp ใน php ซึ่งบันทึกการวัดใน ClickHouse นี่คือวิธีแก้ปัญหาของฉัน ซึ่งเป็นผลมาจากการทำความรู้จักกับ pinba, ClickHouse และ protobuf ในขณะที่ฉันกำลังแยกแยะกลุ่มทั้งหมดนี้ ฉันเขียน "ข้อพิสูจน์แนวคิด" ซึ่งโดยไม่คาดคิดสำหรับฉัน ไม่ได้ใช้ทรัพยากรจำนวนมาก (RAM 30 MB และน้อยกว่า 1% ของหนึ่งในแปดแกนประมวลผล) ดังนั้นฉันจึง ตัดสินใจแบ่งปันกับสาธารณะ

ข้อดีเหมือนกับโซลูชันก่อนหน้า ฉันยังใช้ชื่อปกติจาก pinba_engine ดั้งเดิมด้วย ฉันยังเพิ่มการกำหนดค่าที่ช่วยให้คุณสามารถเปิดใช้งานอินสแตนซ์เซิร์ฟเวอร์ pinbase หลายรายการพร้อมกันเพื่อบันทึกหน่วยวัดในตารางที่แตกต่างกัน สิ่งนี้มีประโยชน์หากคุณต้องการรวบรวมข้อมูลไม่เพียง แต่จาก php แต่ยังจาก nginx ด้วย
ข้อเสีย - "ข้อบกพร่องร้ายแรง" และสิ่งเล็ก ๆ น้อย ๆ เหล่านั้นที่ไม่เหมาะกับคุณเป็นการส่วนตัว แต่วิธีแก้ปัญหาของฉันคือ "ง่ายเหมือนรองเท้าแตะ" และประกอบด้วยโค้ดเพียงประมาณ 100 บรรทัดดังนั้นนักพัฒนา PHP ทุกคนสามารถเปลี่ยนสิ่งที่เขาไม่ชอบได้ ภายในไม่กี่นาที

หลักการของการดำเนินงาน

ฟังพอร์ต UDP 30002 แล้ว แพ็กเก็ตขาเข้าทั้งหมดจะถูกถอดรหัสตามโครงร่าง protobuf และรวมเข้าด้วยกัน นาทีละครั้ง แพ็กเก็ตจะถูกแทรกเข้าไปในคลิกเฮาส์ในตาราง pinba.requests (พารามิเตอร์ทั้งหมดได้รับการกำหนดค่าใน กำหนดค่า)

เล็กน้อยเกี่ยวกับคลิกเฮาส์

Clickhouse รองรับเครื่องมือจัดเก็บข้อมูลที่แตกต่างกัน หนึ่งที่ใช้กันมากที่สุดคือ MergeTree

หาก ณ จุดหนึ่งคุณตัดสินใจที่จะจัดเก็บข้อมูลรวมไว้ตลอดเวลา และข้อมูลดิบเฉพาะสำหรับข้อมูลสุดท้าย คุณสามารถสร้างมุมมองที่เป็นรูปธรรมด้วยการจัดกลุ่ม และล้างตาราง pinba.requests หลักเป็นระยะ ในขณะที่ข้อมูลทั้งหมดจะยังคงอยู่ใน มุมมองที่เป็นรูปธรรม ยิ่งกว่านั้นเมื่อสร้างตาราง pinba.requests คุณสามารถระบุ "engine = Null" จากนั้นข้อมูลดิบจะไม่ถูกบันทึกลงในดิสก์เลยและในขณะเดียวกันก็จะยังคงอยู่ในมุมมองที่เป็นรูปธรรมและจะถูกบันทึกแบบรวม . ฉันใช้รูปแบบนี้สำหรับตัววัด nginx เนื่องจากใน nginx ฉันมีคำขอมากกว่า php ถึง 50 เท่า

คุณมาไกลมากแล้วและฉันไม่อยากทิ้งคุณไว้ครึ่งทาง ดังนั้นสิ่งที่ตามมาคือคำอธิบายโดยละเอียดเกี่ยวกับการติดตั้งและการกำหนดค่าโซลูชันของฉันและทุกสิ่งที่คุณต้องการ รวมถึงข้อผิดพลาดที่ทำให้เกิดเรือมากกว่าหนึ่งลำ ที่จะพัง กระบวนการติดตั้งทั้งหมดอธิบายไว้สำหรับ Ubuntu 18.04 LTS และ Centos 7 กระบวนการอาจแตกต่างกันเล็กน้อยในรุ่นและรุ่นอื่นๆ

การติดตั้ง

ฉันใส่คำสั่งที่จำเป็นทั้งหมดลงไป ไฟล์นักเทียบท่า เพื่ออำนวยความสะดวกในการทำซ้ำคำแนะนำ เราจะอธิบายเฉพาะข้อผิดพลาดด้านล่างเท่านั้น

php-pinba.php

หลังการติดตั้ง ตรวจสอบให้แน่ใจว่าในไฟล์ /etc/php/7.2/fpm/conf.d/20-pinba.ini คุณได้ยกเลิกการใส่เครื่องหมายข้อคิดเห็นตัวเลือกทั้งหมดแล้ว ในการแจกแจงบางอย่าง (เช่น centos) พวกเขาอาจถูกใส่ความคิดเห็น

extension=pinba.so
pinba.enabled=1
pinba.server=127.0.0.1:30002

คลิกเฮาส์

ระหว่างการติดตั้ง Clickhouse จะขอให้คุณตั้งรหัสผ่านสำหรับผู้ใช้เริ่มต้น ตามค่าเริ่มต้น ผู้ใช้รายนี้สามารถเข้าถึงได้จาก IP ทั้งหมด ดังนั้นหากคุณไม่มีไฟร์วอลล์บนเซิร์ฟเวอร์ของคุณ โปรดแน่ใจว่าได้ตั้งรหัสผ่านแล้ว ซึ่งสามารถทำได้หลังการติดตั้งในไฟล์ /etc/clickhouse-server/users.xml

นอกจากนี้ ยังเป็นที่น่าสังเกตว่า Clickhouse ใช้พอร์ตหลายพอร์ต รวมถึง 9000 พอร์ตนี้ยังใช้สำหรับ php-fpm ในบางรูปแบบ (เช่น centos) หากคุณใช้พอร์ตนี้อยู่แล้ว คุณสามารถเปลี่ยนเป็นพอร์ตอื่นได้ในไฟล์ /etc/clickhouse-server/config.xml

Grafana พร้อมปลั๊กอิน Clickhouse

หลังจากติดตั้ง Grafana ให้ใช้ผู้ดูแลระบบเข้าสู่ระบบและผู้ดูแลระบบรหัสผ่าน เมื่อคุณเข้าสู่ระบบเป็นครั้งแรก Grafana จะขอให้คุณตั้งรหัสผ่านใหม่

จากนั้นไปที่เมนู “+” -> นำเข้า และระบุหมายเลขแดชบอร์ดที่จะนำเข้า 10011. ฉันได้เตรียมและอัปโหลดแดชบอร์ดนี้เพื่อที่คุณจะได้ไม่ต้องทำเองอีก

Grafana รองรับการทำงานกับ clickhouse ผ่านปลั๊กอินของบุคคลที่สาม แต่ Grafana ไม่มีการแจ้งเตือนสำหรับปลั๊กอินของบุคคลที่สาม (มีตั๋วสำหรับสิ่งนี้มาหลายปีแล้ว)

เซิร์ฟเวอร์ pinba

การติดตั้ง protobuf และ libevent เป็นทางเลือก แต่จะปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์ pinba หากคุณติดตั้ง pinba-server ในโฟลเดอร์อื่นที่ไม่ใช่ /opt คุณจะต้องแก้ไขด้วย สคริปต์ systemd ไฟล์.

โมดูล pinba สำหรับ nginx

ในการคอมไพล์โมดูล คุณต้องมีซอร์สโค้ดของ nginx เวอร์ชันเดียวกันที่ติดตั้งไว้แล้วบนเซิร์ฟเวอร์ของคุณ รวมถึงตัวเลือกการคอมไพล์เดียวกัน มิฉะนั้นการสร้างจะสำเร็จ แต่เมื่อเชื่อมต่อโมดูลจะมีข้อผิดพลาดเกิดขึ้น “โมดูลไม่รองรับไบนารี” ตัวเลือกการคอมไพล์สามารถดูได้โดยใช้คำสั่ง nginx -V

เคล็ดลับชีวิต

เว็บไซต์ทั้งหมดของฉันใช้งานได้บน https เท่านั้น ฟิลด์สคีมาไม่มีความหมาย ดังนั้นฉันจึงใช้ฟิลด์นี้เพื่อแยกเว็บ/คอนโซล

ในสคริปต์ที่สามารถเข้าถึงได้จากเว็บฉันใช้:

if (ini_get('pinba.enabled')) {
    pinba_schema_set('web');
}

และในสคริปต์คอนโซล (เช่น สคริปต์ cron):

if (ini_get('pinba.enabled')) {
    pinba_schema_set('console');
}

ในแดชบอร์ดของฉันใน Grafana มีสวิตช์เว็บ/คอนโซลสำหรับการดูสถิติแยกกัน

คุณยังสามารถส่งแท็กของคุณไปที่ Pinba ได้ เช่น:

pinba_tag_set('country', $countryCode);

นั่นคือทั้งหมดที่

กรุณาตอบแบบสำรวจด้านล่างบทความ

ตามปกติ ฉันขอเตือนคุณว่าฉันไม่แนะนำหรือช่วยเหลือผ่านข้อความส่วนตัวบน Habr และโซเชียลเน็ตเวิร์ก

สร้างตั๋วบน Github

ฝากสนับสนุนด้วยการกดไลค์ด้วย ฉบับภาษาอังกฤษ ของบทความนี้ บนเรดดิท.

เฉพาะผู้ใช้ที่ลงทะเบียนเท่านั้นที่สามารถเข้าร่วมในการสำรวจได้ เข้าสู่ระบบ, โปรด.

คุณใช้ระบบปฏิบัติการอะไรบนเซิร์ฟเวอร์?

  • อูบุนตู

  • CentOS

  • debian

  • Gentoo

  • หมวกสีแดง

  • Fedora

  • OpenSUSE

  • สวิตเซอร์แลนด์

  • ยูนิกซ์

  • Windows

  • อื่น ๆ

ผู้ใช้ 114 คนโหวต ผู้ใช้ 11 รายงดออกเสียง

คุณใช้ php เวอร์ชันใดบนเซิร์ฟเวอร์?

  • 7.3

  • 7.2

  • 7.1

  • 7.0

  • 5

  • อื่น ๆ

ผู้ใช้ 105 คนโหวต ผู้ใช้ 17 รายงดออกเสียง

คุณเคยใช้พินบาหรือไม่?

  • ใช่

  • ไม่ แต่ฉันอยากทำ

  • ไม่ และฉันก็ไม่อยากทำ

  • ไม่และไม่เคยได้ยินเกี่ยวกับเธอเลย

ผู้ใช้ 100 คนโหวต ผู้ใช้ 14 รายงดออกเสียง

คุณต้องการลองใช้เซิร์ฟเวอร์ Pinba เวอร์ชันใด

  • pinba_engine (เอ็นจิ้น mysql)

  • pinba2 (เอ็นจิ้น mysql)

  • พินบอร์ด (php + mysql)

  • olegfedoseev/pinba-เซิร์ฟเวอร์ (go + OpenTSDB)

  • olegfedoseev/pinba-influxdb (ไป + influxdb)

  • เซิร์ฟเวอร์ pinba / เซิร์ฟเวอร์ pinba (go + clickhouse)

  • เซิร์ฟเวอร์ pinba / เซิร์ฟเวอร์ pinba (php + clickhouse)

  • ฉันจะเขียนของฉันเอง

  • อื่น ๆ

ผู้ใช้ 39 คนโหวต ผู้ใช้ 47 รายงดออกเสียง

ที่มา: will.com

เพิ่มความคิดเห็น