Setting MongoDB Replication dengan Replica Set dan Arbiters di centos


 Hi semua,

mohon maaf, sudah lama gak nulis jadinya agak kaku nulisnya hehheheheh. langsung saja kita buat replika set mongodb dengan arbiter dan menggunakan password/authentication 
kita samain dulu servernya ya 

MongoDB Replica Set

1. Install MongoDB

buat file repo , vim /etc/yum.repos.d/mongo.repo , masukan ketikan dibawah ini

[MongoDB]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

ketik, yum install mongodb-org
aktifkan mongodb, systemctl start mongod && systemctl enable mongod

2. Modify /etc/hosts file

On mongodb1 (and mongodb2) server, modify the /etc/hosts file and add the following.

192.168.100.1 mongodb1
192.168.100.2 mongodb2
192.168.100.3 arbiter1

3. Enable Auth on all MongoDB Nodes and activate replica

edit file config mongodb

# vi /etc/mongod.conf
security:
    auth = true
bindIp: 0.0.0.0 (edit)
replication:
    replSetName: ragiel0

Restart the mongodb instance after the above change.

systemctl restart mongod

buat user mongodb

  use admin
  db.createUser(
  {
     user: "superadmin",
     pwd: "adminsuper",
     roles: [ { role: "readWriteAnyDatabase", db: "admin" }, { role: "dbAdminAnyDatabase", db: "admin" }, { role: "userAdminAnyDatabase", db: "admin" }]
      } 
   )
  use admin
  db.createUser(
  {
    user: "root",
    pwd: "assssuuu",
    roles: [ { role: "root", db: "admin" } ]
      }
   )

Note: apply disemua server mongo ya geys...~~~//????

4. Setup KeyFile for Replication Auth on all MongoDB Nodes

generate key agar sesama server bisa ngobrol menggunakan key  yg sama 

openssl rand -base64 756 > /var/lib/mongodb/keyfile 
chmod 400 /var/lib/mongodb/keyfile 
chown mongodb:mongodb /var/lib/mongodb/keyfile

5. On mongodb1: Initiate the Replica Set

mari memulai initiate replica rs.initiate() command. ( gw gak ngajarin cara login ke mongonya ya , ente lebih jago dah )

> use admin
> rs.initiate();
{
  "info2" : "no configuration explicitly specified -- making one",
  "me" : "mongodb1:27017",
  "info" : "Config now saved locally.  Should come online in about a minute.",
  "ok" : 1
}

Right after the initiate, you’ll notice that the configuration is not null anymore. Also, you’ll notice that the mongodb prompt changed from “>” to “replicasetName:PRIMARY>” as shown below.

> rs.config();
{
  "_id" : "ragiel0",
  "version" : 1,
  "members" : [
     {
       "_id" : 0,
       "host" : "mongodb1:27017"
     }
  ]
}

6. On mongodb1: konfirmasi konfig anda dgn View Log and Replica Set Status

cek log nya , kalau seperti ini berarti mantul

# tail /var/log/mongo/mongod.log
Sat Feb 22 18:11:30.995 [conn2] ******
Sat Feb 22 18:11:30.995 [conn2] replSet info saving a newer config version to local.system.replset
Sat Feb 22 18:11:30.996 [conn2] replSet saveConfigLocally done
Sat Feb 22 18:11:30.996 [conn2] replSet replSetInitiate config now saved locally.  Should come online in about a minute.
Sat Feb 22 18:11:34.568 [rsStart] replSet I am mongodb1:27017
Sat Feb 22 18:11:34.569 [rsStart] replSet STARTUP2
Sat Feb 22 18:11:35.570 [rsSync] replSet SECONDARY
Sat Feb 22 18:11:35.570 [rsMgr] replSet info electSelf 0
Sat Feb 22 18:11:36.570 [rsMgr] replSet PRIMARY
...

pake rs.status() command juga bisa ya geys

