Sepetiniz

MongoDB Sharded Cluster Yetkilendirmenin Etkinleştirilmesi

MongoDB kurulduktan sonra varsayılan olarak yetkilendirme (authentication) etkinleştirilmemiş şekilde gelir, kullanıcılar kullanıcı adı/parola ve yetki seviyesindeki veri tabanlarını belirtmeye gerek duymadan giriş yapabilirler. Yetkilendirme, güvenlik için son derece önemlidir ve etkinleştirilmesi gerekir.

Etkinleştirme işlemi için sırasıyla aşağıdaki adımlar uygulanmalıdır (Sunucu Centos Linux 7, MongoDB sürümü 3.2’dir):

  1.  Öncelikle openssl ile bir anahtar dosyası oluşturulur, bağlantı ve sunucular arası iletişim için bu dosyayı kullanacaktır.
    [mongodb@mongodb1 ~]$ cd /mongodb
    [mongodb@mongodb1 ~]$ mkdir keyfile
    [mongodb@mongodb1 ~]$ openssl rand -base64 346 > keyfile/mongodb-keyfile
    [mongodb@mongodb1 ~]$ chmod 600 keyfile/mongodb-keyfile
  2. Oluşturulan bu dosya, tüm sunucuların ilgili dizinine kopyalanır. Tüm sunuculardaki anahtar dosyası aynı olmalıdır.
  3. Tüm mongod ve mongos işlemleri, bu keyfile kullanılarak tekrar açılır. Komutlara –keyfile <dosya_yolu> şeklinde parametre verilir. Aşağıda örnek mongod (config, shard) ve mongos (router) işlemleri için örnek komutlar bulunmaktadır.
    [mongodb@mongodb1 ~]$ mongod --configsvr --dbpath cfg0 --port 26001 --fork --logpath logs/log.cfg0 --logappend --keyFile keyfile/mongodb-keyfile
    [mongodb@mongodb1 ~]$ mongod --shardsvr --replSet shA --dbpath shA0 --logpath logs/log.shA0 --port 27500 --fork --logappend --keyFile keyfile/mongodb-keyfile
    [mongodb@mongodb1 ~]$ mongos --configdb mongodb1:26001,mongodb2:26001,mongodb3:26001 --fork --logappend --logpath logs/log.mongos0 
    --keyFile keyfile/mongodb-keyfile
  4. Yetkilendirme etkinleştirmenin bir sonraki adımı yönetici hesabı oluşturmaktır.
    [mongodb@mongodb1 ~]$ mongo
    mongos> use admin
    mongos> db.createUser(
      {
        user: "adminUser",
        pwd: "parola",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" },
                 { role: "readWriteAnyDatabase", db: "admin" },
                 { role: "dbAdminAnyDatabase", db:"admin" },
                 { role: "clusterAdmin", db:"admin" }  ]
      }
    )
  5. Aşağıdaki komutla kullanıcının durumu görülebilir.
    mongos> db.getUser("adminUser")
  6. Bundan sonraki mongos girişlerinde yetkilendirme yaparak girmek gerekmektedir, yoksa hata alırsınız.
    [mongodb@mongodb1 ~]$ mongo --port 27017 -u adminUser -p parola --authenticationDatabase admin
    
    
    
    
    
    
    

     

MongoDB Sharded Cluster Kurulumu

Daha önceki yazımda MongoDB Community Edition kurulumu ve genel olarak MongoDB Sharded Cluster bileşenlerinden söz etmiştim. Bu yazılara aşağıdan erişebilirsiniz:

MongoDB Community Edition Kurulumu

MongoDB Sharded Cluster Bileşenleri

