Centos 7 中MongoDB3.4.2 集群搭建

因为近期工作原因需要使用mongodb数据库,索性将搭建的全部过程分享出来。

一、环境准备

1、Centos7 
2、mongodb3.4.2 
3、三台机器IP分别是:192.168.9.9、192.168.9.10、192.168.9.11

  • 其他版本:https://www.mongodb.org/dl/linux/x86_64

二、mongdb数据库的安装

如下操作是分别在三台机器进行

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副本集

下面对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();

四、增加安全认证机制KeyFile

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> 

你可能感兴趣的:(mongodb分片)