Raspberry Pi

Raspberry Pi Güvenilirliği: Bir Pi'yi IoT Gateway Olarak 7/24 Çalıştırmak

Bir Raspberry Pi MQTT gateway'i aylarca çalışır tutmak için pratik rehber: depolama yıpranması, salt okunur dosya sistemleri, güç, soğutma, donanım ve yazılım watchdog'ları ve uzaktan sağlık izleme.

SSD ve kararlı güç kaynağıyla bir dolaptaki Raspberry Pi gateway, 7/24 çalışma için raspberry pi güvenilirliğini gösteriyor
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Raspberry Pi güvenilirliğini sınırlayan nadiren kartın kendisidir; asıl sınırlayıcılar SD kart, güç kaynağı, ısı ve takıldığında kimsenin yeniden başlatmadığı yazılımdır. Bu rehber, bir Pi'yi masa üstü bir projeden aylarca gözetimsiz çalışan bir MQTT gateway'e dönüştüren değişiklikleri adım adım anlatır: depolama yazmalarını azaltmak, salt okunur bir kök dosya sistemi kullanmak, güç ve soğutma seçmek, watchdog'ları etkinleştirmek ve cihazı MQTT üzerinden uzaktan izlemek. Her bölüm, uygulamak için gereken komutları içerir.

Sürekli Açık Pi'ler Neden Arızalanır

Sahadaki bir Pi gateway sessizleştiğinde, neden genellikle birkaç kategoriden birine girer:

Arıza Tipik belirti Kök neden
Depolama bozulması Acil durum kabuğuna açılma, salt okunur yeniden bağlama, eksik dosyalar Yıpranmış SD kart veya yazma sırasında güç kaybı
Düşük voltaj Rastgele yeniden başlatmalar, kopan USB cihazları, Wi-Fi sıfırlanmaları Zayıf kaynak, uzun veya ince kablo, güce aç çevre birimleri
Aşırı ısınma Yavaşlamalar, kısma (throttling), düzensiz davranış Kapalı bir muhafazada soğutma yok
Yazılım takılması Cihaz ping'e yanıt veriyor ama veri duruyor Takılan betik, kilitlenme, bellek sızıntısı, ağ yığını sorunu
Ağ kaybı Veri boşluğu, ardından birikmiş verinin kaybı Wi-Fi kopması, modem yeniden başlatması, hücresel kesinti

İyi haber şu ki bunların her birinin iyi bilinen bir çözümü vardır. Hiçbiri egzotik donanım gerektirmez ve çoğu birkaç satırlık yapılandırmadır.

Depolama: Yazmaları Azaltın veya Ortamı Değiştirin

SD kartların yazma dayanıklılığı sınırlıdır ve güç kaybına karşı korumaları zayıftır. Ayrıntılı günlük tutan, bir veritabanına yazan ve journald'ın günlükleri kalıcı tutmasına izin veren bir gateway, ucuz bir kartı şaşırtıcı derecede hızlı yıpratabilir. Birbirini tamamlayan üç çözüm vardır.

Daha iyi depolama kullanın. Bir Raspberry Pi 4 veya 5 USB SSD'den açılabilir; Pi 5 ayrıca M.2 HAT+ üzerinden NVMe sürücüleri de destekler. Her ikisi de yazmaları SD kartlardan çok daha iyi kaldırır. SD kullanmak zorundaysanız, sürekli kayıt için tasarlanmış saygın bir yüksek dayanıklılıklı kart seçin.

Gereksiz yazmaları kesin. Günlükleri RAM'de tutun, ihtiyacınız yoksa swap'ı devre dışı bırakın ve noatime ile bağlayın:

# journald in RAM only (logs are lost on reboot, so forward important ones)
sudo mkdir -p /etc/systemd/journald.conf.d
printf "[Journal]\nStorage=volatile\nRuntimeMaxUse=30M\n" | sudo tee /etc/systemd/journald.conf.d/volatile.conf
sudo systemctl restart systemd-journald

# disable the swap file
sudo systemctl disable --now dphys-swapfile 2>/dev/null || true

# check the root mount options include noatime
findmnt /

Bilinçli yazın. Gateway'iniz çevrimdışıyken mesajları diske arabelleğe alıyorsa, Python'da çevrimdışı MQTT arabelleği eğitiminde olduğu gibi yazmaları toplu yapın ve SQLite'ı WAL modunda kullanın. Bir JSON durum dosyasını her saniye yeniden yazmaktan kaçının.

Salt Okunur Kök Dosya Sistemi

Yazılımını sık değiştirmesi gerekmeyen gateway'ler için salt okunur bir kök dizin, bozulmaya karşı en güçlü korumadır. Raspberry Pi OS bir overlay dosya sistemi seçeneği içerir: gerçek kök salt okunur kalır ve tüm değişiklikler yeniden başlatmada kaybolan bir RAM katmanına gider.

sudo raspi-config nonint enable_overlayfs
sudo reboot
# later, to update software:
sudo raspi-config nonint disable_overlayfs
sudo reboot

