İçeriğe geç

Metin2 db conf.txt Ayarları: SQL Satırları, BIND_PORT ve ITEM_ID_RANGE

Hazırlayan: Metin2VIP Editörleri Yayın: 8 dk okuma

Kısaca: conf.txt, db çekirdeğinin klasöründe duran ve yalnız db açılırken okunan ayar dosyasıdır. Satırlar 'ANAHTAR = DEĞER' biçimindedir, boşluk içeren değerler çift tırnağa alınır. db'nin açılması için SQL_PLAYER, SQL_ACCOUNT, SQL_COMMON, SQL_HOTBACKUP, CLIENT_HEART_FPS, PLAYER_ID_START ve ITEM_ID_RANGE satırları gerekir; SQL satırlarında sıra sunucu, veritabanı, kullanıcı, parola ve porttur. db'nin dinlediği BIND_PORT, oyun çekirdeklerinin CONFIG'indeki DB_PORT ile aynı olmalıdır.
İçindekiler
  1. db çekirdeği ne yapar, conf.txt ne zaman okunur?
  2. Yazım kuralları: CONFIG'ten farkları
  3. Zorunlu satırlar ve açılış hataları
  4. SQL satırları nasıl yazılır?
  5. BIND_PORT ve BIND_IP
  6. ITEM_ID_RANGE ne işe yarar?
  7. Önbellek ve kayıt süreleri
  8. PROTO_FROM_DB ve MIRROR2DB
  9. Karakter silme sınırları
  10. Diğer satırlar
  11. Örnek conf.txt
  12. Güvenlik için yapılması gerekenler

conf.txt, db çekirdeğinin klasöründe (srv1/db) duran ve yalnız db açılırken okunan ayar dosyasıdır. Satırlar ANAHTAR = DEĞER biçimindedir, boşluk içeren değerler çift tırnağa alınır. db'nin açılabilmesi için dört SQL satırı (SQL_PLAYER, SQL_ACCOUNT, SQL_COMMON, SQL_HOTBACKUP) ile CLIENT_HEART_FPS, PLAYER_ID_START ve ITEM_ID_RANGE gerekir. db'nin auth ve oyun çekirdeklerini beklediği port BIND_PORT'tur ve CONFIG dosyalarındaki DB_PORT ile aynı olmalıdır.

Aşağıdaki davranışlar db çekirdeğinin kaynak kodundan çıkarıldı. PROTO_FROM_DB ve MIRROR2DB gibi bazı satırlar incelenen kaynağa sonradan eklenmiş özelliklerdir, başka bir derlemede bulunmayabilir. Satırların kısa listesi CONFIG ayarları listesinde db başlığı altında da var.

db çekirdeği ne yapar, conf.txt ne zaman okunur?

db çekirdeği MySQL ile auth ve oyun çekirdekleri arasında durur. Açılışta eşya, canavar, beceri ve market tablolarını yükleyip çekirdeklere dağıtır; oyuncu ve eşya verisini önbellekte tutup aralıklarla MySQL'e yazar; çekirdeklere birbirlerinin adresini ve haritalarını bildirir. Bu yüzden sunucuda ilk açılan çekirdek db'dir. Veritabanlarının ve tabloların ne tuttuğu Metin2 veritabanları yazısında.

conf.txt yalnız açılışta okunur; çalışan db'de dosyayı değiştirmek hiçbir şeyi etkilemez. db çevrimiçi oyuncuların verisini önbellekte tuttuğu için değişiklikten sonra sunucunun tamamını stop.py ile durdurup yeniden açmak en güvenli yoldur. Düzgün kapanışta db önbellekteki her şeyi MySQL'e yazar.

Yazım kuralları: CONFIG'ten farkları

conf.txt'nin okuyucusu game çekirdeğinin CONFIG okuyucusundan tamamen farklıdır. İki dosyayı birbirine benzeterek yazmak en sık hata kaynağıdır.

