介绍
在服务器上搭建了个复制集,只有两台虚拟机,系统一个红帽、一个centOS,经过测试,也还是能实现复制集的功能的。
- 172.21.29.210
- 172.21.29.211
但是我在同一个虚拟机上装了两个库,能够实现主从节点的自动切换。
MongoDB下载
1. 进入usr/local,下载压缩包,然后解压缩,再改个名,改成mongodb
cd ../usr/local
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.13.tgz`
tar zxvf mongodb-linux-x86_64-rhel70-3.6.3.tgz
mv mongodb-linux-x86_64-rhel70-3.6.3 mongodb
2.新建两个文件夹(存放目录,路径要记下,后续的配置文件中要对应)
mkdir /usr/local/mongodb/data -p # data数据文件的存放目录
mkdir /usr/local/mongodb/logs -p # logs日志文件的存放目录
3. 转到mongodb文件夹中,新建并修改配置文件
cd ./monogodb
vi mongodb.conf
4. 把这一坨整进去
# 设置数据文件的存放目录
dbpath=/usr/local/mongodb/data
#日志输出文件路径及其日志文件名
logpath=/usr/local/mongodb/logs/mongodb.log
#错误日志采用追加模式
logappend=true
#启用日志文件,默认启用
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true
#端口号 默认为27017
port=27017
#允许远程访问
bind_ip=0.0.0.0
#开启认证,必选先添加用户,先不开启(不用验证账号密码)
#auth=true
# 设置每个数据库将被保存在一个单独的目录
directoryperdb=true
configsvr = true
# 设置为以守护进程的方式运行,即在后台运行
fork=true
配置环境变量
vi /etc/profile
到文件最下面,把下方内容粘贴进去
# MongoDB 环境变量内容
export MONGODB_HOME=/usr/local/mongodb
export PATH=$MONGODB_HOME/bin:$PATH
使立即生效
source /etc/profile
启动mongo
到mongo文件夹中启动,config后面跟配置文件mongodb.conf的路径,successfully显示成功。
cd /usr/local/mongo
[root@iZuf6ahuk73s2puww2elmpZ]# ./bin/mongod -f mongodb.conf
·····················································
about to fork child process, waiting until server is ready for connections.
forked process: 5702
child process started successfully, parent exiting
# 查看状态。可以用kill 杀掉进程。
[root@iZuf6ahuk73s2puww2elmpZ]# ps -ef |grep mongodb
······················································
root 5702 1 2 14:38 ? 00:00:00 ./bin/mongod -f mongodb.conf
root 5729 5601 0 14:39 pts/0 00:00:00 grep --color=auto mongodb
复制集搭建
1.在两台以上的机器上下载mongodb,mongodb.config文件配置相同。
由于我是在同一台机器上下载了两个,只需要新建另外的文件夹,解压mongo,在配置文件中修改端口号(例如:20718),这涉及到防火墙问题,所以说我都是把防火墙关掉。
2.启动主节点(随便找一台顺手的即可,后期的主节点可以切换)
在mongodb文件夹中,启动mongodb
[root@roothost-10-90-2-105 mongodb]#./bin/mongod -f mongodb.conf # 主
3.进入主节点并新建root账号
[root@roothost-10-90-2-105 mongodb4.0.2]#mongo
MongoDB shell version v4.0.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 4.0.2
>use adimn
switch to admin
> db.createUser({ user: 'root', pwd: 'root', roles: [ { role:"root", db: "admin" } ] });
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
>
4.停止主节点(直接ctrl+c,退出去,然后)
# 查看状态。kill 5072可以杀掉进程。
[root@iZuf6ahuk73s2puww2elmpZ]# ps -ef |grep mongodb
······················································
root 5702 1 2 14:38 ? 00:00:00 ./bin/mongod -f mongodb.conf
root 5729 5601 0 14:39 pts/0 00:00:00 grep --color=auto mongodb
[root@iZuf6ahuk73s2puww2elmpZ]# kill 5702
5.启用密码认证和keyfile证书验证:
进入mongodb文件夹,生成keyfiles文件
然后把主节点上生成的energy-rc.key传到从节点上,配置同主节点一样
[root@roothost-10-90-2-105 mongodb]# openssl rand -base64 756 > energy-rc.key
# 设置只读权限
[root@roothost-10-90-2-105 mongodb]# chmod 400 energy-rc.key
配置文件中添加如下
[root@roothost-10-90-2-105 mongodb]# vi mongodb.conf
把下面东西粘进去
auth=true #打开认证
keyFile=/root/mongodb4.0.2/energy-rc.key #启用key验证
6.启动主从节点
[root@roothost mongodb4.0.2]#./bin/mongod -f mongodb.conf # 主
[root@server mongodb4.0.2]#./bin/mongod -f mongodb.conf # 从
7.进入主节点添加副本集节点
> use admin
switched to db admin
> db.auth('root','test123')
1
# 查看复制集状态
> rs.status()
{
"ok" : 0,
"errmsg" : "no replset config has been received",
"code" : 94,
"codeName" : "NotYetInitialized"
}
# 定义配置信息,把两台节点加进来
> conf=
{
"_id" : "rs0",
"members" : [
{ "_id" : 0, "host" : "172.21.29.210:27017" },
{ "_id" : 1, "host" : "172.21.29.211:27017" },
{ "_id" : 1, "host" : "172.21.29.211:27018" },
]
}
# 初始化复制集
> rs.initiate(conf)
{ "ok" : 1 }
# 查看配置信息
rs0:SECONDARY> rs.conf()
总之一大串,懒得粘了。
进入每个数据库,看看>之前都会变。
primary为主,可以读写,secondary为从节点,只能读数据,但是还要给个读的权限(很简单,一句话)。
rs0:SECONDARY> use admin
switched to db admin
rs0:SECONDARY> db.auth('root','test123')
1
rs0:SECONDARY> show dbs;
2018-09-05T13:31:49.563+0800 E QUERY [js] Error: listDatabases failed:{
"operationTime" : Timestamp(1536125517, 1),
"ok" : 0,
"errmsg" : "not master and slaveOk=false",
"code" : 13435,
"codeName" : "NotMasterNoSlaveOk",
"$clusterTime" : {
"clusterTime" : Timestamp(1536125517, 1),
"signature" : {
"hash" : BinData(0,"KIttQEB/e0mzlQvqPJzeLWZgREM="),
"keyId" : NumberLong("6597607397777211393")
}
}
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:67:1
shellHelper.show@src/mongo/shell/utils.js:876:19
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1
# 默认因为SECONDARY是不允许读写的,如果非要解决,方法如下:
rs0:SECONDARY> db.getMongo().setSlaveOk();
# 可以看到数据已经同步过来了
rs0:SECONDARY> show dbs;
admin 0.000GB
config 0.000GB
local 0.000GB
pay 0.000GB
rs0:SECONDARY> db.pay.find().count()
1
rs0:SECONDARY> db.pay.find()
{ "_id" : "1" }
第一次写文章,有点嘈杂,细节问题后期补充