配置服务器,全部设置为静态地址
转到/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
这两句话.
- mongos的配置文件里加上
keyFile = /home/cluster/mongodb_key/autokey 这一句配置.
(mongos的配置文件里不要加上auth = true,会报错)
3.mongos配置文件无需开auth,mongos的登录的管理员账户是config server的里账户.
4.从mongos登录时的数据库,如果你以前配置过密码那就不需要重新在mongos配置密码了.