Mongodb分片集群部署

一、架构

1、Mongodb分片集群配置

按照尽量节省资源的原则,不交叉部署的原则:

作用 配置 数量
分片1-主、分片1-副 8C16G300GSSD 2
分片1-仲裁节点 4C8G100GSSD 1
分片2-主、分片2-副 8C16G300GSSD 2
分片2-仲裁节点 4C8G100GSSD 1
config服务复制集(1主2副) 4C8G100GSSD 3
mongos路由 2C4G40GSSD 3

2、说明

MongoDB分片集群,英文名称为: Sharded Cluster。旨在通过横向扩展,来提高数据吞吐性能、增大数据存储量。

分片集群由三个组件:“mongos”, “config server”, “shard” 组成。
在这里插入图片描述

  • mongos:数据库请求路由。负责接收所有客户端应用程序的连接查询请求,并将请求路由到集群内部对应的分片上。”mongos”可以有1个或多个。

    本身不保存数据,在启动时从配置服务器加载集群信息,开启mongos进程需要知道配置服务器的地址,指定configdb选项。

  • config server: 配置服务器。是一个独立的mongod进程,保存集群和分片的元数据,即各分片包含了哪些数据的信息。最先开始建立,启用日志功能。像启动普通的mongod一样启动配置服务器,指定configsvr选项。不需要太多的空间和资源,配置服务器的1KB空间相当于真是数据的200MB。保存的只是数据的分布表。当服务不可用,则变成只读,无法分块、迁移数据。

  • shard: 分片存储。将数据分片存储在多个服务器上。有点类似关系数据库”分区表”的概念,只不过分区表是将数据分散存储在多个文件中,而sharding将数据分散存储在多个服务器上。一个集群可以有一个或多个分片。

  • 每个分片都必须是副本集,“config server” 必须是副本集!

二、环境准备

  • 操作系统:Centos6.5

  • Mongodb版本:3.2.1 RPM包

    建议优先从官方网站下载对应平台的安装包,如果官方找不到,可以从其他平台查找

    mongodb-org-server-3.2.1-1.el7.x86_64.rpm
    mongodb-org-tools-3.2.1-1.el7.x86_64.rpm
    mongodb-org-mongos-3.2.1-1.el7.x86_64.rpm
    mongodb-org-shell-3.2.1-1.el7.x86_64.rpm
    mongodb-org-3.2.1-1.el7.x86_64.rpm
    
  • 主机规划:mongos(3个)+ config server 副本集(1主2从) + 分片(2个,每个分片由1主1从1仲裁组成),一共12台主机:

    主机编号 IP地址 角色 hostname
    1 192.168.1.1 Mongos-1 mongo-mongos-1
    2 192.168.1.2 Mongos-2 mongo-mongos-2
    3 192.168.1.3 Mongos-3 mongo-mongos-3
    4 192.168.1.11 Config-1 mongo-config-1
    5 192.168.1.12 Config-2 mongo-config-2
    6 192.168.1.13 Config-3 mongo-config-3
    7 192.168.1.21 Shard1-Primary mongo-shard1-1
    8 192.168.1.22 Shard1-Secondary mongo-shard1-2
    9 192.168.1.23 Shard1-Arbiter mongo-shard1-3
    10 192.168.1.31 Shard2-Primary mongo-shard2-1
    11 192.168.1.32 Shard2-Secondary mongo-shard2-2
    12 192.168.1.33 Shard2-Arbiter mongo-shard2-3

注意:所有主机的hostname最好不要相同,以免影响mongos信息在config服务数据库中的存储。

三、分片集群搭建

1、搭建步骤

分片集群各组件搭建顺序如下,不能错:

  1. ConfigServer –> 2.Shard集群 –> 3.Mongos

启动顺序也是这样

2、所有主机预备操作

2.1、修改Linux主机能创建的文件数量限制

echo "ulimit -c unlimited" >> /etc/profile && source /etc/profile

cat >> /etc/security/limits.conf << EOF
* soft nofile 262140
* hard nofile 262140
root soft nofile 262140
root hard nofile 262140
* soft core unlimited
* hard core unlimited
root soft core unlimited
root hard core unlimited
EOF
echo "session  required  pam_limits.so">> /etc/pam.d/login

2.2、使用RPM包安装mongodb

rpm -ivh mongodb-org-server-3.2.1-1.el7.x86_64.rpm
rpm -ivh mongodb-org-tools-3.2.1-1.el7.x86_64.rpm
rpm -ivh mongodb-org-mongos-3.2.1-1.el7.x86_64.rpm
rpm -ivh mongodb-org-shell-3.2.1-1.el7.x86_64.rpm
rpm -ivh mongodb-org-3.2.1-1.el7.x86_64.rpm

2.3、修改监听IP