Bu bölümde Centos Linux işletim sistemi kurulu üç ayrı makineye (mongodb1, mongodb2, mongodb3) Sharded Cluster kurulumunu inceleyeceğiz.

  1. Öncelikle MongoDB Community Edition Kurulumu yazımda belirttiğim şekilde her üç makinede kullanıcılar oluşturulur ve MongoDB Community Edition kurulumları gerçekleştirilir.
  2. Veri tabanı dosyalarının tutulacağı düzgün bir klasör yapısı oluşturmak gerekir. MongoDB bu konuda son derece esnek, istenilen şekilde klasör yapısına izin veriyor. Ben her bir sunucuda /mongodb dizini oluşturup içine shard, konfigurasyon ve log klasörlerini oluşturmayı uygun gördüm. Yapı genel olarak:

    mongodb1
    /mongodb
             ………. shA0
             ………. shB2
             ………. shC1
             ………. cfg0
             ………. logs

    mongodb2
    /mongodb
             ………. shA1
             ………. shB0
             ………. shC2
             ………..cfg1
             ………. logs

    mongodb3
    /mongodb
             ………. shA2
             ………. shB1
             ………. shC0
             ………. cfg3
             ………. logs

    Buradaki yapıyı şu şekilde özetleyebiliriz:

    * shA, shB ve shC klasörleri üç ayrı shard’dır. Son eklerinde bulunan 0,1 ve 2 ise replica setleri ifade ediyor. Görüldüğü gibi her sharda ait verinin replica seti başka bir sunucuda duruyor, bu da veri kaybını en aza indirgemeyi sağlıyor. Sunuculardan biri kullanılamaz hale gelse bile diğer iki sunucu sayesinde veri kaybı olmayacaktır.

    * cfg dizini konfigürasyon sunucusuna ait verileri içerecektir ve üç ayrı sunucuda da mevcuttur.

    * logs dizinlerinde işlemlere ve sunuculara ait log dosyaları tutulacaktır.

     * Her üç sunucuda shard’lar, birer config sunucu ve birer router bulunmaktadır. Birden fazla router sayesinde, router sorunlarında uygulamalar hizmet kesintisi  yaşamadan diğer router’ları kullanabilecektir.

  3. Her üç makinede de aşağıdaki komutla dosya yolları ve cfg isimleri de belirtilerek konfigürasyon sunucuları oluşturulur. (mongodb1 için script)
    [mongodb@mongodb1 ~]$ cd /mongodb
    [mongodb@mongodb1 ~]$ mongod --configsvr --dbpath cfg0 --port 26001 --fork --logpath logs/log.cfg0 --logappend
  4. Shard sunucuları, replica setleri ile oluşturulur. Sunucularda yukarıda belirtilen yollar kullanılmalıdır. (mongodb1 için script)
    [mongodb@mongodb1 ~]$ mongod --shardsvr --replSet shA --dbpath shA0 --logpath logs/log.shA0 --port 27500 --fork –-logappend
    [mongodb@mongodb1 ~]$ mongod --shardsvr --replSet shB --dbpath shB2 --logpath logs/log.shB2 --port 27600 --fork –-logappend
    [mongodb@mongodb1 ~]$ mongod --shardsvr --replSet shC --dbpath shC1 --logpath logs/log.shC1 --port 27700 --fork --logappend
    
  5. Her üç makinede de default portta (27017) router (mongos) işlemleri başlatılır.
    [mongodb@mongodb1 ~]$ mongos --configdb mongodb1:26001,mongodb:26001,mongodb3:26001 --fork --logappend --logpath logs/log.mongos
  6. ps –ef | grep mongo komutuyla işlemlerin düzgün başladığı kontrol edilir.

 

 

Replica Set Oluşturma
Şu ana kadar gerekli işlemleri çalışır hale getirdik. Bu aşamada öncelikle replica set üyelerini ekleyeceğiz. (mongodb1 shA seti için)

