二、软件下载和目录规划
01.软件下载
版本:v4.0.14
安装方式:二进制部署
系统:CentOS 7.5
下载地址:
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
02.mongoDB单节点目录规划
二进制包目录:
mkdir /opt/src
数据目录:
mkdir /data/mongodb
软件主目录:
mkdir -p /opt/mongodb/{conf,log,pid}
三、安装部署
01.下载解压
cd /opt/src/
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
tar xf mongodb-linux-x86_64-4.0.14.tgz
ln -s mongodb-linux-x86_64-4.0.14 mongodb
cp -r /opt/src/mongodb/bin/ /opt/mongodb/
02.创建mongodb用户和组
useradd mongod
passwd mongod
03.设置目录结构权限
chown -R mongod:mongod /data/mongodb/
chown -R mongod:mongod /opt/mongodb/
04.设置用户环境变量
su - mongod
vi .bash_profile
export PATH=/opt/mongodb/bin:$PATH
source .bash_profile
05.命令行参数启动mongodb
touch /opt/mongodb/conf/mongodb.conf
cat >/opt/mongodb/conf/mongodb.conf<<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/log/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongodb
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongodb/pid/mongod.pid
net:
port: 27017
bindIp: 127.0.0.1,192.168.66.200
EOF
/opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf
四、登录mongoDB
登录
# 本地登录
/opt/mongodb/bin/mongo
# 远程登录
/opt/mongodb/bin/mongo 192.168.66.201:27017
检查是否启动
ps -ef|grep mongo
netstat -lntup|grep mongo
关闭
/opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf --shutdown
==-单节点脚本编写(命令式启动)-==
cat >mongodb.sh <<EOF
#!/bin/bash
pkill mongod
##01.创建目录
mkdir -p /opt/src /data/mongodb /opt/mongodb/{conf,log,pid}
##02.如果源码包不存在就下载
cd /opt/src/
if [ ! -f "/opt/src/mongodb-linux-x86_64-4.0.14.tgz" ]; then
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz &>/dev/null
fi
##03.如果源码包没有解压就解压
if [ ! -d "/opt/src/mongodb-linux-x86_64-4.0.14" ]; then
tar xf mongodb-linux-x86_64-4.0.14.tgz
fi
##04.如果没有创建软连接就创建软连接
if [ ! -d "/opt/src/mongodb" ]; then
ln -s mongodb-linux-x86_64-4.0.14 mongodb
fi
##05.如果没有可执行文件就复制
if [ ! -d "/opt/mongodb/bin/" ]; then
cp -r /opt/src/mongodb/bin/ /opt/mongodb/
fi
##06.
#chown -R mongod:mongod /data/mongodb/
#chown -R mongod:mongod /opt/mongodb/
##07.启动mongoDB
/opt/mongodb/bin/mongod --dbpath=/data/mongodb --logpath=/opt/mongodb/log/mongodb.log --port=27017 --logappend --fork
##08.查看进程号,是否启动成功
ps -ef|grep mongo
EOF
==-单节点脚本编写(配置文件启动)-==
vim mongodb.sh
#!/bin/bash
pkill mongod
# 01.创建目录
groupadd mongo -g 777
useradd mongo -g 777 -u 777 -M -s /sbin/nologin
id mongo
mkdir -p /opt/src /data/mongodb /opt/mongodb/{conf,log,pid}
chown -R mongo:mongo /opt/mongodb/
chown -R mongo:mongo /data/mongodb/
# 02.如果源码包不存在就下载
cd /opt/src/
if [ ! -f "/opt/src/mongodb-linux-x86_64-4.0.14.tgz" ]; then
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
fi
# 03.如果源码包没有解压就解压
if [ ! -d "/opt/src/mongodb-linux-x86_64-4.0.14" ]; then
tar xf mongodb-linux-x86_64-4.0.14.tgz
fi
# 04.如果没有创建软连接就创建软连接
if [ ! -d "/opt/src/mongodb" ]; then
ln -s mongodb-linux-x86_64-4.0.14 mongodb
fi
# 05.如果没有可执行文件就复制
if [ ! -d "/opt/mongodb/bin/" ]; then
cp -r /opt/src/mongodb/bin/ /opt/mongodb/
fi
# 06.创建配置文件
cat > /opt/mongodb/conf/mongodb.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/log/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongodb
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongodb/pid/mongod.pid
net:
port: 27017
bindIp: 127.0.0.1,`ifconfig eth0|awk 'NR==2{print $2}'`
EOF
# 07.启动mongoDB
cat >/usr/lib/systemd/system/mongod.service<<EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongo
Group=mongo
ExecStart=/opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf
ExecStartPre=/usr/bin/chown -R mongo:mongo /opt/mongodb/
ExecStartPre=/usr/bin/chown -R mongo:mongo /data/mongodb/
PermissionsStartOnly=true
PIDFile=/opt/mongodb/pid/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
EOF
# 08.启动mongoDB
systemctl daemon-reload
systemctl start mongod.service
# 09.查看进程号,是否启动成功
ps -ef|grep mongo
五、 创建用户和角色
01.相关命令集
db.auth() 将用户验证到数据库。
db.changeUserPassword() 更改现有用户的密码。
db.createUser() 创建一个新用户。
db.dropUser() 删除单个用户。
db.dropAllUsers() 删除与数据库关联的所有用户。
db.getUser() 返回有关指定用户的信息。
db.getUsers() 返回有关与数据库关联的所有用户的信息。
db.grantRolesToUser() 授予用户角色及其特权。
db.revokeRolesFromUser() 从用户中删除角色。
db.updateUser() 更新用户数据。
02.创建管理员账户(未开启用户访问控制)
/opt/mongodb/bin/mongo 192.168.66.201:27017
use admin
db.createUser(
{
user: "root",
pwd: "123456",
roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
}
)
03.查看新用户
db.getUsers()
04.验证新用户
db.auth(“root”,“123456”)
05.配置文件添加权限认证参数
vim /opt/mongodb/conf/mongodb.conf
...
security:
authorization: enabled
06.重启mongo
/opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf --shutdown
/opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf
07.使用root用户登录
/opt/mongodb/bin/mongo -uroot -p123456 192.168.66.201/admin
==注意:在哪个库下新建用户,这个库就作为该用户的验证库,在进行远程登录的时候需要添加上验证库信息==
六、MongoDB复制集RS
01.一主二从架构
前提:准备好三台服务器,能正常单点启动
配置步骤跟前面的一致,这里直接采用不同端口作为多实例
直接使用单实例的模板:
#创建数据目录
mkdir /data/2801{7..9}
#复制一份作为模板
cp -r /opt/mongodb/ /opt/28017
#修改配置文件信息
vim /opt/28017/conf/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /opt/28017/log/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/28017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/28017/pid/mongod.pid
net:
port: 28017
bindIp: 127.0.0.1,192.168.66.201
replication:
oplogSizeMB: 2048
replSetName: ly
将模板批量复制为多实例,并修改端口
cp -r /opt/28017/ /opt/28018
cp -r /opt/28017/ /opt/28019
sed -i 's#28017#28019#g' /opt/28019/conf/mongodb.conf
sed -i 's#28017#28017#g' /opt/28017/conf/mongodb.conf
启动多个实例
/opt/mongodb/bin/mongod -f /opt/28017/conf/mongodb.conf
/opt/mongodb/bin/mongod -f /opt/28018/conf/mongodb.conf
/opt/mongodb/bin/mongod -f /opt/28019/conf/mongodb.conf
查看是否启动成功
ps -ef |grep mongodb
配置普通复制集
#登录任意一台
/opt/mongodb/bin/mongo --port 28017 admin
config = {_id: 'ly', members: [
{_id: 0, host: '192.168.66.201:28017'},
{_id: 1, host: '192.168.66.201:28018'},
{_id: 2, host: '192.168.66.201:28019'}]
}
rs.initiate(config)
#查询复制集状态
rs.status();
#查看整体复制集状态
rs.status();
#查看复制集配置信息
rs.conf();
02.一主一从一选举架构
在一主二从的架构上,先添加一个新的节点,或者删除一个已经存在的节点,再将该节点设置为仲裁节点
#登录主节点
/opt/mongodb/bin/mongo --port 28017 admin
rs.remove("ip:port");#删除一个节点
rs.remove("192.168.66.201:20818")
rs.add("ip:port");#新增从节点
rs.add("192.168.66.201:20818")
rs.addArb("ip:port");#新增仲裁节点
rs.addArb("192.168.66.201:20818")
#查询复制集状态
rs.status();
也可以在做复制集的时候选定一个主机为arbiter
#登录任意节点
/opt/mongodb/bin/mongod --port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '192.168.66.201:28017'},
{_id: 1, host: '192.168.66.201:28018'},
{_id: 2, host: '192.168.66.201',"arbiterOnly":true}]
}
rs.initiate(config)
03.特殊从节点
arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用
再添加一个新的节点并将该节点加入到集群中去
mkdir /data/28020
cp -r /opt/28017/ /opt/28020
sed -i 's#28017#28020#g' /opt/28020/conf/mongodb.conf
mongod -f /opt/28020/conf/mongodb.conf
##登录主节点
mongo --port 28018 admin
配置延时节点(一般延时节点也配置成hidden)
cfg=rs.conf()
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=120
rs.reconfig(cfg)
######列表下标的数字是从0开始数
取消以上配置
cfg=rs.conf()
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)
配置成功后,通过以下命令查询配置后的属性
rs.conf();
七、模拟故障转移
在搭建好一主二从架构后,登录任意从节点,开启可读权限
#先启动所有节点
#主节点
mongod -f /opt/28017/conf/mongodb.conf
#从节点
mongod -f /opt/28018/conf/mongodb.conf
#从节点
mongod -f /opt/28019/conf/mongodb.conf
#延迟节点
mongod -f /opt/28020/conf/mongodb.conf
#登录主节点,写入数据
mongo --port 28017
use log
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":newDate()})}
db.log.find()
#登录从节点,开启读权限
mongo --port 28018
#临时开启
rs.slaveOk()
#查看是否同步主节点数据
use log
db.log.find()
#永久生效
[root@master1 ~]# echo "rs.slaveOk()" > ~/.mongorc.js
#登录从节点,开启读权限
mongo --port 28019
#临时开启
rs.slaveOk()
#永久生效
[root@master1 ~]# echo "rs.slaveOk()" > ~/.mongorc.js
use log
db.log.find()
当从节点能正常读取数据之后,把主节点关闭掉
mongod -f /opt/28017/conf/mongodb.conf --shutdown
登录任意从节点,查看集群状态信息
mongo --port 28017
rs.status()
实现现象:
当主节点宕机之后,剩下的从节点回自动选举出一个主节点,期间自动进行故障转移,无需人为干预,数据能正常读取。
当宕机掉的主节点重新修复上线之后,会自动变成从节点
网友评论