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.

posted on 2021-11-03 20:34  梦幻朵颜  阅读(916)  评论(0编辑  收藏  举报