好记性不如烂博客,记录一下,以后需要了直接用就可以了。
本文配置的三个mongodb在同一台机器,按理来说应该放三台机器的,不过资源有限,一台机器将就用,配置副本集总比不配置的好。
本文配置使用数据库版本:3.2.6 64位版
1、拷贝三分mongodb到服务器下,目录依次为:
mongo_master // 192.168.1.11 27311 主库 实际在数据库运行时,哪个实例是主库是不一定的,但为了区分文件夹,暂且如此起名了
mongo_slaver // 192.168.1.11 27321 从库
mongo_arbiter // 192.168.1.11 27331 仲裁服务器
2、主库配置
2.1、打开cmd,进入mater\bin目录下:
cd E:\mongo\mongo_master\bin
2.2、执行以下命令,创建数据库服务:
mongod --replSet shard1 --port 27311 --logpath "E:\mongo\mongo_master\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_master\data\db" --serviceName "mongo_master" --serviceDisplayName "mongo_master" --install
3、从库配置
3.1、进入mongo-slaver\bin目录下:
cd E:\mongo\mongo_slaver\bin
3.2、执行以下命令、创建数据库服务:
mongod --replSet shard1 --port 27321 --logpath "E:\mongo\mongo_slaver\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_slaver\data\db" --serviceName "mongo_slaver" --serviceDisplayName "mongo_slaver" --install
4、仲裁服务器配置
4.1、进入mongo_arbiter\bin目录下:
cd E:\mongo\mongo_arbiter\bin
4.2、执行以下命令、创建数据库服务:
mongod --replSet shard1 --port 27331 --logpath "E:\mongo\mongo_arbiter\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_arbiter\data\db" --serviceName "mongo_arbiter" --serviceDisplayName "mongo_arbiter" --install
5、启动数据库,配置主库、从库、仲裁库:
mongo 192.168.1.11:27311/admin
config={_id:'shard1',members:[{_id:0,host:'192.168.1.11:27311'},{_id:1,host:'192.168.1.11:27321'},{_id:3,host:'192.168.1.11:27331', arbiterOnly:true}]}
rs.initiate(config)
5.1、说明:_id的值“shard1”是配置名称,多处使用,需统一。members下就是各mongo实例,第三个成员中的arbiterOnly:true表明改成员是仲裁服务器。rs.initiate(config)启用本配置。
5.2、查看副本集配置情况:rs.status()
5.3、改变副本集配置:
var config = rs.config();
config.members[0].host = '120.27.194.222:27311'
rs.reconfig(config)
5.4、如果出现“not master and slaveok=false”的提示错误,请输入一下命令:
rs.slaveOk()
6、在主库中配置用户:
6.1、为admin数据库添加admin用户
use admin
db.createUser({user: "admin",pwd: "admin",roles:[{ role:"clusterAdmin", db: "admin"},{role:"dbAdminAnyDatabase", db: "admin"},{role:"userAdminAnyDatabase",db: "admin"},{role:"readWriteAnyDatabase", db:"admin" } ]})
6.2、为mydb数据库添加sa用户
use mydb
db.createUser({user: "sa", pwd: "sa",roles:[{ role: "dbOwner", db: "mydb"} ]})
7、创建keyFile文件
7.1、在 E:\mongo\mongo_master创建文件夹key,在文件夹中创建文件key,内容要求如下:
(1)至少6个字符,小于1024字节
(2)认证时候不考虑文件中空白字符
(3)连接到副本集的成员和mongos进成的keyfile文件内容必须一样
(4)必须是base64编码,但是不能有等号
(5)文件权限必须是x00,也就是说,不能分配任何权限给group成员和other成员
windows下可以建一个txt文件,拷贝一段base64编码的内容,删除文件后缀名。将key文件夹连同key文件拷贝至三个mongo目录下即可。
8、修改主库、从库以认证方式启动:
8.1、停止主库服务,修改主库启动服务(添加启动参数--auth):
cd E:\mongo\mongo_master\bin
mongod --replSet shard1 --port 27311 --auth --keyFile "E:\mongo\mongo_master\key\key" --logpath "E:\mongo\mongo_master\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_master\data\db" --serviceName "mongo_master" --serviceDisplayName "mongo_master" --reinstall
8.2、停止从库服务,修改从库启动服务
cd E:\mongo\mongo_slaver\bin
mongod --replSet shard1 --port 27321 --auth --keyFile "E:\mongo\mongo_master\key\key" --logpath "E:\mongo\mongo_slaver\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_slaver\data\db" --serviceName "mongo_slaver" --serviceDisplayName "mongo_slaver" --reinstall
8.3、停止仲裁库服务,修改仲裁库启动服务
cd E:\mongo\mongo_arbiter\bin
mongod --replSet shard1 --port 27331 --auth --keyFile "E:\mongo\mongo_master\key\key" --logpath "E:\mongo\mongo_arbiter\data\log\MongoDB.log" --logappend --dbpath "E:\mongo\mongo_arbiter\data\db" --serviceName "mongo_arbiter" --serviceDisplayName "mongo_arbiter" --reinstall
9、java中连接数据库:
import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.MongoCollection;
ServerAddress master = new ServerAddress("192.168.1.11", 27311);
ServerAddress slaver = new ServerAddress("192.168.1.11", 27321);
List<ServerAddress> sends = new ArrayList<ServerAddress>();
sends.add(master);
sends.add(slaver);
MongoCredential c = MongoCredential.createCredential("sa", "mydb", "sa".toCharArray());
MongoClient mc = new MongoClient(sends, Arrays.asList(c));
MongoCollection<Document> test = mc.getDatabase("mydb").getCollection("test");
Document doc = new Document();
doc.put("name", "test");
mcoll.insertOne(doc)