nfs挂载根文件系统

1.安装NFS

     
nfs原理是通过网络,将远程主机共享的文件系统,挂载到本机。Ubuntu 12.04上默认是没有安装NFS服务器的,首先要安装NFS服务程序:

先执行 # apt-get update

未分类

然后执行 #  sudo apt-get install nfs-kernel-server

未分类

(安装nfs-kernel-server时,apt会自动安装nfs-common和portmap) 这样,宿主机就相当于NFS Server。

2.宿主机NFS的配置

   

2.1 修改配置文件/etc/exports

          
在终端下用 # vi  /etc/exports打开exports文件。

如果你没有配置过这个文件的话此文件应该是空的。
      
在开始部分写入  /home/topeet/targetNFS/   * (rw,sync,no_root_squash)

未分类

/home/topeet/targetNFS/ -- 与客户机共享的目录,在这里我的共享目录为  /home/topeet/targetNFS/;

其中:

*      -- 表示允许任意用户使用,也可以使用具体IP;
(rw,sync,no_root_squash)  -- rw,挂载此目录的客户机对此目录有读写权利;sync,……;no_root_squash,挂载此目录的客户机享有主机root的权利;

我是将主机的根目录设置为共享目录  /  *(rw,sync,no_root_squash)
OK,保存,退出。
修改完成之后输入:#  exportfs –rv来使配置文件生效
——————— 
 

3.重启nfs(每一次修改exports都要重启nfs)

/etc/init.d/nfs-kernel-server restart
/etc/init.d/portmap restart

4.本地测试

现在可以在本机上试一下:

#sudo mount -t nfs localhost:/home/kevin /mnt

注:localhost为本机linux的IP地址

这样就把共享目录挂到了/mnt目录,取消挂载用:

#sudo umount /mnt

如果用在嵌入式设备上挂载,要加上参数-o nolock

我在开发板上使用的挂载命令:

mount -t nfs -o nolock 192.168.1.8:/home/kevin /mnt

CentOS 7中搭建NFS文件共享存储服务的完整步骤

如果仅仅只是希望搭建一个linux之间进行文件共享的服务器,而不是所有异构的系统之间共享的话,nfs是一个不错的选择。下面这篇文章主要给大家介绍了关于在CentOS 7中搭建NFS文件共享存储服务的完整步骤,需要的朋友可以参考下

前言

NFS(Network File System)意为网络文件系统,它最大的功能就是可以通过网络,让不同的机器不同的操作系统可以共享彼此的文件。简单的讲就是可以挂载远程主机的共享目录到本地,就像操作本地磁盘一样,非常方便的操作远程文件。

本文将给大家讲解如何在CentOS7上安装和配置NFS服务器。

下面话不多说了,来一起看看详细的介绍吧

准备

我们需要两台CentOS7机器,我们用虚拟机做测试,分别做NFS服务器和客户端,配置如下:

  • NFS服务器ip:192.168.11.31

  • 客户端ip:192.168.11.34

我们要实现的目标是:在NFS服务器上共享一个目录,在客户端上可以直接操作NFS服务器上的这个共享目录下的文件。

NFS服务器配置

1.安装NFS服务

首先使用yum安装nfs服务:

yum -y install rpcbind nfs-utils

2.创建共享目录

在服务器上创建共享目录,并设置权限。

mkdir /data/share/
chmod 755 -R /data/share/

3.配置NFS

nfs的配置文件是 /etc/exports ,在配置文件中加入一行:

/data/share/ 192.168.11.34(rw,no_root_squash,no_all_squash,sync)

这行代码的意思是把共享目录/data/share/共享给192.168.11.34这个客户端ip,后面括号里的内容是权限参数,其中:

  • rw 表示设置目录可读写。

  • sync 表示数据会同步写入到内存和硬盘中,相反 rsync 表示数据会先暂存于内存中,而非直接写入到硬盘中。

  • no_root_squash NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。

  • no_all_squash 不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都不会拥有匿名用户权限。

如果有多个共享目录配置,则使用多行,一行一个配置。保存好配置文件后,需要执行以下命令使配置立即生效:

exportfs -r

4.设置防火墙

如果你的系统没有开启防火墙,那么该步骤可以省略。

NFS的防火墙特别难搞,因为除了固定的port111、2049外,还有其他服务如rpc.mounted等开启的不固定的端口,这样对防火墙来说就比较麻烦了。为了解决这个问题,我们可以设置NFS服务的端口配置文件。

修改/etc/sysconfig/nfs文件,将下列内容的注释去掉,如果没有则添加:

RQUOTAD_PORT=1001
LOCKD_TCPPORT=30001
LOCKD_UDPPORT=30002
MOUNTD_PORT=1002

保存好后,将端口加入到防火墙允许策略中。执行:

firewall-cmd --zone=public --add-port=111/tcp --add-port=111/udp --add-port=2049/tcp --add-port=2049/udp --add-port=1001/tcp --add-port=1001/udp --add-port=1002/tcp --add-port=1002/udp --add-port=30001/tcp --add-port=30002/udp --permanent
firewall-cmd --reload

5.启动服务

按顺序启动rpcbind和nfs服务:

systemctl start rpcbind
systemctl start nfs

加入开机启动:

systemctl enable rpcbind 
systemctl enable nfs

nfs服务启动后,可以使用命令 rpcinfo -p 查看端口是否生效。

服务器的后,我们可以使用 showmount 命令来查看服务端(本机)是否可连接:

[root@localhost ~]# showmount -e localhost
Export list for localhost:
/data/share 192.168.11.34

出现上面结果表明NFS服务端配置正常。

客户端配置

1.安装rpcbind服务

客户端只需要安装rpcbind服务即可,无需安装nfs或开启nfs服务。

yum -y install rpcbind

2.挂载远程nfs文件系统

查看服务端已共享的目录:

[root@localhost ~]# showmount -e 192.168.11.31
Export list for 192.168.11.31:
/data/share 192.168.11.34

建立挂载目录,执行挂载命令:

mkdir -p /mnt/share
mount -t nfs 192.168.11.34:/data/share /mnt/share/ -o nolock,nfsvers=3,vers=3

如果不加 -onolock,nfsvers=3 则在挂载目录下的文件属主和组都是nobody,如果指定nfsvers=3则显示root。

如果要解除挂载,可执行命令:

umount /mnt/share

3.开机自动挂载

如果按本文上面的部分配置好,NFS即部署好了,但是如果你重启客户端系统,发现不能随机器一起挂载,需要再次手动操作挂载,这样操作比较麻烦,因此我们需要设置开机自动挂载。我们不要把挂载项写到/etc/fstab文件中,因为开机时先挂载本机磁盘再启动网络,而NFS是需要网络启动后才能挂载的,所以我们把挂载命令写入到/etc/rc.d/rc.local文件中即可。

[root@localhost ~]# vim /etc/rc.d/rc.local
#在文件最后添加一行:
mount -t nfs 192.168.11.34:/data/share /mnt/share/ -o nolock,nfsvers=3,vers=3

保存并重启机器看看。

测试验证

查看挂载结果,在客户端输入 df -h

文件系统    容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root   18G 5.0G 13G 29% /
devtmpfs      904M  0 904M 0% /dev
tmpfs       916M  0 916M 0% /dev/shm
tmpfs       916M 9.3M 906M 2% /run
tmpfs       916M  0 916M 0% /sys/fs/cgroup
/dev/sda1      497M 164M 334M 33% /boot
tmpfs       184M  0 184M 0% /run/user/0
192.168.11.31:/data/share  18G 1.7G 16G 10% /mnt/share

看到最后一行了没,说明已经挂载成功了。接下来就可以在客户端上进入目录/mnt/share下,新建/删除文件,然后在服务端的目录/data/share查看是不是有效果了,同样反过来在服务端操作在客户端对应的目录下看效果。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

NFS企业上机实战

1.在NFS服务器A上共享 /data/w_shared/data/r_shared 两个文件目录,允许从NFS客户端B,C上分别挂载共享目录后实现从B,C上只读/data/r_shared ,可写/data/w_shared