Game CONFIG db conf.txt
Satır biçimi ANAHTAR: değer, iki noktadan sonra tek boşluk ANAHTAR = DEĞER, eşittirin iki yanında boşluk
Boşluk içeren değer Satırın geri kalanı Çift tırnak içinde
Anahtarda büyük-küçük harf Fark etmez Fark eder, büyük harfle yazılır
Aynı anahtar iki kez Çoğunda sonraki geçerli İlk yazılan geçerli
Yorum Yok Ayrı kelime olarak yazılan // satırın kalanını yorum yapar
SQL satırının sırası sunucu, kullanıcı, parola, veritabanı, port sunucu, veritabanı, kullanıcı, parola, port

Okuyucu dosyayı satır satır değil, kelime kelime okur: önce anahtarı, sonra = ile başlayan kelimeyi, sonra değeri arar. Bunun beklenmedik bir sonucu var. = unutulursa okuyucu, bir sonraki = işaretine kadar gelen her kelimeyi atlar ve o satırın değerini eksik satırın anahtarına yazar:

CLIENT_HEART_FPS 25
PLAYER_ID_START = 100

Bu iki satırda CLIENT_HEART_FPS 100 olur, PLAYER_ID_START hiç yazılmamış sayılır ve db "PLAYER_ID_START not configured" diyerek kapanır. Hata iletisi bu yüzden asıl bozuk satırı değil, ondan sonrakini gösterebilir. ANAHTAR=DEĞER biçiminde bitişik yazmak da aynı kaymaya yol açar, çünkü bitişik yazı tek bir kelime sayılır.

// yalnız ayrı bir kelime olduğunda yorum açar: // not çalışır, //not ise anahtar sanılır ve sonraki satırı kaydırır. # işareti yorum değildir; #BIND_PORT = 30000 yazılırsa db #BIND_PORT adında tanımadığı bir anahtar okur, gerçek BIND_PORT tanımsız kalır. Aynı anahtarı iki kez yazarsan ilki geçerli olur, sonradan eklediğin satır sessizce yok sayılır.

Zorunlu satırlar ve açılış hataları

Eksik olan db'nin verdiği ileti
conf.txt dosyası Loading conf.txt failed.
CLIENT_HEART_FPS Cannot find CLIENT_HEART_FPS configuration.
PLAYER_ID_START PLAYER_ID_START not configured
SQL_PLAYER, SQL_ACCOUNT, SQL_COMMON, SQL_HOTBACKUP SQL_PLAYER not configured (öbürleri için de aynı biçim)
ITEM_ID_RANGE conf.txt: Cannot find ITEM_ID_RANGE [start_item_id] [end_item_id]
common veritabanındaki locale tablosu Failed Localization Infomation so exit

İletilerin bir kısmı ekrana, bir kısmı db klasöründeki syserr dosyasına yazılır; açılmayan db'de ikisine de bakmak gerekir. BIND_PORT başka bir program tarafından kullanılıyorsa db soketi açamaz ve "socket" ile başlayan bir hata verir.

SQL satırları nasıl yazılır?

Dört SQL satırı db'nin bağlanacağı dört veritabanını tanımlar: SQL_PLAYER player'ı, SQL_ACCOUNT account'u, SQL_COMMON common'ı, SQL_HOTBACKUP hotbackup'ı gösterir. Değer çift tırnak içinde beş parçadır:

SQL_PLAYER = "localhost player KULLANICI_ADI PAROLA_BURAYA 3306"
  • Sıra sunucu, veritabanı adı, kullanıcı, parola, porttur. Oyun çekirdeğinin CONFIG'indeki PLAYER_SQL satırında veritabanı adı dördüncü sıradadır; iki dosya arasında satır kopyalanırken en sık yapılan hata budur.
  • Port mutlaka yazılmalıdır. Port yazılmazsa kod o alanı doldurmaz ve bağlantı belirsiz bir port değeriyle denenir.
  • Parolada boşluk ve çift tırnak bulunamaz; parçalar boşlukla ayrılır.
  • SQL_HOTBACKUP kullanılmasa da zorunludur ve hotbackup veritabanının gerçekten var olması gerekir.

Bir bağlantı kurulamazsa db 5 saniye arayla 6 kez dener, yani yaklaşık 30 saniye bekler. Sonra ekrana yine de "Success PLAYER" gibi bir satır yazar ve devam eder; bu satır yanıltıcıdır. Kodda bağlantı hatası o ana kadar kurulmuş bütün MySQL bağlantılarını da siler, bu yüzden tek bir hatalı satır db'nin açılışın ilerleyen adımında çökmesine yol açar. Asıl ipucu syslog'daki "failed, retrying in 5 seconds" satırlarıdır.

