一、单机yum安装
1、关闭selinux,设置firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
firewall-cmd --permanent --add-port=27017/tcp;firewall-cmd --reload
2、更改yum源
rm -rf /etc/yum.repos.d/*
vi /etc/yum.repos.d/base.repo
[rocky-base]
name=rocky-base
baseurl=http://mirrors.163.com/rocky/8.6/BaseOS/x86_64/os/
enable=1
gpgcheck=0
[rocky-appstream]
name=rocky-appstream
baseurl=http://mirrors.163.com/rocky/8.6/AppStream/x86_64/os/
gpgcheck=0
enable=1
[rocky-extras]
name=rocky-extras
baseurl=http://mirrors.163.com/rocky/8.6/extras/x86_64/os/
gpgcheck=0
enable=1
vi /etc/yum.repos.d/mongodb.repo
[mongodb-org-6.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/6.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-6.0.asc
dnf -y install net-tools bash-completion vim wget
reboot
安装mongodb
yum install -y mongodb-org
systemctl start mongod
mongosh
二、二进制文件安装
最小化安装rockylinux8.6
1、关闭selinux,防火墙放通策略及安装软件包
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
firewall-cmd --permanent --add-port=27017/tcp;firewall-cmd --reload
dnf -y install net-tools bash-completion vim wget
reboot
2、下载mongodb软件及mongodb-shell
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-6.0.2.tgz
wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz
tar -xvf mongodb-linux-x86_64-rhel80-6.0.2.tgz
mv mongodb-linux-x86_64-rhel80-6.0.2 /usr/local/mongodb
3、查看安装
4、编辑配置文件
mkdir -p /data/mongodb
vim /data/mongodb/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongodb.log
storage:
dbPath: /data/mongodb
journal:
enabled: true
processManagement:
fork: true
net:
port: 27017
bindIp: 0.0.0.0
5、启动与检查
/usr/local/mongodb/bin/mongod -f /data/mongodb/mongodb.conf
ls /data/mongodb
ps -aux | grep mongo
netstat -antup | grep mongo
6、安装mongodb-shell
tar -xvf mongosh-1.6.0-linux-x64.tgz
mv mongosh-1.6.0-linux-x64/bin/mongosh /usr/bin
mongosh
7、优化
Soft rlimits for open file descriptors too low
vim /etc/security/limits.conf
加入如下
* - nproc 65536
* - nofile 65536
logout
ulimit -n
ulimit -a
vm.max_map_count is too low
vi /etc/sysctl.conf
加入如下
vm.max_map_count=655360
sysctl -p
/sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
vim /etc/rc.d/rc.local
加入
echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
chmod +x /etc/rc.d/rc.local
You are running this process as the root user, which is not recommended
Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
kill (px -aux |grep mongo)
useradd mongodb
echo password | passwd --stdin mongodb
chown -R mongodb:mongodb /data/mongodb
vim /data/mongodb/mongodb.conf
加入
security:
authorization: enabled
reboot
mongodb用户登录
/usr/local/mongodb/bin/mongod -f /data/mongodb/mongodb.conf
mongosh
8、关闭
use admin
db.shutdownServer()
三、基本命令
show dbs;
show databases;
1、mongodb创建库、创建集合、插入数据
use mydb
db.myuser.insertOne({ name: 'john', age:28 })
show dbs
show collections
db.myuser.insertOne( {'name': 'jerry', age: 27} )
db.myuser.insertOne( {'name': 'mary', age: 26} )
db.myuser.find()
db.myuser.find( { name: 'john' } )
db.myuser.find( { age: 26 } )
集合的field不固定,可以插入如下数据
db.myuser.insert( {age: 29} )
db.myuser.insert( {'location': 'urumqi'} )
db.myuser.find()
更新集合数据
db.myuser.update({ age: 29 }, {$set: { age: 30 }})
db.myuser.update({ 'name': 'mary' }, { $set: { 'name': 'hanmei' } })
删除集合数据
db.myuser.remove({ name: 'hanmei' })
db.myuser.find()
删除集合所有数据
db.myuser.remove( {} )
db.myuser.find()
删除集合
db.myuser.drop()
删除数据库
db.dropDatabase()
show dbs
2、查询
use mydb
db.myuser.insert( {name:"john", age: 20} )
db.myuser.insert( {name:"mary", age: 28} )
db.myuser.insert( {name:"pat", age: 38} )
db.myuser.insert( {name:"amy", age: 58} )
db.myuser.insert( {name:"bob", age: 68} )
db.myuser.insert( {name:"david", age: 25} )
db.myuser.find().pretty()
db.myuser.find()
db.myuser.find().limit(2)
db.myuser.find().skip(0).limit(2)
db.myuser.find().skip(2).limit(2)
db.myuser.find().skip(4).limit(2)
db.myuser.find().sort({ age: 1 })
db.myuser.find().sort({ age: -1 })
db.myuser.find({ age: {$lt: 30} })
$gt #大于
$lt #小于
$gte #大于或等于
$lte #小于或等于
db.myuser.find( {name: 'john'} )
db.myuser.find( {name: 'mary'} )
db.myuser.find({ $or: [ {name: 'john'},{name: 'mary'} ] })
db.myuser.find({ $and: [ {name: 'john'},{age: 20} ] })
正则查询
db.myuser.find({ name: {$regex: "mar[a-z]"} })
db.myuser.find( {"name":{$regex:"(a)"}} )
3、索引
db.getProfilingStatus()
for(i=1; i<=500000;i++){
db.myuser.insert( {name:'mytest'+i, age:i} )
}
db.myuser.find( {age:210086} )
db.myuser.find( {age:210086} ).explain(true)
db.myuser.getIndexes()
db.myuser.ensureIndex( {age:1} )
db.myuser.find( {age:210086} )
db.myuser.find( {age:210086} ).explain(true)
删除索引
db.myuser.dropIndex( {age:1} )
使用正则时,索引无效
db.myuser.find( {"name":"mytest10010"} )
创建索引
db.myuser.ensureIndex( {name:1} )
db.myuser.find( {"name":"mytest110086"} )
db.myuser.find( {"name":"mytest110086"} ).explain(true)
db.myuser.find( {"name":/99999/} )
db.myuser.find( {"name":/99999/} ).explain(true)
唯一索引
db.myuser.remove({})
db.myuser.insert( {userid:1} )
db.myuser.insert( {userid:1} )
db.myuser.find( )
建立索引
db.myuser.remove({})
db.myuser.ensureIndex( {userid:1},{unique:true} )
db.myuser.insert( {userid:1} )
db.myuser.insert( {userid:1} )
db.myuser.insert( {userid:2} )
3、 监控
db.serverStatus()
db.serverStatus().network
db.serverStatus().opcounters
db.serverStatus().connections
serverStatus可用来获取mongodb的状态信息
db.serverStatus() #查看所有的监控信息
db.serverStatus().network #单独查看网络流量信息
db.serverStatus().opcounters #统计增、删、改、查的次数
db.serverStatus().connections#连接
四、副本集搭建
序号主机名IP安装选项备注1stu1192.168.3.81rockylinux8.6最小化安装2stu2192.168.3.82rockylinux8.6最小化安装3stu3192.168.3.83rockylinux8.6最小化安装4stu4192.168.3.84rockylinux8.6最小化安装伸缩使用
1、关闭selinux,防火墙放通策略及安装软件包(四台设备)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
firewall-cmd --permanent --add-port=27017/tcp;firewall-cmd --reload
dnf -y install net-tools bash-completion vim wget
reboot
2、下载mongodb软件及mongodb-shell(四台设备)
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-6.0.2.tgz
wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz
tar -xvf mongodb-linux-x86_64-rhel80-6.0.2.tgz
mv mongodb-linux-x86_64-rhel80-6.0.2 /usr/local/mongodb
tar -xvf mongosh-1.6.0-linux-x64.tgz
mv mongosh-1.6.0-linux-x64/bin/mongosh /usr/bin
3、编辑配置文件
stu1:
mkdir -p /data/mongodb
vim /data/mongodb/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongodb.log
storage:
dbPath: /data/mongodb
journal:
enabled: true
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.3.81
replication:
replSetName: mycluster
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/mongodb.conf
netstat -antup | grep mongod
stu2:
mkdir -p /data/mongodb
vim /data/mongodb/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongodb.log
storage:
dbPath: /data/mongodb
journal:
enabled: true
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.3.82
replication:
replSetName: mycluster
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/mongodb.conf
netstat -antup | grep mongod
stu3:
mkdir -p /data/mongodb
vim /data/mongodb/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongodb.log
storage:
dbPath: /data/mongodb
journal:
enabled: true
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.3.83
replication:
replSetName: mycluster
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/mongodb.conf
netstat -antup | grep mongod
注:解决warnings见二进制安装
4、配置
mongosh 192.168.3.81
config = { _id:"mycluster", members:[
{_id:0,host:"192.168.3.81:27017"},
{_id:1,host:"192.168.3.82:27017"},
{_id:2,host:"192.168.3.83:27017"}]
}
use admin
rs.initiate( config )
rs.status()
5、测试
stu1:
use mydb
db.myuser.insertOne( {'name': 'mytest'} )
show dbs
db.myuser.find()
stu2:
mongosh 192.168.3.82
show dbs
use mydb
db.myuser.find()
rs.secondaryOk()
db.myuser.find()
db.myuser.insertOne( {'name': 'mytest82'} )
注:SECONDARY需要声明是slave才能查看数据,从库无法插入数据
查看从库延时
rs.printSecondaryReplicationInfo()
6、副本集切换
stu1:半闭192.168.3.81
stu2:
mongosh 192.168.3.82
rs.status()
use mydb
db.myuser.find()
db.myuser.insertOne( {'name': 'mytest82'} )
db.myuser.find()
7、副本级优先级
primary的选举依赖于各个实例的优先权重,默认权重都是1 (只有开启优先级时才会抢占)
开启192.168.3.81,此时主仍为192.168.3.82
stu2:
mongosh 192.168.3.82
conf = rs.config()
conf.members[0].priority = 10
conf.members[1].priority = 5
conf.members[2].priority = 2
rs.reconfig(conf)
rs.status()
此时stu1为主
8、副本集伸缩
stu4:
mkdir -p /data/mongodb
vim /data/mongodb/mongodb.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/mongodb.log
storage:
dbPath: /data/mongodb
journal:
enabled: true
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.3.84
replication:
replSetName: mycluster
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/mongodb.conf
netstat -antup | grep mongod
stu1:
mongosh 192.168.3.81
use admin
rs.add('192.168.3.84:27017')
rs.status()
stu4:
rs.secondaryOk()
use mydb
db.myuser.find()
db.myuser.insertOne( {'name': 'mytest84'} )
stu1:
rs.remove('192.168.3.83:27017')
rs.status()
192.168.3.83已移除
五、mongodb备份
备份
mongosh
for(i=1; i<=50;i++){
db.myuser.insert( {name:'mytest'+i, age:i} )
}
db.myuser.find( {"name":"mytest46"})
db.myuser.count()
mongodump -h 127.0.0.1 -o /data/mongodbbk/
ls -lh /data/mongodbbk/
还原
mongosh
db.myuser.drop()
mongorestore -h 127.0.0.1 /data/mongodbbk/
mongosh
use mydb
db.myuser.find( {"name":"mytest46"})
db.myuser.count()
六、mongodb分片集群搭建
mongodb分片集群三种角色
router角色: mongodb的路由,提供入口,使得分片集群对外透明,router不存储数据
configsvr角色: mongodb的配置角色,存储元数据信息。分片集群后端有多份存储,读取数据该去哪个存储上读取,依赖于配置角色。配置角色建议使用副本集
shardsvr角色: mongodb的存储角色,存储真正的数据,建议使用副本集
环境说明:生产环境需9台以上服务器部署
本实验使用3台
序号主机名IP安装选项作用备注1stu1192.168.3.81rockylinux8.6最小化安装 27017: router 28018: configsvr 29019: shardsvr 29029: shardsvr 2stu2192.168.3.82rockylinux8.6最小化安装 27017: router 28018: configsvr 29019: shardsvr 29029: shardsvr 3stu3192.168.3.83rockylinux8.6最小化安装 27017: router 28018: configsvr 29019: shardsvr 29029: shardsvr
1、关闭selinux,防火墙放通策略及安装软件包(三台设备)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
firewall-cmd --permanent --add-port=27017/tcp
firewall-cmd --permanent --add-port=28018/tcp
firewall-cmd --permanent --add-port=29019/tcp
firewall-cmd --permanent --add-port=29029/tcp
firewall-cmd --reload
dnf -y install net-tools bash-completion vim wget
reboot
2、下载mongodb软件及mongodb-shell(三台设备)
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-6.0.2.tgz
wget https://downloads.mongodb.com/compass/mongosh-1.6.0-linux-x64.tgz
tar -xvf mongodb-linux-x86_64-rhel80-6.0.2.tgz
mv mongodb-linux-x86_64-rhel80-6.0.2 /usr/local/mongodb
tar -xvf mongosh-1.6.0-linux-x64.tgz
mv mongosh-1.6.0-linux-x64/bin/mongosh /usr/bin
3、configsvr搭建
stu1:
mkdir -p /data/mongodb/configsvr
vim /data/mongodb/configsvr/configsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/configsvr/configsvr.log
storage:
dbPath: /data/mongodb/configsvr
journal:
enabled: true
processManagement:
fork: true
net:
port: 28018
bindIp: 192.168.3.81
replication:
replSetName: mycluster
sharding:
clusterRole: configsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/configsvr/configsvr.conf
netstat -antup | grep mongod
stu2:
mkdir -p /data/mongodb/configsvr
vim /data/mongodb/configsvr/configsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/configsvr/configsvr.log
storage:
dbPath: /data/mongodb/configsvr
journal:
enabled: true
processManagement:
fork: true
net:
port: 28018
bindIp: 192.168.3.82
replication:
replSetName: mycluster
sharding:
clusterRole: configsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/configsvr/configsvr.conf
netstat -antup | grep mongod
stu3:
mkdir -p /data/mongodb/configsvr
vim /data/mongodb/configsvr/configsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/configsvr/configsvr.log
storage:
dbPath: /data/mongodb/configsvr
journal:
enabled: true
processManagement:
fork: true
net:
port: 28018
bindIp: 192.168.3.83
replication:
replSetName: mycluster
sharding:
clusterRole: configsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/configsvr/configsvr.conf
netstat -antup | grep mongod
stu1:
mongosh 192.168.3.81:28018
use admin
config = { _id:"mycluster",
configsvr: true,
members:[
{_id:0,host:"192.168.3.81:28018"},
{_id:1,host:"192.168.3.82:28018"},
{_id:2,host:"192.168.3.83:28018"}
]
}
rs.initiate(config)
rs.status()
4、router搭建
stu1:
mkdir -p /data/mongodb/router
vim /data/mongodb/router/router.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/router/router.log
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.3.81
sharding:
configDB: mycluster/192.168.3.81:28018,192.168.3.82:28018,192.168.3.83:28018
启动
/usr/local/mongodb/bin/mongos -f /data/mongodb/router/router.conf
stu2:
mkdir -p /data/mongodb/router
vim /data/mongodb/router/router.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/router/router.log
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.3.82
sharding:
configDB: mycluster/192.168.3.81:28018,192.168.3.82:28018,192.168.3.83:28018
启动
/usr/local/mongodb/bin/mongos -f /data/mongodb/router/router.conf
stu3:
mkdir -p /data/mongodb/router
vim /data/mongodb/router/router.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/router/router.log
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.3.83
sharding:
configDB: mycluster/192.168.3.81:28018,192.168.3.82:28018,192.168.3.83:28018
启动
/usr/local/mongodb/bin/mongos -f /data/mongodb/router/router.conf
5、shardsvr搭建
stu1:
mkdir -p /data/mongodb/shardsvr1
vim /data/mongodb/shardsvr1/shardsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shardsvr1/shardsvr.log
storage:
dbPath: /data/mongodb/shardsvr1/
journal:
enabled: true
processManagement:
fork: true
net:
port: 29019
bindIp: 192.168.3.81
replication:
replSetName: myclusterdata1
sharding:
clusterRole: shardsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/shardsvr1/shardsvr.conf
mkdir -p /data/mongodb/shardsvr2
vim /data/mongodb/shardsvr2/shardsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shardsvr1/shardsvr.log
storage:
dbPath: /data/mongodb/shardsvr2/
journal:
enabled: true
processManagement:
fork: true
net:
port: 29029
bindIp: 192.168.3.81
replication:
replSetName: myclusterdata2
sharding:
clusterRole: shardsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/shardsvr2/shardsvr.conf
stu2:
mkdir -p /data/mongodb/shardsvr1
vim /data/mongodb/shardsvr1/shardsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shardsvr1/shardsvr.log
storage:
dbPath: /data/mongodb/shardsvr1/
journal:
enabled: true
processManagement:
fork: true
net:
port: 29019
bindIp: 192.168.3.82
replication:
replSetName: myclusterdata1
sharding:
clusterRole: shardsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/shardsvr1/shardsvr.conf
mkdir -p /data/mongodb/shardsvr2
vim /data/mongodb/shardsvr2/shardsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shardsvr1/shardsvr.log
storage:
dbPath: /data/mongodb/shardsvr2/
journal:
enabled: true
processManagement:
fork: true
net:
port: 29029
bindIp: 192.168.3.82
replication:
replSetName: myclusterdata2
sharding:
clusterRole: shardsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/shardsvr2/shardsvr.conf
stu3:
mkdir -p /data/mongodb/shardsvr1
vim /data/mongodb/shardsvr1/shardsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shardsvr1/shardsvr.log
storage:
dbPath: /data/mongodb/shardsvr1/
journal:
enabled: true
processManagement:
fork: true
net:
port: 29019
bindIp: 192.168.3.83
replication:
replSetName: myclusterdata1
sharding:
clusterRole: shardsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/shardsvr1/shardsvr.conf
mkdir -p /data/mongodb/shardsvr2
vim /data/mongodb/shardsvr2/shardsvr.conf
systemLog:
destination: file
logAppend: true
path: /data/mongodb/shardsvr1/shardsvr.log
storage:
dbPath: /data/mongodb/shardsvr2/
journal:
enabled: true
processManagement:
fork: true
net:
port: 29029
bindIp: 192.168.3.83
replication:
replSetName: myclusterdata2
sharding:
clusterRole: shardsvr
启动
/usr/local/mongodb/bin/mongod -f /data/mongodb/shardsvr2/shardsvr.conf
stu1:
mongosh 192.168.3.81:29019
use admin
config = { _id:"myclusterdata1",
members:[
{_id:0,host:"192.168.3.81:29019"},
{_id:1,host:"192.168.3.82:29019"},
{_id:2,host:"192.168.3.83:29019"}
]
}
rs.initiate(config)
rs.status()
stu1:
mongosh 192.168.3.81:29029
use admin
config = { _id:"myclusterdata2",
members:[
{_id:0,host:"192.168.3.81:29029"},
{_id:1,host:"192.168.3.82:29029"},
{_id:2,host:"192.168.3.83:29029"}
]
}
rs.initiate(config)
rs.status()
6、router中填加shardsvr
stu1:
mongosh 192.168.3.81:27017
use admin
sh.addShard("myclusterdata1/192.168.3.81:29019,192.168.3.82:29019,192.168.3.83:29019")
sh.addShard("myclusterdata2/192.168.3.81:29029,192.168.3.82:29029,192.168.3.83:29029")
sh.status()
7、测试
stu1: router
mongosh 192.168.3.81:27017
use mydb
for(i=1; i<=500;i++){
db.myuser.insert( {name:'mytest'+i, age:i} )
}
sh.status()
db.myuser.count();
db.myuser.find({"name":"mytest488"});
注:默认情况下所有数据未分片存储,只存在主集群中
mongosh 192.168.3.81:29019
show dbs;
use mydb
db.myuser.find({"name":"mytest488"});
db.myuser.count();
mongosh 192.168.3.81:29029
show dbs;
可见数据未写入myclusterdata2
数据分片存储(stu1)
mongosh 192.168.3.81:27017
use mydb
db.dropDatabase()
use admin
db.runCommand( { enablesharding :"mydb"});
db.runCommand( { shardcollection : "mydb.myuser",key : {_id: "hashed"} } )
use mydb
for(i=1; i<=500;i++){
db.myuser.insert( {name:'mytest'+i, age:i} )
}
db.myuser.count();
db.myuser.find({"name":"mytest488"});
sh.status()
mongosh 192.168.3.81:29019
show dbs;
use mydb
db.myuser.find({"name":"mytest488"});
db.myuser.count();
mongosh 192.168.3.81:29029
show dbs;
use mydb
db.myuser.find({"name":"mytest488"});
db.myuser.count();
推荐链接
发表评论