ในบทความนี้ ฉันจะบอกวิธีใช้ pinba กับ clickhouse และ grafana แทน pinba_engine และ pinboard
ในโปรเจ็กต์ PHP pinba อาจเป็นวิธีเดียวที่เชื่อถือได้ในการทำความเข้าใจสิ่งที่เกิดขึ้นกับประสิทธิภาพ จริงอยู่ โดยปกติแล้ว pinba จะใช้เฉพาะเมื่อมีการสังเกตปัญหาแล้วเท่านั้น และยังไม่ชัดเจนว่า "จะขุดที่ไหน"
บ่อยครั้งไม่มีใครรู้ว่ามีการเรียกสคริปต์นี้หรือสคริปต์นั้นกี่ครั้งต่อวินาที/นาที และพวกเขาเริ่มเพิ่มประสิทธิภาพ "โดยการสัมผัส" โดยเริ่มจากตำแหน่งที่ดูเหมือนมีเหตุผลมากกว่า
บางคนวิเคราะห์บันทึก nginx ในขณะที่บางคนวิเคราะห์การสืบค้นฐานข้อมูลที่ช้า
แน่นอนว่าพินบาจะไม่ฟุ่มเฟือย แต่มีสาเหตุหลายประการที่ทำให้ทุกโครงการไม่มี
เพื่อให้ได้รับ "ไอเสีย" บางอย่างจากการนำ Pinba ไปใช้ไม่มากก็น้อย เป็นที่พึงปรารถนาอย่างยิ่งที่จะเห็นการวัดไม่เพียงแต่ในนาทีสุดท้ายเท่านั้น แต่ยังรวมถึงช่วงเวลาที่ยาวนานด้วย (จากวันเป็นเดือน)
สำหรับสิ่งนี้คุณต้องการ:
- ติดตั้งส่วนขยายสำหรับ php (และคุณอาจต้องการโมดูลสำหรับ nginx)
- ส่วนขยายการคอมไพล์สำหรับ mysql
- ติดตั้งพินบอร์ดและกำหนดค่า cron
เนื่องจากข้อมูลจำนวนเล็กน้อยเกี่ยวกับ Pinba หลายคนจึงรู้สึกว่ามันใช้งานได้กับ PHP5 เท่านั้นและกลายเป็นอดีตไปนานแล้ว แต่อย่างที่เราจะได้เห็นในภายหลัง นี่ไม่ใช่กรณี
ขั้นตอนแรกนั้นง่ายที่สุด สิ่งที่คุณต้องทำคือรันคำสั่ง:
apt install php-pinba
ส่วนขยายนี้มีอยู่ในที่เก็บจนถึงและรวมถึง php 7.3 และคุณไม่จำเป็นต้องคอมไพล์อะไรเลย
หลังจากดำเนินการคำสั่งการติดตั้ง เราได้รับส่วนขยายการทำงานที่รวบรวมและส่งการวัดสำหรับแต่ละสคริปต์ (เวลาทำงาน หน่วยความจำ ฯลฯ) ในรูปแบบทันที
จนถึงขณะนี้ยังไม่มีใครจับหรือประมวลผลแพ็กเก็ต UDP เหล่านี้ได้ แต่สิ่งนี้ไม่ได้ส่งผลเสียต่อความเร็วหรือความเสถียรของสคริปต์ PHP ของคุณแต่อย่างใด
จนกระทั่งเมื่อไม่นานมานี้ แอปพลิเคชั่นเดียวที่สามารถจับและประมวลผลแพ็กเก็ต UDP เหล่านี้ได้คือ
ขั้นตอนการติดตั้ง
บางทีสักวันหนึ่งอาจเป็นไปได้ที่จะติดตั้ง pinba10 ด้วยคำสั่งหนึ่งหรือสองคำสั่ง และไม่ต้องอ่านเนื้อหามากมายเพื่อทำความเข้าใจวิธีการ แต่ตอนนี้ไม่เป็นเช่นนั้น
หากคุณติดตั้ง pinba_engine นี่เป็นเพียงครึ่งหนึ่งของการต่อสู้ ท้ายที่สุดแล้วไม่มี
ดูเหมือนว่าเหตุใดจึงต้องทนทุกข์ทรมานหากเมตริกทั้งหมดจาก php ถูกส่งไปยังพอร์ต udp ในรูปแบบ protobuf แล้วและสิ่งที่คุณต้องทำก็แค่เขียนแอปพลิเคชันที่จะจับพวกมันและนำไปไว้ในที่เก็บข้อมูลบางประเภท? เห็นได้ชัดว่านักพัฒนาที่คิดไอเดียนี้ขึ้นมานั่งลงทันทีเพื่อเขียนไอเดียของตัวเอง ซึ่งบางไอเดียก็ลงเอยที่ GitHub
ต่อไปนี้เป็นภาพรวมของโปรเจ็กต์โอเพ่นซอร์สสี่โปรเจ็กต์ที่บันทึกหน่วยวัดในพื้นที่จัดเก็บข้อมูล ซึ่งสามารถเรียกค้นและแสดงข้อมูลนี้ได้อย่างง่ายดาย เช่น การใช้กราฟาน่า
olegfedoseev/pinba-server (พฤศจิกายน 2017)
เซิร์ฟเวอร์ udp ขณะเดินทางซึ่งจะบันทึกการวัดลงใน OpenTSDB บางทีหากคุณใช้ OpenTSDB ในโปรเจ็กต์ของคุณอยู่แล้ว โซลูชันนี้อาจเหมาะกับคุณ ไม่เช่นนั้น ฉันขอแนะนำให้ผ่านเลย
olegfedoseev/pinba-influxdb (มิถุนายน 2018)
เซิร์ฟเวอร์ udp ขณะเดินทางจากที่เดียวกัน
จุดเด่น:
- 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 จะขอให้คุณตั้งรหัสผ่านใหม่
จากนั้นไปที่เมนู “+” -> นำเข้า และระบุหมายเลขแดชบอร์ดที่จะนำเข้า
Grafana รองรับการทำงานกับ clickhouse ผ่านปลั๊กอินของบุคคลที่สาม แต่ Grafana ไม่มีการแจ้งเตือนสำหรับปลั๊กอินของบุคคลที่สาม (มีตั๋วสำหรับสิ่งนี้มาหลายปีแล้ว)
เซิร์ฟเวอร์ pinba
การติดตั้ง protobuf และ libevent เป็นทางเลือก แต่จะปรับปรุงประสิทธิภาพของเซิร์ฟเวอร์ pinba หากคุณติดตั้ง pinba-server ในโฟลเดอร์อื่นที่ไม่ใช่ /opt คุณจะต้องแก้ไขด้วย
โมดูล 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