sed -i "s/bindIp: 127.0.0.1/bindIp: 0.0.0.0/g" /etc/mongod.conf

2.4、清空防火墙

iptables -F
systemctl stop firewalld
systemctl disable firewalld

如果还不行就关闭Selinux。或者,在防火墙添加相应的放通策略,也可以

3、搭建Config-Server集群

ConfigServer是一个副本集集群,一主两从,按照搭建副本集的方式搭建即可。

3.1、修改Congfig-Server配置文件

三台主机配置相同,依次执行如下命令:

cat >> /etc/mongod.conf << EOF
replication:
  oplogSizeMB: 2048
  replSetName: mars-config

sharding:
  clusterRole: configsvr
EOF

注意:集群角色必须是configsvr

3.2、启动Mongod

三台主机依次启动mongod程序

systemctl start mongod   

3.3、初始化config-server副本集

三台主机随便挑一台,敲mongo进入mongo shell,执行如下命令:

rs.initiate( {
    _id: "mars-config",
    configsvr: true,
    members: [
        { _id: 0, host: "192.168.0.11:27017"},
        { _id: 1, host: "192.168.0.12:27017"},
        { _id: 2, host: "192.168.0.13:27017"}
    ]
} )

注意:id为集群名称,configsvr为true。

3.4 验证

rs.status()

4、搭建Shard分片复制集集群

此处我们采用2个Shard分片,每个分片是一个主-从-仲裁的三节点复制集。两个分片配置过程一致。

4.1、分片1

4.1.1、修改配置文件

三台主机配置相同,依次执行如下shell命令:

cat >> /etc/mongod.conf << EOF
replication:
  oplogSizeMB: 2048
  replSetName: mars-shard1

sharding:
  clusterRole: shardsvr
EOF

注意:集群名字为shard1,要和分片2区分开。集群角色为shardsvr。

4.1.2、启动mongod
systemctl start mongod
4.1.3、初始化Shard1副本集

三台主机随便挑一台,敲mongo进入mongo shell,执行如下命令:

rs.initiate( {
    _id: "mars-shard1",
    members: [
        { _id: 0, host: "192.168.0.21:27017"},
        { _id: 1, host: "192.168.0.22:27017"},
        { _id: 2, host: "192.168.0.23:27017", arbiterOnly: true}
    ]
} )

注意:id为配置文件中的集群名称,如不需要仲裁节点,可以去掉arbiterOnly: true。

4.1.4、验证
rs.status()

4.2、分片2

4.2.1、修改配置文件

三台主机配置相同,依次执行如下shell命令:

cat >> /etc/mongod.conf << EOF
replication:
  oplogSizeMB: 2048
  replSetName: mars-shard2

sharding:
  clusterRole: shardsvr
EOF

注意:集群名字为shard2,要和分片1区分开。集群角色为shardsvr。

4.2.2、启动mongod
systemctl start mongod
4.2.3、初始化Shard2副本集

三台主机随便挑一台,敲mongo进入mongo shell,执行如下命令:

rs.initiate( {
    _id: "mars-shard2",
    members: [
        { _id: 0, host: "192.168.0.31:27017"},
        { _id: 1, host: "192.168.0.32:27017"},
        { _id: 2, host: "192.168.0.33:27017", arbiterOnly: true}
    ]
} )

注意:id为配置文件中的集群名称。

我这里把第三台主机设为仲裁主机,是为了节省硬件资源,节约成本。如果不在乎这点成本,可以去掉上面arbiterOnly的配置。

4.2.4、验证
rs.status()

5、搭建mongos路由

mongos可以为1个,也可以为多个,可以根据需要横向扩展,这里采用3个。

mongos的主机名hostname必须要保持不同,如果相同,config的数据库中就只会保存一个mongos信息,从而造成active mongos数量永远是1。

5.1、修改配置文件

mongos的配置文件为mongos.conf,如果不存在就采用如下方式新建,三台主机依次执行:

cat >> /etc/mongos.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongos.pid  # location of pidfile

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0 

sharding:
  configDB: mars-config/192.168.0.11:27017,192.168.0.12:27017,192.168.0.13:27017
EOF

注意:configDB为config-server集群的IP和端口,不要填错,启动的时候同时注意提示信息,可能逗号前面不需要空格。

5.2、启动mongos

已mongod用户启动mongos,三台主机依次执行:

sudo -u mongod mongos -f /etc/mongos.conf

5.3、添加分片

连接任意一个mongos,在任意一台主机上执行mongo,添加分片信息:

use admin

sh.addShard("mars-shard1/192.168.0.21:27017,192.168.0.22:27017,192.168.0.23:27017")

sh.addShard("mars-shard2/192.168.0.31:27017,192.168.0.32:27017,192.168.0.33:27017")

5.4、验证

sh.status()

在这里插入图片描述

