说明:
有三台服务器,已经安装好了MongoDB数据库,具体信息如下:
MongoDB版本:mongodb-linux-x86_64-2.6.11
MongoDB安装目录:/usr/local/mongodb
MongoDB数据库目录:/home/data/mongodb/mongodb_data
MongoDB日志目录:/home/data/mongodb/mongodb_log
MongoDB配置文件:/usr/local/mongodb/mongodb.conf
三台服务器IP地址:
192.168.0.8
192.168.0.9
192.168.0.10
实现目的:
对三台服务器进行部署,实现副本集功能。
具体操作:
一、确定副本集名称、主从节点、配置文件、启动脚本信息
1、定义副本集名称为:osyunwei
2、主节点为:192.168.0.8
3、两台从节点为:
192.168.0.9
192.168.0.10
4、确保三台副本集服务器上的配置文件完全相同,如下:
第一种写法:官方推荐、适合2.6以后的版本
vi /usr/local/mongodb/mongodb.conf #编辑
systemLog:
destination: "file"
path: "/home/data/mongodb/mongodb_log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/home/data/mongodb/mongodb_data/"
directoryPerDB: true
processManagement:
fork: true
pidFilePath: "/usr/local/mongodb/mongo.pid"
net:
port: 27017
http:
enabled: true
RESTInterfaceEnabled: true
#security:
# keyFile: "/usr/local/mongodb/keyfile"
# clusterAuthMode: "keyFile"
# authorization: "enabled"
replication:
replSetName: "osyunwei"
:wq! #保存退出
第二种写法:适用所有版本
vi /usr/local/mongodb/mongodb.conf #编辑
port=27017
dbpath=/home/data/mongodb/mongodb_data/
logpath=/home/data/mongodb/mongodb_log/mongodb.log
pidfilepath=/usr/local/mongodb/mongo.pid
fork=true
logappend=true
shardsvr=true
directoryperdb=true
#auth=true
#keyFile =/usr/local/mongodb/keyfile
replSet =osyunwei
:wq! #保存退出
注意:以上两种配置文件的写法都可以。
5、确保三台副本集服务器上的启动脚本完全相同,如下:
vi /etc/init.d/mongod
ulimit -SHn 655350
#!/bin/sh
# chkconfig: - 64 36
# description:mongod
case $1 in
start)
/usr/local/mongodb/bin/mongod --maxConns 20000 --config /usr/local/mongodb/mongodb.conf
;;
stop)
/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.shutdownServer()"
#/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.auth('system', '123456');db.shutdownServer()"
;;
status)
/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.stats()"
#/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.auth('system', '123456');db.stats()"
;;
esac
:wq! #保存退出
二、对主节点进行配置
1、/usr/local/mongodb/bin/mongo #进入主节点192.168.0.8
rs.initiate()
rs.conf()
#初始化副本集,设置本机为主节点PRIMARY
2、添加副本集从节点
rs.add("192.168.0.9:27017")
rs.add("192.168.0.10:27017")
3、设置节点优先级
cfg = rs.conf() #查看节点顺序
cfg.members[0].priority = 1
cfg.members[1].priority = 1
cfg.members[2].priority = 2 #设置_ID为2的节点为主节点
rs.reconfig(cfg) #使配置生效
exit #退出控制台
说明:
MongoDB副本集通过设置priority决定优先级,默认优先级为1,值为1到1000之间的数字,priority值是0到100之间的数字,数字越大优先级越高,priority=0,则此节点永远不能成为主节点primay。
cfg.members[0].priority =1参数,中括号里的数字是执行rs.conf()查看到的节点顺序,第一个节点是0,第二个节点是1,第三个节点是2,以此类推。
三、分别对两台从节点进行配置
/usr/local/mongodb/bin/mongo #进入从节点192.168.0.9/10
db.getMongo().setSlaveOk() #设置从节点为只读数据库
exit #退出控制台
四、设置数据库账号,开启登录验证
1、设置数据库账号
在主节点服务器192.168.0.8上面操作
/usr/local/mongodb/bin/mongo #进入主节点192.168.0.8
show dbs #列出所有数据库
use admin #切换到admin数据库,添加的账号才是管理员账号。
show collections
db.system.users.find()
#添加两个管理员账号,一个系统管理员:system 一个数据库管理员:administrator
db.createUser({user:"system",pwd:"123456",roles:[{role:"root",db:"admin"}]}) #添加系统管理员账号,用来管理用户
db.auth('system','123456') #添加管理员用户认证,认证之后才能管理所有数据库
db.createUser({user:"administrator",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]}) #添加数据库管理员,用来管理所有数据库
db.auth('administrator','123456') #添加管理员用户认证,认证之后才能管理所有数据库
exit #退出
#用刚才创建的账号进行登录
/usr/local/mongodb/bin/mongo -u system -p 123456 --authenticationDatabase admin
exit #退出
/usr/local/mongodb/bin/mongo -u administrator -p 123456 --authenticationDatabase admin
exit #退出
2、开启登录验证
在主节点服务器192.168.0.8上面操作
cd /usr/local/mongodb #进入mongodb安装目录
openssl rand -base64 21 > keyfile #创建一个keyfile(使用openssl生成21位base64加密的字符串)
chmod 600 /usr/local/mongodb/keyfile #修改文件权限为600
cat /usr/local/mongodb/keyfile #查看刚才生成的字符串,做记录,后面要用到。
注意:上面的数字21,最好是3的倍数,否则生成的字符串可能含有非法字符,认证失败。
3、设置配置文件
分别在所有节点上面操作
192.168.0.8/9/10
配置文件/usr/local/mongodb/mongodb.conf取消注释
第一种写法:
security:
keyFile: "/usr/local/mongodb/keyfile"
clusterAuthMode: "keyFile"
authorization: "enabled"
第二种写法:
auth=true
keyFile =/usr/local/mongodb/keyfile
启动脚本使用下面的代码(注释原来的,启用之前注释掉的)
/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.auth('system', '123456');db.shutdownServer()"
/usr/local/mongodb/bin/mongo 127.0.0.1:27017/admin --eval "db.auth('system', '123456');db.stats()"
4、设置权限验证文件
先进入主节点服务器192.168.0.8,查看cat /usr/local/mongodb/keyfile #查看刚才生成的字符串,做记录
再分别进入两台从节点服务器192.168.0.9/10
vi /usr/local/mongodb/keyfile #输入上一步查看到的字符串
:wq! #保存退出
chmod 600 /usr/local/mongodb/keyfile #修改文件权限为600
五、验证副本集
分别重启三台副本集服务器
/usr/local/mongodb/bin/mongo -u system -p 123456 --authenticationDatabase admin #登录到控制台
rs.status() #副本集状态查看
exit #退出
当主节点出现故障的时候,在两个从节点上会选举出一个新的主节点,故障恢复之后,之前的主节点会变为从节点。
至此,Linux下MongoDB副本集部署完成。
扩展阅读:
官方文档:
http://docs.mongodb.org/manual/reference/configuration-options/
rs.remove("ip:port"); #删除副本
/usr/local/mongodb/bin/mongo --host 192.168.0.9 #远程连接服务器
默认情况下,mongodb不启用验证的。
单服务器,启动时添加--auth参数开启验证。
副本集服务器,开启--auth参数的同时,必须指定keyfile参数,节点之间的通讯基于该keyfile,key长度必须在6到1024个字符之间,最好为3的倍数,不能含有非法字符。
重新设置副本集
rs.stepDown()
cfg = rs.conf()
cfg.members[n].host= 'new_host_name:prot'
rs.reconfig(cfg)
副本集所有节点服务器总数必须为奇数,服务器数量为偶数的时候,需要添加一个仲裁节点,仲裁节点不参数副本集,只有选举权。
rs.addArb("192.168.0.11:27017") #添加仲裁节点