文章目录
1 部署规划
1.1 版本说明
操作系统版本 | CentOS release 6.10 (Final) |
---|---|
数据库版本 | MongoDB 4.2.5 |
内核版本 | 2.6.32-754.el6.x86_64 |
CPU | 8C |
MEM | 16G |
1.2 安装路径规划
说明项 | 安装路径 | 挂载点 | |
---|---|---|---|
软件安装目录 | Mongodb二进制程序 | /data/mongodb/bin | /data |
数据文件目录 | Mongodb数据文件 | /data/mongodb/$port/data | /data |
配置文件目录 | Mongodb配置文件 | /data/mongodb/$port/conf | /data |
日志文件目录 | Mongodb日志文件目录 | /data/mongodb/$port/log | /data |
1.3 用户与组规划
根据规划配置用户与组信息:
用户名称 | 组 | 用户目录 |
---|---|---|
mongod | mongod | /home/mongod |
1.4 分片节点规划
Mongodb分片集群分为mongos节点、config集群、 shard集群。Mongos节点建议至少部署两节点(本文部署三节点)实现高可用以及负载均衡。其中mongos和config消耗资源较少,使用较低规格服务器即可;对于shard集群应选用合适的CPU、内存、磁盘的主机。
本文IP、端口规划如下:
角色 | 协议类型 | 服务监听端口 |
---|---|---|
mongos | TCP/IP | 172.32.1.59:28018、172.32.1.91:28018、172.32.1.140:28018 |
config | TCP/IP | 172.32.1.59:28020、172.32.1.91:28020、172.32.1.140:28020 |
shard1 | TCP/IP | 172.32.1.59:28021、172.32.1.91:28021、172.32.1.140:28021 |
shard2 | TCP/IP | 172.32.1.59:28022、172.32.1.91:28022、172.32.1.140:28022 |
1.5 架构规划
2 Sharded Cluster集群部署
2.1 创建mongod用户
useradd -u800 mongod
echo 123456|passwd --stdin mongod
2.2 安装mongodb软件
mkdir -p /data/mongodb/bin
tar xf mongodb-linux-x86_64-rhel62-4.2.5.tgz -C /data/
cd mongodb-linux-x86_64-rhel62-4.2.5/bin/ &&\
cp * /data/mongodb/bin
2.3 配置环境变量
cat >> /home/mongod/.bash_profile <<'EOF'
PATH=/data/mongodb/bin/:$PATH
EOF
2.4 禁用大内存页面
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
2.5 修改用户限制
cat >> /etc/security/limits.conf <<'EOF'
mongod soft nofile 64000
mongod hard nofile 64000
mongod soft nproc 32000
mongod hard nproc 32000
EOF
2.6 修改网络、内存及资源限制相关内核参数
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_max_syn_backlog = 65535
net.core.somaxconn = 65535
net.ipv4.tcp_max_tw_buckets = 262144
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 120
vm.overcommit_memory = 1
vm.swappiness = 1
fs.file-max = 1024000
EOF
sysctl -p
2.7 关闭selinux和防火墙
service iptables stop
chkconfig iptables off
setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.8 创建目录、keyFile并授权
\#按照规划在各节点创建目录
for i in 18 20 21 22
do
mkdir -p /data/mongodb/280$i/conf
mkdir -p /data/mongodb/280$i/data
mkdir -p /data/mongodb/280$i/log
done
openssl rand -base64 100 -out /data/mongodb/access.key
chmod 600 /data/mongodb/access.key
chown -R mongod.mongod /data/mongodb
#将keyfile传输至各节点
scp /data/mongodb/access.key 172.32.1.91:/data/mongodb/
scp /data/mongodb/access.key 172.32.1.140:/data/mongodb/
2.9 修改配置文件
#config配置文件
systemLog:
destination: file
path: /data/mongodb/28020/log/mongodb.conf
logAppend: true
storage:
journal:
enabled: true
dbPath: /data/mongodb/28020/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 2
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 172.32.1.59
port: 28020
replication:
oplogSizeMB: 2048
replSetName: configReplSet
sharding:
clusterRole: configsvr
processManagement:
fork: true
#security:
#authorization: enabled
#keyFile: /data/mongodb/access.key
shard配置文件
systemLog:
destination: file
path: /data/mongodb/28021/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /data/mongodb/28021/data
directoryPerDB: true
\#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 4
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 172.32.1.59
port: 28021
replication:
oplogSizeMB: 2048
replSetName: shard1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
#security:
#authorization: enabled
#keyFile: /data/mongodb/access.key
mongos配置文件
systemLog:
destination: file
path: /data/mongodb/28018/log/mongos.log
logAppend: true
net:
bindIp: 172.32.1.59
port: 28018
sharding:
configDB: configReplSet/172.32.1.59:28020,172.32.1.91:28020,172.32.1.140:28020
processManagement:
fork: true
#security:
#keyFile: /data/mongodb/access.key
2.10 启动Sharded Cluster集群
\#启动config集群
su - mongod
mongod -f /data/mongodb/28020/conf/mongod.conf
\#连接mongo
mongo 172.32.1.59:28020
\#初始化副本集configReplSet
config = {_id: 'configReplSet', members: [
{_id: 0, host: '172.32.1.59:28020'},
{_id: 1, host: '172.32.1.91:28020'},
{_id: 2, host: '172.32.1.140:28020'}]
}
rs.initiate(config)
\#启动shard集群
su - mongod
mongod -f /data/mongodb/28021/conf/mongod.conf
\#连接mongo
mongo 172.32.1.59:28021
\#初始化副本集configReplSet
config = {_id: 'shard1', members: [
{_id: 0, host: '172.32.1.59:28021'},
{_id: 1, host: '172.32.1.91:28021'},
{_id: 2, host: '172.32.1.140:28021'}]
}
rs.initiate(config)
\#创建管理员用户
db.createUser({
user: 'sharddba', // 用户名
pwd: 'sharddba', // 密码
roles:[{
role: 'root', // 角色
db: 'admin' // 数据库
}]
})
\#启动mongos节点
su - mongod
mongos -f /data/mongodb/28018/conf/mongos.conf
\#连接mongo
mongo 172.32.1.59:28018
\#添加分片节点
use admin
db.runCommand( { addshard : "shard1/172.32.1.59:28021,172.32.1.91:28021,172.32.1.140:28021",name:"shard1"} )
db.runCommand( { addshard : "shard2/172.32.1.59:28022,172.32.1.91:28022,172.32.1.140:28022",name:"shard2"} )
db.runCommand( { listshards : 1 } )
\#创建管理员用户
db.createUser({
user: 'dba', // 用户名
pwd: 'dba', // 密码
roles:[{
role: 'root', // 角色
db: 'admin' // 数据库
}]
})
\#查看分片状态
sh.status();
\#开启数据库分片
db.runCommand( { enablesharding : "test" } )
use test
\#创建索引
db.t1.createIndex( { id: 1 }, {background: true} )
\#开启集合范围分片
use admin
db.runCommand( { shardcollection : "test.t1",key : {id: 1} } )
\#测试
use test
for(i=0;i<1000;i++){ db.t.insert({"id":i,"name":"zj","age":23,"date":new Date()}); }
db.t1.stats()
\#创建索引
db.t2.createIndex( { id: 1 }, {background: true} )
\#开启集合hash分片
use admin
sh.shardCollection( "test.t2", { id: "hashed" } )
\#测试
use test
for(i=0;i<1000;i++){ db.t2.insert({"id":i,"name":"zj","age":23,"date":new Date()}); }
db.t2.stats()
2.11 开启集群keyfile认证
#各节点均关闭
su - mongod
mongod -f /data/mongodb/28020/conf/mongod.conf --shutdown
#将配置文件中#security注释部分取消,注意调整缩进
#启动mongo
su - mongod
mongod -f /data/mongodb/28020/conf/mongod.conf
2.12 配置副本节点永久只读
echo "rs.slaveOk()" >.mongorc.js