因为近期工作原因需要使用mongodb数据库,索性将搭建的全部过程分享出来。
1、Centos7
2、mongodb3.4.2
3、三台机器IP分别是:192.168.9.9、192.168.9.10、192.168.9.11
如下操作是分别在三台机器进行
1、首先分别在三台机器上下载好mongodb安装包mongodb-linux-x86_64-rhel70-3.4.2.tgz
mkdir /data && cd /data
wget https://bbcbackup.oss-cn-shenzhen.aliyuncs.com/run/linux/mongodb-linux-x86_64-rhel70-3.4.2.tgz
2、使用tar命令解压安装包然后修改解压后的目录名
tar zxvf mongodb-linux-x86_64-rhel70-3.4.2.tgz
mv mongodb-linux-x86_64-rhel70-3.4.2 mongodb
3、 进入 mongodb目录中新建三个目录conf、logs 、db
conf存储配置文件目录,logs用来存储日志目录,db用来存储数据目录
cd mongodb && mkdir conf logs db
4、进入conf目录新建mongodb的配置文件mongodb.conf
cd conf && touch mongodb.conf
5、编写配置文件mongodb.conf,内容如下
其中dbpath是数据库文件目录,logpath是日志目录,port是mongodb所占用的端口,fork是true的时候表示在后台启动
dbpath=/data/mongodb/db
logpath=/data/mongodb/logs/mongodb.log
port=27017
fork=true
6、分别在三台机器上启动mongodb
其中–replSet表示副本集群参数 ,mongoTest是副本集名称,这里的名字可以任意取,另外两台机也要和这个一样
/data/mongodb/bin/mongod --config /data/mongodb/conf/mongodb.conf --replSet mongoTest
如果启动成功会看到类似下面的提示
about to fork child process, waiting until server is ready for connections.
forked process: 15398
child process started successfully, parent exiting
下面对mongodb副本集进行初始化
1、进入其中一台机器的mongo shell操作
/data/mongodb/bin/mongo -port 27017
2、 使用admin库
use admin
3、mongo副本配置
config={_id:'mongoTest',members:[{_id:0,host:'192.168.9.9:27017'},{_id:1,host:'192.168.9.10:27017'},{_id:2,host:'192.168.9.11:27017'}]}
rs.initiate(config)
上图表示初始化完毕
4、查看详细
mongoTest:PRIMARY> rs.status()
{
"set" : "mongoTest",
"date" : ISODate("2018-01-03T14:08:25.966Z"),
"myState" : 1,
"term" : NumberLong(1),
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.9.11:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2512,
"optime" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-03T14:08:18Z"),
"electionTime" : Timestamp(1514986487, 1),
"electionDate" : ISODate("2018-01-03T13:34:47Z"),
"configVersion" : 1,
"self" : true
},
{
"_id" : 1,
"name" : "192.168.9.10:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2028,
"optime" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-03T14:08:18Z"),
"optimeDurableDate" : ISODate("2018-01-03T14:08:18Z"),
"lastHeartbeat" : ISODate("2018-01-03T14:08:24.568Z"),
"lastHeartbeatRecv" : ISODate("2018-01-03T14:08:25.476Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.9.9:27017",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.9.9:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 2028,
"optime" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1514988498, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2018-01-03T14:08:18Z"),
"optimeDurableDate" : ISODate("2018-01-03T14:08:18Z"),
"lastHeartbeat" : ISODate("2018-01-03T14:08:24.568Z"),
"lastHeartbeatRecv" : ISODate("2018-01-03T14:08:25.412Z"),
"pingMs" : NumberLong(0),
"syncingTo" : "192.168.9.11:27017",
"configVersion" : 1
}
],
"ok" : 1
}
若显示上列信息则说明集群搭建成功
MongoDb的“not master and slaveok=false”错误及解决方法
在SECONDARY查询出发现如下错误:
SECONDARY> show collections;
Sat Aug 4 15:29:00 uncaught exception: error: { "$err" : "not master and slaveok=false", "code" : 13435 }
这是正常的,因为SECONDARY是不允许读写的,如果非要解决,方法如下:
SECONDARY> rs.slaveOk();
4.1 集群之间的安全认证
集群之间的复制增加keyFile认证
#生成key
openssl rand -base64 745 > /data/mongodb/mongodb-keyfile
chmod 600 /data/mongodb/mongodb-keyfile
# 该key的权限必须是600
将该key放到集群中机器的每一台上,记住必须保持一致,权限设置成600;
4.2 修改配置
在mongodb.conf启动配置文件中增加配置项
#安全认证机制
keyFile=/data/mongodb/mongodb-keyfile
4.3 主库配置用户
也可后面配置,开启keyfile认证就默认开启了auth认证了,为了保证后面可以登录,我提前创建了用户:
先创建管理员账户
db.createUser({user:"admin",pwd:"xxxxxx",roles:[{role:"userAdminAnyDatabase",db:"admin"}]});
db.createUser({user:"root",pwd:"xxxxxxx",roles:[{role:"root",db:"admin"}]});
#认证用户
db.auth("admin","xxxxxxx")
db.auth("root","xxxxxxx")
4.4 重启进入
重新启动mongodb,记住重新启动时候,keyfile的指定如果没有在配置文件中配置,就必须启动时候使用参数keyfile指定,关闭顺序注意下,mongodb集群有自动切换主库功能,如果先关主库,主库就切换到其它上面去了,这里预防主库变更,从库关闭后再关闭主库。
[root@localhost conf]# /data/mongodb/bin/mongo -u root -p
MongoDB shell version v3.4.2
Enter password:
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
2018-01-26T14:08:32.116+0800 I CONTROL [initandlisten]
test_set:PRIMARY> use admin
switched to db admin
重新查看从库和集群状态都是正常。
5.1 启动认证
开启了安全认证就可以开始对每个数据库进行安全认证了,首先给用户创建一个数据库:
mongoTest:PRIMARY> use user_test
switched to db user_test
#插入一条数据
mongoTest:PRIMARY> db.admin.insert({item: "ABC1",details: {model: "14Q3",manufacturer: "XYZ Company"},stock: [ { size: "S", qty: 25 }, { size: "M", qty: 50 } ],category: "clothing"})
#创建用户数据库的用户:
mongoTest:PRIMARY> db.createUser({user:"test_user",pwd:"xxxxxx",roles:[{role:"readWrite",db:"user_test"}]});
创建完成会显示成功,可以用db.system.users.find()查看所有用户验证用户是否存在;
5.2 验证用户登录
#client操作
[root@localhost conf]# /data/mongodb/bin/mongo 192.168.206.142/user_test -u test_user -p xxxxxx
MongoDB shell version v3.4.2
connecting to: mongodb://192.168.9.9/user_test
MongoDB server version: 3.4.2
mongoTest:PRIMARY>