主从复制和副本集区别
主从集群和制本集最大的区别就是副本集没有固定的“主节点";整个集群会选出一个主节点当其挂掉后,又在剩下的从节点中选中其他节点为"主节点"。副本集总有一个活跃点(主primary和一 个或多个备份节点(从secondary)。
副本集有两种类型三种角色
两种类型:
主节点(Primary) 类型:数据操作的主要连接点,可读写.
次要(辅助、从)节点(Secondaries) 类型:数据冗余备份节点,可以读或选举。
相当于只从复制 master宕机后就凉了 ,为了实现高可用,就不得不介绍一下分片的概念了
分片(sharding) 是一-种跨多 台机器分布数据的方法,MongoDB使用分 片来支持具有非常大的数据集和高吞吐量操作的部署。
换句话说:分片(sharding)是指将数据拆分,将其分散存在不同的机器上的过程。有时也用分区(partitioning)来表示这个概念。将数据分散到不同的机器上,不需要功能强大的大型计算机就可以储存更多的数据,处理更多的负载。
具有大型数据集或高吞吐量应用程序的数据库系统可以会挑战单个服务器的容量。例如,高查询率会耗尽服务器的CPU容量。工作集大小大于系统的RAM会强调磁盘驱动器的I / 0容量。
有两种解决系统增长的方法:垂直扩展和水平扩展。
MongoDB分片群集包含以下组件: .
●分片(存储)shard:每个分片包含分片数据的子集。 每个分片都可以部署为副本集。
●mongos (路由) : mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口。
●config servers (“调度"的配置) : 配置服务器存储群集的元数据和配置设置。从MongoDB 3.4开始,必须将配置服务器部署为副本集(CSRS)。
下图描述了分片集群中组件的交互:
Vmware 虚拟机
centos7.6 192.168.110.132
mongodb3.2
创建多实例的数据目录和日志文件;
修改ulimit -n 和ulimit -u 的值为25000;
tar zxvf mongodb-linux-x86_64-3.2.1.tgz -C /opt/
mv mongodb-linux-x86_64-3.2.1/ /usr/local/mongodb
mkdir -p /data/mongodb/mongodb{
1,2,3,4}
mkdir /data/mongodb/logs
touch /data/mongodb/logs/mongodb{
1,2,3,4}.log
chmod -R 777 /data/mongodb/logs/*.log
ulimit -n 25000 //临时修改 重启后失效 指定同一时间最多可打开的文件数
ulimit -u 25000 //临时修改 重启后失效 用户最多可启动的进程数目。
创建软连接:
ln -s /usr/local/mongodb/bin/mongo /usr/bin/mongo
ln -s /usr/local/mongodb/bin/mongod /usr/bin/mongod
cd /usr/local/mongodb/bin/
port=37017 端口
dbpath=/data/mongodb/mongodb1 数据存储位置
logpath=/data/mongodb/logs/mongodb1.log 日志存储位置
logappend=true mongos或mongod会将新条目附加到现有日志文件的末尾。
fork=true 启用在后台运行mongos或mongod进程的守护进程模式
maxConns=5000 最大连接数
storageEngine=mmapv1 引擎
configsvr=true 指定配置服务器
启动:
mongod -f /usr/local/mongodb/bin/mongodb1.conf '启动不起来 -f使用不了 改个环境变量'
mongo --port 27017 //查看端口是否正常开放
cp -p mongodb1.conf mongodb2.conf
vim mongodb2.conf
port=47017
dbpath=/data/mongodb/mongodb2
logpath=/data/mongodb/logs/mongodb2.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
cp -p mongodb1.conf mongodb3.conf
vim mongodb3.conf
port=47018
dbpath=/data/mongodb/mongodb3
logpath=/data/mongodb/logs/mongodb3.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
启动:
mongod -f /usr/local/mongodb/bin/mongodb1.conf '启动服务'
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
–port指定对方连接入口27017
–fork后台运行
–logpath指定日志文件存储路径
–configdb指定给谁处理
./mongos --port 27017 --fork --logpath=/usr/local/mongodb/bin/route.log --configdb 192.168.110.132:37017 --chunkSize 1
mongos> sh.addShard("192.168.110.132:47018"); 添加分片服务器
{
"shardAdded" : "shard0000", "ok" : 1 }
mongos> sh.addShard("192.168.110.132:47017"); 添加分片服务器
{
"shardAdded" : "shard0001", "ok" : 1 }
mongos> sh.status() 再次查看分片的服务器
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5f5b73644e296224377d5e65")
}
shards:
{
"_id" : "shard0000", "host" : "192.168.110.132:47018" }
{
"_id" : "shard0001", "host" : "192.168.110.132:47017" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
> use school
> for(var i=1;i<=10000;i++) db.users.insert({
"id":i,"name":"tom"+i})
mongos> show dbs
mongos> use school
mongos> show collections //查看集合
mongos> db.users.find().limit(5) 查看前五行
mongos> sh.status() //查看数据库分片信息
'下面要开启集合的分片;'
'先对users集合创建索引;'
'然后对集合的索引进行分片。'
mongos> use shang
mongos> db.users.createIndex({
"id":1}) //对users表创建索引
mongos> sh.shardCollection("school.users",{
"id":1}) //表分片给shard节点
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5f5b73644e296224377d5e65")
}
shards:
{
"_id" : "shard0000", "host" : "192.168.110.132:47018" }
{
"_id" : "shard0001", "host" : "192.168.110.132:47017" }
active mongoses:
"3.2.1" : 1
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
1 : Success
databases:
{
"_id" : "school", "primary" : "shard0000", "partitioned" : true }
school.users
shard key: {
"id" : 1 }
unique: false
balancing: true
chunks:
shard0000 2
shard0001 1
{
"id" : {
"$minKey" : 1 } } -->> {
"id" : 4682 } on : shard0001 Timestamp(2, 0)
{
"id" : 4682 } -->> {
"id" : 9364 } on : shard0000 Timestamp(2, 1)
{
"id" : 9364 } -->> {
"id" : {
"$maxKey" : 1 } } on : shard0000 Timestamp(1, 2)
mongos> for(var i=1;i<=60000;i++) db.users2.insert({
"id":i,"name":"tom"+i})
WriteResult({
"nInserted" : 1 })
mongos> db.users2.count()
60000
mongos> db.users2.createIndex({
"id":1}) '添加索引'
{
"raw" : {
"192.168.110.132:47018" : {
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
},
"ok" : 1
}
mongos>
mongos> sh.shardCollection("school.users2",{
"id":1}) '添加分片存储'
{
"collectionsharded" : "school.users2", "ok" : 1 }
mongos> db.users2.stats()
{
"sharded" : true,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"ns" : "school.users2",
"count" : 60000,
"numExtents" : 12,
"size" : 6720000,
"storageSize" : 22364160,
"totalIndexSize" : 3581088,
"indexSizes" : {
"_id_" : 1970416,
"id_1" : 1610672
},
"avgObjSize" : 112,
"nindexes" : 2,
"nchunks" : 13,
"shards" : {
"shard0000" : {
"ns" : "school.users2",
"count" : 31909,
"size" : 3573808,
"avgObjSize" : 112,
"numExtents" : 6,
"storageSize" : 11182080,
"lastExtentSize" : 8388608,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 2,
"totalIndexSize" : 1872304,
"indexSizes" : {
"_id_" : 1054704,
"id_1" : 817600
},
"ok" : 1
},
"shard0001" : {
"ns" : "school.users2",
"count" : 28091,
"size" : 3146192,
"avgObjSize" : 112,
"numExtents" : 6,
"storageSize" : 11182080,
"lastExtentSize" : 8388608,
"paddingFactor" : 1,
"paddingFactorNote" : "paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.",
"userFlags" : 1,
"capped" : false,
"nindexes" : 2,
"totalIndexSize" : 1708784,
"indexSizes" : {
"_id_" : 915712,
"id_1" : 793072
},
"ok" : 1
}
},
"ok" : 1
}
mongos>
mongos> sh.addShardTag("shard0000","sales00")
mongos> sh.addShardTag("shard0001","sales01")
mongo --port 37017
configsvr> use config //打开配置数据库
configsvr> show collections //查看集合
configsvr> db.chunks.findOne() //记录所有块的信息
configsvr> db.collections.find() //分片集合信息
configsvr> db.databases.find() //分片中所有数据库信息
[root@localhost bin]# cp -p mongodb3.conf mongodb4.conf
[root@localhost bin]# vim mongodb4.conf
port=47019
dbpath=/data/mongodb/mongodb4
logpath=/data/mongodb/logs/mongodb4.log
logappend=true
fork=true
maxConns=5000
storageEngine=mmapv1
shardsvr=true
[root@localhost bin]# ls /data/mongodb/
logs mongodb1 mongodb2 mongodb3 mongodb4
[root@localhost bin]# ls /data/mongodb/logs/
mongodb1.log mongodb2.log mongodb3.log mongodb4.log
mongod -f mongodb4.conf '启动'
添加分片节点:
mongos> sh.addShard("192.168.110.132:47019") //添加分片服务器
mongos> sh.status() '查看分片信息'
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5f5b73644e296224377d5e65")
}
shards:
{
"_id" : "shard0000", "host" : "192.168.110.132:47018", "tags" : [ "sales00" ] }
{
"_id" : "shard0001", "host" : "192.168.110.132:47017", "tags" : [ "sales01" ] }
{
"_id" : "shard0002", "host" : "192.168.110.132:47019" }
删除分片节点:
mongos> use admin
mongos> db.runCommand({
"removeshard":"192.168.110.132:47019"}) //删除节点