1.1 准备服务器的基本信息

Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例-LMLPHP

1.2 操作系统上创建其用户

#### 用途:相当于root用户,因为root用户我们会禁止远程登录
01:用来充当root用户的角色。
02:它不会用来运行任何的应用。

#### 用户的基本要求
01:用户要能够远程登录,要有家目录。
02:用户不能过期、密码得复杂化,密码是否过期是另外一回事。
03:用户的主组为admin,用户的辅组为wheel。
04:用户得被visudo授权为:admin ALL=(ALL:ALL) NOPASSWD: ALL

#### 创建用户的命令
chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
groupadd -g 91 wheel
groupadd -g 1000 admin
useradd admin -u 1000 -g admin -G wheel -m -s /bin/bash
echo "admin:123456\!@#"|chpasswd
echo "admin ALL=(ALL:ALL) NOPASSWD: ALL" >> /etc/sudoers
visudo -c
#### 用途:用来运行1024端口以上的应用
01:用来运行1024端口及以上的应用,即ps -ef | grep "服务名" 结果中的第一
    列的内容得是app。
02:所有服务的启停、开机自启动都用systemctl来管理。
03:这个app用户要能够使用systemctl来启停服务、开机自启动管理。

#### 用户的基本要求
01:用户要能够远程登录,要有家目录。
02:用户不能过期、密码得复杂化,密码是否过期是另外一回事。

#### 创建普通用户app的命令
sudo chattr -i /etc/passwd /etc/shadow /etc/group /etc/gshadow
sudo groupadd -g 1001 app
sudo useradd app -u 1001 -g app -m -s /bin/bash
echo "app:Chenliang\!@#" | sudo chpasswd

1.3 部署MongoDB服务端

https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz
sudo mkdir -p /data/soft
sudo ls -ld /data/soft
#### 安装mongodb服务端软件
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz
ls -l mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz
sudo tar xf  mongodb-linux-x86_64-ubuntu2004-6.0.4.tgz  -C /data/soft/
sudo ln -svf /data/soft/mongodb-linux-x86_64-ubuntu2004-6.0.4 /data/soft/mongodb
sudo chown -R app:app /data/soft/
ls -l /data/soft/mongodb/bin

  # 里面只有mongod mongos install_compass 这三个命令
  # 没有mongo命令了

#### 配置环境变量
ls -ld /data/soft/mongodb/bin

sudo bash -c "cat >>/etc/profile" <<'EOF'
export PATH=/data/soft/mongodb/bin:$PATH
EOF

source /etc/profile
which mongod mongos

1.4 部署MongoDB客户端

安装mongosh客户端工具,因为6.0版本默认没有mongo命令了,所以这里安装mongosh

#### 软件下载地址,这个得根据自己的操作系统版本,及系统上Openssl的版本
wget https://downloads.mongodb.com/compass/mongodb-mongosh-shared-openssl11_1.8.0_amd64.deb

#### 安装
ls -l mongodb-mongosh-shared-openssl11_1.8.0_amd64.deb
sudo dpkg -i mongodb-mongosh-shared-openssl11_1.8.0_amd64.deb
which mongosh

sudo ln -svf $(which mongosh)  /data/soft/mongodb/bin/mongosh
sudo ls -l  /data/soft/mongodb/bin/mongosh

1.5 部署MongoDB 27017实例

1.5.1 创建相关目录

sudo mkdir -p /data/apps/mongodb/27017/{data,conf,logs,run,keys,scripts}
sudo tree /data/apps/mongodb/27017

1.5.2 准备配置文件

sudo bash -c "cat >/data/apps/mongodb/27017/conf/mongod.conf" <<'EOF'
## network
net:
  port: 27017
  ipv6: false
  bindIpAll: false
  bindIp: 0.0.0.0
  maxIncomingConnections: 3000
  wireObjectCheck: true
  unixDomainSocket:
    enabled: true
    pathPrefix: /data/apps/mongodb/27017/run
    filePermissions: 0700

## storage
storage:
  dbPath: /data/apps/mongodb/27017/data
  journal:
    enabled: true
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 2

## log
systemLog:
  destination: file
  logAppend: false
  path:  /data/apps/mongodb/27017/logs/mongod.log
  quiet: false

## process
processManagement:
  fork: true
  pidFilePath:  /data/apps/mongodb/27017/run/mongod.pid
  timeZoneInfo: /usr/share/zoneinfo/Asia