Bunu raspi-config içindeki Performance Options altından etkileşimli olarak da etkinleştirebilirsiniz. İki sonucu planlayın. Birincisi, gateway'in saklaması gereken her şey (yapılandırma değişiklikleri, bir mesaj arabelleği) ayrı bir yazılabilir bölüme veya harici sürücüye ihtiyaç duyar. İkincisi, güncellemeler bir bakım yeniden başlatma döngüsü gerektirir; bu yüzden onu otomatikleştirin veya belgeleyin.

Güç: En Çok Hafife Alınan Faktör

Düşük voltaj, diğer tüm donanım sorunlarından daha fazla gizemli davranışa yol açar. Modelinizin resmi güç kaynağını veya pay bırakan endüstriyel bir kaynak kullanın: Raspberry Pi 5, 5 V 5 A USB-C kaynak için, Pi 4 ise 5,1 V 3 A için tasarlanmıştır. Kabloları kısa ve kalın tutun; çok güç çeken USB sürücüleri veya modemleri harici beslemeli bir hub'dan besleyin.

Pi'nin açılıştan bu yana hiç düşük voltaj veya kısma yaşayıp yaşamadığını kontrol edin:

vcgencmd get_throttled

İstediğiniz sonuç throttled=0x0'dır. Bit 0 (0x1) şu anda düşük voltaj olduğunu, bit 16 (0x10000) açılıştan bu yana düşük voltaj yaşandığını gösterir; bit 2 ve 18 ise kısmayı bildirir. Sorunları arızaya yol açmadan önce görebilmek için bu değeri MQTT üzerinden yayınlayın.

Şebekesi güvenilmez sahalar için küçük bir UPS HAT veya bir DC UPS, Pi'ye temiz biçimde kapanması için zaman tanır. Birkaç saniyelik tutma süresi bile dosya sistemini ani bir kesintiye göre çok daha iyi korur.

Isı ve Muhafazalar

Pi ısındığında CPU'sunu kısar; bu donanımı korur ama uygulamanızı yavaşlatır. Güneş altındaki kapalı bir plastik kutuda Pi, az bir yükle bile bu noktaya ulaşabilir. Soğutuculu bir kasa veya Pi 5'te resmi Active Cooler kullanın, muhafazaları havalandırın ve Pi'yi diğer ısı kaynaklarından uzak tutun. Sıcaklığı vcgencmd measure_temp ile okuyun ve sağlık mesajlarınıza ekleyin.

Watchdog'lar: Sahaya Gitmeden Kurtarma

Bir watchdog, yazılım yanıt vermeyi bıraktığında sistemi yeniden başlatır. İki katman kullanın.

systemd üzerinden donanım watchdog'u. Pi'nin SoC'si, systemd'nin besleyebileceği bir watchdog zamanlayıcısı içerir. Çekirdek veya systemd'nin kendisi takılırsa kart yeniden başlar.

sudo mkdir -p /etc/systemd/system.conf.d
printf "[Manager]\nRuntimeWatchdogSec=15\nRebootWatchdogSec=2min\n" | sudo tee /etc/systemd/system.conf.d/watchdog.conf
sudo systemctl daemon-reexec
dmesg | grep -i watchdog

Uygulama watchdog'u. Takılan bir Python süreci donanım watchdog'unu tetiklemez, çünkü systemd hâlâ sağlıklıdır. Gateway'i Restart=always ile bir systemd servisi olarak çalıştırın ve (yalnızca çökmeler için değil) takılmalar için WatchdogSec= ile Type=notify kullanın: betik düzenli olarak bir heartbeat göndermelidir, aksi halde systemd onu sonlandırıp yeniden başlatır.

import os
import socket


def sd_notify(state: str):
    addr = os.getenv("NOTIFY_SOCKET")
    if not addr:
        return
    if addr.startswith("@"):
        addr = "\0" + addr[1:]
    with socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM) as s:
        s.connect(addr)
        s.sendall(state.encode())

# after MQTT connects:      sd_notify("READY=1")
# in the main loop, only when work is actually progressing:
#                           sd_notify("WATCHDOG=1")

WATCHDOG=1 mesajını yalnızca döngü gerçekten sağlıklıyken gönderin, örneğin başarılı bir okuma ve yayından sonra. Bunu her zaman çalışan ayrı bir iş parçacığından göndermek amacı boşa çıkarır. Tam birim dosyası Python MQTT betiğini açılışta çalıştırma rehberinde yer alır.

Ağ Dayanıklılığı

Bağlantı kopmaları istisna değil, olağandır. Bunlar için tasarım yapın:

  1. paho-mqtt'nin reconnect_delay_set(1, 60) ve connect_async() ile otomatik olarak yeniden bağlanmasına izin verin.
  2. Bağlantı yokken okumaları yerel olarak arabelleğe alın ve sırasıyla yeniden oynatın.
  3. Yeniden oynatılan verinin doğru zamana yerleşmesi için her payload'a bir zaman damgası ekleyin.
  4. Gateway kaybolduğunda arka ucun bunu bilmesi için retained bir status topic'inde Last Will mesajı kullanın.
  5. Mümkün olduğunda Wi-Fi yerine Ethernet'i tercih edin; Wi-Fi'de kopmalar görürseniz güç tasarrufunu sudo iw dev wlan0 set power_save off ile devre dışı bırakın.

