foo adlı üyeden alıntı: mesajı görüntüle
merhaba,

konu hakkında öncelikle yanlış yapılan noktaları belirtmekte fayda görüyorum.

- tek master game server : down olması durumunda tüm sistem down demektir.
- c# : bahsettiğiniz proje için oldukça kötü bir tercih olur. fazla ram tüketimi, external source bağlantı yavaşlığı ve ne kadar türevleri olsa da sizi windows'a mahkum etmesi.
- mssql : belki de en büyük yanlış. aşırı ram tüketimi, yavaşlık ve ön planda fazla write özelliği olan bir sistemde kolaylıkla sapıtması.
- load balancer : genellikle servis bazlı olarak özelleştirildiklerinden birçok limite takılırsınız. bunların başında da ram gelir. ihtiyaç duyacağınız balancing TCP load balancing olacaktır. 1 tcp paketi minimum 41B, maximum 64KB'dır. Dehşet bir tcp window ayarladığınızı ve paket size 1KB olduğunu düşünüyorum. Anlık olarak 100 milyon paket için o cihaz üzerinde sadece TCP request paketlerini alması için 100GB ram ayrılmış olmalı. Daha sonra bu paketi alıp arkadaki slave'lere aktaracak, response'ları alacak ve tekrar response edecek vs vs. bu arada 100milyon anlık tcp paketi çok çok abartı bir değer.

tavsiyelerime gelince;

öncelikle tamamiyle hiyearşik bir yapı tasarlamanız gerekir. ben size örnek 1 milyon anlık paket için bir yapı önereyim.

- öncelikle gelen isteklerin tamamını tek sunucudan almanız mantıklı değildir. öncelikle balancing'i client tarafında yaparsınız. bunun da en kolay yolu DNS'tir. Bölgesel DNS sunucuları ve DNS load balancing ile öncelikle istekleri bölersiniz.

- DNS sorgularının karşılarında "master game server" farm kullanırsınız. 1milyon anlık istek için 32 GB ram'li 4 adet "master game server" kullanabilirsiniz. arka tarafta ise, child game server'ları forge edersiniz. ilk aşamada ihtiyaç duyduğunuz kadar.

- Bu aşamada sadece 3 aşamalı bir yapınız var. DNS, master game server farm, child game servers . Son aşamada ise child server'ların bağlantı yapacağı veritabanı sunucusu bulunur. Veritabanı sunucusu dediğime bakmayın, saklanacak veriye göre farm' da olabilir.

- programlama diline gelince, ben klasik biriyim bu nedenle önceliğim c veya c++ olur ancak şayet bu dillere hakim değilseniz, javascript veya go da olabilir. ama java derseniz (benim şahsi fikrimdir) game server yapısını bırakıp limon satın.

- veritabanı yapısına gelince SQL yapılı bir sistem sizi zora sokar. noSQL veritabanı sistemlerini inceleyebilirsiniz. mongodb tavsiyemdir. böyle bir sistem için redis mecburidir aynı zamanda. SQL tarafını sürekli saklamalar için kullanabilirsiniz.

sanırım bu kadar şimdilik.
iptables adlı üyeden alıntı: mesajı görüntüle
Çok derinlemesine girecek şekilde anlatmak için vaktim yok ancak aşağıdaki gibi bir yapınız olmak zorunda bu tip bir büyüme yapabilmeniz için.

Client -> Login/Proxy Sunucuları -> Oyun/Fizik motoru sunucuları -> DB sunucuları

Burada gördüğünüz üzere Logi/Proxy sunucuları tüm mesajlaşma (normal mesajlarşma değil sunucu arasındaki API ve XML sorguları), giriş ve dağıtım işini yükleniyor. Bunu kendiniz de yazabilirsiniz yukarıda bahsettiğniiz gibi Azure veya AWS'den Route53+SQS+SNS+Autoscaling hizmeti alabilirsiniz.

Oyun sunucularında exe çalıştırabilirsiniz sorun yok. Bahsettiğiniz korku sanırım bir exe değiştiğinde ne olacak konusu. Emin olun bu dert edeceğiniz en son şey olmalı online bir oyunda. Çünkü kendi içinizde kuracağınız bir Git sunucusu ile bile exe değişikliklerini anında birden fazla suncuuya aktarabilirsiniz. Detaylı araştırma için anahtar kelimeler: "push to deploy with git", "deploying with capistrano", "continuous integration"

DB sunucuları ile ilgili detay verememe gerek yok sanırım pek fazla ekstra bir şey yok bağlantı, cluster ve optimizasyon yapıldıktan sonra.

Sizin kafanızda hala bir adet master sunucu olsun diğerleri slave olsun mantığı var bu yanlış bir büyüme şekli. Sunucular gruplar halinde bir sunucu ağını oluşturmak zorunda (grid computing örneklerine bakabilirsiniz). Master dedğiniz kısım ise Login/Proxy sunucuları gibi değerlendirilebilir ve tüm kontrolü bu sunucular yapacaktır oyun içerisinde. Yani tek master sunucu mantığına kıyasla daha tercih edilebilir bir yönetim şeklidir.

DDos konusuna gelince her türlü mimaride ddos almanız kaçınılmaz benim bahsettiğim yapıda da olsun master-slave yapısında da olsun fark etmez. Bu tartışılması gereken farklı bir konu öncelikli olarak nasıl büyüyeceğinize odaklanın bence.
Öncelikle yorumlarınız için teşekkür ediyorum. Sunucu konusunda çok iyi olmadığım için birkaç terimi anlayamıyorum.

Tek MasterServer mantıksızmış evet. Git sunucusuna güvenilirmi ? Git'de sorun olursa o sorun banada yansıyacak mesela.

ClashOfClans game server olarak Java kullanıyor, hosting olarak AWS. Bende yazılımımı Java'a geçirebilirim, çok sorun olmaz. NoSQL mongodb kullanırım o da sorun olmaz.


"DNS sorgularının karşılarında "master game server" farm kullanırsınız. 1milyon anlık istek için 32 GB ram'li 4 adet "master game server" kullanabilirsiniz. arka tarafta ise, child game server'ları forge edersiniz. ilk aşamada ihtiyaç duyduğunuz kadar."

Bu kısım kafama yattı gibi fakat çok birşey anlamadım DNS LoadBalancing vs.

m.agar.io/?_=1430388662333

Agar.io da bu şekilde sistem yapılmış. Bu bir nevi random yönlendirici olabilir. Benim yaptığım da mı bu şekilde olacak ?

Birde benim istediğim şekilde hosting eden AWS vs Linode dışında hosting firması varmı ? Çünkü ben çok anlamıyorum, sanırım donanımsal çözülecek bir sorun bu. Kafam iyice karıştı gitti.

Ayrıca evet şimdi farkettim, anlık 1 milyon tcp paketi kaldırsa yeterli. Birde windows önermediniz. Zaten bu kadar olmaz, anlık 1k civarı olur ama her zaman profesyonel düşünmek zorundayım. Yoksa diğer türlü 10 sunucu kiralayıp sorunu çözerim ama istediğim bu değil benim. :9