2.NFS客户端B上的挂载点为/data/b_w(写),/data/b_r(读)

3.NFS客户端C上的挂载点为/data/w_qzc(写),/data/r_qzc(读)

4.从NFS客户端B上的NFS可写挂载耟目录创建任意文件,从C上可以删除这个创建的文件,反之也可以。

#服务端配置
[root@zcjscl ~]# vim /etc/exports 
添加
/data/w_shared 0.0.0.0/24(rw,sync)
/data/r_shared 0.0.0.0/24(ro)

[root@zcjscl ~]# mkdir /data/w_shared /data/r_shared -p
[root@zcjscl ~]# chown -R nfsnobody /data/w_shared/ /data/r_shared 
[root@zcjscl ~]# /etc/init.d/rpcbind restart
[root@zcjscl ~]# /etc/init.d/nfs restart
[root@zcjscl ~]#chkconfig nfs on
[root@zcjscl ~]#chkconfig rpcbind on
[root@zcjscl ~]#/etc/init.d/iptables stop
[root@zcjscl ~]#getenforce
[root@zcjscl ~]#showmount -e 127.0.0.1   //测试
#B客户端配置,挂载

[root@zcjscl ~]#mkdir /data/{b_w,b_r} -p
[root@zcjscl ~]#showmount -e 192.168.1.99
[root@zcjscl ~]#/etc/init.d/rpcbind restart
[root@zcjscl ~]#chkconfig rpcbind on
[root@zcjscl ~]#mount -t nfs 192.168.1.99:/data/w_shared /data/b_w/
[root@zcjscl ~]#mount -t nfs 192.168.1.99:/data/r_shared /data/b_r/
[root@zcjscl ~]#df -h //检查
#C客户端配置,挂载

[root@zcjscl ~]#mkdir /data/{w_qzc,r_qzc} -p
[root@zcjscl ~]#showmount -e 192.168.1.99
[root@zcjscl ~]#/etc/init.d/rpcbind restart
[root@zcjscl ~]#chkconfig rpcbind on
[root@zcjscl ~]#mount -t nfs 192.168.1.99:/data/w_shared /w_qzc/
[root@zcjscl ~]#mount -t nfs 192.168.1.99:/data/r_shared /r_qzc/
[root@zcjscl ~]#df -h //检查
#挂载优化

 读取限制       写入限制     不更新时间
rsize=32768,wsize=32768,intr,noatime

mount -t nfs -o rsize=32768,wsize=32768,intr,noatime 192.168.1.99:/data/w_shared /w_qzc/

zanePerfor前端性能监控平台高可用之Mongodb副本集读写分离架构

优势:

MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组成。

当主节点挂掉之后,会由多个副本节点选举产生出新的主节点。(节点数请保持为基数个)。

这样就能保证应用的高可用,其中一个或多个节点挂掉之后还能正常运行和服务。

劣势:

数据丢失:主节点挂掉之后,副本节点选举出新的主节点需要一定的时间,这段时间会造成数据的丢失。

不能承受高吞吐量:副本集架构追根还是单机执行写任务,在高并发应用中性能受限,不能解决流量洪峰时的实时读写。

不能完全保证项目的高可用:在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,将不能再提供服务。

总结:

在大多数情况下推荐使用副本集架构,副本集架构在保证高可用的同时还能降低服务器成本,相对于集群分片来说配置也更简单,更易于维护,具体选择什么架构需要根据自己的项目来决定。

Mongodb副本集架构搭建:

Mongodb副本集搭建比较简单,你只需要根据下面的步骤一步一步操作即可(以下内容以Linux或mac为例进行环境搭建)。

一:安装Mongodb (略)

