文章目录
- mongodb 分片部署
- 二进制安装
- 三台config 配置
- shard 分片安装
- shard1 安装
- shard2 安装
- shard3 安装
- mongos 安装
- 数据库、集合启用分片
- 创建集群认证文件
- 创建集群用户
- 部署常见问题
mongodb 分片部署
二进制安装
mkdir -p /data/mongodb
tar xvf mongodb-linux-x86_64-rhel70-3.6.17.tgz
mv mongodb-linux-x86_64-rhel70-3.6.17/* /data/mongodb
#设置环境变量
echo export PATH='$'PATH:/data/mongodb/bin >> .bash_profile
source .bash_profile
三台config 配置
#三台配置一致
mkdir -p /data/mongodb/config
mkdir -p /data/mongodb/config/logs/
mkdir -p /data/mongodb/config/pid/
mkdir -p /etc/mongodb/
cat > //etc/mongodb/config.conf <<EOF
dbpath=/data/mongodb/config
logpath=/data/mongodb/config/logs/config.log
pidfilepath=/data/mongodb/config/pid/config.pid
logappend=true
bind_ip=0.0.0.0
port=27100
fork=true
configsvr=true
replSet=configs
EOF
#三台启动config
mongod -f /etc/mongodb/config.conf
config 初始化,任意一台执行
mongo --port 27100
use admin
config = {
_id : "configs",
members : [
{_id : 0, host : "192.168.221.173:27100" },
{_id : 1, host : "192.168.221.174:27100" },
{_id : 2, host : "192.168.221.175:27100" }
]
}
rs.initiate(config)
shard 分片安装
shard1 安装
3台服务器添加配置
configdb为config服务地址,192.168.221.173、192.168.221.174、192.168.221.175分别替换为3台机器的IP地址,/data根据实际情况修改为数据盘路径。
3台服务器分别添加配置文件
#三台配置一致
mkdir -p /data/mongodb/shard1/data
mkdir -p /data/mongodb/shard1/logs/
mkdir -p /data/mongodb/shard1/pid/
cat > /etc/mongodb/shard1.conf <<EOF
dbpath=/data/mongodb/shard1/data
logpath=/data/mongodb/shard1/logs/shard1.log
pidfilepath=/data/mongodb/shard1/pid/shard1.pid
directoryperdb=true
logappend=true
replSet=shard1
bind_ip=0.0.0.0
port=27001
fork=true
shardsvr=true
EOF
#3台服务器分别启动服务
mongod -f /etc/mongodb/shard1.conf
shard1 初始化
连接任意一台非“arbiterOnly: true”节点shard1,192.168.221.173、192.168.221.174、192.168.221.175分别替换为3台机器的IP地址(建议节点1执行)
mongo --port 27001
use admin
config = {
_id : "shard1",
members : [
{_id : 0, host : "192.168.221.173:27001" },
{_id : 1, host : "192.168.221.174:27001" },
{_id : 2, host : "192.168.221.175:27001", arbiterOnly: true }
]
}
rs.initiate(config);
shard2 安装
3台服务器分别添加配置文件
mkdir -p /data/mongodb/shard2/data
mkdir -p /data/mongodb/shard2/logs/
mkdir -p /data/mongodb/shard2/pid/
cat > /etc/mongodb/shard2.conf <<EOF
dbpath=/data/mongodb/shard2/data
logpath=/data/mongodb/shard2/logs/shard2.log
pidfilepath=/data/mongodb/shard2/pid/shard2.pid
directoryperdb=true
logappend=true
replSet=shard2
bind_ip=0.0.0.0
port=27002
fork=true
shardsvr=true
EOF
#3台服务器分别启动服务
mongod -f /etc/mongodb/shard2.conf
shard2初始化,
连接任意一台非“arbiterOnly: true”节点shard2,192.168.221.173、192.168.221.174、192.168.221.175分别替换为3台机器的IP地址(建议节点1执行)
mongo --port 27002
use admin
config = {
_id : "shard2",
members : [
{_id : 0, host : "192.168.221.173:27002" },
{_id : 1, host : "192.168.221.174:27002", arbiterOnly: true },
{_id : 2, host : "192.168.221.175:27002" }
]
}
rs.initiate(config);
shard3 安装
3台服务器分别添加配置文件
mkdir -p /data/mongodb/shard3/data/
mkdir -p /data/mongodb/shard3/logs/
mkdir -p /data/mongodb/shard3/pid/
cat > /etc/mongodb/shard3.conf <<EOF
dbpath=/data/mongodb/shard3/data
logpath=/data/mongodb/shard3/logs/shard3.log
pidfilepath=/data/mongodb/shard3/pid/shard3.pid
directoryperdb=true
logappend=true
replSet=shard3
bind_ip=0.0.0.0
port=27003
fork=true
shardsvr=true
EOF
#3台服务器分别启动服务
mongod -f /etc/mongodb/shard3.conf
shard3 初始化,
连接任意一台非“arbiterOnly: true”节点shard3,192.168.221.173、192.168.221.174、192.168.221.175分别替换为3台机器的IP地址(建议节点1执行)
mongo --port 27003
use admin
config = {
_id : "shard3",
members : [
{_id : 0, host : "192.168.221.173:27003" },
{_id : 1, host : "192.168.221.174:27003" },
{_id : 2, host : "192.168.221.175:27003", arbiterOnly: true }
]
}
rs.initiate(config);
mongos 安装
3台服务器分别添加配置文件
mkdir -p /data/mongodb/mongos/pid/
mkdir -p /data/mongodb/mongos/logs/
cat > /etc/mongodb/mongos.conf <<EOF
#configdb为config服务地址
configdb=configs/192.168.221.173:27100,192.168.221.174:27100,192.168.221.175:27100
pidfilepath=/data/mongodb/mongos/pid/mongos.pid
logpath=/data/mongodb/mongos/logs/mongos.log
bind_ip=0.0.0.0
port=30000
logappend=true
fork=true
EOF
#3台服务器启动mongos
mongos -f /etc/mongodb/mongos.conf
配置分片
任意一台服务器连接,192.168.221.173、192.168.221.174、192.168.221.175分别替换为3台机器的IP地址
mongo --port 30000
use admin
#添加shard
sh.addShard("shard1/192.168.221.173:27001,192.168.221.174:27001,192.168.221.175:27001")
sh.addShard("shard2/192.168.221.173:27002,192.168.221.174:27002,192.168.221.175:27002")
sh.addShard("shard3/192.168.221.173:27003,192.168.221.174:27003,192.168.221.175:27003")
#查看分片状态:
sh.status()
这是一个MongoDB的分片状态信息。让我来解释一下每个部分的含义:
1. sharding version:这是分片的版本信息。当前的版本是6,最小兼容版本是5。
2. shards:这里列出了所有的分片信息。每个分片有一个唯一的"_id",以及它的"host"(主机)和"state"(状态)。这些信息指示了每个分片所在的主机和它们的状态。
3. active mongoses:这里显示了当前活动的mongos进程的数量和版本号。mongos是MongoDB的路由进程,用于处理客户端请求并将它们路由到正确的分片。
4. autosplit:这个字段指示是否启用了自动分片功能。在这个例子中,自动分片是启用的。
5. balancer:这个字段显示了均衡器(balancer)的状态。它指示均衡器是否启用,以及它是否正在运行。还显示了最近5次均衡尝试中失败的次数。
6. databases:这里列出了所有的数据库信息。每个数据库有一个"_id"和它的"primary"(主节点),还指示了该数据库是否进行了分片。
数据库、集合启用分片
mongo --port 30000
use admin
#这条命令表示启用分片功能,针对的数据库为 "rabbitpre_app"。
db.runCommand({enablesharding:"rabbitpre_app"});
#这条命令表示对 "rabbitpre_app" 数据库中的 "t_page_component" 集合进行分片,使用 "appId" 作为散列键(hashed),实际数据分布会根据 appId 的散列值进行分片。
db.runCommand( {shardcollection : "rabbitpre_app.t_page_component",key : { "appId" : "hashed" }} )
#
use rabbitpre_app
#这条命令表示获取 "rabbitpre_app" 数据库中 "t_page_component" 集合的统计信息,例如集合的大小、索引大小、数据条数等。
db.t_page_component.stats();
创建集群认证文件
创建集群认证文件(三台执行)
openssl rand -base64 512 > keyfile.file
#将keyfile.file拷贝到3台服务的/etc/mongodb目录,并设置权限
chmod 600 /etc/mongodb/keyfile.file
在shard、config添加如下配置(三台):
$ cat >> /etc/mongodb/shard1.conf <<EOF
auth=true
keyFile=/etc/mongodb/keyfile.file
EOF
$ cat >> /etc/mongodb/shard2.conf <<EOF
auth=true
keyFile=/etc/mongodb/keyfile.file
EOF
$ cat >> /etc/mongodb/shard3.conf <<EOF
auth=true
keyFile=/etc/mongodb/keyfile.file
EOF
$ cat >> /etc/mongodb/config.conf <<EOF
auth=true
keyFile=/etc/mongodb/keyfile.file
EOF
在mongos添加如下配置(三台)
echo "keyFile=/etc/mongodb/keyfile.file" >> /etc/mongodb/mongos.conf
创建集群用户
#创建用户,更新用户,密码设置为符合安全要求的密码
>db.createUser({ user: 'admin', pwd:'密码', roles:[{role:"root",db:"admin"}]})
>db.createUser({user:'rwuser',pwd:'密码', roles:[{role:"readWriteAnyDatabase",db:"admin"}]})
> db.updateUser('rwuser',{pwd:'密码',roles:[{role:'readWrite',db:'admin'}]})
#Roles角色说明:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
部署常见问题
Error initializing sharding state, sleeping for 2 seconds and trying again :: caused by :: NetworkInterfaceExceededTimeLimit: Error loading clusterID :: caused by :: Operation timed out
查看防火墙是否关闭
关闭防火墙,问题解决