ragiel0:PRIMARY> rs.status();
{
"set" : "prodRepl",
"date" : ISODate("2014-02-22T06:28:49Z"),
"myState" : 1,
"members" : [
  {
    "_id" : 0,
    "name" : "mongodb1:27017",
    "health" : 1,
    "state" : 1,
    "stateStr" : "PRIMARY",
    "uptime" : 645,
    "optime" : Timestamp(1438853170, 1),
    "optimeDate" : ISODate("2014-02-22T06:19:30Z"),
    "self" : true
  }
],
"ok" : 1
}

7. On mongodb1: Add the 2nd node

nambah node replica dgn script ini ya rs.add command dibawah ini contohnya.

prodRepl:PRIMARY> rs.add("mongodb2");
{ "ok" : 1 }

klo berhasil pake rs.config() untuk ngecek statusnya

ragiel0:PRIMARY> rs.config();
{
  "_id" : "prodRepl",
  "version" : 2,
  "members" : [
     {
       "_id" : 0,
       "host" : "mongodb1:27017"
     },
     {
       "_id" : 1,
       "host" : "mongodb2:27017"
     }
  ]
}

8. Sync started Between Nodes

tunggu beberapa saat sampai semua ngesync, jangan buru2 bos que

ragiel0:PRIMARY> rs.status();
{
  "set" : "prodRepl",
  "date" : ISODate("2014-02-22T21:27:53Z"),
  "myState" : 1,
  "members" : [
   {
     "_id" : 0,
     "name" : "mongodb1:27017",
     "health" : 1,
     "state" : 1,
     "stateStr" : "PRIMARY",
     "uptime" : 225,
     "optime" : Timestamp(1343239634, 1),
     "optimeDate" : ISODate("2014-02-22T21:27:14Z"),
     "self" : true
   },
   {
     "_id" : 1,
     "name" : "mongodb2:27017",
     "health" : 1,
     "state" : 5,
     "stateStr" : "STARTUP2",
     "uptime" : 39,
     "optime" : Timestamp(0, 0),
     "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
     "lastHeartbeat" : ISODate("2014-02-22T21:27:52Z"),
     "lastHeartbeatRecv" : ISODate("2014-02-22T21:27:52Z"),
     "pingMs" : 2,
     "lastHeartbeatMessage" : "initial sync cloning db: mongoprod"
   }
  ],
  "ok" : 1
}

anda akan melihat perubahan status dari startup menjadi secondary

ragiel0:PRIMARY> rs.status();
{
  "set" : "prodRepl",
  "date" : ISODate("2014-02-22T22:03:21Z"),
  "myState" : 1,
  "members" : [
    {
      "_id" : 0,
      "name" : "mongodb1:27017",
      "health" : 1,
      "state" : 1,
      "stateStr" : "PRIMARY",
      "uptime" : 2353,
      "optime" : Timestamp(1394309634, 1),
      "optimeDate" : ISODate("2014-02-22T21:27:14Z"),
      "self" : true
    },
    {
      "_id" : 1,
      "name" : "mongodb2:27017",
      "health" : 1,
      "state" : 2,
      "stateStr" : "SECONDARY",
      "uptime" : 2167,
      "optime" : Timestamp(1394309634, 1),
      "optimeDate" : ISODate("2014-02-22T21:27:14Z"),
      "lastHeartbeat" : ISODate("2014-02-22T22:03:21Z"),
      "lastHeartbeatRecv" : ISODate("2014-02-22T22:03:20Z"),
      "pingMs" : 0,
      "syncingTo" : "mongodb1:27017"
    }
],
"ok" : 1
}

Note: gak percaya , lu login aja di mongo2, pasti nanti akan tampil ragiel0:SECONDARY>

9. Start setting arbiter , On arbiter1: Start the mongod instance

arbiter ini akan jalan dibackground anda jadi anda bisa menggunakan screen atau tmux, atau > /dev/null 2>&1& atau apa saja lah yang bisa biasa anda gunakan, bisa berjalan berdampingan dengan replica mongo nya atau anda bisa pakai sembarang server yg masih dapat berkomunikasi dengan node mongo yg lain, cara setting nya begini aja 

mkdir /data/arb

mongod --port 27021 --dbpath /data/db-temp --replSet ragiel0 --bind_ip 0.0.0.0

