MongoDB分布式集群分片

MongoDB高可用集群搭建

一、环境准备

# 启动时需要使用非root用户,所有创建一个mongo用户:
useradd mongo

# 为mongo用户添加密码:
echo 123456 | passwd --stdin mongo

# 将mongo添加到sudoers
echo "mongo ALL = (root) NOPASSWD:ALL" | tee /etc/sudoers.d/mongo
chmod 0440 /etc/sudoers.d/mongo
#解决sudo: sorry, you must have a tty to run sudo问题,在/etc/sudoer注释掉 Default requiretty 一行
sudo sed -i ‘s/Defaults    requiretty/Defaults:chiansun !requiretty/‘ /etc/sudoers

# 创建一个mongo目录
mkdir /mongo

# 给相应的目录添加权限
chown -R mongo:mongo /mongo

# 配置mongo的yum源
cat >> /etc/yum.repos.d/mongodb-org-4.0.repo << EOF
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=http://repo.mongodb.org/yum/redhat/\$releasever/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF

# 关闭selinux
sed -i ‘s/SELINUX=enforcing/SELINUX=disabled/‘ /etc/selinux/config
setenforce 0

# 关闭防火墙
systemctl disable firewalld
systemctl stop firewalld

二、主机规划

192.168.33.14   node-1
192.168.33.15   node-2
192.168.33.16   node-3

node-1    node-2       node-3
mongos    mongos       mongos     路由服务器,寻址
config    config       config     配置服务器,保存配置
shard1主  shard2主     shard3主    分片:保存数据
shard2从  shard3从     shard1从    副本集:备份数据,可以配置读写分离(主负责写,从负责同步数据和读)
shard3从  shard1从     shard2从

三、安装部署

# 分别在多台机器上使用mongo用户登录
sudo yum install -y mongodb-org 

# 分别在多台机器上创建mongo config server对应的目录
mkdir -p /mongo/config/{log,data,run}

# 分别在多台机器上修改config server的配置文件
cat > /mongo/config/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /mongo/config/log/mongod.log
storage:
  dbPath: /mongo/config/data
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /mongo/config/run/mongod.pid
net:
  port: 27100
  bindIp: 0.0.0.0
replication:
  replSetName: config
sharding:
  clusterRole: configsvr
EOF

# 启动所有的mongo config server服务
mongod --config /mongo/config/mongod.conf

# 登录任意一台配置服务器,初始化配置副本集
mongo --port 27100

# 创建配置
# id名要和replSetName名保持一致
config = {
   _id : "config",
    members : [
        {_id : 0, host : "192.168.33.14:27100" },
        {_id : 1, host : "192.168.33.15:27100" },
        {_id : 2, host : "192.168.33.16:27100" }
    ]
}

# 初始化副本集配置
rs.initiate(config)

# 查看分区状态
rs.status()

# 注意:其中,"_id" : "config"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的ip和port

1.配置第一个分片和副本集

# 修改mongo shard1 server的配置文件
mkdir -p /mongo/shard1/{log,data,run}

# 分别在多台机器上修改shard1 server的配置文件
cat > /mongo/shard1/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /mongo/shard1/log/mongod.log
storage:
  dbPath: /mongo/shard1/data
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /mongo/shard1/run/mongod.pid
net:
  port: 27001
  bindIp: 0.0.0.0
replication:
  replSetName: shard1
sharding:
  clusterRole: shardsvr
EOF

# 启动所有的shard1 server
mongod --config /mongo/shard1/mongod.conf

# 登陆任意一台shard1服务器,初始化副本集
mongo --port 27001

# 使用admin数据库
use admin

# 定义副本集配置
config = {
   _id : "shard1",
    members : [
        {_id : 0, host : "192.168.33.14:27001" },
        {_id : 1, host : "192.168.33.15:27001" },
        {_id : 2, host : "192.168.33.16:27001" }
    ]
}

# 初始化副本集配置
rs.initiate(config);

# 查看分区状态
rs.status()

2.配置第二个分片和副本集

# 修改mongo shard2 server的配置文件
mkdir -p /mongo/shard2/{log,data,run}

# 分别在多台机器上修改shard2 server的配置文件
cat > /mongo/shard2/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /mongo/shard2/log/mongod.log
storage:
  dbPath: /mongo/shard2/data
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /mongo/shard2/run/mongod.pid
net:
  port: 27002
  bindIp: 0.0.0.0
replication:
  replSetName: shard2
sharding:
  clusterRole: shardsvr
EOF

# 启动所有的shard2 server
mongod --config /mongo/shard2/mongod.conf

# 登陆任意一台shard2服务器,初始化副本集
mongo --port 27002

# 使用admin数据库
use admin

