如何在Ubuntu 18.04 LTS上设置MongoDB复制
在本教程中,将介绍如何在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
然后将节点和数据集复制到所有其他 SECONDARY
nodes.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]计算,这意味着高可用性所需的奇数节点,最小数量为三个。