至此,一个基本的Shard分片集群已经搭建完毕。

6、使用分片

使用分片的基本步骤是:1.开启数据库分片–> 2.开启集合分片

对数据库分片是对集合分片的先决条件。

6.1、开启数据库分片

以testdb数据库为例,在一台mongos上,进入mongoshell,执行:

sh.enableSharding("testdb")

6.2、开始集合分片

已testdb.coll1集合为例:

sh.shardCollection("testdb.coll1", {"name" : "hashed"})

说明:

  • 第一个参数为集合的完整namespace名称,此例集合为testdb.coll1。
  • 第二个参数为片键,指定根据哪个字段进行分片,此例对name字段进行hash分片。

6.3、插入数据验证分片

插入测试数据

use testdb

for (var i = 1; i <= 100000; i++){
  db.coll1.insert({"id" : i, "name" : "name" + i});
}

验证是否分片

sh.status()

在这里插入图片描述

7、添加集群认证

上文已经成功创建一个分片集群,并验证数据分片可用。但在部署生产环境时,还需添加认证,用以保障集群安全性。
认证分两种:

  • 集群内部认证 (Internal Authentication)
    用于集群内的各个组件(mongos, config server, shard)之间相互访问认证,也就是所有的mongos进程和mongod进程之间相互访问认证。
    内部认证通过keyfile密钥文件实现,即所有的monogs/mongod公用同一个keyfile文件来相互认证。如果集群外随便来一个”mongod”进程,如果没有相同的keyfile,想加入集群,是不可能的。

  • 外部用户访问集群所需的用户认证 (User Access Controls)
    用于外部客户端访问mongos时,所需的用户认证。

7.1、生成并分发密钥文件Keyfile

在第一台主机上执行

openssl rand -base64 756 > /var/lib/mongo/keyFile
chmod 600 /var/lib/mongo/keyFile
chown -R mongod:mongod /var/lib/mongo/keyFile

其他所有主机复制第一台生成的keyFile文件(通过lszrz 或者 scp 或者 ftp),并执行以下命令:

cp keyFile /var/lib/mongo/
chmod 600 /var/lib/mongo/keyFile
chown -R mongod:mongod /var/lib/mongo/keyFile

7.2、添加用户

连接到任意一台mongos上,添加超级管理员用户:

use admin
db.createUser({user: "admin",pwd: "xxx@1111",roles: [ { role: "userAdminAnyDatabase", db: "admin" },{ role: "clusterAdmin", db: "admin" }]})

添加客户端用户:

use testdb
db.createUser({user: "test_rw",pwd: "xxx#111",roles: [{ role: "dbOwner", db: "testdb"}]})

在”mongos”上添加用户,用户信息实际保存在”config server”上,”mongos”本身不存储任何数据,包括用户信息。

然而,”mongos”上创建的用户,是不会自动添加到”shard”分片服务器上的。
为了以后方便维护shard分片服务器,分别登录到每个分片服务器的”primary”节点,添加管理员用户:

use admin
db.createUser({user: "admin",pwd: "xxx@1111",roles: [ { role: "userAdminAnyDatabase", db: "admin" },{ role: "clusterAdmin", db: "admin" }]})

7.3、开启认证

7.3.1、为所有mongod程序添加认证参数

所有mongod程序包括,config-server主机3台,分片集群6台。

cat >> /etc/mongod.conf << EOF

security:
  authorization: enabled
  keyFile: /var/lib/mongo/keyFile
EOF
7.3.2、为所有mongos程序添加认证参数

在三台mongos主机上执行:

cat >> /etc/mongos.conf << EOF

security:
  keyFile: /var/lib/mongo/keyFile
EOF
7.3.3、停止集群内所有mongos和mongod程序

mongos程序使用kill -9 pid停止,mongod程序使用systemctl stop mongod停止。

7.3.4、按顺序启动所有程序
  1. config-server -> 2. shard集群 -> 3. mongos
7.3.5、验证用户访问

通过连接任意一个mongos,验证管理员用户和客户端用户的访问。

mongos -uadmin -pxxx@1111
show dbs;

8、监控相关

8.1 常用监控命令

8.2 开启慢查询

在所有数据分片上,修改mongod.conf文件,并重启mongod服务

operationProfiling:
   mode: slowOp
   slowOpThresholdMs: 200

9、遇到的问题

9.1 Disable Transparent Huge Pages

WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.We suggest setting it to 'never'

官方永久解决办法,不使用tuned可以忽略第5步。

9.2 Use XFS filesystem

 WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

安装后使用可能会收到以上warning,建议使用命令 db.serverStatus().storageEngine.name确认存储引擎后,使用xfs文件系统存储mongod数据,只修改mongod-shard分片节点即可。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 lxwno.1@163.com

×

喜欢就点赞,疼爱就打赏