2.2config server配置服务器( configsvr角色)
2.3配置分片副本集三台机器都要配( shardsvr角色 )
1.分片集群介绍与原理
mongodb分片
- 一般用得比较少,需要较多的服务器,还有三种的角色
- 一般把mongodb的副本集应用得好就足够用了,可搭建多套mongodb复本集
mongodb分片技术
- mongodb副本集可以解决数据备份、读性能的问题,但由于mongodb副本集是每份数据都一模一样的,无法解决数据量过大问题
- mongodb分片技术能够把数据分成两份存储,假如bfd.user(bfd库,user是表)里面有100w条数据,分片能够实现50万左右存储在data1,50万左右存储在data2
- data1、data2需要使用副本集的形式,预防数据丢失。
mongodb分片集群三种角色介绍:
router角色 | mongodb的路由,提供入口,使得分片集群对外透明。router不存储数据 |
configsvr角色 | mongodb的配置角色,存储元数据信息。分片集群后端有多份存储,读取数据该去哪个存储上读取,依赖于配置角色。配置角色建议使用副本集 |
shardsvr角色 | mongodb的存储角色,存储真正的数据,建议使用副本集 |
依赖关系:
当用户通过router角色插入数据时,需要从configsvr知道这份数据插入到哪个节点, 然后执行插入动作插入数据到sharedsvr
当用户通过router角色获取数据时,需要从configsvr知道这份数据是存储在哪个节点,然后再去sharedsvr获取数据
服务器规划
172.18.1.23 | 172.18.1.24 | 172.18.1.25 |
mongos | mongos | mongos |
config server | config server | config server |
shard server1 主节点 | shard server1 副节点 | shard server1 副节点 |
shard server2 主节点 | shard server2 副节点 | shard server2 副节点 |
shard server3 主节点 | shard server3 副节点 | shard server3 副节点 |
端口分配:
mongos:27017
configsvr:28017
shard1:29017
shard2:29018
shard3:29019
2.分片集群安装
2.1解压,创建软连接,配置环境变量
#获取
[root@bfd-yiz-1p23 software]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.0.4.tgz
#解压
[root@bfd-yiz-1p23 software]# tar -xf mongodb-linux-x86_64-rhel70-4.0.4.tgz -C /opt
#改名
[root@bfd-yiz-1p23 software]# cd /opt
[root@bfd-yiz-1p23 opt]# mv mongodb-linux-x86_64-rhel70-4.0.4 mongodb
#分别建立config、log、data/shard1/data 、data/shard2/data 、data/shard3/data 5个目录,因为mongos不存储数据,只需要建立日志文件目录即可。
[root@bfd-yiz-1p23 opt] cd /opt/mongodb
[root@bfd-yiz-1p23 /opt/mongodb] mkdir -pv {conf,log,data/shard1/data,data/shard2/data,,data/shard3/data}
# 把mongdb文件夹 传到其他两台机器上
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb 172.18.1.24:/opt
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb 172.18.1.25:/opt
配置环境变量(三台机器都需要配置)
[root@bfd-yiz-1p23 opt] vim /etc/profile
# 内容
export MONGODB_HOME=/opt/mongodb
export PATH=${MONGODB_HOME}/bin:$PATH
# 使立即生效
[root@bfd-yiz-1p23 opt] source /etc/profile
2.2config server配置服务器( configsvr角色)
mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。
添加配置文件
[root@bfd-yiz-1p23 opt] vim /opt/mongodb/config/configsvr.conf
systemLog:
destination: file
logAppend: true
path: "/opt/mongodb/log/mongodb.log"
storage:
dbPath: "/opt/mongodb/data/configsvr"
journal:
enabled: true
processManagement:
fork: true
net:
port: 28017
bindIp: 0.0.0.0
replication:
replSetName: bfd
sharding:
clusterRole: configsvr
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/configsvr 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/configsvr 172.18.1.25:/opt/mongodb/
启动三台服务器的configsvr角色(三台都要启动)
[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/configsvr.conf
about to fork child process, waiting until server is ready for connections.
forked process: 27999
child process started successfully, parent exiting
登录任意一台配置服务器,初始化配置副本集
#连接
[root@bfd-yiz-1p23 opt] mongo --port 28017
#config变量
>config = { _id:"bfd",
configsvr: true,
members:[
{_id:0,host:"172.18.1.23:28017"},
{_id:1,host:"172.18.1.24:28017"},
{_id:2,host:"172.18.1.25:28017"}
]
}
rs.initiate(config)
#初始化副本集
>rs.initiate(config)
{ "ok" : 1 }
>rs.status() #查看状态
其中,"_id" : "configs"应与配置文件中配置的 replicaction.replSetName 一致,"members" 中的 "host" 为三个节点的 ip 和 port
2.3配置分片副本集三台机器都要配( shardsvr角色 )
分片集群的数据角色里面存储着真正的数据,所以数据角色一定得使用副本集。
2.3.1设置第一个分片副本集
[root@bgsbtsp0152-dqf opt] vim /opt/mongodb/config/shard1.conf
#配置文件内容
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/log/shard1.log
storage:
dbPath: /opt/mongodb/data/shard1/data
journal:
enabled: true
processManagement:
fork: true
net:
port: 29017
bindIp: 0.0.0.0
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard1 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard1 172.18.1.25:/opt/mongodb/
启动三台服务器的shard1 server(三台都要启动)
[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/shard1.conf
about to fork child process, waiting until server is ready for connections.
forked process: 9997
child process started successfully, parent exiting
登陆任意一台服务器,初始化副本集
[root@bgsbtsp0152-dqf opt] mongo --port 29017
#使用admin数据库
use admin
#定义副本集配置
>config = {
... _id : "shard1",
... members : [
... {_id : 0, host : "172.18.1.23:29017" },
... {_id : 1, host : "172.18.1.24:29017" },
... {_id : 2, host : "172.18.1.25:29017" }
... ]
... }
#初始化副本集配置
>rs.initiate(config);
{ "ok" : 1 }
2.3.2设置第二个分片副本集:
[root@bfd-yiz-1p23 opt] vim /opt/mongodb/config/shard2.conf
#配置文件内容
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/log/shard2.log
storage:
dbPath: /opt/mongodb/data/shard2/data
journal:
enabled: true
processManagement:
fork: true
net:
port: 29018
bindIp: 0.0.0.0
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard2 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard2 172.18.1.25:/opt/mongodb/
启动三台服务器的shard2 server(三台都要启动)
[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/shard2.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10191
child process started successfully, parent exiting
登陆任意一台服务器,初始化副本集
[root@bfd-yiz-1p23 opt] mongo --port 29018
#使用admin数据库
use admin
#定义副本集配置
>config = {
... _id : "shard2",
... members : [
... {_id : 0, host : "172.18.1.23:29018" },
... {_id : 1, host : "172.18.1.24:29018" },
... {_id : 2, host : "172.18.1.25:29018" }
... ]
... }
#初始化副本集配置
>rs.initiate(config);
{ "ok" : 1 }
2.3.2设置第三个分片副本集
[root@bfd-yiz-1p23 opt] vim /opt/mongodb/config/shard3.conf
#配置文件内容
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/log/shard3.log
storage:
dbPath: /opt/mongodb/data/shard3/data
journal:
enabled: true
processManagement:
fork: true
net:
port: 29019
bindIp: 0.0.0.0
replication:
replSetName: shard3
sharding:
clusterRole: shardsvr
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard3 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/shard3 172.18.1.25:/opt/mongodb/
启动三台服务器的shard3 server(三台都要启动)
[root@bfd-yiz-1p23 opt] numactl --interleave=all mongod -f /opt/mongodb/config/shard3.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10275
child process started successfully, parent exiting
登陆任意一台服务器,初始化副本集
[root@bfd-yiz-1p23 opt] mongo --port 29019
#使用admin数据库
use admin
#定义副本集配置
>config = {
... _id : "shard3",
... members : [
... {_id : 0, host : "172.18.1.23:29019" },
... {_id : 1, host : "172.18.1.24:29019" },
... {_id : 2, host : "172.18.1.25:29019" }
... ]
... }
#初始化副本集配置
>rs.initiate(config);
{ "ok" : 1 }
2.3配置路由服务器mongos(路由角色)
mongodb中的router(mongos)角色只负责提供一个入口,不存储任何的数据,router最重要的配置是指定configsvr的地址,使用副本集ip+端口的方式指定配置多个router,任何一个都能正常的获取数据。
vim /opt/mongodb/mongos/config/mongos.conf
#配置文件内容如下:
systemLog:
destination: file
logAppend: true
path: /opt/mongodb/log/mongos.log
processManagement:
fork: true
net:
port: 27017
bindIp: 0.0.0.0
sharding:
configDB: bfd/172.18.1.23:28017,172.18.1.24:28017,172.18.1.25:28017
#发送到其他两台
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/mongos 172.18.1.24:/opt/mongodb/
[root@bfd-yiz-1p23 opt] scp -r /opt/mongodb/mongos 172.18.1.25:/opt/mongodb/
启动三台服务器的mongos server(三台机器)
[root@bfd-yiz-1p23 opt] numactl --interleave=all mongos -f /opt/mongodb/config/mongos.conf
至此,以上三种角色的服务都已经创建并启动成功。
3.启用分片
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,不过应用程序连接到mongos路由服务器并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
登陆任意一台mongos,给分片集群添加数据角色,数据角色为副本集的方式。
mongo --port 27017
#使用admin数据库
mongos> use admin
#串联路由服务器与分配副本集
mongos> sh.addShard("shard1/172.18.1.23:29017,172.18.1.24:29017,172.18.1.25:29017")
mongos> sh.addShard("shard2/172.18.1.23:29018,172.18.1.24:29018,172.18.1.25:29018")
mongos> sh.addShard("shard3/172.18.1.23:29019,172.18.1.24:29019,172.18.1.25:29019")
mongos> sh.status() #添加完后,我们看到下图中分片的相关信息
我们可以看到分片集群的信息:
4.测试验证
目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。
#针对某个数据库的某个表使用hash分片存储,分片存储就会同一个colloection分配两个数据角色
mongos> use admin
mongos> db.runCommand( { enablesharding :"bfd"});
#指定数据库里需要分片的集合和片键
mongos> db.runCommand( { shardcollection : "bfd.myuser",key : {_id: "hashed"} } )
mongos>exit
我们设置bfd的 myuser表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。
测试分片配置结果
[root@bgsbtsp0152-dqf opt] mongo --port 27017
#插入测试数据
mongos> use bfd
mongos> for(i=1; i<=500;i++){
... db.myuser.insert( {name:'mytest'+i, age:i} )
... }
WriteResult({ "nInserted" : 1 })
mongos> db.myuser.count()
500 #我们可以通过路由角色看到插入到了500条记录。
我们去shard1上去查看。
我们去shard2上去查看。
我们去shard3上去查看。
我们再看其中的一个从节点,看看是否也同步到数据了。
发现shard3的从分片上也有了和主shard3分片上一摸一样的数据,可以看到500条记录被分到三个分片上存储了。至此mongodb的分片部署已经完成。