MongoDB是一种面向文档的NoSQL数据库,具有高性能、高可用性和易扩展性等特点,在实际应用中,我们通常会使用MongoDB的分片和副本集功能来实现数据的高可用和负载均衡,本文将详细介绍如何在MongoDB 3.4版本中搭建一个高可用的分片副本集集群。
环境准备
1、操作系统:CentOS 7.2
2、MongoDB版本:3.4
3、MongoDB工具:mongos、mongod、mongocfg等
搭建副本集
1、安装MongoDB
我们需要在每个节点上安装MongoDB,在CentOS 7.2上,可以通过以下命令安装MongoDB:
sudo yum install -y mongodb-org
2、配置MongoDB
接下来,我们需要为每个节点创建一个配置文件,在/etc/mongod.conf
文件中,添加以下内容:
systemLog: destination: file path: /var/log/mongodb/mongod.log logAppend: true net: bindIp: 127.0.0.1,192.168.1.2,192.168.1.3 port: 27017 storage: dbPath: /data/db replication: replSetName: "rs0"
bindIp
表示绑定的IP地址,port
表示端口号,dbPath
表示数据存储路径,replSetName
表示副本集名称,根据实际情况修改这些配置。
3、启动MongoDB服务
在每个节点上,通过以下命令启动MongoDB服务:
sudo service mongod start
4、初始化副本集
为了实现数据的高可用,我们需要将多个节点组成一个副本集,在其中一个节点上,通过以下命令初始化副本集:
mongo --host 192.168.1.2 --port 27017 <<EOF rs.initiate() EOF
5、查看副本集状态
初始化完成后,我们可以通过以下命令查看副本集的状态:
mongo --host 192.168.1.2 --port 27017 <<EOF rs.status() EOF
搭建分片集群
1、添加分片服务器
在副本集中,我们可以添加更多的节点作为分片服务器,在新的节点上安装MongoDB,然后创建一个新的配置文件/etc/mongod.conf
,并添加以下内容:
systemLog: destination: file path: /var/log/mongodb/mongod.log logAppend: true net: bindIp: 192.168.1.3,192.168.1.4,192.168.1.5 注意添加新的IP地址 port: 27017 storage: dbPath: /data/db_shard1 注意修改数据存储路径,以区分不同的分片服务器 replication: replSetName: "rs0" 注意与副本集名称保持一致 sharding: 开启分片功能 clusterRole: shardsvr 设置角色为分片服务器
启动新的MongoDB服务:
sudo service mongod start --config /etc/mongod.conf --fork --fork表示以后台进程运行MongoDB服务
2、添加分片到副本集
接下来,我们需要将新添加的分片服务器添加到副本集中,在任何一个节点上,通过以下命令连接到MongoDB shell:
mongo --host 192.168.1.2 --port 27017 <<EOF 根据实际IP地址和端口号修改连接参数 rs.add("192.168.1.3:27017") 添加分片服务器的IP地址和端口号,注意用冒号分隔端口和IP地址,多个分片服务器用逗号分隔,rs.add("192.168.1.3:27017,192.168.1.4:27017,192.168.1.5:27017")) 如果需要添加更多分片服务器,可以继续添加类似的语句,rs.add("xxxx:xxxx") EOF 如果需要移除某个分片服务器,可以使用rs.remove("ip:port")语句,rs.remove("192.168.1.3:27017") 如果需要查看当前副本集中的所有成员,可以使用rs.status()语句,rs.status() EOF 如果需要查看当前副本集中所有分片的信息,可以使用sh.status()语句,sh.status() EOF 如果需要查看当前副本集中所有分片的详细信息,可以使用sh.status().detailedString()语句,sh.status().detailedString() EOF 如果需要查看当前副本集中所有分片的数据分布情况,可以使用sh.status().shards字段遍历输出,for (var i = 0; i < sh.status().shards.length; i++) { print(sh.status().shards[i].host) } EOF 如果需要查看当前副本集中所有分片的日志文件位置,可以使用sh.status().shards字段遍历输出日志文件路径,for (var i = 0; i < sh.status().shards.length; i++) { print(sh.status().shards[i].log) } EOF 如果需要查看当前副本集中所有分片的数据大小,可以使用sh.status().shards字段遍历输出数据大小,for (var i = 0; i < sh.status().shards[i].chunksSizeTotal; i++) { print(sh