高数据量和吞吐量的数据库应用会对单机的性能造成较大压力,大的查询量会将单机的CPU耗尽,大的数据量对单机的存储压力较大,最终会耗尽系统的内存而将压力转移到磁盘IO上。
MongoDB分片是使用多个服务器存储数据的方法,以支持巨大的数据存储和对数据进行操作。分片技术可以满足MongoDB数据量大量增长的需求,当一台MongoDB服务器不足以存储海量数据或者不足以提供可接受的读写吞吐量时,我们就可以通过在多台服务器上分割数据,使得数据库系统能存储和处理更多的数据。
分片为应对高吞吐量与大数据量提够了方法
systemctl stop firewalld.service
setenforce 0
IP:172.16.10.26 | IP:172.16.10.27 | IP:172.16.10.29 |
---|---|---|
mongos(27017) | mongos(27017) | mongos(27017) |
config(30000) | config(30000) | config(30000) |
shard1主节点(40001) | shard1副节点(40001) | shard1仲裁节点(40001) |
shard2仲裁节点(40002) | shard2主节点(40002) | shard2副节点(40002) |
shard1副节点(40003) | shard1仲裁节点(40003) | shard1主节点(40003) |
群集部署的搭建思路,利用三台服务器,分别安装mongodb数据库,每台服务器创建五个实例(mongos、configs、shard1、shard2、shard3)。三台不同的服务器上的相同名称的实例,创建为一个复制集,分别包括主节点,副节点,仲裁节点。mongos不需创建复制集,config不需指定主副节点及仲裁节点,但是要创建复制集。三台服务器的操作步骤略有差别,但是大多是都是重复操作,步骤完全一致。
yum install openssl-devel -y
tar zxf mongodb-linux-x86_64-rhel70-4.0.0.tgz -C /usr/local
mv /usr/local/mongodb-linux-x86_64-rhel70-4.0.0 /usr/local/mongodb //解压即完成安装
路由服务器不存储数据,因此就不需要创建数据存储目录,只需创建config、shard1、shaed2、shard3即可,日志文件创建完成之后还需要给予权限。
mkdir -p /data/mongodb/logs/
mkdir /etc/mongodb/
mkdir /data/mongodb/config/
mkdir /data/mongodb/shard{1,2,3}
touch /data/mongodb/logs/shard{1,2,3}.log
touch /data/mongodb/logs/mongos.log
touch /data/mongodb/logs/config.log
chmod 777 /data/mongodb/logs/*.log
useradd -M -u 8000 -s /sbin/nologin mongo
chown -R mongo.mongo /usr/local/mongodb
chown -R mongo.mongo /data/mongodb
echo "PATH=/usr/local/mongodb/bin:$PATH" >> /etc/profile
source /etc/profile
ulimit -n 25000
ulimit -u 25000
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag //*注意*这些优化都是临时的,重启失效
#vim /etc/mongodb/config.conf
pidfilepath = /data/mongodb//logs/config.pid //pid文件位置
dbpath = /data/mongodb/config/ //数据文件存放位置
logpath = /data/mongodb//logs/config.log //日志文件位置
logappend = true
bind_ip = 0.0.0.0 //监听地址
port = 30000 //端口号
fork = true
replSet=configs //复制集名称
configsvr = true
maxConns=20000 //最大连接数
scp /etc/mongodb/config.conf root@172.16.10.27:/etc/mongodb/
scp /etc/mongodb/config.conf root@172.16.10.29:/etc/mongodb/
mongod -f /etc/mongodb/config.conf //三台服务器操作一致
mongo --port 30000 //建议三台服务器都进入数据库,方便查看角色变更
config={_id:"configs",members:[{_id:0,host:"172.16.10.26:30000"},{_id:1,host:"172.16.10.27:30000"},{_id:2,host:"172.16.10.29:30000"}]} //创建复制集
rs.initiate(config) //初始化复制集
#vim /etc/mongodb/shard1.conf
pidfilepath = /data/mongodb//logs/shard1.pid
dbpath = /data/mongodb/shard1/
logpath = /data/mongodb//logs/shard1.log
logappend = true
journal = true
quiet = true
bind_ip = 0.0.0.0
port = 40001
fork = true
replSet=shard1
shardsvr = true
maxConns=20000
scp /etc/mongodb/shard1.conf root@172.16.10.27:/etc/mongodb/
scp /etc/mongodb/shard1.conf root@172.16.10.29:/etc/mongodb/
mongod -f /etc/mongodb/shard1.conf //三台服务器操作一致
在shard分片服务器的创建中,需要注意的点是,不是在任一台服务器上创建都能成功的,如果选择在预先设置为仲裁节点的服务器上创建复制集会报错。以shard1分片服务器为例,可以在172.16.10.26和172.16.10.27服务器上创建复制集,在172.16.10.29上创建则会失败,因为在复制集创建之前,172.16.10.29已经被设置为仲裁节点。
mongo --port 40001 //建议三台服务器都进入数据库,方便查看角色变更
use admin
config={_id:"shard1",members:[{_id:0,host:"172.16.10.26:40001",priority:2},{_id:1,host:"172.16.10.27:40001",priority:1},{_id:2,host:"172.16.10.29:40001",arbiterOnly:true}]}
rs.initiate(config)
#vim /etc/mongodb/shard2.conf
pidfilepath = /data/mongodb//logs/shard2.pid
dbpath = /data/mongodb/shard2/
logpath = /data/mongodb//logs/shard2.log
logappend = true
journal = true
quiet = true
bind_ip = 0.0.0.0
port = 40002
fork = true
replSet=shard2
shardsvr = true
maxConns=20000
scp /etc/mongodb/shard2.conf root@172.16.10.27:/etc/mongodb/
scp /etc/mongodb/shard2.conf root@172.16.10.29:/etc/mongodb/
mongod -f /etc/mongodb/shard2.conf //三台服务器操作一致
mongo --port 40002 //建议三台服务器都进入数据库,方便查看角色变更
use admin
config={_id:"shard2",members:[{_id:0,host:"172.16.10.26:40002",arbiterOnly:true},{_id:1,host:"172.16.10.27:40002",priority:2},{_id:2,host:"172.16.10.29:40002",priority:1}]}
rs.initiate(config)
#vim /etc/mongodb/shard3.conf
pidfilepath = /data/mongodb//logs/shard3.pid
dbpath = /data/mongodb/shard3/
logpath = /data/mongodb//logs/shard3.log
logappend = true
journal = true
quiet = true
bind_ip = 0.0.0.0
port = 40003
fork = true
replSet=shard3
shardsvr = true
maxConns=20000
scp /etc/mongodb/shard3.conf root@172.16.10.27:/etc/mongodb/
scp /etc/mongodb/shard3.conf root@172.16.10.29:/etc/mongodb/
mongod -f /etc/mongodb/shard3.conf //三台服务器操作一致
mongo --port 40003 //建议三台服务器都进入数据库,方便查看角色变更
use admin
config={_id:"shard3",members:[{_id:0,host:"172.16.10.26:40003",priority:1},{_id:1,host:"172.16.10.27:40003",arbiterOnly:true},{_id:2,host:"172.16.10.29:40003",priority:2}]}
rs.initiate(config);
pidfilepath = /data/mongodb/logs/mongos.pid
logpath=/data/mongodb/logs/mongos.log
logappend = true
bind_ip = 0.0.0.0
port = 27017
fork = true
configdb = configs/172.16.10.26:30000,172.16.10.27:30000,172.16.10.29:30000
maxConns=20000
scp /etc/mongodb/mongos.conf root@172.16.10.27:/etc/mongodb/
scp /etc/mongodb/mongos.conf root@172.16.10.29:/etc/mongodb/
mongos -f /etc/mongodb/mongos.conf //三台服务器操作一致*注意*这里是“mongos”而非“mongod”
mongo //因为默认端口即是27017,所以此处不接端口号
mongos> use admin
mongos> sh.addShard("shard1/172.16.10.26:40001,172.16.10.27:40001,172.16.10.29:40001")
mongos> sh.addShard("shard2/172.16.10.26:40002,172.16.10.27:40002,172.16.10.29:40002")
mongos> sh.status() //查看群集状态
//此处先添加两各分片服务器,还有一个,待会添加
mongos> use config
switched to db config
mongos> db.settings.save({"_id":"chunksize","value":1}) //设置块大小为1M是方便实验,不然就需要插入海量数据
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
mongos> use python
switched to db python
mongos> show collections
mongos> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
//在python库的user表中循环写入五万条数据
WriteResult({ "nInserted" : 1 })
mongos>sh.enableSharding("python")
//数据库分片就有针对性,可以自定义需要分片的库或者表,毕竟也不是所有数据都是需要分片操作的
创建索引的规则是不能一致性太高,要具有唯一性,例如序号,比如性别这一类重复性太高的就不适合做索引
mongos> db.user.createIndex({"id":1}) //以”id“为索引
mongos> sh.shardCollection("python.user",{"id":1})
mongos> sh.status()
--- Sharding Status ---
···省略内容
shards:
{ "_id" : "shard1", "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002", "state" : 1 }
···省略内容
chunks:
shard1 3
shard2 3
{ "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard1 Timestamp(2, 0)
{ "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(3, 0)
{ "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0)
{ "id" : 29679 } -->> { "id" : 39572 } on : shard2 Timestamp(4, 1)
{ "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(1, 4)
{ "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5)
mongos> use admin
switched to db admin
mongos> sh.addShard("172.16.10.26:40003,172.16.10.27:40003,172.16.10.29:40003")
mongos> sh.status()
--- Sharding Status ---
···省略内容
shards:
{ "_id" : "shard1", "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002", "state" : 1 }
{ "_id" : "shard3", "host" : "shard3/172.16.10.26:40003,172.16.10.29:40003", "state" : 1 }
···省略内容
chunks:
shard1 2
shard2 2
shard3 2
{ "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard3 Timestamp(6, 0)
{ "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(6, 1)
{ "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0)
{ "id" : 29679 } -->> { "id" : 39572 } on : shard3 Timestamp(5, 0)
{ "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(5, 1)
{ "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5)
服务器又对数据进行重新分片,当你再次移除一个分片服务器,此时又会对数据再次进行分片处理,MongoDB对数据的处理非常灵活
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。