如何在Ubuntu 18.04 LTS上设置MongoDB复制

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

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

什么是mongodb复制/副本集?

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

本教程将描述创建工作三个节点副本集所需的步骤,而无需配置访问控制以限制访问。
本教程基于以下系统IP地址:

Node1: 10.10.5.2
Node2: 10.10.5.3
Node3: 10.10.5.4

第1步:搭建需求环境

在配置副本设置之前,必须在每个系统上安装MongoDB,该系统将成为副本集的一部分。
为所有服务器设置正确的主机名。
如果我们有Active DNS服务器,请为所有服务器添加记录,或者修改/etc/hosts文件。
在所有节点上添加它们。

$sudo vim /etc/hosts
10.10.5.2 mongodb-01 
10.10.5.3 mongodb-02 
10.10.5.4 mongodb-03

我的服务器设置基于以下 Vagrantfile在KVM上运行。

# -*- mode: ruby -*-
# vim: set ft=ruby :

ENV[’VAGRANT_DEFAULT_PROVIDER’] = ’libvirt’

# Check required plugins
REQUIRED_PLUGINS_LIBVIRT = %w(vagrant-libvirt)
exit unless REQUIRED_PLUGINS_LIBVIRT.all? do |plugin|
  Vagrant.has_plugin?(plugin) || (
    puts "The #{plugin} plugin is required. Please install it with:"
    puts "$vagrant plugin install #{plugin}"
    false
  )
end

Vagrant.configure("2") do |config|
  config.vm.define "mongodb-01" do |node|
    node.vm.hostname = "mongodb-01"
    node.vm.box = "generic/ubuntu1804"
    node.vm.box_check_update = false
    #node.vm.synced_folder ′.’, ’/vagrant’, :disabled => true
    node.vm.network "private_network", ip: "10.10.5.2"
    node.vm.provider :libvirt do |domain|
      domain.memory = 512
      domain.storage :file, :size => ’10G’
    end
  end
  config.vm.define "mongodb-02" do |node|
    node.vm.hostname = "mongodb-02"
    node.vm.box = "generic/ubuntu1804"
    node.vm.box_check_update = false
    #node.vm.synced_folder ′.’, ’/vagrant’, :disabled => true
    node.vm.network "private_network", ip: "10.10.5.3"
    node.vm.provider :libvirt do |domain|
      domain.memory = 512
      domain.storage :file, :size => ’10G’
    end
  end
  config.vm.define "mongodb-03" do |node|
    node.vm.hostname = "mongodb-03"
    node.vm.box = "generic/ubuntu1804"
    node.vm.box_check_update = false
    #node.vm.synced_folder ′.’, ’/vagrant’, :disabled => true
    node.vm.network "private_network", ip: "10.10.5.4"
    node.vm.provider :libvirt do |domain|
      domain.memory = 512
      domain.storage :file, :size => ’10G’
    end
  end
end

然后我运行了 vagrant up启动所有VM

第2步:在所有Ubuntu 18.04节点上安装MongoDB

如果我们尚未安装MongoDB,请参阅我们的安装教程如何在Ubuntu 18.04/Ubuntu 16.04上安装最新的MongoDB。
我将在此处为方便使用安装教程.Update系统:

sudo apt-get update
sudo apt-get upgrade

导入MongoDB Public GPG密钥:

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

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

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

对于我的设置,我有10GB专用于MongoDB数据的二级存储。
我将分区并挂载到/数据/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卷,这将使扩展分区很容易

# pvcreate  /dev/vda1
  Physical volume "/dev/vda1" successfully created.
# vgcreate vg11 /dev/vda1
  Volume group "vg11" successfully created
# lvcreate -n data -l 100%FREE vg11
Logical volume "data" created

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

# 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" >> /etc/fstab
mkdir /data
mount -a

确认分区安装挂载成功:

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

安装MongoDB软件包

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

为MongoDB数据创建一个文件夹

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

第3步:配置MongoDB副本集

现在我们有需要的一切都准备好了,让我们继续配置MongoDB副本Set.Change MongoDB在所有节点上从LocalHost IP收听地址

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.

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

# Where and how to store data.
storage:
  dbPath: /data/mongodb
  journal:
    enabled: true

配置MongoDB副本集

其中一个MongoDB节点运行 PRIMARY,所有其他节点都将作为 SECONDARY
数据始终为 PRIMARY然后将节点和数据集复制到所有其他 SECONDARYnodes.edit 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)
                }
        }
}

确保你得到 1为了 ok状态

添加辅助节点

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

总结

你现在有一个工作的mongodb复制。
我们可以将群集大小从三个节点增加到五个节点,七个节点或者更多。
此数字是根据的:[主符合条件节点)/2 + 1]计算,这意味着高可用性所需的奇数节点,最小数量为三个。