BIND_PORT ve BIND_IP

BIND_PORT, db'nin auth ve oyun çekirdeklerini beklediği porttur. İncelenen kaynakta satır yoksa 30000 kullanılır. Bütün CONFIG'lerdeki DB_PORT bu değerle aynı olmalıdır.

BIND_IP, db portunun hangi adreste dinleneceğidir. Yazılmazsa db bütün ağ arayüzlerinde dinler. Bütün çekirdekler aynı makinedeyse BIND_IP = 127.0.0.1 yazmak db portunu dışarıdan tamamen erişilmez yapar; bu durumda CONFIG'lerdeki DB_ADDR de 127.0.0.1 olmalıdır.

İncelenen kaynakta ayrıca bir adres süzgeci var: db portu yalnız 127.0.0.1, 192.168.x ve 10.x adreslerinden gelen bağlantıyı kabul eder, ötekileri syslog'a "BLOCK CONNECTION FROM" yazıp reddeder. DB_ADDR'a makinenin genel IP'si yazılırsa bağlantı o adresten geleceği için reddedilir. Port planının tamamı kanal ve portlar yazısında.

ITEM_ID_RANGE ne işe yarar?

Her eşyanın veritabanında benzersiz bir kimliği vardır. ITEM_ID_RANGE, db çekirdeğinin kendi oluşturduğu eşyalara vereceği kimlik aralığının başlangıcı ve sonudur. İncelenen kaynakta db'nin kendisinin eşya ürettiği tek yer item_award tablosudur: web sitesinden ya da yönetim panelinden gönderilen ve oyuncu depoyu ya da Nesne Market deposunu açınca yerleşen eşyalar.

ITEM_ID_RANGE = 100000000 200000000
  • Değer tırnaksız yazılır. Okuyucu bu satırı ötekilerden farklı olarak = işaretinden sonra satır sonuna kadar okur; satıra iki sayıdan başka bir şey ekleme.
  • db açılırken aralıktaki en büyük kimliği bulur ve oradan devam eder. Aralığın sonuna 10.000'den az boş kimlik kaldıysa "Can not build ITEM_ID_RANGE" hatasıyla açılmaz. Bu durumda içinde hiç eşya bulunmayan yeni bir aralık yazılır.
  • Oyun çekirdekleri bu aralığı kullanmaz. Her oyun çekirdeği açılışta db'den 10 milyonluk ayrı bir kimlik bloğu alır; bloklar 10.000.001'den başlayıp 4.280.000.000'e kadar dizilir ve tamamen db aralığının içine düşen bloklar dağıtılmaz. Bloklar tükenirse db'nin syserr'ine "NO MORE ITEM ID RANGE" düşer.

Önbellek ve kayıt süreleri

db, oyuncu ve eşya verisindeki değişiklikleri hemen değil, belirli aralıklarla MySQL'e yazar.

Satır Varsayılan Ne yapar
PLAYER_CACHE_FLUSH_SECONDS 420 Değişen karakter verisinin MySQL'e yazılma aralığı (saniye)
ITEM_CACHE_FLUSH_SECONDS 300 Değişen eşyaların yazılma aralığı
ITEM_PRICELIST_CACHE_FLUSH_SECONDS 540 Pazar fiyat hafızasının yazılma aralığı
CACHE_FLUSH_LIMIT_PER_SECOND 200 Saniyede en çok kaç önbellek kaydının yazılacağı; en az 10

Üç süre de kodda en çok 1.800 saniyeyle sınırlıdır. Kısa süre MySQL'e daha sık yazar ama ani bir çökmede daha az veri kaybettirir; uzun süre yükü azaltır, kill -9 gibi düzensiz bir kapanışta kaybı büyütür. Oyuncu çıktıktan sonra verisinin önbellekte 10 dakika daha tutulması ise kodda sabittir, conf.txt'den değişmez. Sunucu açıkken tabloları elle düzenlemenin neden riskli olduğu veritabanları yazısında anlatılıyor.

CLIENT_HEART_FPS, db çekirdeğinin döngü hızıdır; örnek dosyada 25'tir. db'nin zamanlanmış işleri saniyeye göre hesaplandığı için bu değer kayıt aralıklarını değiştirmez.

