在Ubuntu 20.04 | 18.04 | 16.04上配置MongoDB 4.4副本集

时间:2020-02-23 14:40:45  来源:igfitidea点击:

在本教程中,将介绍如何在Ubuntu 20.04 | 18.04 | 16.04服务器上配置MongoDB副本集。 MongoDB是具有自动扩展,高可用性和高性能的企业级NoSQL数据库系统。在NoSQL数据库中,数据使用MongoDB BSON格式存储在文档结构中。在MongoDB中不能使用SQL语句来插入或者检索数据。

什么是MongoDB复制/副本集?

在MongoDB中,副本集是一组维护相同数据集的mongod进程。副本集是所有生产部署的基础,因为它们提供了数据冗余和高可用性。

本教程将介绍在没有配置访问控制来限制访问的情况下创建有效的三个节点副本集所需的步骤。本教程基于以下系统IP地址:

MongoDB Server1: 10.10.5.2
MongoDB Server2: 10.10.5.3
MongoDB Server3: 10.10.5.4

设定要求

在配置副本集之前,我们必须在所有服务器上安装MongoDB。确保在用于复制的服务器上配置了正确的主机名。

如果我们没有可用的DNS服务器,请在服务器上本地设置IP地址和FQDN的映射。

# Edit and set the values correctly
10.10.5.2 mongodb-01.example.net mongodb-01
10.10.5.3 mongodb-02.example.net mongodb-02
10.10.5.4 mongodb-03.example.net mongodb-03

在所有Ubuntu 20.04 | 18.04节点上安装MongoDB

请按照以下步骤在Ubuntu服务器上安装MongoDB。

更新系统:

sudo apt-get update
sudo apt-get upgrade && sudo reboot

导入MongoDBpublic GPG密钥:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4

导入密钥后,添加存储库:

### Ubuntu 20.04 ###
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

### Ubuntu 18.04 ###
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

### Ubuntu 16.04 ###
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

安装MongoDB软件包

sudo apt-get update
sudo apt install -y mongodb-org

使用专用磁盘存储MongoDB数据(可选)

对于我的设置,我有10GB的二级存储专用于MongoDB数据。对它进行分区,然后挂载到/data/mongodb。

# lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   32G  0 disk 
|-sda1   8:1    0  487M  0 part /boot
|-sda2   8:2    0  1.9G  0 part [SWAP]
`-sda3   8:3    0 29.6G  0 part /
vda      252:0  0 10G    0 disk

为辅助磁盘创建一个GPT分区表,它可以是多个磁盘

parted -s -a optimal -- /dev/vda mklabel gpt
parted -s -a optimal -- /dev/vda mkpart primary 0% 100%
parted -s -- /dev/vda align-check optimal 1

然后创建LVM卷,这将使扩展分区变得容易

$sudo pvcreate  /dev/vda1
  Physical volume "/dev/vda1" successfully created.

$sudo vgcreate vg11 /dev/vda1
  Volume group "vg11" successfully created

$sudo lvcreate -n data -l 100%FREE vg11
Logical volume "data" created

在创建的逻辑卷上创建一个ext4文件系统。

$sudo mkfs.ext4 /dev/mapper/vg11-data
mke2fs 1.44.1 (24-Mar-2016)
Creating filesystem with 2620416 4k blocks and 655360 inodes
Filesystem UUID: b98e07e5-1b04-4282-a9db-fa5b73c74d2f
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

创建安装点并安装分区

echo "/dev/mapper/vg11-data /data ext4 defaults 0 0" | sudo tee -a /etc/fstab
mkdir /data
mount -a

确认分区安装成功:

$df -hT | grep /data
/dev/mapper/vg11-data ext4      9.8G   37M  9.3G   1% /data

创建用于MongoDB数据的文件夹

sudo mkdir /data/mongodb
sudo chown -R mongodb:mongodb /data/mongodb
sudo chmod -R 775 /data/mongodb

将存储路径配置为先前在所有节点上创建的存储路径

$sudo vim /etc/mongod.conf
# Where and how to store data.
storage:
  dbPath: /data/mongodb
  journal:
    enabled: true

配置MongoDB副本集

现在我们已经准备好了所有需要的东西,让我们继续配置MongoDB副本集。

在所有节点上从本地IP更改MongoDB侦听地址

$sudo vim /etc/mongod.conf
# node 1
# network interfaces
net:
  port: 27017
  bindIp: 10.10.5.2  # Listen to local interface only, comment to listen on all interfaces.

# node 2
# network interfaces
net:
  port: 27017
  bindIp: 10.10.5.3  # Listen to local interface only, comment to listen on all interfaces.

# node 3
# network interfaces
net:
  port: 27017
  bindIp: 10.10.5.4  # Listen to local interface only, comment to listen on all interfaces.

配置MongoDB副本集

MongoDB节点之一以" PRIMARY"运行,所有其他节点将以" SECONDARY"运行。数据总是到达" PRIMARY"节点,然后将数据集复制到所有其他" SECONDARY"节点。

编辑MongoDB配置文件mongod.conf并在所有节点上启用副本集

replication:
  replSetName: "replica01"

在防火墙上打开端口" 27017/tcp":

sudo ufw enable
sudo ufw allow ssh
sudo ufw allow 27017/tcp

配置MongoDB以在操作系统引导期间启动

sudo systemctl enable mongod.service
sudo systemctl restart mongod.service

检查MongoDB服务的监听地址:

# ss -tunelp | grep -i mongo
tcp   LISTEN  0       128                10.10.5.2:27017          0.0.0.0:*      users:(("mongod",pid=15288,fd=11)) uid:111 ino:46927 sk:4 <->

启动MongoDB副本集

我们的MongoDB Node1(mongodb-01)将是PRIMARY,另外两个将充当SECONDARY

登录到mongodb-01服务器并启动mongo shell。

$mongo 10.10.5.2
MongoDB shell version v4.0.1
connecting to: mongodb://10.10.5.2:27017/test
MongoDB server version: 4.0.1
Welcome to the MongoDB shell.
For interactive help, type "help".
...
>

通过运行以下命令初始化在node1上设置的副本:

> rs.initiate()
{
        "info2" : "no configuration specified. Using a default configuration for the set",                                                           
        "me" : "10.10.5.2:27017",
        "ok" : 1,
        "operationTime" : Timestamp(1534797235, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1534797235, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),                                                                          
                        "keyId" : NumberLong(0)
                }
        }
}

确保我们获得OK状态的" 1"

添加辅助节点

replica01:PRIMARY> rs.add("mongodb-02")
{
        "ok" : 1,
        "operationTime" : Timestamp(1534797580, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1534797580, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

replica01:PRIMARY> rs.add("mongodb-03")
{
        "ok" : 1,
        "operationTime" : Timestamp(1534797614, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1534797614, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

使用以下命令检查副本集状态:

replica01:PRIMARY> rs.status()

检查主站的状态

replica01:PRIMARY> rs.isMaster()

测试MongoDB复制

在mongodb-01上创建测试数据库

replica01:PRIMARY> use test_db
switched to db test_db

添加一些数据

> db.test.save(
{
    "desc": "My Test Database",
    "apps":  ["Test1", "Test2", "Test3", "Test4"],
})

replica01:PRIMARY> show dbs
admin    0.000GB
config   0.000GB
local    0.000GB
test_db  0.000GB
replica01:PRIMARY> use test_db
switched to db test_db
replica01:PRIMARY> show collections
test