Risiko memulai NTP di server database?

27

Saya telah mendengar desas-desus tentang hal-hal buruk yang terjadi pada basis data dan server surat jika Anda mengubah waktu sistem saat sedang berjalan. Namun, saya kesulitan menemukan informasi konkret tentang risiko aktual.

Saya memiliki server Postgres 9.3 produksi yang berjalan pada host Debian Wheezy dan waktu dimatikan oleh 367 detik. Bisakah saya menjalankan ntpdateatau memulai openntp saat Postgres berjalan, atau apakah itu akan menyebabkan masalah? Jika demikian, apa metode yang lebih aman untuk mengoreksi waktu?

Apakah ada layanan lain yang lebih sensitif terhadap perubahan waktu sistem? Mungkin mail server (exim, sendmail, dll) atau antrian pesan (activemq, rabbitmq, zeromq, dll)?

jauh sekaliupormanorman
sumber

Jawaban:

23

Database tidak suka langkah mundur dalam waktu, jadi Anda tidak ingin memulai dengan perilaku default melompat waktu. Menambahkan -xopsi ke baris perintah akan memperlambat waktu jika offset kurang dari 600 detik (10 menit). Pada laju perubahan tegangan maksimum, diperlukan waktu satu setengah hari untuk menyesuaikan jam dengan satu menit. Ini adalah cara lambat tapi aman untuk menyesuaikan waktu.

Sebelum berjalan ntpuntuk menyesuaikan waktu, Anda mungkin ingin memulai ntpdengan opsi ingin -g 2memverifikasi seberapa besar offset yang terdeteksi. Ini akan mengatur kepanikan offset ke 2 detik yang seharusnya relatif aman.

Opsi alternatif yang saya gunakan sebelum opsi ini tersedia adalah menulis loop yang mengatur ulang bagian belakang jam setiap detik atau lebih. Jika Anda memeriksa untuk memastikan pengaturan ulang tidak akan mengubah yang kedua ini kemungkinan aman. Jika Anda banyak menggunakan cap waktu, Anda mungkin kehabisan catatan urutan.

Pilihan umum adalah mematikan server cukup lama sehingga tidak ada pergerakan mundur jam. ntpatau ntpdatedapat dikonfigurasi untuk melompat jam ke waktu yang tepat saat start up. Ini harus dilakukan sebelum database dimulai.

BillThor
sumber
8

Database bisa sangat rentan terhadap perubahan waktu sistem jika mereka sangat aktif dan memiliki catatan waktu pada catatan internal. Secara umum, jika waktu Anda tertinggal, Anda akan memiliki lebih sedikit masalah jika tiba-tiba melompat ke depan daripada jika Anda maju dan tiba-tiba melompat mundur.

Seperti yang ditunjukkan Joffrey - jauh lebih sering aplikasi yang memiliki masalah dengan lompatan waktu tiba-tiba daripada database itu sendiri. Cara paling aman untuk memperbaiki waktu adalah mematikan aplikasi selama N + 1 menit (di mana N adalah jumlah menit di depan jam sistem Anda) dan kemudian menyinkronkan waktu, memulai NTP, dan memulai kembali aplikasi. Jika Anda tidak dapat mengambil downtime sebanyak itu dalam aplikasi, saya hanya dapat menyarankan Anda mengambil cadangan dari database sebelum menyinkronkan waktu, kemudian menawarkan tupai mati ke goda computerdom dan hanya menarik pelatuk. Ok, saya agak jenaka, tapi saya tidak bisa memikirkan cara "aman" selain mengambil pemadaman aplikasi.

John
sumber
Saya maju dan perlu melompat mundur sekitar 6 menit. Saya memiliki banyak, banyak catatan internal yang ditetapkan now(). Bisakah Anda menambahkan metode aman untuk mengubah waktu ke jawaban Anda?
extremelylysuperiorman
6
Jika ntpd diinstal dan dikonfigurasi dengan benar, ntpd harus dapat secara bertahap memperbaiki waktu sistem dengan memperlambat jam. Setelah waktu yang tepat tercapai, penyimpangan disesuaikan untuk mempertahankan waktu. Anda mungkin perlu menentukan koreksi maksimum yang melebihi kesalahan Anda. Setidaknya begitulah cara saya memahaminya, tapi saya bukan ahli NTP.
Jonathan J
@JonathanJ - NTP mengalami kesulitan mengoreksi skew waktu yang lebih besar dari 5 menit, dan ketika mengatur per tindakan dokumen "standar" (yang ada beberapa set, harus diakui) pertama menyinkronkan waktu dalam satu lompatan kemudian mempertahankan sinkronisasi dengan menyesuaikan penyimpangan.
John
@ John I kehabisan tupai tahun lalu;)
Joffrey
4

