Mongodb 3.4分片+副本集实例

配置服务器,全部设置为静态地址

转到/home目录,创建一个mongo目录用做实验,我们需要创建如下的目录层级和空的配置文件:

/home/mongo/conf/ # 存放各种角色的服务器的的配置文件的文件夹

/home/mongo/conf/config.conf # 配置服务器的配置文件
/home/mongo/conf/mongos.conf # mongos的配置文件
/home/mongo/conf/shard1.conf # 第一个分片的配置文件
/home/mongo/conf/shard2.conf # 第二个分片的配置文件
/home/mongo/conf/shard3.conf #第三个分片的配置文件

/home/mongo/config/ # 配置服务器的文件夹

/home/mongo/config/data/ # 配置服务器的数据库目录
/home/mongo/config/log/ # 配置服务器的日志目录

/home/mongo/mongos/ # mongos服务器的文件夹

/home/mongo/mongos//log/ # 配置服务器的日志目录

/home/mongo/shard1/ # shard1的文件夹

/home/mongo/shard1/data/ # shard1的数据库目录
/home/mongo/shard1/log/ # shard1的日志目录

/home/mongo/shard2/ # shard2的文件夹

/home/mongo/shard2/data/ # shard2的数据库目录
/home/mongo/shard2/log/ # shard2的日志目录

/home/mongo/shard3/ # shard3的文件夹

/home/mongo/shard3/data/ # shard3的数据库目录
/home/mongo/shard3/log/ # shard3的日志目录

服务器角色有以下几种:
1. mongos

数据库集群请求的入口,所有的请求都通过mongos进行协调,mongos是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上。在生产环境通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。

2. config server

配置服务器,存储所有数据库元信息(路由、分片)的配置。由于mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据。mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态,这样 mongos 就能继续准确路由。在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,防止数据丢失!配置服务器保存数据要求的空间不大,硬件要求也不高.但必须保持高可用性.

3. shard

shard,分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程。将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处理更大的负载。基本思想就是将集合切成小块,这些块分散到若干片里,每个片只负责总数据的一部分,最后通过一个均衡器来对各个分片进行均衡(数据迁移)。分片是数据的主要存储位置.一般分片的都配置成副本集的形式,一个分片往往是一个副本集,以提高数据可靠性.

4. replica set

副本集,是shard的备份,防止shard挂掉之后数据丢失。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

其中,副本集中主要有以下几种角色:

1. primary

主服务器,具备读写功能,数据最新,副本集中的其他服务器从此服务器同步数据.

2. secondary

从服务器,从主服务器同步数据.在主服务器宕机的时候,可以通过选举竞争成为主服务器.除非显示的执行rs.salveOk(),否则不能从从服务器上读取数据,一般也不允许向从服务器写入数据.

3. arbiter

仲裁服务器.不保存数据,仅仅是为了维持奇数的选举成员.负载很小.

本例的物理服务器共三台,他们分别担任的角色如下表所示:

192.168.99.60 192.168.99.61 192.168.99.62
mongos mongos mongos
config server config server config server
shard1 primary shard1 secondary shard1 arbiter
shard2 secondary shard2 arbiter shard2 primary
shard3 arbiter shard3 primary shard3 secondary

端口分配如下:

角色 端口
mongos 20000
config server 21000
shard1 27001
shard2 27002
shard3 27003
编辑config server配置文件

mongodb 现在要求配置服务器也必须以副本集方式运行.
注意,除了yaml以外,mongodb还支持这种 = 的配置语法.
`
vi /home/mongo/conf/config.conf

配置内容

pidfilepath = /home/mongo/config/log/configsrv.pid # pid文件位置
dbpath = /home/mongo/config/data # 数据库目录
logpath = /home/mongo/config/log/configsvr.log # 日志目录
logappend = true # 日志追加

bind_ip = 0.0.0.0
port = 21000
fork = true # 后台运行
configsvr = true # 配置服务器必须有这一项,用于标识身份

副本集名称

replSet=configs

设置最大连接数

maxConns=20000
`

启动并初始化 config server副本集

三台配置完以后,分别启动这三台 config server
mongod -f /home/mongo/conf/config.conf
登录其中的一台,初始化副本集.
`

连接

mongo --port 21000

config变量

config = {
... _id : "configs",
... members : [
... {_id : 0, host : "192.168.99.60:21000" },
... {_id : 1, host : "192.168.99.61:21000" },
... {_id : 2, host : "192.168.99.62:21000" }
... ]
... }

初始化副本集

rs.initiate(config)
`