# 定义副本集配置
config = {
   _id : "shard2",
    members : [
        {_id : 0, host : "192.168.33.14:27002" },
        {_id : 1, host : "192.168.33.15:27002" },
        {_id : 2, host : "192.168.33.16:27002" }
    ]
}

# 初始化副本集配置
rs.initiate(config)

# 查看分区状态
rs.status()

3.配置第三个分片和副本集

# 修改mongo shard3 server的配置文件
mkdir -p /mongo/shard3/{log,data,run}

# 分别在多台机器上修改shard3 server的配置文件
cat > /mongo/shard3/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /mongo/shard3/log/mongod.log
storage:
  dbPath: /mongo/shard3/data
  journal:
    enabled: true
processManagement:
  fork: true
  pidFilePath: /mongo/shard3/run/mongod.pid
net:
  port: 27003
  bindIp: 0.0.0.0
replication:
  replSetName: shard3
sharding:
  clusterRole: shardsvr
EOF

# 启动所有的shard3 server
mongod --config /mongo/shard3/mongod.conf

# 登陆任意一台的shard3服务器,初始化副本集
mongo --port 27003

# 使用admin数据库
use admin

# 定义副本集配置
config = {
   _id : "shard3",
    members : [
        {_id : 0, host : "192.168.33.14:27003" },
        {_id : 1, host : "192.168.33.15:27003" },
        {_id : 2, host : "192.168.33.16:27003" }
    ]
}

# 初始化副本集配置
rs.initiate(config)

# 查看分区状态
rs.status()

4.配置mongos路由器

##### 注意:启动mongos是守候进程是因为/mongo/mongos/mongod.conf缺少了fork: true这个配置#######
------------------------------------------------------------------------------------------

mkdir -p /mongo/mongos/{log,data,run}

# 添加mongs的配置文件
cat > /mongo/mongos/mongod.conf << EOF
systemLog:
  destination: file
  logAppend: true
  path: /mongo/mongos/log/mongod.log
processManagement:
  fork: true
  pidFilePath: /mongo/mongos/run/mongod.pid
net:
  port: 27200
  bindIp: 0.0.0.0
sharding:
  configDB: config/192.168.33.14:27100,192.168.33.15:27100,192.168.33.16:27100
EOF

# 注意,这里configDB后面的config要与配置服务器的_id保持一致

# 启动路由服务器
mongos --config /mongo/mongos/mongod.conf

# 登录其中的一台路由节点,手动启用分片
mongo --port 27200

# 添加分片到mongos
sh.addShard("shard1/192.168.33.14:27001,192.168.33.15:27001,192.168.33.16:27001")
sh.addShard("shard2/192.168.33.15:27002,192.168.33.16:27002,192.168.33.14:27002")
sh.addShard("shard3/192.168.33.16:27003,192.168.33.14:27003,192.168.33.15:27003")

# 设置slave可读
rs.slaveOk()

5.常用操作

#没有分片是因为没有开启分片规则

# 对bike这个数据库开启分片功能
use admin
db.runCommand({"enablesharding":"bike"}) 

# 对bike数据库下的users集合按id的hash进行分片
db.runCommand({"shardcollection":"bike.users","key":{_id:‘hashed‘}})

# 启动所有的config server
mongod --config /mongo/config/mongod.conf

# 启动所有的shard1
mongod --config /mongo/shard1/mongod.conf

# 启动所有的shard2
mongod --config /mongo/shard2/mongod.conf

# 启动所有的shard3
mongod --config /mongo/shard3/mongod.conf

# 启动所有的mongos
mongos --config /mongo/mongos/mongod.conf

# 关闭服务
mongod --shutdown --dbpath /mongo/shard3/data
mongod --shutdown --dbpath /mongo/shard2/data
mongod --shutdown --dbpath /mongo/shard1/data
mongod --shutdown --dbpath /mongo/config/data

原文地址:http://blog.51cto.com/hzde0128/2299602

时间: 2024-10-08 23:15:45

MongoDB分布式集群分片的相关文章

elasticsearch与mongodb分布式集群环境下数据同步

1.ElasticSearch是什么 ElasticSearch 是一个基于Lucene构建的开源.分布式,RESTful搜索引擎.它的服务是为具有数据库和Web前端的应用程序提供附加的组件(即可搜索的存储库).ElasticSearch为应用程序提供搜索算法和相关的基础架构,用户只需要将应用程序中的数据上载到ElasticSearch数据存储中,就可以通过RESTful URL与其交互.ElasticSearch的架构明显不同于它之前的其他搜索引擎架构,因为它是通过水平伸缩的方式来构建的.不同

Linux安装ElasticSearch与MongoDB分布式集群环境下数据同步