[mongodb@mongodb1 ~]$ mongo --port 27500
>rs.status()
{
	"info" : "run rs.initiate(...) if not yet done for the set",
               "ok" : 0,
               "errmsg" : "no replset config has been received",
               "code" : 94
}
>rs.initiate({_id:"shA", members: [{"_id":0, "host":"mongodb1:27500"},{"_id":1, "host":"mongodb2:27500"},{"_id":2, "host":"mongodb3:27500"}]})
{ "ok" : 1 }
>rs.status()
{
    "set" : "shA",
    "date" : ISODate("2016-09-25T19:16:59.040Z"),
    "myState" : 1,
    "term" : NumberLong(1),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "members" : [
        {
            "_id" : 0,
            "name" : "mongodb1:27500",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 3013,
            "optime" : {
                "ts" : Timestamp(1474831011, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-09-25T19:16:51Z"),
            "infoMessage" : "could not find member to sync from",
            "electionTime" : Timestamp(1474831010, 1),
            "electionDate" : ISODate("2016-09-25T19:16:50Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "mongodb2:27500",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 19,
            "optime" : {
                "ts" : Timestamp(1474831011, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-09-25T19:16:51Z"),
            "lastHeartbeat" : ISODate("2016-09-25T19:16:58.758Z"),
            "lastHeartbeatRecv" : ISODate("2016-09-25T19:16:57.587Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "mongodb1:27500",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "mongodb3:27500",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 19,
            "optime" : {
                "ts" : Timestamp(1474831011, 1),
                "t" : NumberLong(1)
            },
            "optimeDate" : ISODate("2016-09-25T19:16:51Z"),
            "lastHeartbeat" : ISODate("2016-09-25T19:16:58.757Z"),
            "lastHeartbeatRecv" : ISODate("2016-09-25T19:16:57.586Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "mongodb1:27500",
            "configVersion" : 1
        }
    ],
    "ok" : 1
}

Bu işlem shB ve shC için de yapılır (sadece bir sunucuda, shA için 27500 portu, shB için 27600 portu, shC için 27700 portu).
Görüldüğü gibi üç üyeden biri PRIMARY diğerleri SECONDARY durumdadır. Okuma ve yazma istekleri PRIMARY üyede çözülürken, SECONDARY üyelerde yedekler senkronize bir şekilde tutulur.

Shard Ekleme
Her sunucuda (PRIMARY replica üyesinin bulunduğu) aşağıdaki komutlar ile shard’lar eklenir.

[mongodb@mongodb1 ~]$ mongo
mongos> sh.addShard("shA/mongodb1:27500")
{ "shardAdded" : "shA", "ok" : 1 }
mongos> sh.status()
--- Sharding Status --- 
  sharding version: {
	"_id" : 1,
	"minCompatibleVersion" : 5,
	"currentVersion" : 6,
	"clusterId" : ObjectId("27e81987jns3e8fp81fdb1")
}
  shards:
	{  "_id" : "shA",  "host" : "shA/mongodb1:27500,mongodb2:27600,mongodb3:27700" }
  active mongoses:
	"3.2.9" : 4
  balancer:
	Currently enabled:  yes
	Currently running:  no
	Failed balancer rounds in last 5 attempts:  0
	Migration Results for the last 24 hours: 
		No recent migrations
  databases:

Son aşamadan sonra çalışır bir MongoDB Sharded Cluster yapımız oluşmuş oldu.

 

MongoDB Sharded Cluster Bileşenleri

MongoDb Sharding, birden fazla makineye verileri dağıtmak için kullanılan bir yöntemdir. Sharding sayesinde verilere erişmek daha performanslı olacaktır. 

Sharding Cluster, üç ana bileşenden oluşur. Bunlar;

Shard’lar: Bir collection’a ait verinin uygun bir kurala göre bir parçasının tutulduğu MongoDB instance’ıdır. Verinin shardlara bölünmesi, erişim esnasında sadece ilgili shard’ları ilgilendireceğinden performans artışı söz konusudur. Shard’lar, tek bir mongod instance’ı olabildiği gibi yedekli olacak şekilde replica set’ler olarak da tanımlanabilir.

Konfigürasyon Sunucuları: Cluster’a ait metadata verilerinin tutulduğu sunuculardır. Konfigürasyon sunucuları da birer mongod instance’ıdır.

Routing Instance’lar: Uygulamalar tarafından  shard’lara okuma ve yazma işlemlerinin yapılmasını sağlayan mongos instance’larıdır. Uygulamalar doğrudan shard’lara erişemez. Bu instance’lar farklı sunucularda çoklanarak yüksek erişilebilirlik sağlanmış olur.

 

 

mongodb-bilesen

 

MongoDB Community Edition Kurulumu

mongo

 

Bu yazıda CentOS Linux’a MongoDB Community Edition kurulumu anlatılacaktır. Aynı kurulum şekli RedHat Linux sürümleri için de geçerlidir.

Sürümler:
İşletim Sistemi: CentOS Linux 7 – 64bit
MongoDB: MongoDB Community Edition 3.2

  1. Sunucu üzerinde yönetim için bir kullanıcı oluşturulur.
    [root@mongodbserv ~]# adduser mongodb
    [root@mongodbserv ~]# passwd mongodb
  2. Kurulum için YUM ayarları yapılır. Doğrudan .rpm ile de kurulum gerçekleştirilebilir, paketleri https://www.mongodb.com/download-center#community adresinden indirebilirsiniz. YUM ayarları için /etc/yum.repos.d yolu altına mongodb-org-3.2.repo dosyası oluşturulur ve aşağıdaki gibi ayarlanır.
    [root@mongodbserv ~]# vi /etc/yum.repos.d/mongodb-org-3.2.repo
    
    [mongodb-org-3.2]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
  3. mongodb kullanıcısı ile aşağıdaki şekilde kurulum gerçekleştirilir.
    [mongodb@mongodbserv ~]$ sudo yum install -y mongodb-org
  4. MongoDB, mongod işlemi kullanılarak çalışır hale getirilir. Aşağıdaki şekilde MongoDB servisi başlatılır.
    [mongodb@mongodbserv ~]$ sudo service mongod start
  5. Sistem yeniden başlatıldığında otomatik olarak mongod servisinin de başlaması için aşağıdaki gibi ayar yapılır.
    [mongodb@mongodbserv ~]$ sudo chkconfig mongod on

Not: Varsayılan olarak MongoDB veri dosyalarını /var/lib/mongo yolunda, log dosyalarını ise /var/log/mongodb yolunda saklamaktadır. Bu değerleri değiştirmek için mongod işlemini uygun parametreler ile başlatmak veya konfigurasyon dosyası kullanmak gerekmektedir. Bu ayarlamadan başka bir yazıda söz edilecektir.