Mongodb副本集配置

一:概念


 通俗的讲副本集就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。


二:实验环境


 


三:实验步骤


3.1 下载


下载地址:

https://www.mongodb.org/

下载完成后传到三台机器的/download下。

 

#3.2-3.5在三台机器上都要执行。

这里以192.168.6.51为例:


3.2 解压

 

[root@ser6-51 download]# tar xvf mongodb-linux-x86_64-2.6.9.tgz 
mongodb-linux-x86_64-2.6.9/README
mongodb-linux-x86_64-2.6.9/THIRD-PARTY-NOTICES
mongodb-linux-x86_64-2.6.9/GNU-AGPL-3.0
mongodb-linux-x86_64-2.6.9/bin/mongodump
mongodb-linux-x86_64-2.6.9/bin/mongorestore
mongodb-linux-x86_64-2.6.9/bin/mongoexport
 
mongodb-linux-x86_64-2.6.9/bin/mongoimport
mongodb-linux-x86_64-2.6.9/bin/mongostat
 
mongodb-linux-x86_64-2.6.9/bin/mongotop
mongodb-linux-x86_64-2.6.9/bin/mongooplog
mongodb-linux-x86_64-2.6.9/bin/mongofiles
mongodb-linux-x86_64-2.6.9/bin/bsondump
mongodb-linux-x86_64-2.6.9/bin/mongoperf
mongodb-linux-x86_64-2.6.9/bin/mongod
mongodb-linux-x86_64-2.6.9/bin/mongos
mongodb-linux-x86_64-2.6.9/bin/mongo


#为了方便管理,把安装文件移动到/data

[root@ser6-51 download]# mv mongodb-linux-x86_64-2.6.9 /data/mongodb

  

3.3 创建相关目录

为mongodb创建数据库存放的位置和日志文件

[root@ser6-51 mongodb]# cd /data/mongodb/ 
[root@ser6-51 mongodb]# mkdir data
[root@ser6-51 mongodb]# touch logs
[root@ser6-51 mongodb]# ls -ltr
total 68
-rw-r--r-- 1 1046 1046  1359 Mar 23 22:49 README
-rw-r--r-- 1 1046 1046 34520 Mar 23 22:49 GNU-AGPL-3.0
-rw-r--r-- 1 1046 1046 17793 Mar 23 22:49 THIRD-PARTY-NOTICES
drwxr-xr-x 2 root root  4096 Jul 15 13:26 bin
drwxr-xr-x 2 root root  4096 Jul 15 13:34 data
-rw-r--r-- 1 root root     0 Jul 15 13:34 logs

 

3.4 创建Linux用户

[root@ser6-51 mongodb]# groupadd mongodb
[root@ser6-51 mongodb]# useradd -g mongodb mongodb
[root@ser6-51 mongodb]# chown -R mongodb:mongodb /data/mongodb
[root@ser6-51 ~]# passwd mongodb
Changing password for user mongodb.
New password: 
BAD PASSWORD: it is based on a dictionary word
BAD PASSWORD: is too simple
Retype new password: 
passwd: all authentication tokens updated successfully.

 

3.5 配置PATH

#mongodb用户:

 

PATH末尾添加Mongodb 安装文件/bin路径:

 

[root@ser6-51 init.d]# su - mongodb 

[mongodb@ser6-51 ~]$ vi .bash_profile  

PATH=$PATH:$HOME/bin:/data/mongodb/bin/

[mongodb@ser6-51 ~]$ source .bash_profile 

这样就可以不用进入到/data/mongodb/bin/路径下使用mongo命令了,直接输入mongo命令即可。 

#root用户省略

 

3.6 启动mongodb