特别提醒,rs,initiate() 方法不能在arbiter角色的主机上运行,(config server的副本集中没有arbiter主机)
配置 shard1

配置文件
`
vi /home/mongo/conf/shard1.conf

配置文件内容

——————————————–

pidfilepath = /home/mongo/shard1/log/shard1.pid
dbpath = /home/mongo/shard1/data
logpath = /home/mongo/shard1/log/shard1.log
logappend = true

bind_ip = 0.0.0.0
port = 27001
fork = true

打开web监控

httpinterface=true
rest=true

副本集名称

replSet=shard1

declare this is a shard db of a cluster;

shardsvr = true

设置最大连接数

maxConns=20000
启动三台服务器的shard1 server
mongod -f /home/mongo/conf/shard1.conf
登陆任意一台服务器,初始化副本集
mongo --port 27001

使用admin数据库

use admin

定义副本集配置,第三个节点的 "arbiterOnly":true 代表其为仲裁节点。

config = {
... _id : "shard1",
... members : [
... {_id : 0, host : "192.168.99.60:21000" },
... {_id : 1, host : "192.168.99.61:21000" },
... {_id : 2, host : "192.168.99.62:21000", arbiterOnly: true }
... ]
... }

初始化副本集配置

rs.initiate(config);
`
如此类推,分别把shard2,shard3都配置好并初始化副本集.

注意不要在仲裁主机上进行副本集的初始化动作,会报错的.
配置 mongos

由于mongos需要从配置服务器读取配置,并且mongos需要启用分片,所以要先启动配置服务器的副本集和shard的分片副本集们.
先配置mongos
`
vi /home/mongo/conf/mongos.conf

内容

pidfilepath = /home/mongo/mongos/log/mongos.pid
logpath =/home/mongo/mongos/log/mongos.log
logappend = true

bind_ip = 0.0.0.0
port = 20000
fork = true

监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字

configdb = configs/192.168.99.60:21000,192.168.99.61:21000,192.168.99.62:21000

设置最大连接数

maxConns=20000
然后再分别启动3台mongos
mongos -f /home/mongo/conf/mongos.conf # 注意这里不是mongod.而是mongos
`

启用分片

登陆任意一台mongos
`
mongo --port 20000

使用admin数据库

use admin

串联路由服务器与分配副本集

sh.addShard("shard1/192.168.99.60:27001,192.168.99.61:27001,192.168.99.62:27001")
sh.addShard("shard2/192.168.99.60:27002,192.168.99.61:27002,192.168.99.62:27002")
sh.addShard("shard3/192.168.99.60:27003,192.168.99.61:27003,192.168.99.62:27003")

查看集群状态

sh.status()
`

开始数据库的分片

sh.enableSharding("db_name")

对表进行分片,注意片键的选择要慎重.

sh.shardCollection("db_name.collection_name", {key_name":1})

测试

连接到mongos的20000端口
mongo --port 192.168.99.65:20000 sh.enableSharding(some_db) sh.shardCollection("some_db.some_collection",{"no":1}) use some_db for(var i=0;i<1000000;i++){db.some_collection.save({"no":i});}
运行结束后,查看分片的情况
`
db.some_collection.stats()

中间会有一段类似
    "shards" : {
            "shard1" : {
                    "ns" : "testdb.table1",
                    "count" : 42183,
                    "size" : 0,
                    ...
                    "ok" : 1
            },
            "shard2" : {
                    "ns" : "testdb.table1",
                    "count" : 38937,
                    "size" : 2180472,
                    ...
                    "ok" : 1
            },
            "shard3" : {
                    "ns" : "testdb.table1",
                    "count" :18880,
                    "size" : 3419528,
                    ...
                    "ok" : 1
            }
    },

mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos. 关闭时,直接killall杀掉所有进程
killall mongod
killall mongos
`

有关账户和密码:

1.如果要开启auth 的话,config server配置文件要加上
auth = true
keyFile = /home/cluster/mongodb_key/autokey
这两句话.

  1. mongos的配置文件里加上
    keyFile = /home/cluster/mongodb_key/autokey 这一句配置.
    (mongos的配置文件里不要加上auth = true,会报错)
    3.mongos配置文件无需开auth,mongos的登录的管理员账户是config server的里账户.
    4.从mongos登录时的数据库,如果你以前配置过密码那就不需要重新在mongos配置密码了.

你可能感兴趣的:(Mongodb 3.4分片+副本集实例)