文章目录
- [1 环境假设](#1 环境假设)
1 环境假设
- 服务器1:
server1
(IP:192.168.1.100
) - 服务器2:
server2
(IP:192.168.1.101
) - MongoDB版本:
4.x
(可以根据需要选择其他版本)
步骤1:在两台服务器上安装MongoDB
-
配置YUM源
在每台服务器上添加MongoDB的YUM源。编辑
/etc/yum.repos.d/mongodb.repo
文件,内容如下:bash[mongodb-org-7.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
如果是其他Linux发行版,请根据系统版本选择合适的源。
-
安装MongoDB
安装MongoDB的相关包:
bashsudo yum install -y mongodb-org
-
启动MongoDB服务
启动MongoDB服务并设置为开机启动:
bashsudo systemctl start mongod sudo systemctl enable mongod
-
验证安装
使用以下命令检查MongoDB是否正常运行:
bashsudo systemctl status mongod
或使用
mongo
客户端连接到MongoDB实例,确认是否可以连接。
步骤2:配置副本集
-
配置
mongod.conf
在每台服务器上编辑MongoDB的配置文件
/etc/mongod.conf
,启用副本集配置。修改如下:yamlreplication: replSetName: rs0
rs0
是副本集的名字,你可以根据需要修改。 -
开放端口
确保MongoDB端口(默认是
27017
)在防火墙中开放。你可以使用以下命令来开放该端口:bashsudo firewall-cmd --zone=public --add-port=27017/tcp --permanent sudo firewall-cmd --reload
-
启动MongoDB
启动或重新启动MongoDB使配置生效:
bashsudo systemctl restart mongod
-
检查MongoDB日志
检查
mongod
日志(/var/log/mongodb/mongod.log
)确认是否有错误。
步骤3:初始化副本集
-
连接到MongoDB实例
在
server1
上,使用mongo
客户端连接到MongoDB:bashmongo --host 192.168.1.100
-
初始化副本集
在MongoDB shell中运行以下命令来初始化副本集:
javascriptrs.initiate()
你应该会看到类似以下输出:
javascript{ "info2" : "no configuration has been given yet", "me" : "192.168.1.100:27017", "ok" : 1 }
-
添加副本集成员
之后,向副本集中添加第二台服务器
server2
:javascriptrs.add("192.168.1.101:27017")
运行以下命令检查副本集状态:
javascriptrs.status()
如果一切正常,你应该会看到两个成员(
server1
和server2
)都已经加入副本集。
步骤4:验证副本集配置
-
查看副本集状态
使用以下命令查看副本集的状态,确保两个节点都在运行:
bashmongo --host 192.168.1.100
在Mongo shell中运行:
javascriptrs.status()
-
进行数据写入测试
在主节点上插入数据并检查是否同步到从节点:
javascriptuse test db.testCollection.insert({name: "test"})
你可以在从节点上验证该数据是否已同步。
步骤5:设置安全性(可选)
为了确保MongoDB副本集的安全性,可以启用身份验证和加密。你可以在配置文件中启用auth
选项并创建管理员用户。
编辑/etc/mongod.conf
文件,添加:
yaml
security:
authorization: "enabled"
然后在主节点上创建管理员用户:
bash
mongo --host 192.168.1.100
use admin
db.createUser({
user: "admin",
pwd: "adminpassword",
roles: [{ role: "root", db: "admin" }]
})
这样,其他成员在加入副本集时需要提供管理员的用户名和密码。
扩展
MongoDB副本集的最低配置需要 3台服务器 。虽然可以在2台服务器上搭建副本集,但为了确保高可用性和避免"脑裂"(split-brain)问题,3台服务器是推荐的配置。
具体原因如下:
-
选举机制:MongoDB副本集需要一个"选举"机制来决定哪个节点作为主节点。如果只有2个节点,出现网络分区时,这两个节点可能无法达成一致,从而导致副本集无法正常工作。
-
高可用性:3个节点可以确保即使1个节点出现故障,副本集依然可以正常工作。在3个节点的配置中,如果其中1个节点宕机,另一个节点可以通过选举成为新的主节点,保证系统的高可用性。
-
仲裁节点:如果你有2个数据节点,可以增加一个仲裁节点(Arbiter),这个节点只参与选举,不保存数据。这样可以避免"脑裂"问题,同时仍然保持副本集的选举功能。仲裁节点不需要存储数据,只要保证选举时可以参与投票。
配置示例:
- 2个数据节点(
primary
和secondary
) - 1个仲裁节点(
arbiter
)
这样配置可以确保副本集有3个投票节点,但不需要额外的存储负担。
最佳实践:
- 3个数据节点 + 1个仲裁节点 是一个常见的高可用副本集配置。
- 4个数据节点 可以提供更强的故障恢复能力,但通常会增加管理和维护的复杂性。
总之,虽然最少可以配置2个节点,但为了确保高可用性和防止"脑裂",建议使用3个节点。
仲裁节点
是的,仲裁节点(Arbiter)在搭建过程中的配置与数据节点相似,但它有一些特别的配置,主要是为了参与副本集选举而不存储数据。以下是如何在MongoDB副本集中设置仲裁节点的步骤:
步骤1:在一台服务器上安装MongoDB(仲裁节点)
你可以选择在已经有的服务器上安装MongoDB,或者在另一台新服务器上安装。这里假设你已经安装了MongoDB,并且副本集已经创建了2个数据节点。
-
安装MongoDB(如果尚未安装)
在仲裁节点服务器上,按照之前的步骤使用YUM安装MongoDB:
bashsudo yum install -y mongodb-org
-
配置
mongod.conf
在仲裁节点的MongoDB配置文件
/etc/mongod.conf
中,进行如下配置:yamlreplication: replSetName: rs0 # 确保与副本集名称一致 security: authorization: "enabled" # 可选:启用认证
-
启动MongoDB
启动MongoDB服务并设置为开机启动:
bashsudo systemctl start mongod sudo systemctl enable mongod
-
检查MongoDB状态
确保MongoDB服务正常运行:
bashsudo systemctl status mongod
步骤2:将仲裁节点加入副本集
-
连接到一个数据节点
使用
mongo
命令连接到你的主节点(假设主节点IP是192.168.1.100
):bashmongo --host 192.168.1.100
-
添加仲裁节点
在Mongo shell中运行以下命令,将仲裁节点加入副本集:
javascriptrs.addArb("192.168.1.102:27017") // 假设仲裁节点的IP是192.168.1.102
这样,MongoDB将会把
192.168.1.102
添加为仲裁节点。 -
验证副本集状态
运行以下命令检查副本集状态,确保仲裁节点已加入并且状态正常:
javascriptrs.status()
在输出中,你应该会看到仲裁节点的状态类似于以下:
json{ "host" : "192.168.1.102:27017", "arbiterOnly" : true, "stateStr" : "ARBITER", "state" : 7, "uptime" : 100 }
步骤3:验证仲裁节点的功能
-
测试选举功能
你可以通过在主节点上停止
mongod
服务来模拟节点故障。然后检查副本集是否能自动选举新的主节点。如果有仲裁节点,副本集应该能够正常进行选举,保证系统的高可用性。 -
验证数据同步
仲裁节点不存储数据,它只是参与选举过程,因此你不需要验证数据同步。你只需要验证它是否正确参与选举并保持副本集的健康状态。
总结
- 仲裁节点的搭建和数据节点类似,唯一的区别是仲裁节点配置不存储数据,且配置文件中不需要启用数据存储的设置。
- 使用
rs.addArb()
将仲裁节点添加到副本集中,不需要额外的数据同步过程。 - 仲裁节点的作用是保证选举过程的顺利进行,确保即使在数据节点故障时,副本集仍然能够正常选举出新的主节点。
对于测试环境,如果你有2个数据节点,可以使用1个仲裁节点来模拟高可用性,而不需要额外的数据存储。