IP1:192.168.5.101 HostName:node1
IP2:192.168.5.102 HostName:node2
IP3:192.168.5.103 HostName:node3
IP信息
DEVICE=eth0
HWADDR=00:0C:29:52:58:AF
TYPE=Ethernet
UUID=13b0cf4a-cb35-4a62-948f-3ba25721cfb8
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.5.101
NETMASK=255.255.255.0
GATEWAY=192.168.5.1
修改主机名
1、hostname node1
#设置主机名为lvs.liufeitest
2、vi /etc/sysconfig/network #编辑配置文件
HOSTNAME= node1
#修改localhost.localdomain为node1
:wq! #保存退出
3、vi /etc/hosts #编辑配置文件
加一条
127.0.0.1 node1
:wq! #保存退出
shutdown -r now #重启系统
分别在每台机器建立mongos 、config 、 shard1 、shard2、shard3 五个目录。
因为mongos不存储数据,只需要建立日志文件目录即可。
#建立mongos目录
mkdir -p /data/mongodb/mongos/log
#建立config server 数据文件存放目录
mkdir -p /data/mongodb/config/data
#建立config server 日志文件存放目录
mkdir -p /data/mongodb/config/log
#建立shard1 数据文件存放目录
mkdir -p /data/mongodb/shard1/data
#建立shard1 日志文件存放目录
mkdir -p /data/mongodb/shard1/log
#建立shard2 数据文件存放目录
mkdir -p /data/mongodb/shard2/data
#建立shard2 日志文件存放目录
mkdir -p /data/mongodb/shard2/log
#建立shard3 数据文件存放目录
mkdir -p /data/mongodb/shard3/data
#建立shard3 日志文件存放目录
mkdir -p /data/mongodb/shard3/log
规划5个组件对应的端口号,由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。
这个端口可以自由定义,在本文
mongos为 20000,
config server 为 21000,
shard1为 22001 ,
shard2为22002,
shard3为22003.
在每一台服务器分别启动配置服务器。
/data/mongodb/bin/mongod --configsvr --dbpath /data/mongodb/config/data --port 21000 --logpath /data/mongodb/config/log/config.log --fork
注意:操作时出现-bash: /data/mongodb/bin/mongod: Permission denied
Permission denied 这样的字样表示没有权限
下面是解决权限问题命令
# sudo chmod 777 /data/mongodb/
# chmod -R 700 /data/mongodb/bin/
service iptables stop 关掉防火墙
在每一台服务器分别启动mongos服务器
/data/mongodb/bin/mongos --configdb 192.168.5.101:21000,192.168.5.102:21000,192.168.5.103:21000 --port 20000 --logpath /data/mongodb/mongos/log/mongos.log --fork
配置各个分片的副本集。
#在每个机器里分别设置分片1服务器及副本集shard1
/data/mongodb/bin/mongod --shardsvr --replSet shard1 --port 22001 --dbpath /data/mongodb/shard1/data --logpath /data/mongodb/shard1/log/shard1.log --fork --nojournal --oplogSize 10
#为了快速启动并节约测试环境存储空间,
这里加上 nojournal 是为了关闭日志信息,在我们的测试环境不需要初始化这么大的redo日志。
同样设置 oplogsize是为了降低 local 文件的大小,
oplog是一个固定长度的 capped collection,它存在于”local”数据库中,用于记录Replica Sets操作日志。注意,这里的设置是为了测试!
#在每个机器里分别设置分片2服务器及副本集shard2
/data/mongodb/bin/mongod --shardsvr --replSet shard2 --port 22002 --dbpath /data/mongodb/shard2/data --logpath /data/mongodb/shard2/log/shard2.log --fork --nojournal --oplogSize 10
#在每个机器里分别设置分片3服务器及副本集shard3
/data/mongodb/bin/mongod --shardsvr --replSet shard3 --port 22003 --dbpath /data/mongodb/shard3/data --logpath /data/mongodb/shard3/log/shard3.log --fork --nojournal --oplogSize 10
任意登陆一个机器,比如登陆192.168.5.101,连接mongodb
root@node1 bin]# ./mongo 127.0.0.1:22001
#使用admin数据库
use admin
#定义副本集配置
config = { _id:"shard1", members:[
{_id:0,host:"192.168.5.101:22001"},
{_id:1,host:"192.168.5.102:22001"},
{_id:2,host:"192.168.5.103:22001",arbiterOnly:true}
]
}
#初始化副本集配置
rs.initiate(config);
#设置第二个分片副本集
root@node1 bin]# ./mongo 127.0.0.1:22002
#使用admin数据库
use admin
#定义副本集配置
config = { _id:"shard2", members:[
{_id:0,host:"192.168.5.101:22002"},
{_id:1,host:"192.168.5.102:22002"},
{_id:2,host:"192.168.5.103:22002",arbiterOnly:true}
]
}
1
2
#初始化副本集配置
rs.initiate(config);
#设置第三个分片副本集
root@node1 bin]# ./mongo 127.0.0.1:22003
#使用admin数据库
use admin
#定义副本集配置
config = { _id:"shard3", members:[
{_id:0,host:"192.168.5.101:22003"},
{_id:1,host:"192.168.5.102:22003"},
{_id:2,host:"192.168.5.103:22003",arbiterOnly:true}
]
}
#初始化副本集配置
rs.initiate(config);
目前搭建了mongodb配置服务器、路由服务器,各个分片服务器,
不过应用程序连接到 mongos 路由服务器
并不能使用分片机制,还需要在程序里设置分片配置,让分片生效。
root@node1 bin]# ./mongo 127.0.0.1:20000
#使用admin数据库
user admin
#串联路由服务器与分配副本集1
db.runCommand( { addshard : "shard1/192.168.5.101:22001,192.168.5.102:22001,192.168.5.103:22001"});
如里shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } )这样的命令加入,如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” });这样的格式表示 。
#串联路由服务器与分配副本集2
db.runCommand( { addshard : "shard2/192.168.5.101:22002,192.168.5.102:22002,192.168.5.103:22002"});
#串联路由服务器与分配副本集3
db.runCommand( { addshard : "shard3/192.168.5.101:22003,192.168.5.102:22003,192.168.5.103:22003"});
#查看分片服务器的配置
db.runCommand( { listshards : 1 } );
显示如下
mongos> db.runCommand({listshards:1})
{
"shards" : [
{
"_id" : "shard1",
"host" : "shard1/192.168.5.101:22001,192.168.5.102:22001"
},
{
"_id" : "shard2",
"host" : "shard2/192.168.5.101:22002,192.168.5.102:22002"
},
{
"_id" : "shard3",
"host" : "shard3/192.168.5.101:22003,192.168.5.102:22003"
}
],
"ok" : 1
}
因为192.168.0.138是每个分片副本集的仲裁节点,所以在上面结果没有列出来。
连接在mongos上,准备让指定的数据库、指定的集合分片生效。
#指定testdb分片生效
db.runCommand( { enablesharding :"testdb"});
#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } )
我们设置testdb的 table1 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!
11、测试分片配置结果。
#连接mongos服务器
/data/mongodbtest/mongodb-linux-x86_64-2.4.8/bin/mongo 127.0.0.1:20000
#使用testdb
use testdb;
#插入测试数据
for (var i = 1; i <= 100000; i++){db.table1.save({id:i,"test1":"testval1"})};
for (var i = 1; i <= 100000; i++){db.logs.save({id:i,"test1":"testval1"})}
#查看分片情况如下,部分无关信息省掉了
db.table1.stats();
mongos> db.table1.stats()
{
"sharded" : true,
"systemFlags" : 1,
"userFlags" : 1,
"ns" : "testdb.table1",
"count" : 100000,
"numExtents" : 12,
"size" : 11200000,
"storageSize" : 23212032,
"totalIndexSize" : 6091120,
"indexSizes" : {
"_id_" : 3278576,
"id_1" : 2812544
},
"avgObjSize" : 112,
"nindexes" : 2,
"nchunks" : 3,
"shards" : {
"shard1" : {
"ns" : "testdb.table1",
"count" : 5238,
"size" : 586656,
"avgObjSize" : 112,
"storageSize" : 696320,
"numExtents" : 4,
"nindexes" : 2,
"lastExtentSize" : 524288,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 335216,
"indexSizes" : {
"_id_" : 179872,
"id_1" : 155344
},
"ok" : 1
},
"shard2" : {
"ns" : "testdb.table1",
"count" : 0,
"size" : 0,
"storageSize" : 8192,
"numExtents" : 1,
"nindexes" : 2,
"lastExtentSize" : 8192,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 16352,
"indexSizes" : {
"_id_" : 8176,
"id_1" : 8176
},
"ok" : 1
},
"shard3" : {
"ns" : "testdb.table1",
"count" : 94762,
"size" : 10613344,
"avgObjSize" : 112,
"storageSize" : 22507520,
"numExtents" : 7,
"nindexes" : 2,
"lastExtentSize" : 11325440,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 1,
"totalIndexSize" : 5739552,
"indexSizes" : {
"_id_" : 3090528,
"id_1" : 2649024
},
"ok" : 1
}
},
"ok" : 1
}
#指定testdb分片生效
db.runCommand( { enablesharding :"mytest"});
#指定数据库里需要分片的集合和片键
db.runCommand( { shardcollection : "mytest.logs",key : {id: 1} } )