Implement MongoDB replication in 3 simple steps
After we find out how replication works with MySQL lets look at mongoDB
Use the following steps to implement mongoDB Replication:
1) Create the data directories
2) Create the replication set and instances
3) Configure, primary, secundaries and an arbiter
Donwload MongoDB? Goto the Download site
Step 1) Create the data directories
Start by creating a data directory for each replica set member, one for the primary and one for the secundary. We add also an arbiter. The arbiter does not relpicate data, but choose a new primary in case there is an outage of the existing primary.
mkdir /data/node1 mkdir /data/node2 mkdir /data/arbiter
Step 2) Create the replication set and instances
Next, start each member as a separate mongod. Since you’ll be running each process on the same machine, it’s probably easiest to start each mongod in a separate terminal window:
mongod --replSet person --dbpath /data/node1 --port 40001 mongod --replSet person --dbpath /data/node2 --port 40002 mongod --replSet person --dbpath /data/arbiter --port 40003
Step 3) Configure, primary, secundaries and an arbiter
Logon on the primary node to proceed, you need to configure the replica set, because if you examine the mongod log output, the first thing you’ll notice are error messages saying that the configuration can’t be found.
mongo localhost:40001 MongoDB shell version: 2.2.0 connecting to: localhost:40001/test
> rs.initiate() { "info2" : "no configuration explicitly specified -- making one", "me" : "Computername.local:40001", "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 }
Now connect again to the primary node, and add the secondary node including the arbiter node:
person:PRIMARY> rs.add(Computername:40002) { "ok" : 1 } person:PRIMARY> rs.add(Computername:40003, {arbiterOnly:true}) { "ok" : 1 }
Check if the configuration is ok, with rs.status():
person:PRIMARY> rs.status() { "set" : "person", "date" : ISODate("2012-10-28T19:50:52Z"), "myState" : 1, "members" : [ { "_id" : 0, "name" : "Computername.local:40001", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", "uptime" : 1266, "optime" : Timestamp(1351453811000, 1), "optimeDate" : ISODate("2012-10-28T19:50:11Z"), "self" : true }, { "_id" : 1, "name" : "Computername.local:40002", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 41, "optime" : Timestamp(1351453811000, 1), "optimeDate" : ISODate("2012-10-28T19:50:11Z"), "lastHeartbeat" : ISODate("2012-10-28T19:50:51Z"), "pingMs" : 0 } ], "ok" : 1 } { "_id" : 1, "name" : "Computername.local:40003", "health" : 1, "state" : 3, "stateStr" : "ARBITER", "uptime" : 14, "optime" : Timestamp(1351453811000, 1), "optimeDate" : ISODate("2012-10-28T19:50:11Z"), "lastHeartbeat" : ISODate("2012-10-28T19:50:51Z"), "pingMs" : 0 } ], "ok" : 1 }
And now its time to check if it works. We put a person in our primary database:
person:PRIMARY> use portraitGallery switched to db portraitGallery person:PRIMARY> db.person.save( { "name" : "Maikel", "group" : [ "Oracle", "ExaData", "Big Data"], } )
Logon on the secondary and check if the data is there, and don’t forget to enable reading with rs.slaveOk() or db.getMongo().setSlaveOk()
mongo localhost:40002 MongoDB shell version: 2.2.0 connecting to: localhost:40002/test person:SECONDARY> rs.slaveOk() person:SECONDARY> use portraitGallery switched to db portraitGallery person:SECONDARY> db.person.find() { "_id" : ObjectId("508d971dda0730903bcbb612"), "name" : "Maikel", "group" : [ "Oracle", "ExaData", "Big Data" ] }
Now we can test it with a filler script. Type in the primary something like:
person:PRIMARY> for(i=0; i<1000000; i++) { db.person.save({person: i}); }
And in the secondary check if the collection is filled:
person:SECONDARY> db.person.find() { "_id" : ObjectId("508f95e9e38917f43ae20db3"), "person" : 0 } { "_id" : ObjectId("508f95e9e38917f43ae20db4"), "person" : 1 } { "_id" : ObjectId("508f95e9e38917f43ae20db5"), "person" : 2 } { "_id" : ObjectId("508f95e9e38917f43ae20db6"), "person" : 3 } { "_id" : ObjectId("508f95e9e38917f43ae20db7"), "person" : 4 } { "_id" : ObjectId("508f95e9e38917f43ae20db8"), "person" : 5 } { "_id" : ObjectId("508f95e9e38917f43ae20db9"), "person" : 6 } { "_id" : ObjectId("508f95e9e38917f43ae20dba"), "person" : 7 } { "_id" : ObjectId("508f95e9e38917f43ae20dbb"), "person" : 8 } { "_id" : ObjectId("508f95e9e38917f43ae20dbc"), "person" : 9 } { "_id" : ObjectId("508f95e9e38917f43ae20dbd"), "person" : 10 } { "_id" : ObjectId("508f95e9e38917f43ae20dbe"), "person" : 11 } { "_id" : ObjectId("508f95e9e38917f43ae20dbf"), "person" : 12 } { "_id" : ObjectId("508f95e9e38917f43ae20dc0"), "person" : 13 } { "_id" : ObjectId("508f95e9e38917f43ae20dc1"), "person" : 14 } { "_id" : ObjectId("508f95e9e38917f43ae20dc2"), "person" : 15 } { "_id" : ObjectId("508f95e9e38917f43ae20dc3"), "person" : 16 } { "_id" : ObjectId("508f95e9e38917f43ae20dc4"), "person" : 17 } { "_id" : ObjectId("508f95e9e38917f43ae20dc5"), "person" : 18 } { "_id" : ObjectId("508f95e9e38917f43ae20dc6"), "person" : 19 } Type "it" for more person:SECONDARY> db.person.count() 194079 person:SECONDARY> db.person.count() 215657 person:SECONDARY> db.person.count() 228488 person:SECONDARY> db.person.count() 239528 person:SECONDARY>
Works, succes with mongoDB!!!
If you wan to do the mongoDB intro lab goto mongodb.info
Implement MySQL Replication in 3 simple steps
For a project we need a second MySQL database for reporting, so whe can split the day to day business (forms) and the analytic reporting. Another thing is that the data must be very actual, so a nightly backup is not really an option.
Use the following steps to implement MySQL Replication:
1) Configure master and slave instances
2) Create Replication user on the master
3) Connect from the slave to the master
Step 1) Configure master- and slave instances
Every server need a unique server ID. We use for the master server-id=1 and for the slave server-id=2.
Binary logging must be enabled (log-bin=mysql-bin) on the master because the binary log is the basis for sending data changes from the master to its slaves. If binary logging is not enabled, replication will not be possible.
For the greatest possible durability and consistency in a replication setup using InnoDB with transactions, you should use innodb_flush_log_at_trx_commit=1 and sync_binlog=1.
Find the MySQL configuration files (on Ubuntu it is located in /etc/mysql/my.cnf). Add the following lines in both the master- and slave configuration files.
[mysqld] server-id=1 log-bin=mysql-bin innodb_flush_log_at_trx_commit=1 sync_binlog=1
[mysqld] server-id=2 log-bin=mysql-bin innodb_flush_log_at_trx_commit=1 sync_binlog=1
Restart the master- and slave instances.
/etc/init.d/mysql restart
Step 2) Create Replication user on the master
Now we need to create a Replication user on the master that is used for the connection from the slave.
Logon on you’re master with the root user:
mysql -u root -p
and type in the MySQL prompt:
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'repl';
Now we use the ‘show master status’ statement to determine the current binary log file name and position. Remember this carefully! In our example we get the following output.
mysql> show master status; +------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +------------------+----------+--------------+------------------+ | mysql-bin.000153 | 106 | | | +------------------+----------+--------------+------------------+ 1 row in set (0.00 sec)
Step 3) Connect from the slave to the master
To set up the slave to communicate with the master for replication, you must tell the slave the necessary connection information.
First logon on you’re slave with the root user:
mysql -u root -p
and type in the MySQL prompt:
mysql> CHANGE MASTER TO -> MASTER_HOST='ip-number of master', -> MASTER_USER='repl', -> MASTER_PASSWORD='repl', -> MASTER_LOG_FILE='mysql-bin.000153', -> MASTER_LOG_POS=106;
And … the last command simple type:
mysql> START SLAVE;
… and you are running MySQL in with Replication! Try to make some changes in the master. For example make a new database and a table and fill it with some rows. Look in the slave and see that the changes are processed.
If there is existing data in the master then create a data dump with the ‘mysqldump’ command on the master. Once the data dump has been completed, you then import this data into the slave before starting the above Replication process.
More information MySQL Replication How To