美文网首页
03.搭建mongoDB集群

03.搭建mongoDB集群

作者: 鸡蛋挂面 | 来源:发表于2021-03-18 09:51 被阅读0次

    二、软件下载和目录规划

    01.软件下载

    版本:v4.0.14
    安装方式:二进制部署
    系统:CentOS 7.5
    下载地址:

    https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
    

    02.mongoDB单节点目录规划

    二进制包目录:

    mkdir /opt/src
    

    数据目录:

    mkdir /data/mongodb
    

    软件主目录:

    mkdir -p /opt/mongodb/{conf,log,pid}
    

    三、安装部署

    01.下载解压

    cd /opt/src/
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
    tar xf mongodb-linux-x86_64-4.0.14.tgz
    ln -s mongodb-linux-x86_64-4.0.14 mongodb 
    cp  -r /opt/src/mongodb/bin/ /opt/mongodb/
    

    02.创建mongodb用户和组

    useradd mongod
    passwd mongod
    

    03.设置目录结构权限

    chown -R mongod:mongod /data/mongodb/
    chown -R mongod:mongod /opt/mongodb/
    

    04.设置用户环境变量

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

    05.命令行参数启动mongodb

    touch /opt/mongodb/conf/mongodb.conf
    cat >/opt/mongodb/conf/mongodb.conf<<EOF
    systemLog:
      destination: file   
      logAppend: true  
      path: /opt/mongodb/log/mongodb.log
    
    storage:
      journal:
        enabled: true
      dbPath: /data/mongodb
      directoryPerDB: true
      wiredTiger:
        engineConfig:
           cacheSizeGB: 0.5
           directoryForIndexes: true
        collectionConfig:
          blockCompressor: zlib
        indexConfig:
          prefixCompression: true
    
    processManagement:
      fork: true
      pidFilePath: /opt/mongodb/pid/mongod.pid
    
    net:
      port: 27017
      bindIp: 127.0.0.1,192.168.66.200
    EOF
    
    /opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf
    

    四、登录mongoDB

    登录

    # 本地登录
    /opt/mongodb/bin/mongo
    # 远程登录
    /opt/mongodb/bin/mongo 192.168.66.201:27017 
    
    

    检查是否启动

    ps -ef|grep mongo
    netstat -lntup|grep mongo
    

    关闭

    /opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf  --shutdown
    

    ==-单节点脚本编写(命令式启动)-==

    cat >mongodb.sh <<EOF
    #!/bin/bash
    pkill mongod
    ##01.创建目录
    mkdir -p /opt/src /data/mongodb /opt/mongodb/{conf,log,pid}
    ##02.如果源码包不存在就下载
    cd /opt/src/
    if [ ! -f "/opt/src/mongodb-linux-x86_64-4.0.14.tgz"  ]; then
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz &>/dev/null
    fi
    ##03.如果源码包没有解压就解压
    if [ ! -d "/opt/src/mongodb-linux-x86_64-4.0.14"  ]; then
    tar xf mongodb-linux-x86_64-4.0.14.tgz
    fi
    ##04.如果没有创建软连接就创建软连接
    if [ ! -d "/opt/src/mongodb"  ]; then
    ln -s mongodb-linux-x86_64-4.0.14 mongodb
    fi
    ##05.如果没有可执行文件就复制
    if [ ! -d "/opt/mongodb/bin/"  ]; then
    cp -r  /opt/src/mongodb/bin/ /opt/mongodb/
    fi
    
    ##06.
    #chown -R mongod:mongod /data/mongodb/
    #chown -R mongod:mongod /opt/mongodb/
    ##07.启动mongoDB
    /opt/mongodb/bin/mongod --dbpath=/data/mongodb --logpath=/opt/mongodb/log/mongodb.log --port=27017 --logappend --fork
    ##08.查看进程号,是否启动成功
    ps -ef|grep mongo
    EOF
    

    ==-单节点脚本编写(配置文件启动)-==

    vim mongodb.sh
    #!/bin/bash
    pkill mongod
    # 01.创建目录
    
    groupadd mongo -g 777 
    useradd mongo -g 777 -u 777 -M -s /sbin/nologin 
    id mongo
    
    mkdir -p /opt/src /data/mongodb /opt/mongodb/{conf,log,pid}
    chown -R mongo:mongo /opt/mongodb/
    chown -R mongo:mongo /data/mongodb/
    
    # 02.如果源码包不存在就下载
    cd /opt/src/
    if [ ! -f "/opt/src/mongodb-linux-x86_64-4.0.14.tgz"  ]; then
    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz 
    fi
    # 03.如果源码包没有解压就解压
    if [ ! -d "/opt/src/mongodb-linux-x86_64-4.0.14"  ]; then
    tar xf mongodb-linux-x86_64-4.0.14.tgz
    fi
    # 04.如果没有创建软连接就创建软连接
    if [ ! -d "/opt/src/mongodb"  ]; then
    ln -s mongodb-linux-x86_64-4.0.14 mongodb 
    fi
    # 05.如果没有可执行文件就复制
    if [ ! -d "/opt/mongodb/bin/"  ]; then
    cp -r  /opt/src/mongodb/bin/ /opt/mongodb/
    fi
    
    # 06.创建配置文件
    cat > /opt/mongodb/conf/mongodb.conf <<EOF
    systemLog:
      destination: file   
      logAppend: true  
      path: /opt/mongodb/log/mongodb.log
    
    storage:
      journal:
        enabled: true
      dbPath: /data/mongodb
      directoryPerDB: true
      wiredTiger:
        engineConfig:
           cacheSizeGB: 0.5
           directoryForIndexes: true
        collectionConfig:
          blockCompressor: zlib
        indexConfig:
          prefixCompression: true
    
    processManagement:
      fork: true
      pidFilePath: /opt/mongodb/pid/mongod.pid
    
    net:
      port: 27017
      bindIp: 127.0.0.1,`ifconfig eth0|awk 'NR==2{print $2}'`
    EOF
    
    # 07.启动mongoDB
    cat >/usr/lib/systemd/system/mongod.service<<EOF
    [Unit]
    Description=MongoDB Database Server
    Documentation=https://docs.mongodb.org/manual
    After=network.target
    
    [Service]
    User=mongo
    Group=mongo
    ExecStart=/opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf
    ExecStartPre=/usr/bin/chown -R mongo:mongo /opt/mongodb/
    ExecStartPre=/usr/bin/chown -R mongo:mongo /data/mongodb/
    
    PermissionsStartOnly=true
    PIDFile=/opt/mongodb/pid/mongod.pid
    Type=forking
    # file size
    LimitFSIZE=infinity
    # cpu time
    LimitCPU=infinity
    # virtual memory size
    LimitAS=infinity
    # open files
    LimitNOFILE=64000
    # processes/threads
    LimitNPROC=64000
    # locked memory
    LimitMEMLOCK=infinity
    # total threads (user+kernel)
    TasksMax=infinity
    TasksAccounting=false
    # Recommended limits for for mongod as specified in
    # http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
    
    [Install]
    WantedBy=multi-user.target
    EOF
    # 08.启动mongoDB
    systemctl daemon-reload 
    systemctl start mongod.service
    # 09.查看进程号,是否启动成功
    ps -ef|grep mongo
    

    五、 创建用户和角色

    01.相关命令集

    db.auth()                 将用户验证到数据库。
    db.changeUserPassword()   更改现有用户的密码。
    db.createUser()           创建一个新用户。
    db.dropUser()             删除单个用户。
    db.dropAllUsers()         删除与数据库关联的所有用户。
    db.getUser()              返回有关指定用户的信息。
    db.getUsers()             返回有关与数据库关联的所有用户的信息。
    db.grantRolesToUser()     授予用户角色及其特权。
    db.revokeRolesFromUser()  从用户中删除角色。
    db.updateUser()           更新用户数据。
    

    02.创建管理员账户(未开启用户访问控制)

    /opt/mongodb/bin/mongo 192.168.66.201:27017 
    use admin
    db.createUser(
      {
        user: "root",
        pwd: "123456", 
        roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
      }
    )
    

    03.查看新用户

    db.getUsers()
    

    04.验证新用户

    db.auth(“root”,“123456”)
    

    05.配置文件添加权限认证参数

    vim /opt/mongodb/conf/mongodb.conf
    ...
    security:     
      authorization: enabled
    

    06.重启mongo

     /opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf --shutdown
     /opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongodb.conf 
    

    07.使用root用户登录

    /opt/mongodb/bin/mongo -uroot -p123456 192.168.66.201/admin
    

    ==注意:在哪个库下新建用户,这个库就作为该用户的验证库,在进行远程登录的时候需要添加上验证库信息==

    六、MongoDB复制集RS

    01.一主二从架构

    前提:准备好三台服务器,能正常单点启动
    配置步骤跟前面的一致,这里直接采用不同端口作为多实例

    直接使用单实例的模板:

    #创建数据目录
    mkdir /data/2801{7..9}
    #复制一份作为模板
    cp -r /opt/mongodb/ /opt/28017
    
    #修改配置文件信息
    vim /opt/28017/conf/mongodb.conf
    systemLog:
      destination: file
      logAppend: true
      path: /opt/28017/log/mongodb.log
    
    storage:
      journal:
        enabled: true
      dbPath: /data/28017
      directoryPerDB: true
      wiredTiger:
        engineConfig:
          cacheSizeGB: 0.5
          directoryForIndexes: true
        collectionConfig:
          blockCompressor: zlib
        indexConfig:
          prefixCompression: true
    
    processManagement:
      fork: true
      pidFilePath: /opt/28017/pid/mongod.pid
    
    net:
      port: 28017
      bindIp: 127.0.0.1,192.168.66.201
    replication:
      oplogSizeMB: 2048
      replSetName: ly
    

    将模板批量复制为多实例,并修改端口

    cp -r /opt/28017/ /opt/28018
    cp -r /opt/28017/ /opt/28019
    sed -i 's#28017#28019#g' /opt/28019/conf/mongodb.conf
    sed -i 's#28017#28017#g' /opt/28017/conf/mongodb.conf
    

    启动多个实例

    /opt/mongodb/bin/mongod -f /opt/28017/conf/mongodb.conf
    /opt/mongodb/bin/mongod -f /opt/28018/conf/mongodb.conf
    /opt/mongodb/bin/mongod -f /opt/28019/conf/mongodb.conf
    

    查看是否启动成功

    ps -ef |grep mongodb
    

    配置普通复制集

    #登录任意一台
    /opt/mongodb/bin/mongo --port 28017 admin
    config = {_id: 'ly', members: [
                              {_id: 0, host: '192.168.66.201:28017'},
                              {_id: 1, host: '192.168.66.201:28018'},
                              {_id: 2, host: '192.168.66.201:28019'}]
              }                   
    rs.initiate(config) 
    #查询复制集状态
    rs.status();
    #查看整体复制集状态
    rs.status();
    #查看复制集配置信息
    rs.conf();
    

    02.一主一从一选举架构

    在一主二从的架构上,先添加一个新的节点,或者删除一个已经存在的节点,再将该节点设置为仲裁节点

    #登录主节点
    /opt/mongodb/bin/mongo --port 28017 admin
    
    rs.remove("ip:port");#删除一个节点
    rs.remove("192.168.66.201:20818")
    
    rs.add("ip:port");#新增从节点
    rs.add("192.168.66.201:20818")
    
    rs.addArb("ip:port");#新增仲裁节点
    rs.addArb("192.168.66.201:20818")
    #查询复制集状态
    rs.status();
    

    也可以在做复制集的时候选定一个主机为arbiter

    #登录任意节点
    /opt/mongodb/bin/mongod --port 28017 admin
    config = {_id: 'my_repl', members: [
                              {_id: 0, host: '192.168.66.201:28017'},
                              {_id: 1, host: '192.168.66.201:28018'},
                              {_id: 2, host: '192.168.66.201',"arbiterOnly":true}]
              }                
    rs.initiate(config) 
    

    03.特殊从节点

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

    再添加一个新的节点并将该节点加入到集群中去

    mkdir /data/28020
    cp -r /opt/28017/ /opt/28020
    sed -i 's#28017#28020#g' /opt/28020/conf/mongodb.conf
    mongod -f /opt/28020/conf/mongodb.conf
    ##登录主节点
    mongo --port 28018 admin
    

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

    cfg=rs.conf() 
    cfg.members[3].priority=0
    cfg.members[3].hidden=true
    cfg.members[3].slaveDelay=120
    rs.reconfig(cfg)    
    ######列表下标的数字是从0开始数
    
    取消以上配置
    cfg=rs.conf() 
    cfg.members[2].priority=1
    cfg.members[2].hidden=false
    cfg.members[2].slaveDelay=0
    rs.reconfig(cfg)    
    配置成功后,通过以下命令查询配置后的属性
    rs.conf(); 
    

    七、模拟故障转移

    在搭建好一主二从架构后,登录任意从节点,开启可读权限

    #先启动所有节点
    #主节点
    mongod -f /opt/28017/conf/mongodb.conf 
    #从节点
    mongod -f /opt/28018/conf/mongodb.conf 
    #从节点
    mongod -f /opt/28019/conf/mongodb.conf 
    #延迟节点
    mongod -f /opt/28020/conf/mongodb.conf
    
    #登录主节点,写入数据
    mongo --port 28017
    use log
    for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":newDate()})}
    db.log.find()
    
    #登录从节点,开启读权限
    mongo --port 28018
    #临时开启
    rs.slaveOk()
    #查看是否同步主节点数据
    use log
    db.log.find()
    #永久生效
    [root@master1 ~]# echo "rs.slaveOk()" > ~/.mongorc.js
    
    
    #登录从节点,开启读权限
    mongo --port 28019
    #临时开启
    rs.slaveOk()
    #永久生效
    [root@master1 ~]# echo "rs.slaveOk()" > ~/.mongorc.js
    use log
    db.log.find()
    

    当从节点能正常读取数据之后,把主节点关闭掉

    mongod -f /opt/28017/conf/mongodb.conf --shutdown
    

    登录任意从节点,查看集群状态信息

    mongo --port 28017
    rs.status()
    

    实现现象:
    当主节点宕机之后,剩下的从节点回自动选举出一个主节点,期间自动进行故障转移,无需人为干预,数据能正常读取。
    当宕机掉的主节点重新修复上线之后,会自动变成从节点

    相关文章

      网友评论

          本文标题:03.搭建mongoDB集群

          本文链接:https://www.haomeiwen.com/subject/gxbecltx.html