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配置密码了.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342