## security
security:
  authorization: enabled
  javascriptEnabled: false
EOF

1.5.3 准备启停脚本

sudo bash -c 'cat >/data/apps/mongodb/27017/scripts/mongod.sh' <<'EOF'
#!/bin/bash
#
# Explain: MongoDB start、stop scripts 
#
# Define variables
RETVAL=0
MonPort="27017"
MonConf="/data/apps/mongodb/$MonPort/conf/mongod.conf"
MonCommPath="/data/soft/mongodb/bin"

# Define functions
start(){
MonStatusCheck="$(ss -lntup|grep -w "$MonPort"|wc -l)"
if [ "$MonStatusCheck" -eq 0 ];then
           $MonCommPath/mongod -f $MonConf --fork >/dev/null 2>&1
           RETVAL=$?
           if [ $RETVAL -eq 0 ];then
              echo "Start mongodb service[$MonPort] success"
             else
              echo "Start mongodb service[$MonPort] fail"
   fi
          else
           echo "mongodb service[$MonPort] is running"
fi
return $RETVAL
}

stop(){
MonStatusCheck="$(ss -lntup|grep -w "$MonPort"|wc -l)"
if [ "$MonStatusCheck" -ne 0 ];then
           $MonCommPath/mongod --shutdown -f $MonConf  >/dev/null 2>&1
           RETVAL=$?
   if [ $RETVAL -eq 0 ];then
      echo "Start mongodb service[$MonPort] success"
     else
      echo "Start mongodb service[$MonPort] fail"		
   fi
  else
   echo "mongodb service[$MonPort] is not running"
fi
return $RETVAL
}

status(){
MonStatusCheck="$(ss -lntup|grep -w "$MonPort"|wc -l)"
if [ "$MonStatusCheck" -ne 0 ];then
   echo "mongodb service[$MonPort] is running"
  else
   echo "mongodb service[$MonPort] is not running"
fi
return $RETVAL
}

# case call define functiosn
case "$1" in
start)
start
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
stop
sleep 5
start
RETVAL=$?
;;
status)
status
RETVAL=$?
;;
*)
echo "USAGE:$0{start|stop|restart|status}"
exit 1
esac
EOF
sudo chmod 700 /data/apps/mongodb/27017/scripts/mongod.sh
ls -l /data/apps/mongodb/27017/scripts/mongod.sh

sudo chown -R app:app /data/apps/mongodb/
#### 编写/etc/systemd/system/mongod27017.service文件
sudo bash -c "cat >/etc/systemd/system/mongod27017.service" <<'EOF'
[Unit]
Description=mongod  instance
After=network.target

[Service]
Type=forking
User=app
Group=app
ExecStart=/bin/bash /data/apps/mongodb/27017/scripts/mongod.sh start
ExecStop=/bin/bash /data/apps/mongodb/27017/scripts/mongod.sh stop
LimitNOFILE=65535
Restart=on-failure
RestartSec=10
RestartPreventExitStatus=1
PrivateTmp=false

[Install]
WantedBy=multi-user.target
EOF

#### 加载
sudo systemctl daemon-reload

#### 授权
sudo chown -R app:app /etc/systemd/system/mongod27017.service

#### 进行visudo授权
sudo bash -c "cat >/etc/sudoers.d/mongod27017_systemctl" <<'EOF'
## Cmnd Alias
Cmnd_Alias MONGOD27017_SYSTEMCTL =  /usr/bin/systemctl daemon-reload, \
                                   /usr/bin/systemctl start mongod27017.service, \
                                   /usr/bin/systemctl stop mongod27017.service, \
                                   /usr/bin/systemctl restart mongod27017.service, \
                                   /usr/bin/systemctl status mongod27017.service, \
                                   /usr/bin/systemctl enable mongod27017.service, \
                                   /usr/bin/systemctl disable mongod27017.service, \
                                   /usr/bin/systemctl is-enabled mongod27017.service 

## auth
app ALL=(ALL:ALL) NOPASSWD:  MONGOD27017_SYSTEMCTL
EOF

#### 更改visudo授权时文件的权限,并visudo -c
sudo chmod 0440 /etc/sudoers.d/mongod27017_systemctl
sudo visudo -c

1.5.4 进行启停测试

#### 先看一看
sudo -u app   sudo -l

#### 启动mongodb27017实例
sudo -u app   sudo systemctl start mongod27017.service
sudo ps -aux | grep mongod
ss -lntup | grep 27017

