VMware vCenter Server Appliance (VCSA) sanallaştırma altyapısının merkezi yönetimini sağlayan kritik bir bileşendir.
VMware vCenter’ın düzgün çalışabilmesi için arka planda çalışan vPostgres veritabanı servisinin sağlıklı olması gerekir. Ancak bazı durumlarda bu servis başlatılamaz ve sistem yöneticisi aşağıdaki türde kritik bir hata mesajıyla karşılaşır.
PANIC: replication slot file "pg_replslot/vpg_archiver/state" has wrong magic number
/var/log/vmware/vmon/vmon.log
YYYY-MM-DD-THH:MM:SS In(05) host-XXXX Received start request for vmware-vpostgres
YYYY-MM-DD-THH:MM:SS In(05) host-XXXX <vmware-vpostgres-prestart> Constructed command: /opt/vmware/vpostgres/current/scripts/pg_pre_start
YYYY-MM-DD-THH:MM:SS Wa(03) host-XXXX <vmware-vpostgres> Service pre-start command's stderr: Issuing signal KILL on all PostgreSQL processes owned by OS user vpostgres
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX Traceback (most recent call last):
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX File "/opt/vmware/vpostgres/13/share/python-modules/vpostgres_cis/telemetry.py", line 247, in pushdata
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX response = urllib.request.urlopen(request)
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX File "/usr/lib/python3.7/urllib/request.py", line 222, in urlopen
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX return opener.open(url, data, timeout)
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX File "/usr/lib/python3.7/urllib/request.py", line 531, in open
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX response = meth(req, response)
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX File "/usr/lib/python3.7/urllib/request.py", line 641, in http_response
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX 'http', request, response, code, msg, hdrs)
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX File "/usr/lib/python3.7/urllib/request.py", line 569, in error
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX return self._call_chain(*args)
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX File "/usr/lib/python3.7/urllib/request.py", line 503, in _call_chain
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX result = func(*args)
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX File "/usr/lib/python3.7/urllib/request.py", line 649, in http_error_default
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX raise HTTPError(req.full_url, code, msg, hdrs, fp)
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX urllib.error.HTTPError: HTTP Error 503: Service Unavailable
YYYY-MM-DD-THH:MM:SS Wa(03) host-XXXX <vmware-vpostgres> Service pre-start command's stderr: yyyy-mm-ddThh:mm:ss.153Z Failed to push telemetry data for startup
YYYY-MM-DD-THH:MM:SS Wa(03)+ host-XXXX
YYYY-MM-DD-THH:MM:SS Wa(03) host-XXXX <vmware-vpostgres> Service pre-start command's stderr: Could not generate telemetry data
YYYY-MM-DD-THH:MM:SS In(05) host-XXXX <vmware-vpostgres> Service pre-start command completed successfully.
YYYY-MM-DD-THH:MM:SS In(05) host-XXXX <vmware-vpostgres> Constructed command: /opt/vmware/vpostgres/current/bin/postgres -D /storage/db/vpostgres
YYYY-MM-DD-THH:MM:SS host-XXXX Client info Uid=0,Gid=0,Pid=34887,Comm=(vmon-coredumper),PPid=2,Comm=(kthreadd),PPid=0
YYYY-MM-DD-THH:MM:SS Wa(03) host-XXXX [ReadSvcSubStartupData] No startup information from vmware-vpostgres.
YYYY-MM-DD-THH:MM:SS Wa(03) host-XXXX <vmware-vpostgres> Service exited. Exit code 1
/var/log/vmware/vpostgres/postgresql-xx.log dizini
YYYY-MM-DD-THH:MM:SS 67a573d7.26bf 0 LOG: listening on IPv6 address "::", port 5432
YYYY-MM-DD-THH:MM:SS 67a573d7.26bf 0 LOG: listening on Unix socket "/var/run/vpostgres/.s.PGSQL.5432"
YYYY-MM-DD-THH:MM:SS 67a573d7.26c1 0 LOG: database system was interrupted; last known up at 2024-09-20 03:07:24 UTC
YYYY-MM-DD-THH:MM:SS 67a573d7.26c1 0 PANIC: replication slot file "pg_replslot/vpg_archiver/state" has wrong magic number: 875771188 instead of 17112225
YYYY-MM-DD-THH:MM:SS 67a573d7.26bf 0 LOG: startup process (PID 9921) was terminated by signal 6: Aborted
YYYY-MM-DD-THH:MM:SS 67a573d7.26bf 0 LOG: aborting startup due to startup process failure
YYYY-MM-DD-THH:MM:SS 67a573d7.26bf 0 LOG: database system is shut down
Bu makalede bu hatanın ne anlama geldiğini, neden oluştuğunu, sistem loglarında nasıl göründüğünü ve güvenli şekilde nasıl düzeltileceğini adım adım anlatacağım.
Bu hata vCenter Server Appliance üzerindeki entegre PostgreSQL (vPostgres) veritabanının başlatılması sırasında oluşur.
Sorunun temel nedeni veritabanı içindeki replication slot (çoğaltma yuvası) bilgilerinin bulunduğu pg_replslot/vpg_archiver/state
dosyasının bozulmasıdır.
PostgreSQL bu dosyada beklenen “magic number” değerini bulamadığında veri bütünlüğünü korumak adına PANIC moduna geçer ve başlatma işlemini tamamen durdurur.
Bu hatayla karşılaşıldığında vCenter yönetim arayüzüne erişim genellikle imkânsız hale gelir.
Bu hata genellikle aşağıdaki senaryolarda ortaya çıkar:
- vCenter Appliance’ın beklenmedik şekilde kapanması (örneğin, elektrik kesintisi)
- Dosya sisteminde meydana gelen bozulmalar (fsck sonrası)
- Kurtarma (emergency) modundan çıkış
- Disk alanı bitmesi ve sonrasında yapılan müdahaleler
Sistem Loglarında Hata Belirtileri
vmon.log
dosyasında:
<vmware-vpostgres> Service pre-start command's stderr: Could not generate telemetry data
<vmware-vpostgres> Service exited. Exit code 1
postgresql-*.log
dosyasında:
PANIC: replication slot file "pg_replslot/vpg_archiver/state" has wrong magic number: 875771188 instead of 17112225
startup process was terminated by signal 6: Aborted
database system is shut down
Bu kayıtlar PostgreSQL’in kendini korumaya alarak başlatma sürecini durdurduğunu ve sistemin kullanım dışı kaldığını gösterir.
Replication Slot ve Magic Number
Replication slot PostgreSQL’in veri çoğaltma (replication) mekanizmasının bir parçasıdır. Sistem bu slotlar sayesinde hangi verilerin başka bir düğüme gönderildiğini takip eder.
Bu bilgiler bozulursa:
- Replikasyon yapılamaz.
- Veri kaybı riski doğar.
- Servis başlatılamaz.
Magic number bir dosyanın doğru formatta olup olmadığını tanımlayan dahili kimliktir. PostgreSQL bu değeri kontrol ederek dosyanın sağlam olup olmadığını anlar. Eğer bu sayı beklenenden farklıysa dosya bozulmuş demektir.
Kalıcı Çözüm Adımları
İşleme Başlamadan Önce: Kritik Güvenlik Önlemleri
İşlem doğrudan veritabanı yapısını etkileyeceği için kesinlikle aşağıdaki adımlar uygulanmalıdır:
- VCSA yedeğini alın:
Yerel veya VAMI (https://<vcenter>:5480) üzerinden yedekleme yapılabilir. - Snapshot oluşturun:
vCenter kapalı durumdayken bir sanal makine snapshot’u alın. - ELM varsa diğer node’ları da koruma altına alın:
Enhanced Linked Mode (ELM) kullanıyorsanız, diğer replikasyon nodlarını da kapatıp snapshot alın.
🔧 Adım Adım Onarım Süreci
1. vCenter Appliance’a SSH ile Bağlanın
ssh root@<vcenter-ip-adresi>
Not : SSH aktif değilse VAMI arayüzünden (https://<vcenter>:5480 > Access > SSH) etkinleştirin.
2. Bozuk Dosyanın Bulunduğu Dizine Geçin
cd /storage/db/vpostgres/pg_replslot
Burada vpg_archiver
adında bir klasör bulunacaktır. Bu klasör replication slot bilgilerini içerir.
3. Bozuk Slot Klasörünü Silin
rm -r vpg_archiver
Bu işlem veri kaybına neden olmaz. PostgreSQL bu dizini servis başlatıldığında kendisi yeniden oluşturacaktır.
4. vPostgres Servisini Tekrar Başlatın
service-control --start vmware-vpostgres
Başarılı bir başlatma durumunda loglarda artık PANIC veya Abort gibi ifadeler görülmez ve servis “running” konumuna geçer.
Başarıyı Doğrulama
Servisin durumunu kontrol etmek için:
service-control --status vmware-vpostgres
Beklenen çıktı:
vmware-vpostgres: running
Ayrıca /var/log/vmware/vpostgres/postgresql-*.log
dosyasında artık sistemin sorunsuz başlatıldığına dair loglar yer almalıdır.
Bu hata vCenter altyapısının durmasına neden olabilecek kritik bir problemdir. Ancak bu makalede yer alan doğru adımlarla sistem kısa sürede eski haline getirilebilir. Bu tür durumlarla karşılaşmamak için:
- Her zaman düzenli yedek alın.
- vCenter kapatılmadan önce servisleri düzgün şekilde sonlandırın.
- Disk alanını takip edin ve sistemin beklenmedik şekilde kapanmasını önleyin.