1.分別在每台機器上建立mongodb
解壓mongodb
tar zxvf mongodb-linux-x86_64-2.6.0.tgz mv mongodb-linux-x86_64-2.6.0 /usr/local/mongodb
2.配置環境變量
echo 'export PATH=$PATH:/usr/local/mongodb/bin' >> /etc/profile
3.存放mongodb數據日志文件
mkdir -p /usr/local/mongodb19999/{etc,date,log}
4.啟動mongodb
/usr/local/mongodb/bin/mongod --fork --dbpath=/usr/local/mongodb/date --logpath=/usr/local/mongodb/log/mongodb.log --logappend --replSet repset
5.初始化副本集
在三台機器上任意一台機器登陸mongodb
使用admin數據庫
#定義副本集配置變量,這里的 _id:”repset” 和上面命令參數“ –replSet repset” 要保持一樣 輸入一下內容:注意IP和端口換成你自己的
config = { _id:"repset", members:[ {_id:0,host:"192.168.10.92:27017"}, {_id:1,host:"192.168.10.93:27017"}, {_id:2,host:"192.168.10.94:27017"}] }
#輸出
{ "_id" : "repset", "members" : [ { "_id" : 0, "host" : "192.168.10.92:27017" }, { "_id" : 1, "host" : "192.168.10.93:27017" }, { "_id" : 2, "host" : "192.168.10.94:27017" } ] }
#初始化副本集配置
rs.initiate(config);
#輸出成功
{ "info" : "Config now saved locally. Should come online in about a minute.", "ok" : 1 }
查看集群節點的狀態 rs.status();
#輸出
整個副本集已經搭建成功了。
#在主節點PRIMARY 機器上連接到終端:
mongo 127.0.0.1
#建立test 數據庫。
use test;
往testdb表插入數據。
> db.testdb.insert({"test1":"testval1"})
> db.testdb.insert({"test1":"testval1"})
repset:SECONDARY> use test;
輸出
Sun Dec 29 21:50:48.590 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:128
#mongodb默認是從主節點讀寫數據的,副本節點上不允許讀,需要設置副本節點可以讀。
repset:SECONDARY> db.getMongo().setSlaveOk();
#可以看到數據已經復制到了副本集。
repset:SECONDARY> db.testdb.find(); 1 2
#輸出
{ "_id" : ObjectId("52c028460c7505626a93944f"), "test1" : "testval1" }
先停掉主節點,查看從節點的日志可以看到經過一系列的投票選擇操作,其中1台當選主節點,其他節點會同步數據過來。
查看整個集群的狀態,可以看到停掉的服務器為狀態不可達。
再啟動原來的主節點,原來的主節點變為 SECONDARY。
java程序連接副本集測試。三個節點有一個節點掛掉也不會影響應用程序客戶端對整個副本集的讀寫! public class TestMongoDBReplSet { public static void main(String[] args) { try { List<ServerAddress> addresses = new ArrayList<ServerAddress>(); ServerAddress address1 = new ServerAddress("192.168.10.92" , 27017); ServerAddress address2 = new ServerAddress("192.168.10.93" , 27017); ServerAddress address3 = new ServerAddress("192.168.10.94" , 27017); addresses.add(address1); addresses.add(address2); addresses.add(address3); MongoClient client = new MongoClient(addresses); DB db = client.getDB( "test"); DBCollection coll = db.getCollection( "testdb"); // 插入 BasicDBObject object = new BasicDBObject(); object.append( "test2", "testval2" ); coll.insert(object); DBCursor dbCursor = coll.find(); while (dbCursor.hasNext()) { DBObject dbObject = dbCursor.next(); System. out.println(dbObject.toString()); } } catch (Exception e) { e.printStackTrace(); } } }
常規寫操作來說並沒有讀操作多,所以一台主節點負責寫,兩台副本節點負責讀。 1、設置讀寫分離需要先在副本節點SECONDARY 設置 setSlaveOk。 2、在程序中設置副本節點負責讀操作,如下代碼: public class TestMongoDBReplSetReadSplit { public static void main(String[] args) { try { List<ServerAddress> addresses = new ArrayList<ServerAddress>(); ServerAddress address1 = new ServerAddress("192.168.10.92" , 27017); ServerAddress address2 = new ServerAddress("192.168.10.93" , 27017); ServerAddress address3 = new ServerAddress("192.168.10.94" , 27017); addresses.add(address1); addresses.add(address2); addresses.add(address3); MongoClient client = new MongoClient(addresses); DB db = client.getDB( "test" ); DBCollection coll = db.getCollection( "testdb" ); BasicDBObject object = new BasicDBObject(); object.append( "test2" , "testval2" ); coll.insert(object); //讀操作從副本節點讀取 ReadPreference preference = ReadPreference. secondary(); DBObject dbObject = coll.findOne(object, null , preference); System. out .println(dbObject); } catch (Exception e) { e.printStackTrace(); } } }