文章目录
- 配置单分片集群
- 环境准备
- 服务器规划
- 端口分配
- 配置config副本集
- 配置防火墙
- 配置mongos
- 配置防火墙
- 配置集群的权限
- 配置自启动服务
- 关闭SELinux
- config启动服务文件
- mongos启动服务文件
- 设置数据库分片(含指定数据存放分片)
- 设定数据库分片
- 设定特定数据存放指定的分片(可应用于特定数据分区、跨区域就近读写)
- 移除Tag
- 移除数据分放的区域
配置单分片集群
分片集群是副本集的延伸,是由于一个或多个副本集组成,因此需要配置mongos与config服务器,来让集群中的副本集可以关联起来。
数据量越大、读写压力越高的情境,所需要的分片数量就会越大
环境准备
服务器规划
服务器node1 | 服务器node2 | 服务器node3 |
mongos | ||
mongo config server | mongo config server | mongo config server |
repl_0 复制集节点1 | repl_0 复制集节点2 | repl_0 仲裁节点 |
这里使用的副本集是上一文中安装的副本集
端口分配
mongos:27017
config:27018
shard1:27019
安装依赖
yum install -y vim lsof
修改hosts
vim /etc/hosts
192.168.10.25 node1
192.168.10.26 node2
192.168.10.27 node3
配置config副本集
配置防火墙
#开启端口
firewall-cmd --zone=public --add-port=27018/tcp --permanent
#重新载入
firewall-cmd --reload
#查看
firewall-cmd --query-port=27018/tcp
config记录数据分片存放在哪个分片的记录
在每一台要配置config的机器上均要配置,这里设置三台机器
- 创建存在PID文件的文件夹
mkdir -p /var/run/mongodb/
- 创建config用存储数据和log文件的文件夹
mkdir -p /mongodb/config/data
mkdir -p /mongodb/config/log
- 编辑config的配置文件
vim /etc/mongod_Config.conf
systemLog:
destination: file
logAppend: true
path: /mongodb/config/log/config.log
storage:
dbPath: /mongodb/config/data
journal:
enabled: true
processManagement:
fork: true
pidFilePath: /var/run/mongodb/config.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27018
bindIp: 0.0.0.0
replication:
replSetName: configset
sharding:
clusterRole: configsvr
- 使用配置文件启动
在每一台要配置config的机器上均要操作,此处为三台
/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod -f /etc/mongod_Config.conf
- 登录其中一个节点
/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongo --port 27018
- 在登录节点后设定副本集成员
use admin
rs.initiate ({
_id:"configset",
configsvr:true,
members:[
{_id:0,host:"node1:27018"},
{_id:1,host:"node2:27018"},
{_id:2,host:"node3:27018"}
]})
rs.conf()
rs.status()
一个分片即一个副本集,在配置分片集群的节点时,在配置文件中需要额外设置sharding.clusterRole属性,以声明该节点是config节点还是数据节点
配置mongos
mongos是访问的路由,需要个几个mongos由业务需求来决定,可以配置高可用
在应用程序连接时,如果将所有mongos连接字符串加上去,便可以在某台mongos服务中断时自动找到其他mongos而不造成连接中断
- 创建用来存放PID文件的文件夹
mkdir -p /var/run/mongodb/
- 创建用来存储mongos的log文件的文件夹
mkdir -p /mongodb/mongos/log
- 编辑mongos的配置文件
vim /etc/Mongos.conf
systemLog:
destination: file
logAppend: true
path: /mongodb/mongos/log/config.log
processManagement:
fork: true
pidFilePath: /var/run/mongodb/mongos.pid
timeZoneInfo: /usr/share/zoneinfo
net:
port: 27017
bindIp: 0.0.0.0
#replication:
# replSetName: configset
sharding:
configDB:
configset/node1:27018,node2:27018,node3:27018
mongos与其他节点在配置文件上的不同之处如下:
- mongos不需要存储数据,所以不需要配置storage的相关属性值
- mongos不是副本集的概念,所以不需要配置replication的相关属性值
- mongos需要配置configDB信息
- 使用配置文件启动
在每一台要配置mongos的机器上均要操作,下面在一台机器上配置
/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongos -f /etc/Mongos.conf
- 登录mongos
如果有多个mongos,仅需登录其中一台进行设定即可
/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongo --port 27017
# 查看分片信息
db.printShardingStatus()
- 设定分片成员
use admin
db.runCommand({addShard:'repl_0/node1:27019,node2:27019,node3:27019'})
如果想继续增加分片,则先配置副本集(副本集名称不能重复),然后再通过mongos将副本集加入集群中作为一个分片
配置防火墙
#开启端口
firewall-cmd --zone=public --add-port=27017/tcp --permanent
#重新载入
firewall-cmd --reload
#查看
firewall-cmd --query-port=27017/tcp
配置集群的权限
集群的权限控管配置与单机完全不同,集群的权限管控需要产生密钥,集群中的所有机器都必须有相同的密钥,以便集群内的机器互相认得。
- 在集群的所有机器上建立存放密钥的文件夹。
mkdir -p /mongodb/mongodb-keyfile
- 使用其他一台机器产生密钥
openssl rand -base64 756 > /mongodb/mongodb-keyfile/mongodbkey
- 将密钥文件复制到集群的所有机器上
scp /mongodb/mongodb-keyfile/mongodbkey root@node1:/mongodb/mongodb-keyfile/
scp /mongodb/mongodb-keyfile/mongodbkey root@node3:/mongodb/mongodb-keyfile/
并输入密码
设置文件权限
chmod 400 /mongodb/mongodb-keyfile/mongodbkey
- 编辑配置文件中权限属性值
集群所有成员的配置文件皆需要添加,包含config、数据节点、Arbiter和mongos
vim /etc/mongod_Node.conf
vim /etc/mongod_Config.conf
vim /etc/Mongos.conf
# mongod_Node.conf、mongod_Config.conf
security:
keyFile: /mongodb/mongodb-keyfile/mongodbkey
authorization: enabled
# Mongo.conf
security:
keyFile: /mongodb/mongodb-keyfile/mongodbkey
- 启动集群的所有服务
systemctl start mongod.service
systemctl start mongod_Config.service
systemctl start mongos.service
如果已经启动,则需要关闭服务再使用配置文件重启
/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongo --port 27017
- 加入具有管理集群权限的账号
use admin
db.createUser({user:"superadmin",pwd:"superadmin",roles:['root']})
/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongo --username superadmin --password superadmin --authenticationDatabase admin --port 27017 admin
配置自启动服务
关闭SELinux
# 检查SELinux是否开启
/usr/sbin/sestatus -v
vim /etc/selinux/config
SELINUX=disabled
重启机器
reboot
config启动服务文件
编辑MongoDB服务文件(mongod_Config.service)
vim /usr/lib/systemd/system/mongod_Config.service
[Unit]
Description=mongodb
After=network.target
[Service]
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStart=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod -f /etc/mongod_Config.conf
ExecStop=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongod --shutdown --config /etc/mongod_Config.conf
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/config.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
设置mongod_Config.service权限
chmod 754 /usr/lib/systemd/system/mongod_Config.service
启动自启动服务
systemctl enable mongod_Config.service
开启服务
systemctl start mongod_Config.service
关闭自启动服务
systemctl disable mongod_Config.service
查询服务状态
systemctl status mongod_Config.service
停止服务
systemctl stop mongod_Config.service
mongos启动服务文件
vim /usr/lib/systemd/system/mongos.service
[Unit]
Description=mongodb
After=network.target
[Service]
ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb
ExecStart=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongos -f /etc/Mongos.conf
ExecStop=/mongodb/mongodb-linux-x86_64-enterprise-rhel70-4.4.5/bin/mongos --shutdown --config /etc/Mongos.conf
PermissionsStartOnly=true
PIDFile=/var/run/mongodb/mongos.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
[Install]
WantedBy=multi-user.target
设置mongod_Config.service权限
chmod 754 /usr/lib/systemd/system/mongos.service
启动自启动服务
systemctl enable mongos.service
开启服务
systemctl start mongos.service
关闭自启动服务
systemctl disable mongos.service
查询服务状态
systemctl status mongos.service
停止服务
systemctl stop mongos.service
设置数据库分片(含指定数据存放分片)
设定数据库分片
- 将欲当成片健值的字段设定成索引
# collection_name 数据库名称
db.collection_name.ensureIndex({_id:"hashed"})
- 启用数据库分片
sh.enableSharding("test")
# 欲当片键的索引,哈希函数会使数据随机分片,但无法设定成复合片
sh.shardCollection("test.col1", { "name" : 1 } )
sh.shardCollection("test.col2", { _id : "hashed" } )
设定特定数据存放指定的分片(可应用于特定数据分区、跨区域就近读写)
- 设定分片Tag(每个区域都要设定)
sh.addShardTag('<shard名>','<Tag名>')
- 依照片键设定数据分段的区域(“字段一” “字段二” 需要设定为复合片键)
# 将复合这些条件的字段放入此分片
sh.addTagRange('<数据库>.<集合名>',
{'<字段一>':'<字段内容>',"<字段二>":MinKey},
{'<字段一>':'<字段内容>',"<字段二>":ManKey},
'<Tag名>')
移除Tag
sh.removeShardTag('<shard名>','<Tag名>')
移除数据分放的区域
sh.removeTagRange('<数据库>.<集合名>',
{'<字段一>':'<字段内容>',"<字段二>":MinKey},
{'<字段一>':'<字段内容>',"<字段二>":ManKey},
'<Tag名>')