#192.168.6.51:
[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs  --fork --replSet MyReplset/192.168.6.51:27017
about to fork child process, waiting until server is ready for connections.
forked process: 4936
child process started successfully, parent exiting
 
#192.168.6.52:
[root@ser6-52 bin]#  mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs  --fork --replSet MyReplset/192.168.6.52:27017
about to fork child process, waiting until server is ready for connections.
forked process: 19649
child process started successfully, parent exiting
 
#192.168.6.70
 
[mongodb@ser6-70 ~]$  mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs  --fork --replSet MyReplset/192.168.6.70:27017
about to fork child process, waiting until server is ready for connections.
forked process: 9782
child process started successfully, parent exiting
 
#注意:MyReplset是自定义的副本集名称

 

3.7 开放防火墙端口

#三台机器都需要开放端口。

为了让其他服务器可以远程连接该mongodb服务器,如果已经开启了防火墙,需要开放其端口。

vi /etc/sysconfig/iptables

直接在配置文件里已有的-A INPUT那些命令下面

添加一行:

-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT

重启防火墙

[root@ser6-52 mongodb]# /etc/init.d/iptables restart

iptables: Setting chains to policy ACCEPT: filter          [  OK  ]

iptables: Flushing firewall rules:                         [  OK  ]

iptables: Unloading modules:                               [  OK  ]

iptables: Applying firewall rules:                         [  OK  ]

 

 

3.8 初始化副本集


连接其中一个节点,初始化命令只能执行一次。

[root@ser6-51 ~]# mongo
MongoDB shell version: 2.6.9
connecting to: test
> use admin;
switched to db admin
 
> config = { _id:"MyReplset", members:[
...  {_id:0,host:"192.168.6.51:27017"},
...  {_id:1,host:"192.168.6.52:27017"},
...  {_id:2,host:"192.168.6.70:27017"}]
...  }
{
"_id" : "MyReplset",
"members" : [
{
"_id" : 0,
"host" : "192.168.6.51:27017"
},
{
"_id" : 1,
"host" : "192.168.6.52:27017"
},
{
"_id" : 2,
"host" : "192.168.6.70:27017"
}
]
}
> rs.initiate(config);
{
"info" : "Config now saved locally.  Should come online in about a minute.",
"ok" : 1
}
 
 


/*

config = { _id:"MyReplset", members:[ {_id:0,host:"192.168.6.51:27017"},

 {_id:1,host:"192.168.6.52:27017"}, {_id:2,host:"192.168.6.70:27017"}] }

 

*/

--注意,假如开启用户认证之后,初始化副本集时报错:"errmsg" : "not authorized on admin to execute command { replSetInitiate: { _id: \"MyReplset\", members。需要赋予用户clusterManager角色。如:db.grantRolesToUser( "admin" , [ { role: "clusterManager", db: "admin" } ]);

3.9 查看状态


MyReplset:PRIMARY> db.printSlaveReplicationInfo();
source: 192.168.6.52:27017
syncedTo: Wed Jul 15 2015 16:04:52 GMT+0800 (CST)
0 secs (0 hrs) behind the primary 
source: 192.168.6.70:27017
syncedTo: Wed Jul 15 2015 16:04:52 GMT+0800 (CST)
0 secs (0 hrs) behind the primary 


 

显示的是从节点的数据源列表,其中有数据滞后时间。


3.10 设置副本节点可读


#mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。

 

#在所有节点上进行设置

修改root用户,mongodb用户家目录下的.mongorc.js文件

如:

vi /root/.mongorc.js

vi /home/mongodb/.mongorc.js 

添加一行:rs.slaveOk();

修改完成后,重新登录mongo,发现副本节点可读了(当前会话不生效,需要重新登录才行)。


3.11 验证是否同步成功


在主库上建个表,看其他副本是否同步成功。
#主节点
MyReplset:PRIMARY> use dba;
switched to db dba
MyReplset:PRIMARY> show tables;
MyReplset:PRIMARY> db.createCollection("a");
{ "ok" : 1 }
MyReplset:PRIMARY> show tables;
a
system.indexes
 
#副本节点
MyReplset:SECONDARY> use dba;
switched to db dba
MyReplset:SECONDARY> show tables;
a
system.indexes
 
说明同步成功,副本集配置成功。


 

3.12 认证用户


3.12.1 简单介绍

  

默认,mongodb无需认证,便可访问,十分不安全。故需要进行认证。

 

在集群及副本集环境中必须使用keyFile参数,只使用--auth参数将无法工作。   

 

客户端在集群中进行认证与在单服务器环境中的认证是一样的,唯一的区别是集群中服务器使用密钥文件进行内部沟通。

 

密钥文件基本上是一个明文的文件,hash计算后被当做集群的内部密码。

 

设置副本集 and/or 分片的验证:

 

a,创建key文件并复制到集合的每个服务器中。密钥文件是字符的base64集,加上空格与换行符。

b,修改密钥文件权限为只能被当前用户读取。

c,启动集群中的服务器时使用命令行参数 --keyFile /path/to/file

d,客户端都必须验证才能使用

 

启动时可以不使用 --auth参数,因为使用了 --keyFile就必须验证,也就是隐含了 --auth。但是--auth并不隐含 --keyFile。

 

如果不建密码文件,只建数据库用户,则不用认证,可以直接登录访问,即auth失效。

故副本集这种模式必须建密码文件。


3.12.2 建数据库用户

#在三台机器上建用户:

MyReplset:PRIMARY> db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]}); 
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}


 