#### 停止mongodb27017实例
sudo -u app   sudo systemctl stop mongod27017.service
sudo ps -aux | grep mongod
ss -lntup | grep 27017

#### 再次启动
sudo -u app   sudo systemctl start mongod27017.service
sudo ps -aux | grep mongod
ss -lntup | grep 27017

1.5.5 加入开机自启动

sudo systemctl enable mongod27017.service
sudo systemctl is-enabled mongod27017.service

1.6 创建超级管理员用户

1.6.1 创建本地的超级用户

我这里创建一个root用户,角色为root,因为角色为root,其库必须得为admin库。且我会开启root用户的身份验证(只允许client地址为127.0.0.1的登录,这样一来这个root用户就是个本地用户,只能在mongodb实例所在服务器上用mongosh 127.0.0.1:27017这样的方式去登录,然后到admin库下去认证。)

// 连接mongodb实例,进入到admin库,我mongodb实例才部署好,哪来的认证
// 连接的时候只能是127.0.0.1,因为我的配置文件中有开启安全认证
mongosh 127.0.0.1:27017
use admin; 

// 这里创建用户并且同时(这里是必须)授于角色为root,db只能是admin
db.createUser(
    {
        user:"root",
        pwd:"root123456",
        roles: [ 
            { role:"root",db:"admin" }
        ]
     }
);

// 进行认证
db.auth("root","root123456")


// 开启其身份验证,其实在创建用户时就可以,但我们这里是才部署好,都没有
// 超级用户。
db.updateUser(
    "root",
    {
        authenticationRestrictions:[
            { 
                clientSource: ["127.0.0.1"] 
            }
        ]
    }
);

// 查看root用户
db.getUser("root");                      // 看不到身份验证的相关信息
db.system.users.find( {user:"root"} );   // 就可看到身份验证


// 退出连接
exit;


// 连接,这里使用mongosh 172.31.7.111:27017 来进行连接
// 认证时使用root用户,会报错,因为root用户开启了身份验证的

Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例-LMLPHP

// 再用mongosh 127.0.0.1:27017去连接,然后认证时使用root用户
// 是可以成功的

Ubuntu20.04平台下使用二进制包部署MongoDB-6.0.4单实例-LMLPHP

1.6.2 创建远端的超级用户

这里创建一个远端的超级用户,这个超级用户的名称可以以你公司的名称来命名,所以它并不是一个人类用户。就不对该用户开启身份验证了,这个用户我们就可以结navicat这样的工具来连接mongodb实例了。

// 本地以root用户登录并认证
mongosh 127.0.0.1:27017
use admin;
db.auth("root","root123456");

// 创建aliang用户,角色为root,认证库必须为admin(得在admin库下创建用
// 户),库也得为admin。
use admin;
db.createUser(
    {
        user: "aliang",
        pwd: "aliang123456",
        roles: [
                { role:"root",db:"admin" }
         ]
    }
);

// 查看用户
use admin;
db.system.users.find( {user:"aliang"} );
db.getUser("aliang");

// 进行认证
db.auth("aliang","aliang123456");

// 退出登录
exit;

1.7 创建web(业务)帐号

1.7.1 创建某业务库

mongosh 127.0.0.1
use admin;
db.auth("root","root123456");

// 进入并创建wyc库,并创建test集群
use wyc;       

db.createCollection("test");    

// 往test集合中插入两条数据
db.test.insertMany( 
	[ 
		{name:"chenliang01",age:"11"},
		{name:"chenliang02",age:"12"} 
  ] 
);
                        
// 查看test集合中的前10条文档(记录)
db.test.find().limit(10);  

1.7.2 创建web帐户

// 我是进入到admin库的哈
use admin;                      

// 创建用户,设置密码,没有授于角色(后面会授予的)
db.createUser(
	{
		user:"wyc",
		pwd:"wyc123456",
		roles: [] 
	}
); 

// 查看wyc用户
db.getUser("wyc"); 

// 对wyc用户授于readWrite角色
db.grantRolesToUser(
	"wyc",
		[ 
			{role:"readWrite",db:"wyc"} 
		]
);  

// 查看wyc用户
db.getUser("wyc");  

// 进入到admin库后,认证wyc用户
use admin;                    
db.auth("wyc","wyc123456"); 

// 查看有哪些库,只能看到wyc库,进入wyc库,查看test集群
show dbs; 
use wyc; 
show tables;
db.test.find().limit(10);

// 退出连接
exit;

06-10 02:50