PROTO_FROM_DB ve MIRROR2DB

Bu iki satır incelenen kaynağa eklenmiş bir özelliktir ve eşya ile canavar tablolarının nereden okunacağını belirler:

conf.txt Sonuç
PROTO_FROM_DB = 1 item_proto ve mob_proto player veritabanındaki tablolardan okunur
PROTO_FROM_DB = 0 Tablolar db klasöründeki item_proto.txt ve mob_proto.txt dosyalarından okunur
PROTO_FROM_DB = 0 ve MIRROR2DB = 1 txt'den okunan tablolar her açılışta MySQL'e de yazılır

Örnek dosyada PROTO_FROM_DB = 0 ve MIRROR2DB = 1 yazılıdır; bu durumda MySQL'deki tablo yalnız bir yansıdır ve orada yapılan değişiklik bir sonraki açılışta ezilir. Proto dosyalarının sütunları item_proto yazısında, dönüştürme araçları proto araçları yazısında.

Karakter silme sınırları

PLAYER_DELETE_LEVEL_LIMIT, silinemeyecek en düşük seviyedir: örnek dosyadaki 70 değeriyle 70. seviye ve üstü karakterler silinemez, 69 ve altı silinebilir. Satır yoksa db syserr'e bir uyarı yazar ve sınırı 251'e çeker; incelenen kaynakta en yüksek seviye 250 olduğu için bu, her karakterin silinebilmesi demektir. PLAYER_DELETE_LEVEL_LIMIT_LOWER ise alt sınırdır: varsayılan 0, örneğin 15 yazılırsa 15. seviyenin altındaki karakterler silinemez.

Diğer satırlar

Satır Ne yapar
TABLE_POSTFIX Tablo adlarına eklenen sonek; örnekte boş (""). Kullanılacaksa oyun çekirdeklerinin CONFIG'indeki TABLE_POSTFIX ile aynı olmalı
LOCALE db'nin MySQL bağlantılarında kullandığı karakter kümesi; varsayılan ve örnek değer latin1, tablolar da latin1 tanımlı
DISABLE_HOTBACKUP Saatlik oyuncu yedeğini kapatır. Bu kaynakta yedek zaten kapalı başlar, satırı silmek ya da 0 yazmak yedeği açmaz
LOG Yalnız satırın varlığına bakılır: yazılıysa değeri ne olursa olsun db daha ayrıntılı syslog tutar. Kapatmak için satır silinir
LOG_KEEP_DAYS Eski günlüklerin kaç gün tutulacağı; 3 ile 30 arası, varsayılan 3
TEST_SERVER db'de yalnız ek günlük satırları yazdırır
NAME_COLUMN Ad sütunu; common veritabanındaki locale tablosu bunu ezer, turkey için locale_name kullanılır
POLY_POWER, POLY_HANDICAP Lonca savaşı rezervasyonu ve bahsinde loncaların güç puanı ile handikap formülü; boşsa syserr'e uyarı düşer, db çalışmaya devam eder
PLAYER_ID_START Zorunlu ama karakter numaralarını belirlemez; numarayı player tablosunun otomatik artan sayacı verir
CHINA_EVENT_SERVER Çin'e özgü etkinlik bayrağı; özel sunucuda kullanılmaz
BACKUP_LIMIT_SEC Okunur ama hiçbir yerde kullanılmaz

Eski rehberlerde görülen DB_SLEEP_MSEC ve HASH_PLAYER_LIFE_SEC satırlarını bu kaynak hiç okumaz; paketin kendi üretici betiğinde de yoruma alınmışlardır.

Örnek conf.txt

İncelenen paketteki dosyanın düzeni aşağıdadır. Bağlantı bilgileri yer tutucuyla değiştirildi; son satırdaki BIND_IP örnekte yoktur, bütün çekirdekler aynı makinedeyse eklenmesi önerilir.

