MongoDB配置单分片集群

配置单分片集群

分片集群是副本集的延伸,是由于一个或多个副本集组成,因此需要配置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()

image-20210522173815294

一个分片即一个副本集,在配置分片集群的节点时,在配置文件中需要额外设置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与其他节点在配置文件上的不同之处如下:

  1. mongos不需要存储数据,所以不需要配置storage的相关属性值
  2. mongos不是副本集的概念,所以不需要配置replication的相关属性值
  3. 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'})

image-20210522184746635

如果想继续增加分片,则先配置副本集(副本集名称不能重复),然后再通过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名>')

猜你喜欢

转载自blog.csdn.net/qq_36213352/article/details/117173320