在Ubuntu 20.04 | 18.04 | 16.04上配置MongoDB 4.4副本集
在本教程中,将介绍如何在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