NoSQL-MongoDB基础及集群搭建学习笔记-程序员宅基地

MySQL体系结构

库:database

表:table

列:column

行:row

MongoDB体系结构

库:database

集合(表);collection

文档:(json)

        {
            id:101
            name:zhangsan
}

1、系统准备

(1)redhat或centos6.2以上系统
(2)系统开发包完整
(3)ip地址和hosts文件解析正常
(4)iptables防火墙&SElinux关闭
(5)关闭大页内存机制
########################################################################
root用户下
在vi /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
        
cat  /sys/kernel/mm/transparent_hugepage/enabled        
cat /sys/kernel/mm/transparent_hugepage/defrag  

https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/

2、mongodb安装

创建所需用户和组

useradd mongodbb
passwd mongodbb

创建mongodb所需目录结构

mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data

上传并解压软件到指定位置

[root@db01 data]# cd   /data
[root@db01 data]# tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz 
[root@db01 data]#  cp -r /data/mongodb-linux-x86_64-rhel70-3.6.12/bin/ /mongodb

设置目录结构权限

chown -R mongod:mongod /mongodb

设置用户环境变量

su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile

设置用户环境变量

su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile

启动mongodb

mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork 

登录mongodb

[mongod@server2 ~]$ mongo

3.使用配置文件

YAML模式

NOTE:
YAML does not support tab characters for indentation: use spaces instead.

--系统日志有关

systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式记录

--数据存储有关

storage:
journal:
enabled: true
dbPath: "/mongodb/data" --数据路径的位置

-- 进程控制

processManagement:
fork: true --后台守护进程
pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中

--网络配置有关

net:
bindIp: <ip> -- 监听地址
port: <port> -- 端口号,默认不配置端口号,是27017

-- 安全验证有关配置

security:
authorization: enabled --是否打开用户名密码验证

/------------------以下是复制集与分片集群有关----------------------

replication:
oplogSizeMB: <NUM>
replSetName: "<REPSETNAME>"
secondaryIndexPrefetch: "all"

sharding:
clusterRole: <string>
archiveMovedChunks: <boolean>

---for mongos only
replication:
localPingThresholdMs: <int>

sharding:
configDB: <string>


mongodb 使用systemd管理

[root@db01 ~]# cat > /etc/systemd/system/mongodb.service <<EOF
[Unit]
Description=mongodb 
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongodb
Type=forking
ExecStart=/mongodb/bin/mongodb --config /mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongodb --config /mongodb/conf/mongo.conf --shutdown
PrivateTmp=true  
[Install]
WantedBy=multi-user.target
EOF

[root@db01 ~]# systemctl restart mongod
[root@db01 ~]# systemctl stop mongod
[root@db01 ~]# systemctl start mongod

3、mongodb常用基本操作

3.0 mongodb 默认存在的库

test:登录时默认存在的库
管理MongoDB有关的系统库
admin库:系统预留库,MongoDB系统管理库
local库:本地预留库,存储关键日志
config库:MongoDB配置信息库

show databases/show dbs
show tables/show collections
use admin 
db/select database()

3.1 命令种类

db 对象相关命令
db.[TAB][TAB]
db.help()
db.oldboy.[TAB][TAB]
db.oldboy.help()

rs 复制集有关(replication set):
rs.[TAB][TAB]
rs.help()

sh 分片集群(sharding cluster)
sh.[TAB][TAB]
sh.help()

4. mongodb对象操作

mongo mysql
库 -----> 库
集合 -----> 表
文档 -----> 数据行

4.1 库的操作

> use test          �(创建数据库)
>db.dropDatabase()   (删除当前库)
{ "dropped" : "test", "ok" : 1 }
show dis(查询)
db (  当前所在库)

4.2 集合的操作

app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')
方法2:当插入一个文档的时候,一个集合就会自动创建。
查询
show tables
show collection
删除
db.oldboy.drop

插入数据

> use oldboy
switched to db oldboy
> db.t1.insert({id:101})
WriteResult({ "nInserted" : 1 })
> show tables;
t1

4.3 文档操作

数据录入:

for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}

查询数据行数:

> db.log.count()

全表查询:

> db.log.find()

每页显示50条记录:

> DBQuery.shellBatchSize=50; 
``

按照条件查询