SQL_ACCOUNT = "localhost account KULLANICI_ADI PAROLA_BURAYA 3306"
SQL_COMMON = "localhost common KULLANICI_ADI PAROLA_BURAYA 3306"
SQL_PLAYER = "localhost player KULLANICI_ADI PAROLA_BURAYA 3306"
SQL_HOTBACKUP = "localhost hotbackup KULLANICI_ADI PAROLA_BURAYA 3306"
TABLE_POSTFIX = ""
CLIENT_HEART_FPS = 25
PLAYER_ID_START = 100
PLAYER_DELETE_LEVEL_LIMIT = 70
ITEM_ID_RANGE = 100000000 200000000
DISABLE_HOTBACKUP = 1
LOCALE = latin1
PROTO_FROM_DB = 0
MIRROR2DB = 1
BIND_PORT = 30000
BIND_IP = 127.0.0.1

Paket bu dosyayı gen_settings.py'deki ayarlardan gen.py ile üretir; gen.py her çalıştığında conf.txt'yi baştan yazar ve elle yaptığın değişiklikler kaybolur. Kalıcı değişiklikleri gen_settings.py'ye de işle. Üretim adımları server kurulumu yazısında.

Güvenlik için yapılması gerekenler

  • conf.txt MySQL parolalarını düz metin tutar. Dosyanın sahibi sunucuyu çalıştıran kullanıcı olmalı, başka kullanıcılar okuyamamalı (chmod 600 conf.txt).
  • SQL satırlarındaki kullanıcı yalnız localhost'tan bağlanabilen ve yalnız gereken yetkilere sahip bir MySQL kullanıcısı olmalı; root kullanılmamalı.
  • BIND_IP ile db portunu 127.0.0.1'e bağla, güvenlik duvarında da kapalı tut. Adres süzgeci parola denetimi değildir.
  • Örnek paketlerle gelen varsayılan parolaları, sunucuyu ilk açmadan önce değiştir.

Sık sorulan sorular

conf.txt'de SQL satırının sırası nedir?
Çift tırnak içinde sunucu, veritabanı adı, kullanıcı, parola ve port: SQL_PLAYER = "localhost player KULLANICI_ADI PAROLA_BURAYA 3306". Oyun çekirdeğinin CONFIG'inde veritabanı adı dördüncü sıradadır, bu yüzden iki dosyadaki satırlar birbirine kopyalanamaz.
db açılmıyor ve 'Can not build ITEM_ID_RANGE' yazıyor, ne yapmalıyım?
ITEM_ID_RANGE aralığının sonuna 10.000'den az boş eşya kimliği kalmış demektir. conf.txt'ye içinde hiç eşya olmayan yeni bir aralık yaz ve db'yi yeniden başlat.
conf.txt'yi değiştirdikten sonra ne yapmak gerekir?
db çekirdeğini yeniden başlatmak; dosya yalnız açılışta okunur. db çevrimiçi oyuncuların verisini önbellekte tuttuğu için en güvenli yol sunucunun tamamını stop.py ile durdurup yeniden açmaktır.
PLAYER_ID_START karakter numaralarını değiştirir mi?
İncelenen kaynakta hayır. Satır zorunludur, yoksa db açılmaz; ama yeni karakterin numarasını player tablosunun otomatik artan sayacı verir. Numaraları ileri almak için tablonun AUTO_INCREMENT değeri değiştirilir.

İlgili sayfalar

Kategori: Server Kurma Yapılandırma yapılandırma conf.txt db çekirdeği mysql

Bu sayfadaki bilgiler Metin2'nin sunucu yazılımındaki hesaplamalara ve standart oyun dosyalarına dayanır. Oyun dosyalarını değiştiren sunucularda değerler farklı olabilir. İçerikleri nasıl hazırlıyoruz?

Bu sayfa işine yaradı mı?

Giriş yap, oy ver ya da sayfayı kaydet. Okumak için üyelik gerekmez. WhatsApp X'te paylaş
Yanlış ya da eksik bir bilgi mi gördün? Bildir
Neyin yanlış olduğunu, doğrusunun ne olduğunu ve bunu nereden bildiğini yaz. Mesajın editörlere gider; yazı, kontrol edildikten sonra düzeltilir.
Yalnız editör görür.

Tartışma

Kurallar

Henüz yorum yok. Bu konuda bir deneyimin ya da sorun varsa ilk yorumu sen yaz.

Giriş yap ya da kayıt ol, sonra yorum yaz. Metin2VIP üyeliği hiçbir oyun sunucusunun hesabı değildir.