请参考: LINUX系统下安装mongodb(https://blog.seosiwei.com/detail/40)

关于副本集搭建还可参考我的另一篇文章: MongoDB主从副本集架构(https://blog.seosiwei.com/detail/39)

二:副本集搭建

(备注:鉴于成本,以下内容在单机下部署为例,多机部署只需要替换下IP即可)

1、创建数据和日志存放目录

// 数据存放目录
mkdir -p /data/replication/s0
mkdir -p /data/replication/s1
mkdir -p /data/replication/s2
// 日志存放目录
mkdir -p /data/replication/log

2、启动Mongodb服务

(下面以28100,28101,28100三个端口为例)

// 启动mongodb服务
mongod --dbpath /data/replication/s0 --logpath /data/replication/log/s0.log --fork --smallfiles --port 28100 --replSet rs1
mongod --dbpath /data/replication/s1 --logpath /data/replication/log/s1.log --fork --smallfiles --port 28101 --replSet rs1
mongod --dbpath /data/replication/s2 --logpath /data/replication/log/s2.log --fork --smallfiles --port 28102 --replSet rs1
  • --dbpath:存放数据目录

  • --logpath:存放日志目录

  • --smallfiles:是否使用较小的默认文件。默认为false,不使用。

  • --replSet: 副本集名称,副本集名称必须一致

进入28100服务设置副本集

// 登录 mongodb
mongo localhost:28100

// 切换到admin用户
use admin

// 初始化副本集
rs.initiate({_id:"rs1",members:[{_id:0,host:"127.0.0.1:28100"},{_id:1,host:"127.0.0.1:28101"},{_id:2,host:"127.0.0.1:28102"}]})

// 查看副本集状态
rs.status()

副本集设置成功之后,查看状态会看到如下信息即标识成功。

{
    "set" : "rs1",
    "date" : ISODate("2018-11-14T08:40:44.659Z"),
    "myState" : 1,
    "term" : NumberLong(2),
    "heartbeatIntervalMillis" : NumberLong(2000),
    "optimes" : {
        "lastCommittedOpTime" : {
            "ts" : Timestamp(1542184835, 1),
            "t" : NumberLong(2)
        },
        "readConcernMajorityOpTime" : {
            "ts" : Timestamp(1542184835, 1),
            "t" : NumberLong(2)
        },
        "appliedOpTime" : {
            "ts" : Timestamp(1542184835, 1),
            "t" : NumberLong(2)
        },
        "durableOpTime" : {
            "ts" : Timestamp(1542184835, 1),
            "t" : NumberLong(2)
        }
    },
    "members" : [
        {
            "_id" : 0,
            "name" : "127.0.0.1:28100",
            "health" : 1,
            "state" : 1,
            "stateStr" : "PRIMARY",
            "uptime" : 5977,
            "optime" : {
                "ts" : Timestamp(1542184835, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-11-14T08:40:35Z"),
            "electionTime" : Timestamp(1542178880, 1),
            "electionDate" : ISODate("2018-11-14T07:01:20Z"),
            "configVersion" : 1,
            "self" : true
        },
        {
            "_id" : 1,
            "name" : "127.0.0.1:28101",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 5970,
            "optime" : {
                "ts" : Timestamp(1542184835, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1542184835, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-11-14T08:40:35Z"),
            "optimeDurableDate" : ISODate("2018-11-14T08:40:35Z"),
            "lastHeartbeat" : ISODate("2018-11-14T08:40:43.345Z"),
            "lastHeartbeatRecv" : ISODate("2018-11-14T08:40:43.603Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "127.0.0.1:28102",
            "configVersion" : 1
        },
        {
            "_id" : 2,
            "name" : "127.0.0.1:28102",
            "health" : 1,
            "state" : 2,
            "stateStr" : "SECONDARY",
            "uptime" : 5970,
            "optime" : {
                "ts" : Timestamp(1542184835, 1),
                "t" : NumberLong(2)
            },
            "optimeDurable" : {
                "ts" : Timestamp(1542184835, 1),
                "t" : NumberLong(2)
            },
            "optimeDate" : ISODate("2018-11-14T08:40:35Z"),
            "optimeDurableDate" : ISODate("2018-11-14T08:40:35Z"),
            "lastHeartbeat" : ISODate("2018-11-14T08:40:43.345Z"),
            "lastHeartbeatRecv" : ISODate("2018-11-14T08:40:43.575Z"),
            "pingMs" : NumberLong(0),
            "syncingTo" : "127.0.0.1:28100",
            "configVersion" : 1
        }
    ],
    "ok" : 1,
    "operationTime" : Timestamp(1542184835, 1),
    "$clusterTime" : {
        "clusterTime" : Timestamp(1542184835, 1),
        "signature" : {
            "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
            "keyId" : NumberLong(0)
        }
    }
}

3、设置Mongodb副本可读

在mac和linux系统中,一般在~目录下会有个.mongorc.js文件,给此文件新增一句rs.slaveOk();即可。

​查看是否有此文件:

cd ~
ll -a

若无,则全局查找:

// 全局搜索
sudo find / -name .mongorc.js

添加rs.slaveOk();

vi ~/.mongorc.js

// 此文件默认为空
// 增加一行,保存退出
rs.slaveOk();

重启Mongodb,这时所有副本节点都可读。

在zanePerfor (前端性能监控平台)生产环境中使用,并做读写分离。

找到项目的 config/config.prod.js文件

更改如下Mongodb配置即可:

// mongodb 服务
// 此处替换 url 参数为链接副本集方式即可
const dbclients = {
        db3: {
           url: 'mongodb://127.0.0.1:28100,127.0.0.1:28101,127.0.0.1:28102/performance?replicaSet=rs1',
            options: {
                poolSize: 100,
                keepAlive: 10000,
                connectTimeoutMS: 10000,
                autoReconnect: true,
                reconnectTries: 100,
                reconnectInterval: 1000,
            },
        },
 };

读写分离:

项目所有查询已经做好了读写分离操作,例如查询page页列表,其他皆如此即可,这样就保证了服务的读写压力(主节点负责写数据,副本节点负责读取数据)。

未分类

read参数说明

primary - (默认值)    只从主节点读取。如果主节点不可用则报错。不能跟 tags 选项组合使用。
secondary            只有当从节点可用时,从中读取,否则报错。
primaryPreferred     优先读取主节点,不可用时读取从节点。
secondaryPreferred   优先读取从节点,不可用时读取主节点。
nearest              所有操作都读最近的候选节点,不同于其他模式,该选项会随机选取所有主、从节点。

选项别名:

p   primary
pp  primaryPreferred
s   secondary
sp  secondaryPreferred
n   nearest

zanePerfor下一步篇:

https://blog.seosiwei.com/detail/43

zanePerfor github地址:

https://github.com/wangweianger/zanePerfor

zanePerfor 开发文档:

https://blog.seosiwei.com/performance/index.html

Mac安装mongodb

在Mac上安装首选使用brew进行安装

Brew是Mac上的套件管理器,类似于Linux系统中的yum或者apt-get,在安装软件的时候可以摆脱下载软件包再手动安装的繁琐操作,让安装软件变得更加的简单。

Homebrew

homebrew是Mac下的软件包管理工具,主要是填补brew缺失的软件包。提供安装软件,卸载软件等操作。

首先安装Homebrew:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果想要卸载brew,不知道卸载命令,可以再一次执行brew的安装命令,如果已经安装brew再次执行安装命令的话,会提示,告诉已经安装过brew了,如果想重复安装就执行卸载命令,然后根据终端的提示执行卸载命令就可以了。

brew的常用命令

1.更新brew

brew update

2.安装软件

brew install soft_name
// soft_name为所要安装的软件名

3.卸载软件

brew uninstall soft_name

4.显示使用brew安装的软件列表

brew list

5.更新软件

brew upgrade // 更新所有使用brew安装的软件
brew upgrade soft_name // 更新soft_name

6.查看哪些软件需要更新

brew outdated

7.查找软件

// 当记不清软件的名字的时候,可以使用search,只需要写出几个字母,就可以联想所有的结果并且输出
brew search

8.查找使用brew安装的东西,安装在哪里

brew --cache

安装mongodb

因为已经安装了brew,所以通过brew安装mongodb:

brew install mongodb

安装成功

未分类

输入mongo启动,会发现并没有成功

未分类

这是因为没有创建mongo的默认数据写入目录,需要自己手动创建

创建默认数据写入目录

注:默认目录为根目录下的data/db

mkdir -p /data/db

然后给刚刚创建的目录赋予可读写的权限

chown `id -u` /data/db

注:如果不使用命令行修改权限,可以前往/data文件夹右键点击显示简介,选择最下面的共享与权限,把所有权限改成读与写

如果不想使用mongo的默认目录,可以自己更改,使用–dbpath参数

mongo --dbpath dir_name

现在可以放心的启动mongodb了

mongod

然后再开启一个新的终端,执行

mongo

要先执行mongod再执行mongo,出现箭头表示链接成功

未分类

数据库错误

如果数据库启动不了,可能是由于未正常关闭导致的,可以删除/data/db文件夹中的mongod.lock文件,然后重新启动,如果还不可以,可以查杀一下进程:

ps -aef | grep mongo

然后根据进程ID杀掉进程,最后重启mongodb

MongoDB常用命令

1.查询库、查询表

show dbs  //查询所有的数据库

show collections   //查询当前数据库下的所有数据表123

2.建库和删库

use myDbs  //建立一个名为myDbs的数据库,当这个库存在时则是切换到这个数据库中去

use myDbs

db.dropDatabase();  //这两句是删除这个数据库12345

3.建表和删表

//表操作都是要先到一个数据库中去,通过use方法
db.myTable.insert({name:’hf’,age:20});  //在mongodb中在插入数据时即创建了改表,此时创建的是名为myTable的数据表
db.myTable.drop();  //删除myTable这个数据表
//如果没有指定数据库,表会创建在mongdb默认数据库test里1234

4.单表的增删改

db.myTable.insert({name:’hahaha’,age:12});  //新增

db.myTable.update({name:’hf’},{$set:{age:25}})  //修改

db.myTable.remove({name:’hf'});  //删除12345

5.查询

db.myTable.find();  //查询myTable中的所有数据

db.myTable.find().sort({age:1})  //根据age升续

db.myTable.find().count();  //查询

MongoDB数据的导出、导入、备份、恢复

mongodb数据库是一种非关系性的数据库,在日常的工作中用到的也是很多的,接下来介绍一下mongodb数据的导出、导入、备份、恢复,掌握这些技能避免数据丢失

使用的工具主要有

  • mongoexport数据导出
  • mongoimport数据导入
  • mongodump数据备份
  • mongorestore数据恢复

mongoexport是数据导出工具

用法:

mongodbexport -d 数据库名 -c 数据表名 -o 导出文件名 --type json/csv -f "字段名"

参数:

-d :数据库名
-c :collection名
-o :输出的文件名
--type : 输出的格式,默认为json
-f :输出的字段,如果-type为csv,则需要加上-f "字段名"

示例:

mongoexport.exe -d test -c runoob -o d:datadata.json --type json -f "title"

mongoimport是数据导入工具

用法:

mongoimport -d 数据库名 -c 数据表名 --file 文件名 --headerline --type json/csv -f "字段"

参数:

-d :数据库名
-c :collection名
--type :导入的格式默认json
-f :导入的字段名
--headerline :如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
--file :要导入的文件

示例:

mongoimport.exe -d test -c runoob --file d:datadata.json --type json

mongodump是数据备份工具

用法:

mongodump -h dbhost -d dbname -o dbdirectory

参数:

-h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d: 需要备份的数据库实例,例如:test
-o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。

示例:

mongodump -h dbhost -d dbname -o dbdirectory

mongorestore是数据恢复工具

用法:

mongorestore -h dbhost -d dbname --dir dbdirectory

参数:

-h: MongoDB所在服务器地址
-d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--dir: 备份数据所在位置,例如:/home/mongodump/itcast/
--drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!

示例:

mongorestore -h 192.168.17.129:27017 -d itcast_restore --dir /home/mongodump/itcast/

MongoDB 账号密码登录

配置MongoDB 账号密码登录的步骤如下 (假设有 2 个数据库 admin (自带的) 和 foo):

1、启动 MongoDB: mongod --config /usr/local/etc/mongod.conf

2、进入数据库 admin: use admin

3、创建用户 admin:

db.createUser(
  {
    user: "admin",
    pwd: "ebag",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

4、进入数据库 foo: use foo

5、创建用户 bar:

db.createUser(
  {
    user: "bar",
    pwd: "bar",
    roles: [
        { role: "dbAdmin", db: "foo" },
        { role: "readWrite", db: "foo" }
    ]
  }
)

6、需要授权的方式启动: mongod --auth --config /usr/local/etc/mongod.conf

7、授权登录

  • 方式一: mongo 先进入然后 db.auth("bar", "bar") 授权
  • 方式二: mongo --port 27017 -u "bar" -p "bar" --authenticationDatabase "foo"

MongoDB数据导入到ElasticSearch python代码实现

ElasticSearch对文本的搜索速度真的是神速呀,基本是毫秒级别的。对于大文本,简直就是秒飞MYSQL十条街。使用python实现:

es = Elasticsearch(['10.18.6.26:9200'])
ret = collection.find({})

# 删除mongo的_id字段,否则无法把Object类型插入到Elastic
map(lambda x:(del x['_id']),ret)

actions=

for idx,item in enumerate(ret):
    i={
        "_index":"jsl",
     "_type":"text",
     "_id":idx,
        "_source":{
            # 需要提取的字段
            "title":item.get('title'),
            "url":item.get('url')
        }
    }
    actions.append(i)


start=time.time()
helpers.bulk(es,actions)

end=time.time()-start
print(end)

运行下来,20W条数据,大概用了15秒左右全部导入ElasticSearch 数据库中。

nodejs操作mongodb

前一篇博文说明了如何在win7下安装mongodb,下面简要测试一下nodejs操作mongodb:

首先安装nodejs mongodb

npm  install mongodb
var  mongodb = require('mongodb');
var  server  = new mongodb.Server('localhost', 27017, {auto_reconnect:true});
var  db = new mongodb.Db('mydb', server, {safe:true});

//连接db
db.open(function(err, db){
    if(!err){
        console.log('connect db');
        // 连接Collection(可以认为是mysql的table)
        // 第1种连接方式
        // db.collection('mycoll',{safe:true}, function(err, collection){
        //     if(err){
        //         console.log(err);
        //     }
        // });
        // 第2种连接方式
        db.createCollection('mycoll', {safe:true}, function(err, collection){
            if(err){
                console.log(err);
            }else{
                //新增数据
                // var tmp1 = {id:'1',title:'hello',number:1};
       //          collection.insert(tmp1,{safe:true},function(err, result){
       //              console.log(result);
       //          }); 
                   //更新数据
                   // collection.update({title:'hello'}, {$set:{number:3}}, {safe:true}, function(err, result){
                   //     console.log(result);
                   // });
                   // 删除数据
                       // collection.remove({title:'hello'},{safe:true},function(err,result){
        //                   console.log(result);
        //               });

                // console.log(collection);
                // 查询数据
                var tmp1 = {title:'hello'};
                   var tmp2 = {title:'world'};
                   collection.insert([tmp1,tmp2],{safe:true},function(err,result){
                   console.log(result);
                   }); 
                   collection.find().toArray(function(err,docs){
                   console.log('find');
                   console.log(docs);
                   }); 
                   collection.findOne(function(err,doc){
                    console.log('findOne');
                      console.log(doc);
                   }); 
            }

        });
        // console.log('delete ...');
        // //删除Collection
        // db.dropCollection('mycoll',{safe:true},function(err,result){

  //           if(err){

        //         console.log('err:');
        //         console.log(err);
        //     }else{
        //         console.log('ok:');
        //         console.log(result);
        //     }
  //       }); 
    }else{
        console.log(err);
    }
});

Yii框架连接mongodb数据库的代码

yii2框架是yii的升级版本,本文我们分别讲解在yii框架中如何连接数据库mongodb。

在文件夹common/config/main_local.php中加入如下代码:

<?php
return [
'components' => [
'mongodb' => [
'class' => 'yiimongodbConnection',
'dsn' => 'mongodb://localhost:27017/数据库名'
],
],
];