CentOS mongodb 副本集分片

环境:三台服务器
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} } )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值