3.12.3 关库

#关库(这里以主节点为例)

MyReplset:PRIMARY> db.shutdownServer();
2015-07-15T17:22:56.673+0800 DBClientCursor::init call() failed
server should be down...
2015-07-15T17:22:56.675+0800 trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2015-07-15T17:22:56.675+0800 warning: Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2015-07-15T17:22:56.675+0800 reconnect 127.0.0.1:27017 (127.0.0.1) failed failed couldn't connect to server 127.0.0.1:27017 (127.0.0.1), connection attempt failed

 

3.12.4 生成密码文件

 

#在192.168.6.51上生成密码文件
[root@ser6-51 ~]# openssl rand -base64 741 > /data/mongodb/mongodb-keyfile
赋予权限600,文件才能被调用
chmod 600 /data/mongodb/mongodb-keyfile
 
#将密码文件拷贝到其他节点
[root@ser6-51 ~]# scp /data/mongodb/mongodb-keyfile 192.168.6.52:/data/mongodb/
root@192.168.6.52's password: 
mongodb-keyfile                                                                                                                                                        100% 1004     1.0KB/s   00:00    
[root@ser6-51 ~]# scp /data/mongodb/mongodb-keyfile 192.168.6.70:/data/mongodb/
root@192.168.6.70's password: 
mongodb-keyfile                                                                                                                                                        100% 1004     1.0KB/s   00:00 

 

3.12.5 以认证的方式登录

#192.168.6.51
[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs  --fork --replSet MyReplset/192.168.6.51:27017 --keyFile=/data/mongodb/mongodb-keyfile
about to fork child process, waiting until server is ready for connections.
forked process: 8472
child process started successfully, parent exiting
 
#192.168.6.52
[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs  --fork --replSet MyReplset/192.168.6.52:27017 --keyFile=/data/mongodb/mongodb-keyfile
about to fork child process, waiting until server is ready for connections.
forked process: 8472
child process started successfully, parent exiting
 
#192.168.6.70
[root@ser6-51 ~]# mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs  --fork --replSet MyReplset/192.168.6.70:27017 --keyFile=/data/mongodb/mongodb-keyfile
about to fork child process, waiting until server is ready for connections.
forked process: 8472
child process started successfully, parent exiting


 

3.13 建配置文件


每次启动Mongodb,都要指定数据文件路径,日志路径等参数,太麻烦。

所以建一个配置文件,启动mongodb的时候以配置文件的方式启动,可以方便些。

Mongodb默认没有配置文件,需要手动创建。

 

这里以192.168.6.51为例:

 

cd /data/mongodb/

vi mongod.conf

添加:

logpath=/data/mongodb/logs
logappend=true 
#fork and run in background
fork=true
auth=true
port=27017
dbpath=/data/mongodb/data
#location of pidfile
pidfilepath=/data/mongodb/mongod.pid 
keyFile=/data/mongodb/mongodb-keyfile
replSet=MyReplset/192.168.6.51:27017
 


#注意:在192.168.6.52/192.168.6.70上修改配置文件时,记得把replSet那行的IP改为对应的IP.

 

#关库

[root@ser6-51 ~]# ps -ef | grep mongo

root       608     1  0 11:02 ?        00:00:01 mongod --dbpath=/data/mongodb/data --logpath=/data/mongodb/logs --fork --replSet =MyReplset/192.168.6.51:27017 --keyFile=/data/mongodb/mongodb-keyfile

root       794   579  0 11:06 pts/0    00:00:00 grep mongo

root     32347 32274  0 10:36 pts/1    00:00:00 su - mongodb

mongodb  32348 32347  0 10:36 pts/1    00:00:00 -bash

[root@ser6-51 ~]# kill -2 608

#以配置文件的方式启动

[root@ser6-51 ~]# mongod --config=/data/mongodb/mongod.conf

 

 

3.14 设置开机自动启动


vi /etc/rc.d/rc.local

添加:

#开机启动mongodb

/data/mongodb/bin/mongod --config /data/mongodb/mongod.conf

 

#重启机器,检测是否生效

[root@ser6-70 ~]# ps -ef | grep mongo

root      1596     1  1 11:27 ?        00:00:00 /data/mongodb/bin/mongod --config /data/mongodb/mongod.conf

root      1735  1691  0 11:27 pts/1    00:00:00 grep mongo

 

说明启动成功了。

 

--本篇文章参考:MongoDB-安全与认证Mongodb2.6副本集验证部署和认证

 

 

 

 

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值