10. Back To mongodb1: Add arbiter1 node

daftarkan arbiter nya dgn sintak ini  rs.addArb , contoh dibawah geys.

ragiel0> rs.addArb("arbiter1:30000");
{ "ok" : 1 }

cek pake syntak rs.config()

ragiel0:PRIMARY> rs.config();
{
  "_id" : "prodRepl",
  "version" : 3,
  "members" : [
    {
      "_id" : 0,
      "host" : "mongodb1:27017"
    },
    {
      "_id" : 1,
      "host" : "mongodb2:27017"
    },
    {
      "_id" : 2,
      "host" : "arbiter1:30000",
      "arbiterOnly" : true
    }
  ]
}
TAmbahan, jika mau remove pake ini ya 
ragiel0:PRIMARY> rs.remove("arbiter1:30000")
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1644490939, 1),
		"signature" : {
			"hash" : BinData(0,"UCnoJG5J71n2GTCY0P995Gd1Rqc="),
			"keyId" : NumberLong("7062999462582419460")
		}
	},
	"operationTime" : Timestamp(1644490939, 1)
}

11. Verify Final Replication Status

jika berhasil lu bisa jalanin  rs.config() and rs.status() di semua node 

ragiel0:PRIMARY> rs.status();
{
  "set" : "prodRepl",
  "date" : ISODate("2014-02-22T22:59:15Z"),
  "myState" : 1,
  "members" : [
     {
       "_id" : 0,
       "name" : "mongodb1:27017",
       "health" : 1,
       "state" : 1,
       "stateStr" : "PRIMARY",
       "uptime" : 5707,
       "optime" : Timestamp(1343042482, 1),
       "optimeDate" : ISODate("2014-02-22T22:14:42Z"),
       "self" : true
     },
     {
       "_id" : 1,
       "name" : "mongodb2:27017",
       "health" : 1,
       "state" : 2,
       "stateStr" : "SECONDARY",
       "uptime" : 5521,
       "optime" : Timestamp(1343042482, 1),
       "optimeDate" : ISODate("2014-02-22T22:14:42Z"),
       "lastHeartbeat" : ISODate("2014-02-22T22:59:14Z"),
       "lastHeartbeatRecv" : ISODate("2014-02-22T22:59:13Z"),
       "pingMs" : 0,
       "syncingTo" : "mongodb1:27017"
     },
     {
       "_id" : 2,
       "name" : "arbiter1:30000",
       "health" : 1,
       "state" : 7,
       "stateStr" : "ARBITER",
       "uptime" : 39,
       "lastHeartbeat" : ISODate("2014-02-22T22:59:14Z"),
       "lastHeartbeatRecv" : ISODate("2014-02-22T22:59:15Z"),
       "pingMs" : 0
     }
  ],
  "ok" : 1
}


done 
ragiel

11. cheat and sheet mongodb

berikut troubleshoot yg biasa di temui 

1. service tidak mau up , abis ganti config. biasanya karena service monggodb masih jalan di balik layar. anda dapat jalan kan perintah dibawah ini
# mongod , tunggu sebentar lalu tekan crtl+c , lalu jalan kan lagi service nya # systemctl start mongod
2. jika ingin paksa node secondary menjadi primary, jalankan perintah ini
ragiel0:PRIMARY> rs.stepDown(1); jika tidak bisa, lakukan ini
3. membuat priorify yg jadi node primary, jalankan perintah ini di node yang mau di settingnya

ragiel0:PRIMARY> conf = rs.conf()
ragiel0:PRIMARY> cfg.members[0].priority = 5

value 0 berarti node tersebut tidak akan menjadi primary selamanya
semakin besar value nya , berarti node tersebut semakin di prioritaskan menjadi primary node
klo gak bisa juga, restart service mongodb di server yg berstatus primary
Source :http://www.thegeekstuff.com/2014/02/mongodb-replication/
        https://iitbitz.wordpress.com/2016/03/14/how-to-setup-mongodb-replication-using-replica-set-and-arbiters/

Comments

Popular posts from this blog

Configure Open Smtp google with Postfix

membuat random password di linux

ISCSI