> db.log.find({uid:999}

以标准的json格式显示数据

{
    "_id" : ObjectId("5cc516e60d13144c89dead33"),
    "uid" : 999,
    "name" : "mongodb",
    "age" : 6,
    "date" : ISODate("2019-04-28T02:58:46.109Z")
}
``
删除集合中所有记录

app> db.log.remove({})


查看集合存储信息
app> db.log.totalSize() //集合中索引+数据压缩存储之后的大小   

5. 用户及权限管理

5.1 注意

验证库: 建立用户时use到的库,在使用用户时,要加上验证库才能登陆。

对于管理员用户,必须在admin下创建.

  1. 建用户时,use到的库,就是此用户的验证库
  2. 登录时,必须明确指定验证库才能登录
  3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
  4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.
  5. 从3.6 版本开始,不添加bindIp参数,默认不让远程登录,只能本地管理员登录。

5.2 用户创建语法

use admin                                选定验证库
db.createUser
{
    user: "<name>",
    pwd: "<cleartext password>",
    roles: [
       { role: "<role>",
     db: "<database>" } | "<role>",
    ...
    ]
}

基本语法说明:
user:用户名
pwd:密码
roles:
role:角色名
db:作用对象
role:root, readWrite,read
验证数据库:
mongo -u oldboy -p 123 10.0.0.53/oldboy

5.3 用户管理例子

创建超级管理员:管理所有数据库(必须use admin再去创建)

$ mongo
use admin

�db.createUser(
{
    user: "root",
    pwd: "root123",
    roles: [ { role: "root", db: "admin" } ]
}
)

验证用户

db.auth('root','root123')

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

security:
  authorization: enabled

重启mongodb

mongod -f /mongodb/conf/mongo.conf --shutdown 
mongod -f /mongodb/conf/mongo.conf 

登录验证

mongo -uroot -proot123  admin
mongo -uroot -proot123  10.0.0.53/admin

或者
mongo
use admin
db.auth('root','root123')

查看用户:
use admin
db.system.users.find().pretty()

创建应用用户

use oldboy
db.createUser(
    {
        user: "app01",
        pwd: "app01",
        roles: [ { role: "readWrite" , db: "oldboy" } ]
    }
)

mongo -uapp01 -papp01 app

查询mongodb中的用户信息

mongo -uroot -proot123 10.0.0.51/admin
db.system.users.find().pretty()

5.3创建应用用户

use oldboy
db.createUser(
    {
        user: "app01",
        pwd: "app01",
        roles: [ { role: "readWrite" , db: "oldboy" } ]
    }
)
登陆
mongo  -uapp01 -papp01 app

查询mongodb中的用户信息

mongo -uroot -proot123 10.0.0.53/admin
db.system.users.find().pretty()

5.4 删除用户(root身份登录,use到验证库)

删除用户
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
mongo -uroot -proot123 10.0.0.52/admin
use oldboy1
db.dropUser("app02")

5.5 用户管理注意事项

  1. 建用户要有验证库,管理员admin,普通用户是要管理的库
  2. 登录时,注意验证库
mongo -uapp01 -papp01 10.0.0.52:27017/oldboy

  1. 重点参数
net:
   port: 27017
   bindIp: 10.0.0.51,127.0.0.1
security:
   authorization: enabled

6. MongoDB复制集RS(ReplicationSet)

6.1 基本原理

基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知
客户端程序,主库已经发生切换了。应用就会连接到新的主库。

6.2 Replication Set配置过程详解

6.2.1 规划

三个以上的mongodb节点(或多实例)

6.2.2 环境准备

注意修改ip
多个端口:
28017、28018、28019、28020

多套目录:

su - mongod 
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

多套配置文件

/mongodb/28017/conf/mongod.conf
/mongodb/28018/conf/mongod.conf
/mongodb/28019/conf/mongod.conf
/mongodb/28020/conf/mongod.conf

配置文件内容

cat > /mongodb/28017/conf/mongod.conf <<EOF
systemLog:
  destination: file
  path: /mongodb/28017/log/mongodb.log
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: /mongodb/28017/data
  directoryPerDB: true
  #engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1
      directoryForIndexes: true
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true
processManagement:
  fork: true
net:
  bindIp: 10.0.0.52,127.0.0.1
  port: 28017
replication:
  oplogSizeMB: 2048
  replSetName: my_repl
EOF
     
\cp  /mongodb/28017/conf/mongod.conf  /mongodb/28018/conf/
\cp  /mongodb/28017/conf/mongod.conf  /mongodb/28019/conf/
\cp  /mongodb/28017/conf/mongod.conf  /mongodb/28020/conf/

sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i
sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i
sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i

启动多个实例备用

mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf
netstat -lnp|grep 280

6.3 配置普通复制集:

1主2从,从库普通从库

mongo --port 28017 admin
config = {_id: 'my_repl', members: [
                          {_id: 0, host: '10.0.0.52:28017'},
                          {_id: 1, host: '10.0.0.52:28018'},
                          {_id: 2, host: '10.0.0.52:28019'}]
          }                   
rs.initiate(config) 
查询复制集状态
rs.status();

6.4 1主1从1个arbiter

mongo -port 28017 admin
config = {_id: 'my_repl', members: [
                          {_id: 0, host: '10.0.0.52:28017'},
                          {_id: 1, host: '10.0.0.52:28018'},
                          {_id: 2, host: '10.0.0.52:28019',"arbiterOnly":true}]
          }                
rs.initiate(config) 

6.5 复制集管理操作

6.5.1 查看复制集状态

rs.status();    //查看整体复制集状态
rs.isMaster(); // 查看当前是否是主节点
 rs.conf();   //查看复制集配置信息

6.5.2 添加删除节点

rs.remove("ip:port"); // 删除一个节点
rs.add("ip:port"); // 新增从节点
rs.addArb("ip:port"); // 新增仲裁节点
例子:
添加 arbiter节点
1、连接到主节点
[mongod@db03 ~]$ mongo --port 28018 admin

2、添加仲裁节点

my_repl:PRIMARY> rs.addArb("10.0.0.52:28020")

3、查看节点状态

my_repl:PRIMARY> rs.isMaster()
{
    "hosts" : [
        "10.0.0.53:28017",
        "10.0.0.53:28018",
        "10.0.0.53:28019"
    ],
    "arbiters" : [
        "10.0.0.53:28020"
    ],
rs.remove("ip:port"); // 删除一个节点    ```要从主节点删除```
例子:
my_repl:PRIMARY> rs.remove("10.0.0.52:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
rs.add("ip:port"); // 新增从节点
例子:
my_repl:PRIMARY> rs.add("10.0.0.52:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()

注意:所有的从库都允许读写

rs.slaveOk() 临时打开从库节点读写功能。

6.5.3 特殊从节点

arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用

介绍:

arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用

配置延时节点(一般延时节点也配置成hidden)

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

取消以上配置

注意:member里面的数字要看情况填写,如果最开始没有改过的话就写标注的id,如果有改变就从0开始数即可。

cfg=rs.conf() 
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)    
配置成功后,通过以下命令查询配置后的属性
rs.conf(); 

6.5.4 副本集其他操作命令

查看副本集的配置信息

admin> rs.conf()

查看副本集各成员的状态

admin> rs.status()

++++++++++++++++++++++++++++++++++++++++++++++++
--副本集角色切换(不要人为随便操作)

admin> rs.stepDown()

注:
admin> rs.freeze(300) //锁定从,使其不会转变成主库
freeze()和stepDown单位都是秒。
+++++++++++++++++++++++++++++++++++++++++++++
设置副本节点可读:在副本节点执行

admin> rs.slaveOk()
eg:
admin> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }

查看副本节点(监控主从延时)

admin> rs.printSlaveReplicationInfo()
source: 192.168.1.22:27017
    syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)
    0 secs (0 hrs) behind the primary

OPlog日志(备份恢复章节)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44922815/article/details/101478784

智能推荐

请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?_malloc 和brk-程序员宅基地

文章浏览阅读1.7k次,点赞2次,收藏3次。Malloc函数用于动态分配内存。为了减少内存碎片和系统调用的开销,malloc其采用内存池的方式,先申请大块内存作为堆区,然后将堆区分为多个内存块,以块作为内存管理的基本单位。当用户申请内存时,直接从堆区分配一块合适的空闲块。Malloc采用隐式链表结构将堆区分成连续的、大小不一的块,包含已分配块和未分配块;同时malloc采用显示链表结构来管理所有的空闲块,即使用一个双向链表将空闲块连..._malloc 和brk

Python3自学--2环境搭建_/root/training/python-3.6.5/lib/python3.6/site-pac-程序员宅基地

文章浏览阅读168次。笔者开发环境:[root@BigData11 /]# cat /etc/redhat-release Red Hat Enterprise Linux Server release 7.4 (Maipo)安装Python3:以Python3.6.1 为例:1.访问https://www.python.org/downloads/source/,选择源码压缩包2.上传到..._/root/training/python-3.6.5/lib/python3.6/site-packages/pandas/compat/__init

JavaScript-超大文件上传-如何上传文件-大文件上传_js如何上传大文件-程序员宅基地

文章浏览阅读191次。一、概述所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。二、Range用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式: Rang..._js如何上传大文件

YARN的发展背景及基本原理_yarn框架历史-程序员宅基地

文章浏览阅读2.1k次。Yarn产生的历史背景Hadoop是apache基金会的一个项目, 目的是开发一个开源软件,用于可靠的可扩展的,分布式的计算。 Hadoop不是一个软件,而是一个软件库,hadoop作为一个软件库,提供了一个框架,可以以分布式的方式,在集群的多台主机之间,使用简单的编程模型来处理大量的数据集。Hadoop被设计成可以从单主机扩展到数千台主机,并且支持本地计算和存储。 Hadoop本身被设计成可以_yarn框架历史

kubernetes杂谈之(二)静态Pod_静态pod和动态pod的主要区别-程序员宅基地

文章浏览阅读1.2k次。一 静态Pod --- '静体现在哪?' ---之前:前面Pod的'生命周期管理'都是通过像DaemonSet、StatefulSet、Deployment'上层'这种方式创建管理的静态Pod是由kubelet进行管理'仅存在于特定Node上'的Pod -->'可以理解为定向调度' -->'如何定向调度涉及到创建方式'它们'不能通过API Server'进行管理,无法与'ReplicationController.._静态pod和动态pod的主要区别

eclipse里面配置spring,提示java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher_eclipse java.lang.classnotfoundexception: org.spri-程序员宅基地

文章浏览阅读7.5k次。在eclipse里面创建了一个Dynamic 项目,用到Spring,一直提示java.lang.ClassNotFoundException: org.springframework.web.servlet.Dispatcher 错误,后来又提示java.lang.NoClassDefFoundError: org/springframework/context/ApplicationConte_eclipse java.lang.classnotfoundexception: org.springframework.web.servlet.di

随便推点

IOC、AOP、以及Spring框架的面试整合题_springioc和aop的面试题-程序员宅基地

文章浏览阅读616次,点赞3次,收藏3次。spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,是一个分层的javaEE一站式轻量级开源框架。_springioc和aop的面试题

蚂蚁开发者工具(支付宝小程序开发工具)v0.32.3官方版_支付宝小程序开发者工具linux版本-程序员宅基地

文章浏览阅读3k次。蚂蚁开发者工具也就是支付宝小程序开发工具,支付宝小程序已经进入公测阶段,目前公测主要面向的是企业级开发者,蚂蚁开发者工具是支付宝小程序必备的工具!小程序介绍:支付宝小程序是手机应用嵌入支付宝客户端的一种方法,有以下特点:基于 Web 技术,学习成本低一套代码,同时支持 iOS 和 Android,接近原生体验提供丰富的组件和 API(比如获取用户信息、本地存储、支付功能等)基..._支付宝小程序开发者工具linux版本

csp 详解碰撞的小球(C++实现)_小球与客户边区边界碰撞动画怎样用c++执行-程序员宅基地

文章浏览阅读1.4k次。题目什么的就不写了,觉得大家都看过,直接上思路!解题思路碰撞的小球一题和下面链接里的题目类似:POJ的题目Ants可惜还是有点区别,如果使用和上题一样的思路,会带来不必要的麻烦!(我使用上题的思路没有做出来,大家可以试试)POJ的题目Ants这道题的解题思路还是挺新颖的,建议大家看看! 在我抛弃上述思路的做法后,很快就写出了答案:一、首先定义了一个结构体:typedef struct Ball ball;struct Ball{ int position;//表示小球位置 _小球与客户边区边界碰撞动画怎样用c++执行

位运算解决“一个数组中,只有一个数字出现n次,其他数字出现k次”问题_一个整形数组中,除了一个数字外,其他数字都出现了n次,找出这个不重复的数字-程序员宅基地

文章浏览阅读1.7k次。在学习完位操作后,经常会遇到一类关于查找缺失整数的问题。_一个整形数组中,除了一个数字外,其他数字都出现了n次,找出这个不重复的数字

MobaXterm连接远程服务器_mobaxterm迁移连接与密码-程序员宅基地

文章浏览阅读2.6k次。下载一个MobaXterm,选择左上角Session,弹出界面中选择SSH,输入ip和port,登陆后输入用户名和密码,完成连接前提是服务器开启了ssh:sudo apt-get updatesudo apt-get install openssh-serversudp ps -e | grep ssh ..._mobaxterm迁移连接与密码

Ext.form.field.File示例-程序员宅基地

文章浏览阅读7.1k次。Ext.onReady(function(){ Ext.QuickTips.init(); var uploadForm = Ext.create('Ext.form.Panel', { title: 'Ext.form.field.File示例', bodyStyle: 'padding:5 5 5 5',//表单边距 width: 300, fram_ext.form.field.file

推荐文章

热门文章

相关标签