ElasticSearch有一个叫做river的插件式模块,可以将外部数据源中的数据导入elasticsearch并在上面建立索引.River在集群上是单例模式的,它被自动分配到一个节点上,当这个节点挂掉后,river会被自动分配到另外的一个节点上.目前支持的数据源包括:Wikipedia, MongoDB, CouchDB, RabbitMQ, RSS, Sofa, JDBC, FileSystem,Dropbox等.River有一些指定的规范,依照这些规范可以开发适合于自己的应用数据的插件.

MongoDB4.0搭建分布式集群

搭建之前先了解一下MongoDB分片群集主要有如下三个组件: Shard:分片服务器,用于存储实际的数据块,实际生产环境中一个shard server 角色可以由几台服务器组成一个Peplica Set 承担,防止主机单点故障. Config Server:配置服务器,存储了整个分片群集的配置信息,其中包括chunk信息. Routers:前端路由,客户端由此接入,且让整个群集看上去像单一数据库,前端应用可以透明使用. 系统环境 Centos7.5.MongoDB4.0.2.关闭防火墙. IP

mongodb的分布式集群(3、分片)

概述 上面两篇博客都是关于mongodb的集群的配置,没有涉及到分布式,该片博客就是写mongodb的分布式,把一个整体,分成多个片,每个片部署到不同的服务器上,这个就是mongodb的分布式,即:mongodb的分片操作. 部署图 mongos服务器做的是路由服务器,config服务器就是保存相应配置的服务器,shard1和shard2就是分片服务器,这两个服务器合在一起才是一个整体,而mongos服务器就是他们的和点,所以,我们客户端只需要和mongos服务器交互就可以了,后面的,服务器自己

mongodb的分布式集群(4、分片和副本集的结合)

概述 前面3篇博客讲了mongodb的分布式和集群,其中第一种的主从复制我们几乎不用,没有什么意义,剩下的两种,我们不论单独的使用哪一个,都会出现相应的问题,比较好的一种解决方案就是,分片和副本集的集合使用,这样就比较完美了. 部署图 在这里,我们需要注意,我们mongos服务器配置成了集群,所以,我们需要在客户端上分别得添加相应的地址,这个和在副本集的那篇博客中将的内容一样,在java客户端程序的具体核心代码,在那篇博客中也给了大家,如果这点不清楚的,可以看看那篇博客. 分片集群的配置 分片集

mongodb的分布式集群(1、主从复制)

分布式集群的理解 关于分布式集群的概念有很多的解释,我比较倾向于"分布式集群"为两个概念,即,分布式是一个概念,集群是另一概念. 分布式是把一个整体系统分成多个部分,分别部署到不同的服务器上,然后由中心服务器统一控制,形成的一个对外来说为一个整体的系统.集群是把一个整体,整体的分别部署到多个服务器上的结果. 分布式和集群都是部署上的现象的描述,都涉及到多台服务器的部署,这是分布式和集群相同的地方,当然,其达到的效果也有很多一样的,但是,他们却是描述着两种不同的现象.今天就讲一下关于mo

搭建高可用mongodb集群—— 分片

从节点每个上面的数据都是对数据库全量拷贝,从节点压力会不会过大? 数据压力大到机器支撑不了的时候能否做到自动扩展? 在系统早期,数据量还小的时候不会引起太大的问题,但是随着数据量持续增多,后续迟早会出现一台机器硬件瓶颈问题的.而mongodb主打的就是海量数据架构,他不能解决海量数据怎么行!不行!“分片”就用这个来解决这个问题. 传统数据库怎么做海量数据读写?其实一句话概括:分而治之.上图看看就清楚了,如下 taobao岳旭强在infoq中提到的 架构图: 上图中有个TDDL,是taobao的一

mongodb的分布式集群(2、副本集)

概述        副本集是主从复制的一种,是一种自带故障转移功能的主从复制,解决了上述主从复制的缺点,实现主服务器发生故障后,不需人为介入,系统自动从新选举一个新的主服务器的功能. 部署图                该图是copy别人的,有兴趣的可以查看该人的博客,写的非常的棒 副本集配置 <strong> </strong> //启动服务器(登录每台服务器) mongod --dbpath d:/data/ --replSet repset //初始化副本集(登录任意一台服

postgresql分布式集群之citus

今天,利用大家的休息时间分享postgresql分布式集群,利用Citus实现分库分表. 一.Citus是什么 citus是PG的一个sharding插件,可以把PG变成一个分布式数据库.目前在苏宁有大量的生产应用跑在citus+pg的环境中.大家可以看it大咖视频. citus是一款基于PostgreSQL的开源分布式数据库,自动继承了PostgreSQL强大的SQL支持能力和应用生态(不仅仅是客户端协议的兼容还包括服务端扩展和管理工具的完全兼容). 和其他类似的基于PostgreSQL的分布