|
个人理解:搭建集群是为了数据的热机备份,保证了数据的安全。也就是说在一台数据库挂掉的情况下,在没有人为的干预下就能自动的启动从机继续提供数据库服务。保证了数据的持续写入和读取,不会对业务造成影响。分片的目的有两个,一是在数据写入压力过大的时候,分片能起到分担写入压力的作用;二是在数据库的硬盘不足的时候分片可以实现动态扩容的意义。
下面我们开始我们的mongodb探索之旅吧!!
准备了六台linux服务器,系统centos。vmware虚拟机ok
下载了mongodb的安装包mongodb-linux-x86_64-2.6.5.gz,该安装包解压即可使用,不需要安装。六台机器命名为server-1/server-2/server-3/server-4/server-5/server-6(这样命名为了下面便于理解)
1、配置机器server-1的ip配置
>vi /etc/sysconfig/network-scripts/ifcfg-eth0
修改为:
DEVICE=eth1
HWADDR=00:0C:29:3E:A0:4D
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
#此处为你的ip地址
IPADDR=192.168.136.74
NETMASK=255.255.255.0
GATEWAY=192.168.136.254
保存退出
重启机器(如果ip未改变成功,确认一下HWADDR修改的是否是本机的mac,命令ifcfg -a)
(其他五台服务器同理)
2.集群设计方案
把server-1/server-2/server-3设置为shard1
把server-4/server-5/server-6设置为shard2
把server-1和server-4设置为primary(主)
把server-2和server-5设置为secondary(从)
把server-3和server-6设置为arbiter (投票决策者)
需要在server-1、server-2、server-3上面分别设置路由机制mongos和控制mongo-config
3、开始配置
解压缩后的目录修改为mongodb(方便后面配置)
在解压的mongodb的根目录下创建一个配置文件目录
>mkdir conf
同理需要建立数据data和日志log的存储目录(这个是因为mongodb无法自己创建目录)
mkdir -p /data
mkdir -p /data/log
shard1的三台机器都按下面写配置文件(vi shard11.conf)
Shard11.conf
replSet=shard1
port=11721
dbpath=../data/shard11
logpath=..data/log/shard11.log
logappend=true
fork=true
oplogSize=100
shardsvr=true
directoryperdb=true
然后:
启动:./mongod -f ../conf/shard11.con
在shard2的所有的机器都如此处理,其中的端口号需要不同
当所有的机器都启动了之后,我们需要将片中的机器关联起来
连接shard1中的任一机器(端口号为你在shard1中设置的端口)
执行命令
./mongo 127.0.0.1:11721/admin
输入:config={_id:'shard1',members:[{_id:0,host:"192.168.136.74:11721",priority:2},{_id:1,host:"192.168.136.76:11721",priority:1},{_id:2,host:"192.168.136.78:11721",arbiterOnly:true}]}
初始化,执行
rs.initiate(config)
绑定成功(server-1/server-2/server-3)
同理将shard2搞定
然后我们要配置mongos和mongos config
Shard1 配置config server 三台都配
Vi config.conf
dbpath=/root/mongodb/data/config
configsvr = true
port = 40000
logpath =/root/mongodb/data/configlog/config.log
logappend = true
fork = true
分别启动配置服务
./mongod -f ../conf/config.conf
启动路由节点(注意端口号)
vi mongos_config.conf
configdb=192.168.136.74:40000,192.168.136.76:40000,192.168.136.78:40000
port = 50000
chunkSize = 5
logpath =/root/mongodb/data/log/mongos.log
logappend=true
fork = true
启动
./mongos -f ../conf/mongos_config.conf
配置sharding
./mongo 127.0.0.1:50000/admin
添加shard集合
db.runCommand( { addshard : "shard1/192.168.136.74:11721,192.168.136.76:11721,192.168.136.78:11721",name:"shard1",maxsize:20480});
db.runCommand( { addshard : "shard2/192.168.136.71:11722,192.168.136.75:11722,192.168.136.77:11722",name:"shard2",maxsize:20480});
查看shards
db.runCommand({listshards:1})
激活数据库分片
创建数据库test,创建表mycollection
db.runCommand( { enablesharding : “test” } );(手动敲入)
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还需单独对collection做些操作
Collection分片
db.runCommand( { shardcollection : “”,key : });
例如:db.runCommand( { shardcollection : "test.mycollection",key : {_id: 1} } )
例如:db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
搭建好之后进行性能测试
测试案例:
1.插入10万条数据(此处可以写测试案例的程序来进行压力测试)
2.插入数据过程中,Shard11强制关机(192.168.136.74),检查发现shard12已经转变为primary,插入10万条数据。耗时7分41秒,重启Shard11后发现数据迅速的从主机同步过来,同时shard11又称为了primary
3.插入100万条数据,耗时18分钟,数据增大后插入速度反而增快
4.多线程测试
调用mongodb client (线程池资源,默认10个线程)
插入10万条数据,耗时62.881秒
插入100万条 耗时658秒
补充说明,总算完成了mongodb的初步学习,主要完成的工作就是搭建了简单的数据库集群。集群的具有的功能包括数据库的备份(一主一从),分片处理来缓解插入数据压力过大的问题。其中遇到启动失败或者配置失败等问题,一定要仔细检查其中的配置以及端口启用或者是目录创建失败等问题。
心得:总体感觉搭建一个简单的mongodb数据库集群还是很容易的,关键是对细节以及性能、参数设置的理解上。此外,数据库的设计应该是根据项目的需求而设。不一定是设计了集群和分片就是最好的。
|
|
|