通俗的讲副本集就是用多台机器进行同一数据的异步同步,从而使多台机器拥有同一数据的多个副本,并且当主库当掉时在不需要用户干预的情况下自动切换其他备份服务器做主库。而且还可以利用副本服务器做只读服务器,实现读写分离,提高负载。
下载地址:
https://www.mongodb.org/
下载完成后传到三台机器的/download下。
#3.2-3.5在三台机器上都要执行。
这里以192.168.6.51为例:
[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
为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
[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.
#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用户省略
#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是自定义的副本集名称
#三台机器都需要开放端口。
为了让其他服务器可以远程连接该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 ]
连接其中一个节点,初始化命令只能执行一次。
[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" } ]);
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
显示的是从节点的数据源列表,其中有数据滞后时间。
#mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读。
#在所有节点上进行设置
修改root用户,mongodb用户家目录下的.mongorc.js文件
如:
vi /root/.mongorc.js
vi /home/mongodb/.mongorc.js
添加一行:rs.slaveOk();
修改完成后,重新登录mongo,发现副本节点可读了(当前会话不生效,需要重新登录才行)。
在主库上建个表,看其他副本是否同步成功。
#主节点
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
说明同步成功,副本集配置成功。
默认,mongodb无需认证,便可访问,十分不安全。故需要进行认证。
在集群及副本集环境中必须使用keyFile参数,只使用--auth参数将无法工作。
客户端在集群中进行认证与在单服务器环境中的认证是一样的,唯一的区别是集群中服务器使用密钥文件进行内部沟通。
密钥文件基本上是一个明文的文件,hash计算后被当做集群的内部密码。
设置副本集 and/or 分片的验证:
a,创建key文件并复制到集合的每个服务器中。密钥文件是字符的base64集,加上空格与换行符。
b,修改密钥文件权限为只能被当前用户读取。
c,启动集群中的服务器时使用命令行参数 --keyFile /path/to/file
d,客户端都必须验证才能使用
启动时可以不使用 --auth参数,因为使用了 --keyFile就必须验证,也就是隐含了 --auth。但是--auth并不隐含 --keyFile。
如果不建密码文件,只建数据库用户,则不用认证,可以直接登录访问,即auth失效。
故副本集这种模式必须建密码文件。
#在三台机器上建用户:
MyReplset:PRIMARY> db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]});
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
#关库(这里以主节点为例)
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
#在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/
[email protected]'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/
[email protected]'s password:
mongodb-keyfile 100% 1004 1.0KB/s 00:00
#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
每次启动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
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副本集验证部署和认证。