一、mongodb集群说明
-
副本集模式:相当于是自带故障转移功能的主从复制
-
分片集群:(将数据子集分散在集群中,每个分片维护着一个数据集合的子集。与副本集相比,使用集群架构可以使应用程序具有更强大的数据处理能力。)
分片服务器(Shard Server):将数据子集分散在集群中,每个分片维护着一个数据集合的子集。与副本集相比,使用集群架构可以使应用程序具有更强大的数据处理能力。在实际生产中,一个 Shard Server 可由几台机器组成一个副本集来承担,防止因主节点单点故障导致整个系统崩溃
配置服务器(Config Server)这是独立的一个 mongod 进程,保存集群和分片的元数据,在集群启动最开始时建立,保存各个分片包含数据的信息。
路由服务器(Route Server):这是独立的一个 mongos 进程,Route Server 在集群中可作为路由使用,客户端由此接入,让整个集群看起来像是一个单一的数据库,提供客户端应用程序和分片集群之间的接口。
Route Server 本身不保存数据,启动时从 Config Server 加载集群信息到缓存中,
并将客户端的请求路由给每个 Shard Server,在各 Shard Server 返回结果后进行聚合并返回客户端.
mongodb下载地址:
https://www.mongodb.com/download-center/community/releases
RedHat / CentOS 7.0 x64
Archive: https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.9.tgz
Server Package: https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-server-4.4.9-1.el7.x86_64.rpm
Mongos Package: https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-mongos-4.4.9-1.el7.x86_64.rpm
Mongo Shell Package: https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.4/x86_64/RPMS/mongodb-org-shell-4.4.9-1.el7.x86_64.rpm
mongodb副本集安装流程
目前最小节点是3个
1、在集群每个节点上安装一份MongoDB;
2、配置副本集;
3、配置副本集的用户、密码;
4、配置副本集的KeyFile安全鉴权;
5、配置开机自启动;
服务器配置
16核 64G内存 40G+2000G存储 RedHat 7.6
192.168.100.138 主节点
192.168.100.139 从节点
192.168.100.140 仲裁节点
二、mongodb 4.4.9安装(每个节点安装)
2.1、安装mongodb
groupadd mongod
useradd -g mongod mongod
yum install -y libcurl openssl glibc
mkdir /opt
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.9.tgz
mv mongodb-linux-x86_64-rhel70-4.4.9 /opt/mongodb
mkdir /opt/mongodb/{
data,conf,logs,pid} -p
mkdir /var/run/mongodb
2.2、目录说明
/opt/mongodb/
├── bin #可执行文件
│ ├── install_compass
│ ├── mongo
│ ├── mongod
│ └── mongos
├── conf #存放配置文件和Keyfile
├── data #存放数据库文件
│ ├── collection #数据
│ ├── index #索引
│ └── journal #日志,类似mysql redo log
├── LICENSE-Community.txt
├── logs #存放系统日志
├── MPL-2
├── pid
├── README
└── THIRD-PARTY-NOTICES
#条件允许的话,可以对服务器的磁盘进行优化,数据、索引、日志放在不同的磁盘(也可以加大内存,满足数据读取,减低磁盘交换)
mount /dev/sdb1 /opt #450G
mount /dev/sdc1 /opt/mongodb/data/index #100G
mount /dev/sdd1 /opt/mongodb/data/journal #50G
2.3、添加到环境变量
# vi /etc/bashrc #或者vi /etc/profile
#MongoDB config
MONGO_HOME=/opt/mongodb
PATH=$MONGO_HOME/bin:$PATH
export MONGO_HOME PATH
# source /etc/bashrc
2.4、创建 mongo.conf 配置
# vi /opt/mongodb/conf/mongod.conf
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/logs/mongod.log #日志文件
# Where and how to store data.
storage:
dbPath: /opt/mongodb/data #数据库存储位置
journal:
enabled: true
commitIntervalMs: 500 #降低journal刷盘时间,500ms(最大的配置)
engine: "wiredTiger"
wiredTiger:
engineConfig:
cacheSizeGB: 50 ##(64G内存配置50G)(96G内存配置75G整数)。如果一台机器启动一个实例这个可以注释选择默认,如果一台机器启动多个实例,需要设置内存大小,避免互相抢占内存
journalCompressor: "snappy"
directoryForIndexes: true
collectionConfig:
blockCompressor: "snappy"
indexConfig:
prefixCompression: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
maxIncomingConnections: 20000
bindIp: 0.0.0.0 # Listen to local interface only, comment to listen on all interfaces.
security:
authorization: 'enabled'
clusterAuthMode: "keyFile"
keyFile: /opt/mongodb/conf/rs.key
operationProfiling:
slowOpThresholdMs: 200
mode: slowOp
replication:
oplogSizeMB: 102400 #复制操作日志的最大大小,以M为单位,默认情况下,mongod进程基于最大可用空间创建oplog,对于64位系统,oplog通常占可用磁盘空间的5%;
replSetName: test #副本集的名称
enableMajorityReadConcern: false
#sharding:
## Enterprise-Only Options
#auditLog:
#snmp:
5、分别启动每个节点:A、B、C节点
#创建认证文件
#使用openssl命令随机生成741个字节的随机数字,然后将数字写入rs.key文件中,编码方式为base64,rand表示随机
# cd /opt/mongodb/conf/
# openssl rand -base64 741 > rs.key
ohMhfKa8oX6IDO2NS+YXsoDh0pcz/AJi013D6Ao6L1cO2LFaKtBwDx5vR9VKJvEQ
wMBC2syOFDFuze3U1JZ+DwsIpahvZCG1e74KG4Mgy/l+pJKdeoW2Qk2aRKkf3K00
LxCFmwhbdRZ5ARQNoq3fLhQg0eH7fvajzEXnwfpsIbIeOv6h+uH16nmKklTb426V
rlThA779UFMKmUq17xvY3mZbiPjjEJgC8oMQUOu8c4xUGL8oaC39zM9QjiNG/EoH
TCjra6UN+O9SR2Q09R+u7GZi0yrnLhVpgDjHMOmfWStHkEgHCdsur6r06fQ3YQuq
UE/EHkPjn99hcgRJ+7bfJbR14h76g1lGKPFJ17W8N+UZA+63emhduxfG77PLExuU
g2NURjXV85W4ISSpbak53tjXISNUwT+KKlGoH1UPLtGKWKzgAGMPzsIAva/+fkJi
BKz8gKdWOp3ivaSHUGOZMRUoluAHeQxM77C+DJG9gTPzQ9JcCQnDZFPgIfiYLpl5
dPZu5jWuU0HVRu03fNkeapkkuqIFdiE9kMzyVXpFiJJXUt1YvP/DDbfo9HTeaFw1
AzeKmXasatO6AWvMXc7GBA5KQlqfgrirbViZfw3vb52vTjcQXwmKNPikDfzvKQEd
OdNWHMJPBbIKkMD3BHefMA/CimOEXj9Ryq9cMRnOOSLuUkkkKJlrsxCzaekRUs97
SnjcD5YuWx8YOF1F0ERgS3DBAtPHlcuybmRMTac6Gb3qeMkJEs13IZbA4pmmwTs2
Jj8yuJIKKqxr+Zebjg5DxBte1PF3r7e2YwC3fx7gPP+0gh2a2yOUcL1HK5I3FA69
ryKs6HQ7SHbVnfUpY/1O9MiahBckpi8NkWclYndbS5PWEi+IK7g7sHR8cYuZGrR9
YXlJQH7VOfVaat3+kLJQT0b40YtylFfCW0Nmu83TEyb7+9jucprpLqraNLbb9RvO
eFQJIkSBwvC4nf5voa9TPgRpX+5J
# chmod 600 rs.key
# scp rs.key root@x.x.x.x:/opt/mongodb/conf/ #将此文件rs.key传到另外2台
# chown -R mongod.mongod /opt
# chown -R mongod.mongod /var/run/mongodb
# sudo -u mongod /opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongod.conf
about to fork child process, waiting until server is ready for connections.
forked process: 1725
child process started successfully, parent exiting
# ps -ef | grep mongo
mongod 1725 1 19 19:37 ? 00:00:02 /opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongod.conf
root 1771 1641 0 19:37 pts/1 00:00:00 grep --color=auto mongo
#关闭mongo服务
# sudo -u mongod /opt/mongodb/bin/mongod --shutdown --dbpath /opt/mongodb/data
设置MongoDB开机自启动
# vi /etc/rc.d/rc.local #加入下面的自启动脚本
sudo -u mongod /opt/mongodb/bin/mongod -f /opt/mongodb/conf/mongod.conf
二、 组建副本集
1、使用mongo 客户端 连接主节点或备节点进行配置
#配置防火墙,允许27017端口可以相互访问
# mongo --port 27017
#连接成功后,开始配置副本集:
> use admin
switched to db admin
# test为配置文件中副本集名称
> config = {_id: 'test', members: [{_id: 0, host: '192.168.100.138:27017',priority:2},{_id: 1, host: '192.168.100.139:27017',priority:1},{_id: 2, host:'192.168.100.140:27017',arbiterOnly:true}]}
{
"_id" : "replSet",
"members" : [
{
"_id" : 0,
"host" : "192.168.100.138:27017",
"priority" : 2
},
{
"_id" : 1,
"host" : "192.168.100.139:27017",
"priority" : 1
},
{
"_id" : 2,
"host" : "192.168.100.140:27017",
"arbiterOnly" : true
}
]
}
> rs.initiate(config)
{ "ok" : 1 }
> rs.status() #查看副本集状态,找到private节点的IP
test:SECONDARY> rs.status()
{
"set" : "test",
"date" : ISODate("2021-09-28T12:10:56.025Z"),
"myState" : 1,
"term" : NumberLong(2),
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"majorityVoteCount" : 2,
"writeMajorityCount" : 2,
"votingMembersCount" : 3,
"writableVotingMembersCount" : 2,
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1632831055, 1),
"t" : NumberLong(2)
},
"lastCommittedWallTime" : ISODate("2021-09-28T12:10:55.675Z"),
"appliedOpTime" : {
"ts" : Timestamp(1632831055, 1),
"t" : NumberLong(2)
},
"durableOpTime" : {
"ts" : Timestamp(1632831055, 1),
"t" : NumberLong(2)
},
"lastAppliedWallTime" : ISODate("2021-09-28T12:10:55.675Z"),
"lastDurableWallTime" : ISODate("2021-09-28T12:10:55.675Z")
},
"electionCandidateMetrics" : {
"lastElectionReason" : "priorityTakeover",
"lastElectionDate" : ISODate("2021-09-28T12:10:05.552Z"),
"electionTerm" : NumberLong(2),
"lastCommittedOpTimeAtElection" : {
"ts" : Timestamp(1632831015, 1),
"t" : NumberLong(1)
},
"lastSeenOpTimeAtElection" : {
"ts" : Timestamp(1632831015, 1),
"t" : NumberLong(1)
},
"numVotesNeeded" : 2,
"priorityAtElection" : 2,
"electionTimeoutMillis" : NumberLong(10000),
"priorPrimaryMemberId" : 1,
"numCatchUpOps" : NumberLong(0),
"newTermStartDate" : ISODate("2021-09-28T12:10:05.645Z")
},
"electionParticipantMetrics" : {
"votedForCandidate" : true,
"electionTerm" : NumberLong(1),
"lastVoteDate" : ISODate("2021-09-28T12:09:55.023Z"),
"electionCandidateMemberId" : 1,
"voteReason" : "",
"lastAppliedOpTimeAtElection" : {
"ts" : Timestamp(1632830733, 1),
"t" : NumberLong(-1)
},
"maxAppliedOpTimeInSet" : {
"ts" : Timestamp(1632830733, 1),
"t" : NumberLong(-1)
},
"priorityAtElection" : 2
},
"members" : [
{
"_id" : 0,
"name" : "192.168.100.138:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY", #主节点
"uptime" : 2049,
"optime" : {
"ts" : Timestamp(1632831055, 1),
"t" : NumberLong(2)
},
"optimeDate" : ISODate("2021-09-28T12:10:55Z"),
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1632831015, 2),
"electionDate" : ISODate("2021-09-28T12:10:15Z"),
"configVersion" : 1,
"configTerm" : 2,