Biasanya bukan server database yang rentan terhadap kesalahan ketika lompatan waktu instan terjadi: itu adalah aplikasi yang menggunakan waktu itu.

Biasanya ada dua cara untuk melacak waktu: memiliki waktu pelacakan atau membandingkan waktu sistem. Keduanya memiliki beberapa tradeoff positif dan negatif.

Pelacakan waktu sendiri

Saya melihat ini digunakan dalam beberapa pemrograman dan sistem tertanam di mana waktu yang tepat tidak begitu penting. Dalam loop aplikasi utama cara melacak 'centang' diurus. Ini bisa berupa alarm yang diberikan oleh kernel, sleep atau select yang memberikan indikasi jumlah waktu yang berlalu. Ketika Anda tahu waktu berlalu, Anda tahu Anda bisa menambah atau mengurangi waktu ini ke penghitung. Penghitung ini yang membuat aplikasi pengaturan waktu Anda terjadi. Misalnya, jika penghitung lebih tinggi dari 10 detik Anda dapat membuang sesuatu, atau Anda perlu melakukan sesuatu.

Jika aplikasi tidak melacak waktu, penghitung tidak akan berubah. Ini bisa diinginkan tergantung pada desain aplikasi Anda. Misalnya, melacak berapa lama proses berjalan lama mengambil sesuatu ditangani lebih mudah dengan penghitung daripada daftar cap waktu mulai / berhenti.

Pro:

  • Tidak tergantung pada jam sistem
  • Tidak akan merusak kemiringan waktu besar
  • Tidak ada panggilan sistem yang mahal
  • Penghitung kecil akan memakan biaya lebih sedikit memori daripada cap waktu penuh

Menipu:

  • Waktu tidak terlalu akurat
  • Perubahan waktu sistem dapat menjadikannya lebih tidak akurat
  • Pengaturan waktu relatif untuk menjalankan aplikasi, tidak bertahan lama

Membandingkan waktu sistem

Ini adalah sistem yang lebih sering digunakan: menyimpan stempel waktu dan membandingkannya dengan stempel waktu menggunakan panggilan waktu sistem. Kemiringan besar dalam waktu sistem dapat mengancam integritas aplikasi Anda, tugas beberapa detik dapat memakan waktu berjam-jam atau berakhir segera tergantung pada arah jam.

Pro:

  • Perbandingan waktu yang akurat
  • Tetap bertahan selama restart dan pemadaman yang lama

Menipu:

  • Mengambil panggilan sistem untuk mendapatkan cap waktu baru untuk dibandingkan dengan cap waktu lain
  • Aplikasi harus mewaspadai kemiringan atau bisa pecah

Sistem yang terpengaruh

Sebagian besar aplikasi akan menggunakan timestamp dibandingkan dengan menjadwalkan tugas. Untuk sistem basis data yang bisa menjadi pembersihan cache.

Semua aplikasi yang menggunakan fungsi basis data dan waktu panggilan dalam bahasa permintaan akan dipengaruhi oleh kemiringan jika aplikasi tidak mendeteksi dan menangani sesuai. Aplikasi tidak pernah dapat berhenti berjalan atau mengizinkan periode login tidak terbatas tergantung pada tujuannya.

Sistem surat akan menggunakan stempel waktu dan / atau batas waktu untuk menangani surat yang sudah basi atau tidak terkirim. Kemiringan jam bisa memengaruhi itu tetapi dengan dampak yang jauh lebih kecil. Penghitung waktu mundur terkait penyambungan kembali ke server dapat terlewat sehingga menghasilkan penalti pada server penghubung.

Saya tidak berpikir (belum meneliti) bahwa alarm kernel akan berbunyi ketika mengubah waktu sistem. Sistem yang menggunakan ini bisa aman.

Solusi

Pindahkan waktu dengan lembut. Ini dapat ditemukan dalam dokumentasi solusi waktu favorit Anda.

Joffrey
sumber
1
Ini adalah respons yang hebat, dan saya menghargai belajar lebih banyak tentang menjaga waktu. Saya tidak memilihnya karena tidak memberikan solusi yang jelas kekhawatiran saya saat ini menyesuaikan waktu pada server database produksi saya. +1 untuk mengajari saya hal-hal.
farlysuperiorman