以下是我给公司搭建mongoDB副本集的过程,查阅了不少资料,赶紧记录下来,供大家参考。
一、准备三台服务器(三个mongod实例):
192.168.100.101:27017
192.168.100.102:27017
192.168.100.103:27017
打算把服务器配置较高的192.168.100.101作为默认的PRIMARY,其它两台作为SECONDARY。
二、给三台服务器分别按装mongoDB
1、下载安装包
[root@server ~]# cd /home/
[root@server home]# curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.10.tgz
[root@server home]# mkdir mongodb
[root@server home]# tar zxvf mongodb-linux-x86_64-3.2.10.tgz -C mongodb/
这个时候发现,mongodb文件夹里面还有一个压缩包同名的文件夹,早知道直接解压到home下,重命名了,现在需要到mongodb/mongodb-linux-x86_64-3.2.10/目录下把内容copy到上一层
[root@server home]# cd mongodb/mongodb-linux-x86_64-3.2.10/
[root@server mongodb-linux-x86_64-3.2.10]# mv ./* ../
然后把该空的文件夹删掉即可
[root@server mongodb]# rm -rf ./mongodb-linux-x86_64-3.2.10/
[root@server mongodb]# ll
total 100
drwxr-xr-x. 2 root root 4096 Jul 13 13:39 bin
-rw-r--r--. 1 root root 34520 Sep 30 2016 GNU-AGPL-3.
-rw-r--r--. 1 root root 16726 Sep 30 2016 MPL-2
-rw-r--r--. 1 root root 1359 Sep 30 2016 README
-rw-r--r--. 1 root root 35910 Sep 30 2016 THIRD-PARTY-NOTICES
将mongodb安装文件复制到/usr/local/目录(这只是我们约定的安装文件目录)
[root@uat-server home]#mv mongodb /usr/local/
2、配置环境变量:
修改/etc/profile内容 :
[root@server ~]# vi /etc/profile
在文件末尾加上以下配置:
export MONGODB_HOME=/usr/local/mongodb #这里就是mongodb解压之后的安装文件目录
export PATH=$PATH:$MONGODB_HOME/bin
然后保存退出,执行下面的命令使之立即生效:
[root@server ~]# source /etc/profile
3、配置mongodb实例相关目录
在/home目录下在创建一个mongodb目录,用于存放mongodb相关数据;然后在mongodb下依次创建log、data、conf目录,分别存放日志、数据和配置信息。
进入conf文件夹,创建mongodb启动实例的基本配置:
[root@server conf]# vi mongod.conf
在编辑器模式下输入以下内容:
bind_ip = ... #允许连接mongodb的ip,0.0.0.0表示不限制访问
dbpath = /home/mongodb/data #本次启动的mongodb实例,对应的数据存放目录
logpath = /home/mongodb/log/mongodb.log #日志存放目录
logappend = true #多次启动,日志保存模式,这里是添加,而不是每次重启都清空
port = 27017 #mongodb实例的连接端口,采用了默认的端口27017
fork = true #是否以守护进程方式运行实例
directoryperdb = true #为每个db设定其归属目录
maxConns=2000 #最大连接数
#auth = true #是否以安全认证方式运行,默认是不认证的非安全方式,先注释掉
#实例认证密码文件,用于主从或者副本集直接验证,同副本集的文件内容需要一致,先注释掉
#keyFile= /home/mongodb/conf/key
httpinterface = true #提供HTTP的log界面,默认端口28017
replSet = replSetHO #副本集名称,同一副本集所有实例,name需要一致
这里先注释掉auth和keyFile,主要是为了第一次启动,登录客户端创建root账号。
三、启动mongodb实例,配置副本集
1、分别启动三台服务器的mongod实例
[root@server conf]# mongod --config /home/mongodb/conf/mongod.conf
查看下是否启动成功了,看到已经有进程ID,表示成功;其实执行上面的命令,稍等片刻会提示成功。
[root@server conf]# ps -ef | grep mongod
root 3964 1 Jul12 ? 00:07:26 mongod --config /home/mongodb/conf/mongod.conf
root 4709 4666 22:37 pts/ 00:00:00 grep mongod
2、登录到预定义的PRIMARY的mongodb,配置副本集
[root@server conf]# mongo
在客户端执行以下命令:
replSetHO:PRIMARY> config = { _id:"replSetHO", members:[{_id:,host:"192.168.100.186:27017", priority : 10},{_id:1,host:"192.168.100.185:27017", priority : 8},{_id:2,host:"192.168.100.184:27017", priority : 6}]}
replSetHO:PRIMARY> rs.initiate(config);
Config就是这次副本集的json内容:
{
"_id": "replSetHO",
"members": [
{
"_id": ,
"host": "192.168.100.101:27017",
"priority": 10 #这个是配置实例权重,权重最大的实例为默认启动的PRIMARY,PRIMARY发生宕机,剩余的副本集成员会选举目前priority最大的实例作为新的PRIMARY
},
{
"_id": 1,
"host": "192.168.100.102:27017",
"priority": 8
},
{
"_id": 2,
"host": "192.168.100.103:27017",
"priority": 6
}
]
}
rs.initiate(config); 就是根据配置文件初始化副本集。
如果副本集启动成功,最终通过mongo命令登录到三台服务器,可以看到,192.168.100.101显示的是replSetHO:PRIMARY,其余两台显示的是replSetHO:SECONDARY。
至此,基本的mongodb副本集配置并启动成功了。
3、添加root账号
切换到admin数据库:use admin
创建一个账号为root,密码为123456(生产环境请用复杂密码)的管理员账号:
db.createUser({user: "root",pwd: "123456",roles: [ { role: "root", db: "admin" } ]})
四、配置mongodb实例权限验证
1、修改配置文件
还记得前面的mongod.conf文件中,注释了两行配置吗?
#auth = true #是否以安全认证方式运行,默认是不认证的非安全方式,先注释掉
#实例认证密码文件,用于主从或者副本集直接验证,同副本集的文件内容需要一致,先注释掉
#keyFile= /home/mongodb/conf/key
打开这两行配置,并重启mongod实例
2、重启mongod
首先在连接客户端的情况下,切换到admin数据库,执行命令:
replSetHO:SECONDARY> db.shutdownServer();
等到进程结束,再依次重启三台服务器即可。
3、用root账号登录mongod实例
[root@server ~]# mongo -u root -p '123456' admin
-u表示用户名,-p表示密码,admin表示登录的默认数据库
五、副本集相关维护命令
1、状态查看
通过rs.help()命令,可以查看副本集相关操作命令:
replSetHO:PRIMARY> rs.help()
rs.status() #查看副本集整体健康状态
rs.initiate() #使用默认配置初始化副本集
rs.initiate(cfg) #使用指定配置,初始化副本集;这是我们使用的命令
rs.conf() #从local.system.replset获取副本集当前配置信息
rs.reconfig(cfg) #指定配置信息重置副本集;指定第二个参数{force:true},来强制更新
rs.add(hostportstr) #使用默认配置,给副本集添加新成员
rs.add(membercfgobj) #使用指定配置,给副本集添加新成员
rs.addArb(hostportstr) #给副本集添加一个仲裁节点,只投票,不会成为数据节点
rs.stepDown([stepdownSecs, catchUpSecs]) #给PRIMARY降权,使之在指定时间内成为SECONDARY,会恢复
rs.syncFrom(hostportstr) #使SECONDARY从指定的服务器同步数据
rs.freeze(secs) #让自己在指定秒数内不会成为PRIMARY
rs.remove(hostportstr) #从副本集删除指定节点
rs.slaveOk() #SECONDARY节点默认是不能查询的,需要执行该命令,使之可以查询
rs.printReplicationInfo() #查看操作日志以及日志时间
rs.printSlaveReplicationInfo() #查看所有SECONDARY延迟情况
db.isMaster() #查询当前PRIMARY信息来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3122804/ ,如需转载,请注明出处,否则将追究法律责任。