zoukankan      html  css  js  c++  java
  • mongodb-4.4.10版本集群搭建:可复制集、分片集群

    mongo除了单机部署,那么集群搭建可分为:可复制集、分片集群。

    可复制集:每个master主后面都有N个slave备用节点。(生产环境推荐的部署模式

    分片集群:同时拥有多个可复制集,每个可复制集有自己的master和slave节点。

    【可复制集】

    读写分离,负载均衡,避免数据丢失,保障数据安全,提高系统安全性。

    最少3节点,最大50节点。

    自动化灾备机制,主节点宕机后通过选举产生新主机;提高系统健壮性;7个选举节点上限

    通过日志同步,保证master和slave的数据是统一的。

    查询会优先从master读。

    【可复制集搭建步骤】

    第一步:配置mongodb.conf 

    storage:
      #数据文件存放目录 
      dbPath: "/Users/xxx/soft/mongodb-macos-x86_64-4.4.10/data"
    systemLog:
      #日志文件存放目录
      destination: file
      path: "/Users/xxx/soft/mongodb-macos-x86_64-4.4.10/log"
    net:
      #本地监听 IP,0.0.0.0 表示本地所有 IP,多个IP用逗号分隔。  #记住此处禁用localhost
      bindIp: 0.0.0.0,192.168.2.100,127.0.0.1
      # 端口,默认 27017,可以自定义
      port: 27017
    processManagement:
      #以守护程序的方式启用,即在后台运行
      fork: true
    setParameter:
      #是否需要验证权限登录(用户名和密码)
      enableLocalhostAuthBypass: false 
    replication:
      #集群搭建的slave信息
      relSetName: configRS   #集群名称
      oplogSizeMB: 50        #oplog盖子集合大小

    记住这里的集群名称叫 configRS。盖子集合的概念请参考《mongodb-4.4.10版本SQL查询进阶,mongodb与mysql的select SQL大比拼

    node1的config文件参照上面配置,然后node2 node3的config文件也按照上面的配置复制,只需要更改端口号、log存放目录、dbpath目录就好了。

    第二步:启动mongo

    依次启动3个mongodb节点命令:

    bin/mongod --config mongo_node1.conf
    bin/mongod --config mongo_node2.conf
    bin/mongod --config mongo_node3.conf

    然后使用 ps -ef | grep mongo 命令查看是否成功启动了3个mongodb

    第三步:决定哪个节点为master主节点

    假设3个节点的端口号是:27017、27018、27019

    mongo --port 27017      连接上你选中做为主节点的节点

    use admin                      回到管理目录

    rs.initiate({                      创建集群命令,指定master节点到host参数
          _id: "configRS",        这里的集合命名一定需与mongodb.conf的集群名字相同
          version: 1,
          members: [
              { _id: 0, host : "192.168.0.128:27017" }
          ]
    });
    rs.add("192.168.0.128:27018");    //第2个节点添加到集群
    rs.add("192.168.0.128:27019");    //第3个节点添加到集群
    rs.add...                                       //第N个节点添加到集群

    第一次rs.initiate命令如果成功了,会有结果反馈: { "ok":1 } 和其他一些cluster信息。然后你在命令行里的 “>” 会变成 "configRS:SECONDARY"           表示刚才那个命令开始了一个集群模式

    第二次执行rs.add命令时,命令行里的 “>” 会变成 "configRS:PRIMARY"       表示你已经是一个集群模式里的master了

    注意:在从节点里("configRS:SECONDARY")需要查看数据或集合时,需执行 rs.slaveOk()指令才可以,否则会报错:"not master and slaveOk=false",即使该slave节点因为master节点挂掉当前已经通过选举刚刚变成了master节点,也需要执行rs.slaveOk()指令才可以看见数据或者集合。

    敲黑板:要保证大多数集群存活,才可以选举出master,如果只剩一个节点,那就没有master了,如果没有master,将不能insert数据,不能做事务操作,即使rs.slaveOk()也不能。

    第四步:集群验证

    ps -ef | grep mongo     列出所有mongodb节点

    kill -9 xxx                      干掉主节点

    mongo --port 27018     连接到从节点上

    configRS:PRIMARY>                          此时从节点已经变成了主节点

    第五步:springboot连接可复制集群demo

    在springboot里注册一个mongoClient:

    @Bean(name="mongo")
       public MongoClient mongoClient() {
           
    //        MongoCredential createCredential = 
    //                MongoCredential.createCredential("lison", "lison", "lison".toCharArray());
            
            WriteConcern wc = WriteConcern.W1.withJournal(true);      //制定写策略,就是在集群里怎么写才算完成事务,参考《mongodb-4.4.10版本的存储引擎与写策略
            MongoClientOptions mco = MongoClientOptions.builder()
                    .writeConcern(wc)
                    .readPreference(ReadPreference.secondary())            // 配置读策略:优先从slave读
                    .connectionsPerHost(100)                                           // 每台主机连接数100,默认连接数10
                    .threadsAllowedToBlockForConnectionMultiplier(5)      // 线程队列数,默认值5,与上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
                    .maxWaitTime(120000)
                    .connectTimeout(10000)
                    .build();
            List<ServerAddress> asList = Arrays.asList(
                    new ServerAddress("192.168.2.100", 27017));

           MongoClient client = new MongoClient(asList, mco);
           return client;
       }

    【分片集群】

    分片集群和可复制集的不同点是:
         可复制集:每个slave数据都是全部拷贝自master节点,就是master里的user集合有多少数据,slave里的user集合就有多少数据。
         分片集群:更像是mysql里的分库分表,一个user集合的数据通过hash算法分布式存储到不同的分片上,然后为了数据的高可用,你可以在每个分片上做一个可复制集。

    分片集群有3大组件概念:
         分片:在集群中唯一存储数据的位置,可以是单个mongo服务器,也可以是可复制集,每个分区上存储部分数据;生产环境推荐使用可复制集
         mongos路由:由于分片之存储部分数据,需要mongos路由将读写操作路由到对应的分区上;mongos提供了单点连接集群的方式,轻量级、非持久化所以通常mongos和应用部署在同一台服务器上;
         配置服务器:存储集群的元数据,元数据包括:数据库、集合、分片的范围位置以及跨片数据分割和迁移的日志信息;mongos启动时会从配置服务器读取元数据信息在内存中;配置服务器最低3台;

    分片集群搭建步骤:

    第一步:搭建3个分片,也就是3套可复制集

    按照上面可复制集的搭建步骤搭建3套可复制集,注意,每个可复制集的集群名称必须不一样。注意 mongodb.conf 配置文件里要加上分片配置信息:

    sharding:
      clusterRole: shardsvr  #配置这个信息就表示当前集群是分片集群。     #注意这个值的不同,可以区分当前mongo节点是分片节点,还是配置节点,还是路由节点

     假设:

    【第一套可复制集】端口:27024、27025、27026,集群名称:configRS
    【第二套可复制集】端口:27027、27028、27029,集群名称:configRS2
    【第三套可复制集】端口:27030、27031、27032,集群名称:configRS3

    bin/mongod --config /soft/mongosplit/node27024/mongodb.conf
    bin/mongod --config /soft/mongosplit/node27025/mongodb.conf
    bin/mongod ...      以这种方式,分别启动以上9个节点
    ps -ef | grep mongo     查看是否9个节点都启动成功

    第二步:搭建3个配置服务器

    在mongodb.conf 配置文件里要加上:

    sharding:
      clusterRole: configsvr     #注意这个值的不同,可以区分当前mongo节点是分片节点,还是配置节点,还是路由节点

    假设启动的3个配置服务器端口是:27040、27041、27042
    bin/mongod --config /soft/mongosplit/node27040/mongodb.conf
    bin/mongod --config /soft/mongosplit/node27041/mongodb.conf
    bin/mongod ...      以这种方式,分别启动以上3个配置节点

    ps -ef | grep mongo     查看是否12个节点都启动成功(9个分片节点 + 3个配置节点)

    第三步:搭建分片集群的路由

    在mongodb.conf配置文件里要加上:

    sharding:
      configDB: editRS/192.168.2.100:27024,192.168.2.100:27027,192.168.2.100:27030    #仅配置每个分片里的可复制集里的master节点,这里共3个分片也就是3套可复制集,也就是3个master节点
     #注意路由节点的conf配置文件里是没有dbPath配置的,它的配置信息全都从配置服务器里取

    bin/mongos --config /soft/mongosplit/node27050/mongodb.conf &      启动路由命令。注意这里的启动命令不是mongod了,而是mongos。此时用 ps -ef | grep mongo 命令就能查到13个节点了,其中一个是mongos节点

    >mongo --port 27050                    进入路由节点

    mongos>                                        进入路由节点成功,因为在这里显示mongos了

    use admin                                       进入管理目录

    sh.addShard("configRS/192.168.2.100:27024,192.168.2.100:27025,192.168.2.100:27026");     添加第1个分片

    sh.addShard("configRS2/192.168.2.100:27027,192.168.2.100:27028,192.168.2.100:27029");     添加第2个分片

    sh.addShard("configRS3/192.168.2.100:27030,192.168.2.100:27031,192.168.2.100:27032");     添加第3个分片

    user lison                                        进入lison数据库

    sh.enableSharding("lisonSharding")                启用一个名叫lisonSharding的分片

    sh.shardCollection("lison.orders",  {"useCode":"hashed"}  )                对lison数据库的orders集合启用分片,使用hash算法进行分片的分布式存储。命令成功的话会返回{"ok":1}等信息

    第四步:springboot连接分片集群demo

    在springboot里注册一个mongoClient:

    @Bean(name="mongo")
    public MongoClient mongoClient() {
            WriteConcern wc = WriteConcern.W1.withJournal(true);      //制定写策略,就是在集群里怎么写才算完成事务,参考《mongodb-4.4.10版本的存储引擎与写策略
            MongoClientOptions mco = MongoClientOptions.builder()
                    .writeConcern(wc)
                    .readPreference(ReadPreference.secondary())            // 配置读策略:优先从slave读
                    .connectionsPerHost(100)                                           // 每台主机连接数100,默认连接数10
                    .threadsAllowedToBlockForConnectionMultiplier(5)      // 线程队列数,默认值5,与上面connectionsPerHost值相乘的结果就是线程队列最大值。如果连接线程排满了队列就会抛出“Out of semaphores to get db”错误。
                    .maxWaitTime(120000)
                    .connectTimeout(10000)
                    .build();
            List<ServerAddress> asList = Arrays.asList( new ServerAddress("192.168.2.100", 27050));      // 这里直接连接到路由节点即可

           MongoClient client = new MongoClient(asList, mco);
           return client;
       }

    事务支持版本

    mongo4.0版本,只有可复制集是支持事务的,分片集群(replica sets)是不支持事务的。

    而在最新的mongo4.2版本中,分片集群也可以支持事务了。

    集群注意事项

    生产环境中打开profile,便于优化系统性能

    生产环境中打开auth模式,保障系统安全

    end.

    支付宝扫一扫,为女程序员打赏!
    作者:梦幻朵颜
    版权:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    【业务自动化】iTop,全面支持ITIL流程的一款ITSM工具
    【Hadoop】HDFS源码解读
    【Hadoop】Hadoop RPC框架线程模型
    电商网站项目(一)用户模块---门户
    jdk1.5后枚举类的定义规则
    回顾static与final的作用
    @Springboot搭建项目controller层接收json格式的对象失败
    把一个文件中所有文件名或者文件路径读取到一个txt文件,然后在matlab中读取
    springboot用mybatis-generator自动生成mapper和model
    hibernate、mybatis、spring data 的对比
  • 原文地址:https://www.cnblogs.com/zhuwenjoyce/p/15505601.html
Copyright © 2011-2022 走看看