03.搭建mongoDB集群

2021-03-18  本文已影响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()

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

上一篇下一篇

猜你喜欢

热点阅读