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} } )

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章