MQTT Üzerinden Uzaktan Sağlık İzleme

Göremediğiniz şeyi düzeltemezsiniz. Her gateway'in her dakika küçük bir sağlık mesajı yayınlamasını sağlayın: çalışma süresi, CPU sıcaklığı, kısma bayrakları, boş disk, arabellek derinliği ve yazılım sürümü. MQTT üzerinden Raspberry Pi sistem istatistikleri eğitimi eksiksiz bir yayıncı gösterir. Ortada bir bulut MQTT broker olduğunda tüm filoyu tek bir yerden izleyebilirsiniz; ConnectMQ eşik uyarı kuralları da sıcaklığı veya arabellek derinliği bir sınırı aşan bir gateway'i işaretleyebilir. Retained Last Will durumu ve broker'ın $SYS/broker/connection/{clientId}/state topic'i, şu anda hangi cihazların çevrimiçi olduğunu size söyler.

Güvenilirlik Kontrol Listesi

  1. SSD veya NVMe'den açın ya da yüksek dayanıklılıklı bir SD kart kullanın.
  2. Günlükler RAM'de, swap devre dışı, kök bağlamada noatime.
  3. Kararlı kurulumlar için salt okunur overlay etkin.
  4. Resmi veya endüstriyel güç kaynağı; get_throttled değeri 0x0 dönüyor.
  5. Soğutucu veya aktif soğutma; sıcaklık izleniyor.
  6. systemd'de donanım watchdog'u etkin.
  7. Gateway, Restart=always ve bir uygulama watchdog'uyla systemd servisi olarak çalışıyor.
  8. Otomatik MQTT yeniden bağlanma, çevrimdışı arabellek ve Last Will yapılandırılmış.
  9. Sağlık metrikleri her dakika yayınlanıyor ve uyarılarla izleniyor.
  10. Güvenli Raspberry Pi IoT kontrol listesine uygun olarak sıkılaştırılmış işletim sistemi ve TLS bağlantıları.

Birlikte uygulandığında bu adımlar yaygın arıza türlerini ortadan kaldırır ve geriye kalan nadir olanları uzaktan kurtarılabilir hale getirir. Bir Pi'yi broker'a bağlamanın temelleri için Raspberry Pi MQTT eğitimi ile başlayın; modele özgü güç ve açılış ayrıntıları için resmi Raspberry Pi dokümantasyonuna bakın.

Sunucu Tarafını ConnectMQ ile Güvenilir Tutun

Hiç arızalanmayan bir gateway bile, konuştuğu broker arızalanırsa veri kaybeder. ConnectMQ gibi tamamen yönetilen bir MQTT hizmeti broker'ı üstlenir; böylece siz uç tarafa odaklanabilirsiniz. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun, gateway'inizi 8883 portunda TLS üzerinden bağlayın ve sağlık topic'lerini canlı topic gezgininde izleyin.

Sık Sorulan Sorular

Bir Raspberry Pi gateway'de SD kart ne kadar dayanır?

Bu tamamen yazma yüküne ve kart kalitesine bağlıdır. Yazmaları azaltmak ve yüksek dayanıklılıklı bir kart veya SSD kullanmak ömrü önemli ölçüde uzatır; yoğun günlükleme ise ucuz bir kartı hızla yıpratabilir.

Salt okunur bir dosya sistemi MQTT istemcimi bozar mı?

İstemcinin yalnızca kodunu ve yapılandırmasını okuması gerekiyorsa hayır. Çevrimdışı arabellek gibi kalıcı tutması gereken her şey ayrı bir yazılabilir konuma ihtiyaç duyar.

Bir Raspberry Pi için UPS gerekir mi?

Her zaman değil, ancak gücün kararsız olduğu yerlerde değerlidir. Temiz bir kapanış dosya sistemini korur; salt okunur bir kök de güç habersiz kesildiğinde hasarı azaltır.

Düzenli yeniden başlatmalar planlamalı mıyım?

Planlı yeniden başlatmalar sorunları düzeltmek yerine gizler. Watchdog'lar artı sağlık izleme daha iyidir, ancak bir sızıntıyı araştırırken haftalık yeniden başlatma pragmatik bir geri dönüş planıdır.

İlgili yazılar

RC522 Okuyucu ile Raspberry Pi RFID MQTT Erişim Kaydı

Bir RC522 RFID okuyucuyu Raspberry Pi'ye bağlayın, etiketleri Python ile okuyun, yerel bir izin listesiyle karşılaştırın ve her erişim denemesini kayıt araçlarının, panellerin ve uyarı araçlarının tüketebileceği bir MQTT olayı olarak yayınlayın.

6 dk okuma

Python ve Bleak ile Raspberry Pi BLE'den MQTT'ye Köprü

Raspberry Pi'nin dahili Bluetooth'unu, bleak kütüphanesini ve paho-mqtt'yi kullanarak BLE sensör yayın paketlerini tarayın, sıcaklık ve nemi çözün ve hız sınırlı ölçümleri MQTT'ye yayınlayın.

6 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.