MongoDB
MongoDB的逻辑结构
MySQL MongoDB
库 库
表 集合
列,数据行 文档
---------------------------
mongodb 安装
1、上传软件
mkdir /data
cd /data
使用xshell上传软件
2、解压软件
tar xf mongodb-linux-x86_64-rhel62-3.2.10.tgz
mv mongodb-linux-x86_64-rhel62-3.2.10 mongodb
3、创建mongodb管理用户
useradd mongod
passwd mongod
4、修改目录授权
chown -R mongod.mongod /data/mongodb
5、切换或登录mongod用户
su - mongod
6、创建mongod的关键目录
mkdir -p /data/data/mongodb/data /data/data/mongodb/log /data/data/mongodb/conf
cd /data/mongodb
ls -l
7、修改环境变量
vim ~/.bash_profile
添加一行:
export PATH=/data/data/mongodb/bin:$PATH
配置生效一下:
source ~/.bash_profile
8、启动mongodb
mongod --logpath=/data/data/mongodb/log/mongodb.log --dbpath=/data/data/mongodb/data/ --fork
9、登录mongodb测试
mongo
++++++++++++++++++++++++++++++
root用户下
vim /etc/rc.local
最后添加如下代码:
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
vim /etc/security/limits.conf
删掉以下内容行
* - nofile 65535
都修改完成后 重启虚拟机
reboot
+++++++++++++++++++++++++++++++
重启后,启动mongodb
su - mongod
mongod --logpath=/data/data/mongodb/log/mongodb.log --dbpath=/data/data/mongodb/data/ --fork
mongodb默认库
系统库
test
admin
local
-----------------
mongodb默认端口号27017
python连接使用import pymongo
-----------------
10、配置文件使用:
vim /data/data/mongodb/conf/mongo.conf
systemLog:
destination: file
path: "/data/data/mongodb/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/data/data/mongodb/data/"
processManagement:
fork: true
net:
port: 27017
11、mongodb的关闭
mongod -f /data/data/mongodb/conf/mongo.conf --shutdown
启动:
mongod -f /data/data/mongodb/conf/mongo.conf
12、帮助的使用
help
KEYWORDS.help()
KEYWORDS.[TAB]
db.help()
db.stu.help()
show
use
db.help()
db.a.help()
rs.help()
sh.help()
-------------------
13、用户管理
{
user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
基本语法说明:
user:用户名
pwd:密码
roles:
role:角色 ------->权限的组
db:对象
role:root,readWrite,read
验证数据库:
创建用户时你use到的库,在将来登录时候,使用以下方式登录,否则是登录不了的
开发用户:
use test
db.createUser(
{
user: "test",
pwd: "123",
roles: [ { role: "readWrite", db: "oldboy" } ]
}
)
创建超级管理员:管理所有数据库
$ mongo
use admin
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
配置文件中,加入以下配置
vim /data/data/mongodb/conf/mongo.conf
添加两行信息:
security:
authorization: enabled
重启mongodb
mongod -f /data/data/mongodb/conf/mongo.conf --shutdown
mongod -f /data/data/mongodb/conf/mongo.conf
登录验证
开发用户登录:
mongo -utest -p123 10.0.0.200
管理员用户:
mongo -uroot -proot123 10.0.0.200/admin
或者
mongo
use admin
db.auth('root','root123')
查询mongodb中的用户信息
mongo -uroot -proot123 10.0.0.200/admin
db.system.users.find().pretty()
删除用户(root身份登录,use到验证库)
删除用户
# mongo -uroot -proot123 10.0.0.200/admin
use app
db.dropUser("app03")
db.createUser(
{
user: "bbs",
pwd: "123",
roles: [ { role: "readWrite", db: "bbs" } ]
}
)
----------------------------------------------------
mongodb复制集RS
基本原理:
基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知
客户端程序,主库已经发生切换了。应用就会连接到新的主库。
Replcation Set配置过程详解
1、规划
三个以上的mongodb节点(或多实例)
多实例:
(1)多个端口:28017、28018、28019、28020
(2)多套目录:
mkdir -p /data/mongodb/28017/conf /data/mongodb/28017/data /data/mongodb/28017/log
mkdir -p /data/mongodb/28018/conf /data/mongodb/28018/data /data/mongodb/28018/log
mkdir -p /data/mongodb/28019/conf /data/mongodb/28019/data /data/mongodb/28019/log
mkdir -p /data/mongodb/28020/conf /data/mongodb/28020/data /data/mongodb/28020/log
(3) 多套配置文件
/data/mongodb/28017/conf/mongod.conf
/data/mongodb/28018/conf/mongod.conf
/data/mongodb/28019/conf/mongod.conf
/data/mongodb/28020/conf/mongod.conf
(4)配置文件内容
vim /data/mongodb/28017/conf/mongod.conf
systemLog:
destination: file
path: /data/mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /data/mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28017
replication:
oplogSizeMB: 2048
replSetName: my_repl
cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28018/conf/
cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28019/conf/
cp /data/mongodb/28017/conf/mongod.conf /data/mongodb/28020/conf/
sed 's#28017#28018#g' /data/mongodb/28018/conf/mongod.conf -i
sed 's#28017#28019#g' /data/mongodb/28019/conf/mongod.conf -i
sed 's#28017#28020#g' /data/mongodb/28020/conf/mongod.conf -i
------------------------------------------------------------
(5)启动多个实例备用
mongod -f /data/mongodb/28017/conf/mongod.conf
mongod -f /data/mongodb/28018/conf/mongod.conf
mongod -f /data/mongodb/28019/conf/mongod.conf
mongod -f /data/mongodb/28020/conf/mongod.conf
netstat -lnp|grep 280
2、配置复制集:
(1)1主2从,从库普通从库
mongo --port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.200:28017'},
{_id: 1, host: '10.0.0.200:28018'},
{_id: 2, host: '10.0.0.200:28019'}]
}
rs.initiate(config)
3、复制集管理操作:
(1)查看复制集状态:
rs.status(); //查看整体复制集状态
rs.isMaster(); // 查看当前是否是主节点
(2)添加删除节点
rs.add("ip:port"); // 新增从节点
rs.remove("ip:port"); // 删除一个节点
rs.addArb("ip:port"); // 新增仲裁节点
--------------------------------
添加 arbiter节点
1、连接到主节点
[mongod@db03 ~]$ mongo --port 28017 admin
2、添加仲裁节点
my_repl:PRIMARY> rs.addArb("10.0.0.200:28020")
3、查看节点状态
my_repl:PRIMARY> rs.isMaster()
{
"hosts" : [
"10.0.0.200:28017",
"10.0.0.200:28018",
"10.0.0.200:28019"
],
"arbiters" : [
"10.0.0.200:28020"
],
-------------------------------
rs.remove("ip:port"); // 删除一个节点
例子:
my_repl:PRIMARY> rs.remove("10.0.0.200:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
rs.add("ip:port"); // 新增从节点
例子:
my_repl:PRIMARY> rs.add("10.0.0.200:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
---------------------------
注:
添加特殊节点时,
1>可以在搭建过程中设置特殊节点
2>可以通过修改配置的方式将普通从节点设置为特殊节点
/*找到需要改为延迟性同步的数组号*/;
特殊节点:
arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,
所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用
(3)配置延时节点(一般延时节点也配置成hidden)
cfg=rs.conf()
cfg.members[1].priority=0
cfg.members[1].hidden=true
cfg.members[1].slaveDelay=120
rs.reconfig(cfg)
------------目前状态-------------------
我的需求是:把28019设置为hidden和delay
my_repl:PRIMARY> rs.status()
{
"members" : [
{
"_id" : 0,
"name" : "10.0.0.200:28017",
},
{
"_id" : 1,
"name" : "10.0.0.200:28018",
},
{
"_id" : 3,
"name" : "10.0.0.200:28020",
},
{
"_id" : 4,
"name" : "10.0.0.200:28019",
}
cfg=rs.conf()
cfg.members[3].priority=0
cfg.members[3].hidden=true
cfg.members[3].slaveDelay=120
rs.reconfig(cfg)
---------------------------
取消以上配置
cfg=rs.conf()
cfg.members[3].priority=1
cfg.members[3].hidden=false
cfg.members[3].slaveDelay=0
rs.reconfig(cfg)
--------------------------------
配置成功后,通过以下命令查询配置后的属性
rs.conf();
---------------------------------------------------------------------
分片集群规划及配置:
---1、规划:
mongos:
port 38017
dir:/data/mongodb/38017/conf /data/mongodb/38017/log /data/mongodb/38017/data
confdb:
port:38018,38019,38020
replSetName: configReplSet
clusterRole: configsvr
dir:
/data/mongodb/38018/conf /data/mongodb/38018/log /data/mongodb/38018/data
/data/mongodb/38019/conf /data/mongodb/38019/log /data/mongodb/38019/data
/data/mongodb/38020/conf /data/mongodb/38020/log /data/mongodb/38020/data
shard1:
port:38021,38022,38023
replSetName: sh1
clusterRole: shardsvr
dir:
/data/mongodb/38021/conf /data/mongodb/38021/log /data/mongodb/38021/data
/data/mongodb/38022/conf /data/mongodb/38022/log /data/mongodb/38022/data
/data/mongodb/38023/conf /data/mongodb/38023/log /data/mongodb/38023/data
shard2:
port:38024,38025,38026
replSetName: sh2
clusterRole: shardsvr
dir:
/data/mongodb/38024/conf /data/mongodb/38024/log /data/mongodb/38024/data
/data/mongodb/38025/conf /data/mongodb/38025/log /data/mongodb/38025/data
/data/mongodb/38026/conf /data/mongodb/38026/log /data/mongodb/38026/data
--------配置过程-----------------------
---2、shard复制集配置:
2.1目录创建:
mkdir -p /data/mongodb/38021/conf /data/mongodb/38021/log /data/mongodb/38021/data
mkdir -p /data/mongodb/38022/conf /data/mongodb/38022/log /data/mongodb/38022/data
mkdir -p /data/mongodb/38023/conf /data/mongodb/38023/log /data/mongodb/38023/data
mkdir -p /data/mongodb/38024/conf /data/mongodb/38024/log /data/mongodb/38024/data
mkdir -p /data/mongodb/38025/conf /data/mongodb/38025/log /data/mongodb/38025/data
mkdir -p /data/mongodb/38026/conf /data/mongodb/38026/log /data/mongodb/38026/data
2.2修改配置文件:
sh1:
vi /data/mongodb/38021/conf/mongodb.conf
===============
根据需求修改相应参数:
systemLog:
destination: file
path: /data/mongodb/38021/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /data/mongodb/38021/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
port: 38021
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
===============
cp /data/mongodb/38021/conf/mongodb.conf /data/mongodb/38022/conf/
cp /data/mongodb/38021/conf/mongodb.conf /data/mongodb/38023/conf/
sed 's#38021#38022#g' /data/mongodb/38022/conf/mongodb.conf -i
sed 's#38021#38023#g' /data/mongodb/38023/conf/mongodb.conf -i
sh2:
vi /data/mongodb/38024/conf/mongodb.conf
========
根据需求修改相应参数:
systemLog:
destination: file
path: /data/mongodb/38024/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /data/mongodb/38024/data
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
port: 38024
replication:
oplogSizeMB: 2048
replSetName: sh2
sharding:
clusterRole: shardsvr
processManagement:
fork: true
========
cp /data/mongodb/38024/conf/mongodb.conf /data/mongodb/38025/conf/
cp /data/mongodb/38024/conf/mongodb.conf /data/mongodb/38026/conf/
sed 's#38024#38025#g' /data/mongodb/38025/conf/mongodb.conf -i
sed 's#38024#38026#g' /data/mongodb/38026/conf/mongodb.conf -i
2.3启动所有节点,并搭建复制集:
mongod -f /data/mongodb/38021/conf/mongodb.conf
mongod -f /data/mongodb/38022/conf/mongodb.conf
mongod -f /data/mongodb/38023/conf/mongodb.conf
mongod -f /data/mongodb/38024/conf/mongodb.conf
mongod -f /data/mongodb/38025/conf/mongodb.conf
mongod -f /data/mongodb/38026/conf/mongodb.conf
mongo --port 38021
use admin
config = {_id: 'sh1', members: [
{_id: 0, host: '10.0.0.200:38021'},
{_id: 1, host: '10.0.0.200:38022'},
{_id: 2, host: '10.0.0.200:38023',"arbiterOnly":true}]
}
> rs.initiate(config)
mongo --port 38024
use admin
config = {_id: 'sh2', members: [
{_id: 0, host: '10.0.0.200:38024'},
{_id: 1, host: '10.0.0.200:38025'},
{_id: 2, host: '10.0.0.200:38026',"arbiterOnly":true}]
}
> rs.initiate(config)
=-=----=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
---3、config节点配置:
3.1目录创建:
mkdir -p /data/mongodb/38018/conf /data/mongodb/38018/log /data/mongodb/38018/data
mkdir -p /data/mongodb/38019/conf /data/mongodb/38019/log /data/mongodb/38019/data
mkdir -p /data/mongodb/38020/conf /data/mongodb/38020/log /data/mongodb/38020/data
3.2修改配置文件:
[mongod@server1 ~]$ vi /data/mongodb/38018/conf/mongodb.conf
systemLog:
destination: file
path: /data/mongodb/38018/log/mongodb.conf
logAppend: true
storage:
journal:
enabled: true
dbPath: /data/mongodb/38018/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
port: 38018
replication:
oplogSizeMB: 2048
replSetName: configReplSet
sharding:
clusterRole: configsvr
processManagement:
fork: true
cp /data/mongodb/38018/conf/mongodb.conf /data/mongodb/38019/conf/
cp /data/mongodb/38018/conf/mongodb.conf /data/mongodb/38020/conf/
sed 's#38018#38019#g' /data/mongodb/38019/conf/mongodb.conf -i
sed 's#38018#38020#g' /data/mongodb/38020/conf/mongodb.conf -i
3.3启动节点,并配置复制集
mongod -f /data/mongodb/38018/conf/mongodb.conf
mongod -f /data/mongodb/38019/conf/mongodb.conf
mongod -f /data/mongodb/38020/conf/mongodb.conf
mongo --port 38018
use admin
config = {_id: 'configReplSet', members: [
{_id: 0, host: '10.0.0.200:38018'},
{_id: 1, host: '10.0.0.200:38019'},
{_id: 2, host: '10.0.0.200:38020'}]
}
> rs.initiate(config)
注:configserver 可以是一个节点,官方建议复制集。configserver不能有arbiter。
新版本中,要求必须是复制集。
注:mongodb 3.4之后,虽然要求config server为replica set,但是不支持arbiter
=============================================================================
---4、mongos节点配置:
4.1创建目录:
mkdir -p /data/mongodb/38017/conf /data/mongodb/38017/log
4.2配置文件:
vi /data/mongodb/38017/conf/mongos.conf
systemLog:
destination: file
path: /data/mongodb/38017/log/mongos.log
logAppend: true
net:
port: 38017
sharding:
configDB: configReplSet/10.0.0.200:38018,10.0.0.200:38019,10.0.0.200:38020
processManagement:
fork: true
4.3启动mongos
[mongod@server1 ~]$ mongos -f /data/mongodb/38017/conf/mongos.conf
---5、分片集群操作:
连接到其中一个mongos(10.0.0.200),做以下配置
(1)连接到mongs的admin数据库
$ mongo 10.0.0.200:38017/admin
(2)添加分片
> db.runCommand( { addshard : "sh1/10.0.0.200:38021,10.0.0.200:38022,10.0.0.200:38023",name:"shard1"} )
> db.runCommand( { addshard : "sh2/10.0.0.200:38024,10.0.0.200:38025,10.0.0.200:38026",name:"shard2"} )
(3)列出分片
mongos> db.runCommand( { listshards : 1 } )
(4)整体状态查看
mongos> sh.status();
--------------------------使用分片集群------------------------------------------
test库下的vast大表进行手工分片
1、激活数据库分片功能
mongo --port 38017 admin
admin> ( { enablesharding : "数据库名称" } )
eg:
admin> db.runCommand( { enablesharding : "test" } )
2、指定分片建对集合分片
eg:范围片键
--创建索引
use test
> db.vast.ensureIndex( { id: 1 } )
--开启分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
3、集合分片验证
admin> use test
test> for(i=1;i<500000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
test> db.vast.stats()
4、分片结果测试
shard1:
mongo --port 38021
db.vast.count();
shard2:
mongo --port 38024
db.vast.count();
----------------------------
分片键
--范围片键
admin> sh.shardCollection("数据库名称.集合名称",key : {分片键: 1} )
或
admin> db.runCommand( { shardcollection : "数据库名称.集合名称",key : {分片键: 1} } )
eg:
admin > sh.shardCollection("test.vast",key : {id: 1} )
或
admin> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
--哈希片键
admin > sh.shardCollection( "数据库名.集合名", { 片键: "hashed" } )
----------------------------------------------------
4、Hash分片例子:
对oldboy库下的vast大表进行hash
创建哈希索引
(1)对于oldboy开启分片功能
use admin
admin> db.runCommand( { enablesharding : "oldboy" } )
(2)对于oldboy库下的vast表建立hash索引
use oldboy
oldboy> db.vast.ensureIndex( { id: "hashed" } )
(3)开启分片
use admin
admin > sh.shardCollection( "oldboy.vast", { id: "hashed" } )
(4)录入10w行数据测试
use oldboy
for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
(5)hash分片结果测试
mongo --port 38021
use oldboy
db.vast.count();
mongo --port 38024
use oldboy
db.vast.count();
---------------------------
5、判断是否Shard集群
admin> db.runCommand({ isdbgrid : 1})
6、列出所有分片信息
admin> db.runCommand({ listshards : 1})
7、列出开启分片的数据库
admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出所有数据库分片情况
8、查看分片的片键
config> db.collections.find().pretty()
{
"_id" : "test.vast",
"lastmodEpoch" : ObjectId("58a599f19c898bbfb818b63c"),
"lastmod" : ISODate("1970-02-19T17:02:47.296Z"),
"dropped" : false,
"key" : {
"id" : 1
},
"unique" : false
}
9、查看分片的详细信息
admin> db.printShardingStatus()
或
admin> sh.status()
10、删除分片节点
(1)确认blance是否在工作
sh.getBalancerState()
(2)删除shard2节点
mongos> db.runCommand( { removeShard: "shard2" } )
---------------------------------------------
MySQL 数据迁移到 MongoDB
CSV --------> CSV
1、了解mongodb的csv长什么样?
(1)模拟数据
mongo -uroot -proot123 10.0.0.200/admin
use test
for(i=0;i<200;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
(2)导出CSV格式文件
mongoexport -uroot -proot123 --authenticationDatabase admin --port 27017 -d test -c vast --type=csv -f id,name,age,date -o /data/mongodb/vast.csv
----------------------------------------
id,name,age,date
0,shenzheng,70,2018-07-18T07:34:14.021Z
1,shenzheng,70,2018-07-18T07:34:14.050Z
2,shenzheng,70,2018-07-18T07:34:14.052Z
----------------------------------------
2、了解MySQL 的CSV长什么样?
++++++++
select * from city into outfile '/tmp/city.csv';
++++++++
3、将MySQL数据导出为MongoDB模式的CSV
select * from world.city into outfile 'd:\city.csv' fields terminated by ',';
编辑CSV格式,加入第一行,列名字
4、mongodb导入CSV文件
mongoimport -uroot -proot123 --authenticationDatabase admin --port 27017 -d world -c city --type=csv --headerline --file /data/city.csv