Ubuntu16.04 LTS amd64
MongoDB4.4 仅支持64位系统
MongoDB的历史版本
参考官网
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
#若报错gnupg,则执行
sudo apt-get install gnupg
#然后再次导入公钥
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org=4.4.8 mongodb-org-server=4.4.8 mongodb-org-shell=4.4.8 mongodb-org-mongos=4.4.8 mongodb-org-tools=4.4.8
尽管此时指定了版本,但是有新版本时,还是会默认更新!!!
5. 禁止更新MongoDB
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections
大部分的类Unix操作系统都会限制一个进程或者用户可以使用的系统资源。这些限制会影响MongoDB的操作,所以需要进行相应的设置。
详细参考
sudo -s
ulimit -a
ulimit -n 210000 #更改文件描述符的数量
#且同时更改 硬限制&软限制
ulimit -H/ -S -n 210000 #则只更改一个
#改变其他的只需替换-n参数
ulimit的更改可能在系统重启时恢复。
-f (file size): unlimited
-t (cpu time): unlimited
-v (virtual memory): unlimited
-l (locked-in-memory size): unlimited
-n (open files): 64000
-m (memory size): unlimited
-u (processes/threads): 64000
更改后重启Mongod进程
$ mongo
>show dbs;
>use admin; #进入admin数据库
>db.createUser({user:"admin",pwd:"admin",roles:[{role:"root",db:"admin"}]})
user–>“用户名”
pwd–>“密码”
roles:[{role:"角色名“, db:"角色所属数据库”}, {role:"角色名2“, db:"角色所属数据库2”},…] 多个角色
各种角色详情
sudo vim /etc/mongod.conf
net:
port= 27017
bindIp= 0.0.0.0 #注意缩进 空格
security:
authorization: enabled #注意空格,否则服务无法启动
重启服务
sudo service mongod restart
mongo
show dbs; #不显示数据库
use admin;
db.auth("user","pwd");
远程连接
mongo --host ip --port 27017 -u user -p pwd
查看帮助mongo -h
sudo vim /usr/local/mongo/mongo.conf
systemLog:
destination: file
path: /usr/local/mongo/mongodb.log
logAppend: true
storage:
dbPath: /usr/local/mongo/data/db
journal:
enabled: true
processManagement:
fork: true #后台启动
net:
bindIp: master
port: 27017
setParameter:
enableLocalhostAuthBypass: false
replication:
oplogSizeMB: 100
replSetName: my_repl #复制集的名字,节点之间必须一致
enableMajorityReadConcern: true
sudo -s
mongod --config /usr/local/mongo/mongo.conf
#或者
mongod -f /usr/local/mongo/mongo.conf
#启动失败看log
mongo --host master --port 27017
>var rsconf={_id:"my_repl",members:[{_id:1,host:"192.168.43.111:27017"},{_id:2,host:"192.168.43.112:27017"},{_id:3,host:"192.168.43.113:27017"}]}
>rs.initiate(rsconf)
>rs.status()
>rs.add("ip:port")#增加节点 在主节点增加、删除
>rs.remove("ip:port")#删除
>rs.slaveOK() #允许从节点读取;在从节点shell中设置,且每次进入shell都要设置
参考官网
MongoDB的分片集由下列部分组成:
三组件(分片、路由、配置服务器)
碎片:即分片,所有的分片一起来存储整个数据集,单个分片只存储数据集的一个子集,因此对单个分片查询仅返回数据的子集,执行集群级别的操作需要连接到mongos,包括读取或写入。
从 MongoDB 3.6 开始,分片必须部署为复制集,以提高数据冗余和可靠性。
分片集群中的每个数据库都有一个主分片,用于保存该数据库的所有未分片的集合。每个数据库都有自己的主分片,在创建新数据库时选择主分片。
图中Shard A是当前数据库的主分片,Collection2是尚未进行分片的集合,暂时存储在主分片中。
如果要迁移主分片,在完成之前,都不能访问数据库的数据。如果迁移的数据量过大,可能会影响整个集群性能。
使用以前用作复制集的分片部署新的分片集群时,所有现有数据库将继续驻留在其原始复制集上。随后创建的数据库可能驻留在集群中的任何分片上。
mongos:该mongos充当查询路由器,提供客户端应用程序和指定的分片集之间的接口。从 MongoDB 4.4 开始,mongos 可以支持对冲读取以最小化延迟。
mongos使用客户端应用程序的元数据来路由操作 mongod实例,它没有持久状态,只需要较少的系统资源。
配置服务器:存储集群的元数据和配置。从 MongoDB 3.4 开始,配置服务器必须部署为副本集
参考
元数据反映了分片集群所有数据和组件的状态,包括每个分片上的块列表以及定义块的范围。路由器mongos与配置服务器通信来缓存元数据,并将其用于路由读取和写入操作。当元数据发生更改时mongos更新缓存。
配置服务器还存储身份验证的配置信息,如集群内部身份验证的设置。
MongoDB 还使用配置服务器来管理分布式锁。
每个分片集群必须有自己的配置服务器。
分片键:
分片键是索引字段或索引复合字段,用于确定集合文档在分片集群中的分布。
具体来说,MongoDB 将分片键值的范围划分为不重叠的分片键值范围。每个范围都与一个chunk块相关联 ,MongoDB 尝试在各分片之间均匀分布块。
分片键规范
对集合文档进行分片时必须指定分片键。可以使用shell 方法 sh.shardCollection()对集合进行分片:
sh.shardCollection(, )
sh.shardCollection(namespace, key, unique, options)
将集合以key作为分片键进行分片。分片键决定了 MongoDB 如何在分片之间分发集合的文档。
sh.shardCollection() 采用以下参数:
namespace
要分片的集合的完整命名空间"."。
key
指定用作分片键的一个或多个字段的文档 。
{ : <1|“hashed”>, … }
将字段值设置为:
1用于基于范围的分片
"hashed"指定一个散列的分片键。
索引必须支持分片键,即索引必须在shardCollection 命令之前存在。如果集合为空,如果可以支持分片键的索引不存在,MongoDB 会在分片集合之前创建索引。
unique
默认为false,指定true以确保基础索引强制执行唯一约束。.使用散列分片键时不能指定true。
如果指定options文档,则必须明确指定 的值unique。
options
可选的,包含可选字段的文档,包括 numInitialChunks和collation。
简单使用:
1.在名为people的数据库中有个records的集合,用zipcode字段作为分片键对集合进行分片 :
sh.shardCollection(“people.records”, { zipcode: 1 } )
2.对phonebook数据库中的contacts集合进行分片,以last_name字段作为散列分片键
>sh.shardCollection(
"phonebook.contacts",#集合完整命名空间
{ last_name: "hashed" },#散列分片键值
false, #散列分片键时,unique为false
{#option选项
numInitialChunks: 5, #指定使用散列分片键对空集合进行分片时最初创建的最小块数
collation: { locale: "simple" }#排序规则文档
}
)
在生产环境的集群中,确保数据是冗余的并且系统具有高可用性。
生产环境==分片集群(sharding)==部署,需要考虑以下:
a.将配置服务器部署为 3 成员副本集
b.将每个 Shard 部署为一个 3 成员副本集
c.部署一台或多台mongos路由器
1.1 复制集的分布
在可能的情况下,在适合灾难恢复的站点部署每个副本集成员。
跨两个数据中心分布复制集成员的好处:如果其中一个数据中心出现故障,数据仍可用于读取。实际上如果拥有少数成员的数据中心宕机,复制集仍然可以为写操作和读操作提供服务。但如果拥有大多数成员的数据中心出现故障,则复制集将变为只读。
尽量将成员分布在三个或者三个以上数据中心。
对于配置服务器复制集 (CSRS),最佳实践是分布在三个或更多的数据中心。
1.2 分片的数据
在分片集中至少需要两个分片,来分发数据。如果现在不想启动分片集,计划将来启动,那么现在可以先部署一个分片的分片集。
1.3 路由器(mongos)的分布
部署多个mongos实现高可用性和可扩展性,常用方法:
i. 在每个应用程序服务器上部署一个mongos ,这样可以减少应用和路由器之间的网络延迟。
ii. 将mongos放置在专用主机,它使应用程序服务器的数量与mongos实例数量分离,更好地控制与mongod服务的连接数。大型部署往往受益于这种方法。
iii. 部署在分片集主机上,允许mongos实例使用更多的内存,内存不与mongod共享。可以使用主分片来托管mongos路由器,但内存资源抢占是一个问题。
原则上mongos路由器数量没有限制,但是它们经常与配置服务器通信,随着路由器数量的增加,配置服务器的通信压力增大,性能会有所下降。
对于开发、测试,只需使用最少的组件部署分片集群。
至少一个分片:单成员复制集
配置服务器:单成员的复制集
路由器:单个mongos实例
参考官网
1.配置服务器–复制集
三个成员或者单个成员的复制集,配置服务器复制集不得与任何分片复制集使用相同的名称。
sudo -s
mongod -f xxx.conf
#配置文件
sharding:
clusterRole: configsvr
replication:
replSetName: <replica set name>
net:
bindIp: localhost,<hostname(s)|ip address(es)>
port: 27017
storage:
dbPath: /xxx/confsvr
processManagement:
fork: true
systemLog:
destination: file
path: /usr/local/mongo/confsvr.log
logAppend: true
连接任意一个节点,配置复制集
只有一个节点时,就配置一台服务器
mongo --host <hostname> --port <port>
>rs.initiate(
{
_id: "" ,
configsvr: true,
members: [
{ _id : 0, host : "cfg1.example.net:27019" },
{ _id : 1, host : "cfg2.example.net:27019" },
{ _id : 2, host : "cfg3.example.net:27019" }
]
}
)
2.分片–复制集
三成员或者单个成员的复制集
sudo -s
mongod -f xxxx.conf
#配置文件
sharding:
clusterRole: shardsvr
replication:
replSetName: shard_rs
net:
bindIp: my_shard
port: 27017
storage:
dbPath: /usr/local/mongo/shard #需手动创建该目录
processManagement:
fork: true #后台启动
systemLog:
destination: file
path: /usr/local/mongo/shard.log
logAppend: true
连接一个节点,初始化配置,单个节点时就配置一个服务器
mongo --host <hostname> --port <port>
>rs.initiate(
{
_id : <replicaSetName>,
members: [
{ _id : 0, host : "s1-mongo1.example.net:27018" },
{ _id : 1, host : "s1-mongo2.example.net:27018" },
{ _id : 2, host : "s1-mongo3.example.net:27018" }
]
}
)
3.配置mongos路由
sudo -s
mongos --config xxx.conf
#配置文件
sharding:
configDB: confsvr_rs/my_confsvr:27017
net:
bindIp: my_router
port: 27017
#路由不需要存储路径
#storage:
# dbPath: /usr/local/mongo/router #需手动创建该目录
processManagement:
fork: true #后台启动
systemLog:
destination: file
path: /usr/local/mongo/router.log
logAppend: true
configDB:配置服务器的复制集名称/其复制集至少一个ip:port
4.连接到mongos
mongo --host mongos_host --port 27017
#将分片添加到集群
sh.addShard( "/s1-mongo1.example.net:27018,s1-mongo2.example.net:27018,s1-mongo3.example.net:27018" )
#直到所有的分片都加入到集群中
5.为数据库启用分片
在对集合进行分片之前,必须为集合的数据库启用分片。
mongo --host mongos_host --port 27017
sh.enableSharding("people") #在目标数据库people上启用分片
为数据库启用分片后,MongoDB 会为该数据库分配一个主分片,MongoDB 将该数据库中所有数据存储在主分片中。
6.分片集合
mongo --host mongos_host --port 27017
>sh.shardCollection()
MongoDB 提供了两种分片集合的策略:
散列分片使用 散列索引单个字段作为的 分片键分片集合:
sh.shardCollection("
基于范围的分片可以使用多个字段作为分片键和将数据分成由片键值确定连续范围。
sh.shardCollection("
sudo apt-get remove mongodb-org=4.4.8 mongodb-org-server=4.4.8 mongodb-org-shell=4.4.8 mongodb-org-mongos=4.4.8 mongodb-org-tools=4.4.8
sudo apt-get purge mongodb-org=4.4.8 mongodb-org-server=4.4.8 mongodb-org-shell=4.4.8 mongodb-org-mongos=4.4.8 mongodb-org-tools=4.4.8
#或者
sudo apt-get purge mongodb-org*