MongoDB笔记
一、上传软件
mkdir /data cd /data # 使用xshell上传软件
二、解压软件
tar xf mongodb-linux-x86_64-rhel62-3.2.10.tgz
mv mongodb-linux-x86_64-rhel62-3.2.10 mongodb
三、创建mongodb管理用户
useradd mongod #添加用户 passwd mongod # 为用户设置密码
四、修改目录授权
chown -R mongod.mongod /data/mongodb
五、切换或登录mongod用户
su - mongod
六、创建mongod的关键目录
mkdir -p /data/mongodb/data /data/mongodb/log /data/mongodb/conf cd /data/mongodb ls -l
七、修改环境变量
# 编辑文件 vim ~/.bash_profile #内容 # 添加一行: export PATH=/data/mongodb/bin:$PATH #配置生效一下: source ~/.bash_profile
八、启动mongodb
mongod --logpath=/data/mongodb/log/mongodb.log --dbpath=/data/mongodb/data/ --fork
九、登录mongodb测试
mongo
++++++++++++++++++++++++++++++
#root用户下:
#编辑文件
vim /etc/rc.local
#最后添加如下代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#* - nofile 65535
+++++++++++++++++++++++++++++++
#都修改完成后 重启虚拟机reboot
#
su - mongod
mongod --logpath=/data/mongodb/log/mongodb.log --dbpath=/data/mongodb/data/ --fork
十、配置文件使用
#编辑配置文件
vim /data/mongodb/conf/mongo.conf
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
systemLog: destination: file path: "/data/mongodb/log/mongodb.log" logAppend: true storage: journal: enabled: true dbPath: "/data/mongodb/data/" processManagement: fork: true net: port: 27017
十一、mongodb的关闭
#关闭 mongod -f /data/mongodb/conf/mongo.conf --shutdown #启动: mongod -f /data/mongodb/conf/mongo.conf
十二、帮助的使用
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 help 2 KEYWORDS.help() 3 KEYWORDS.[TAB] 4 db.help() 5 db.stu.help() 6 show 7 use 8 db.help() 9 db.a.help() 10 rs.help() 11 sh.help()
十三、集合的操作
(一)创建集合
方法1:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
admin> use app switched to db app app> db.createCollection('a') { "ok" : 1 } app> db.createCollection('b') { "ok" : 1 } > show collections //查看当前数据下的所有集合 a b 或 > db.getCollectionNames() [ "a", "b" ]
方法2:当插入一个文档的时候,一个集合就会自动创建。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
> use oldboy > db.test.insert({name:"zhangsan"}) > db.stu.insert({id:101,name:"zhangsan",age:20,gender:"m"}) > show tables; > db.stu.insert({id:102,name:"lisi"}) > db.stu.insert({a:"b",c:"d"}) > db.stu.insert({a:1,c:2}) > db.stu.find({}).pretty() db.stu.find({id:101}).pretty(); { "_id" : ObjectId("5b470168cfdebc16a5a82a97"), "id" : 101, "name" : "zhangsan", "age" : 20, "gender" : "m" } use test db.createUser({ user: "test", pwd: "123", roles: [ { role: "readWrite", db: "oldboy" } ] }) use admin db.createUser({ user: "root", pwd: "root123", roles: [ { role: "root", db: "admin" } ] })
#配置文件中,加入以下配置
vim /data/mongodb/conf/mongo.conf
#在配置文件中添加两行信息:
security:
authorization: enabled
(二)登录验证
(1)用户登录:
mongo -utest -p123 10.0.0.200
(2)管理员用户:
mongo -uroot -proot123 10.0.0.200/admin 或者 mongo use admin db.auth('root','root123')
(三)查询mongodb中的用户信息
mongo -uroot -proot123 10.0.0.53/admin
db.system.users.find().pretty()
(四)删除用户(root身份登录,use到验证库)
# mongo -uroot -proot123 10.0.0.53/admin use app db.dropUser("app03")
十四、复制集
需要掌握:不同架构的连接方法
加上可选仲裁节点
延时节点:为了逻辑错误
隐藏节点
越多从库存在对主库的压力越大
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
vim /data/mongodb/28017/conf/mongod.conf
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
MangoDB切分
和redis的切分不一样的是,MangoDB的切分是可以由我们控制的,也就是我们可以定制切分规则。。。。。。。。。。。
应该对热点数据进行切分,热点数据就是经常访问的数据。也有热点表,热点表也是经常被访问的表。
分片集群的构成:
- config server
(秘书)
存放节点信息,分片策略。默认需要配置三个这种节点。
- mongos
(老板)
APP Router提供对外应用访问。所有操作都通过mongos执行。
数据迁移
数据自动均衡(很耗IO性能)
- mongod
(真正干活的)
存储应用数据记录。真正的数据是存在底层的shard节点上。
分片键shard key
能设置实现预分片
- 必须为分片定义分片键(其实就是选某个字段,选有唯一值多的,精良选将来查询中作为查询条件的键)
- 基于一个或多个列
- 分片键定义数据空间
- 分偏见进行range和hash分片:hash分片更均匀。枚举类型也可以作为分片键
。。。。。。。
分片键是不可变的
必须有索引
大小限制512bytes
不接受插入为空,否则分片失效
MongoDB的逻辑结构
MySQL MongoDB
库 库
表 集合
列,数据行 文档
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" ],
4、删除一个节点
rs.remove("ip:port");
例子:
my_repl:PRIMARY> rs.remove("10.0.0.200:28019"); { "ok" : 1 } my_repl:PRIMARY> rs.isMaster()
5.新增从节点
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
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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", }
---------------------------
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cfg=rs.conf() cfg.members[2].priority=0 cfg.members[2].hidden=true cfg.members[2].slaveDelay=120 rs.reconfig(cfg)
取消以上配置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
cfg=rs.conf() cfg.members[3].priority=1 cfg.members[3].hidden=false cfg.members[3].slaveDelay=0 rs.reconfig(cfg)
配置成功后,通过以下命令查询配置后的属性
rs.conf();