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
#最后添加如下代码:

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
View Code

#编辑配置文件

vim /etc/security/limits.conf

#*               -       nofile          65535
View Code

+++++++++++++++++++++++++++++++

#都修改完成后 重启虚拟机reboot

#

su - mongod

mongod --logpath=/data/mongodb/log/mongodb.log --dbpath=/data/mongodb/data/ --fork

十、配置文件使用

#编辑配置文件

vim /data/mongodb/conf/mongo.conf

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
View Code

十一、mongodb的关闭

#关闭
mongod -f /data/mongodb/conf/mongo.conf --shutdown
#启动:
mongod -f /data/mongodb/conf/mongo.conf 

十二、帮助的使用

 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()
View Code

十三、集合的操作    

(一)创建集合

方法1:

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" ]
View Code

方法2:当插入一个文档的时候,一个集合就会自动创建。

> 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" } ]
})
View Code

#配置文件中,加入以下配置

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

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
View Code

 

MangoDB切分

和redis的切分不一样的是,MangoDB的切分是可以由我们控制的,也就是我们可以定制切分规则。。。。。。。。。。。

应该对热点数据进行切分,热点数据就是经常访问的数据。也有热点表,热点表也是经常被访问的表。

分片集群的构成:

  1. config server

(秘书)

存放节点信息,分片策略。默认需要配置三个这种节点。

  1. mongos

(老板)

APP Router提供对外应用访问。所有操作都通过mongos执行。

数据迁移

数据自动均衡(很耗IO性能)

  1. mongod

(真正干活的)

存储应用数据记录。真正的数据是存在底层的shard节点上。

 

分片键shard key

能设置实现预分片

  1. 必须为分片定义分片键(其实就是选某个字段,选有唯一值多的,精良选将来查询中作为查询条件的键)
  2. 基于一个或多个列
  3. 分片键定义数据空间
  4. 分偏见进行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

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",          
              }
View Code

 ---------------------------

cfg=rs.conf()
cfg.members[2].priority=0
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120
rs.reconfig(cfg)  
View Code

取消以上配置

cfg=rs.conf()
cfg.members[3].priority=1
cfg.members[3].hidden=false
cfg.members[3].slaveDelay=0
rs.reconfig(cfg)   
View Code

配置成功后,通过以下命令查询配置后的属性

rs.conf();

 

posted @ 2018-09-03 08:39  桥前石头  阅读(198)  评论(0编辑  收藏  举报