目录
安装
启动
搭建 副本集
搭建
增删节点
安装
下载地址
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.12.tgz
解压缩到目录
tar -zxvf mongodb-linux-x86_64-4.0.12.tgz
设置环境变量
vi /etc/profile
export PATH=:$PATH:/usr/local/mongo/mongodb-linux-x86_64-4.0.12/bin:$PATH
保存配置生效
source /etc/profile
查看版本
mongo --version
新建数据文件
mkdir -p /usr/local/mongo/data /usr/local/mongo/logs
创建log文件
touch /usr/local/mongo/logs/mongodb.log
设置启动配置文件
vi /usr/local/mongo/mongodb.conf
#日志文件的路径
logpath=/usr/local/mongo/m1/logs/mongodb.log
# 是否追加方式写入日志,默认True
logappend=true
port = 27001
# 数据库文件位置
dbpath=data
# 是否以守护进程方式运行,默认false
fork = true
# 设置绑定ip
bind_ip=0.0.0.0
# 集群名称
replSet=mongo
启动
必须进入配置文件所在目录
mongod -f mongodb.conf
连接MongoDB
mongo --port 27001
停止服务
mongod --shutdown -f mongodb.conf
搭建 副本集
一、简介
Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点。
Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,实现数据的高可用。
使用场景
- 数据冗余,用做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。
- 读写分离,读的请求分流到副本上,减轻主节点的读压力。
二、副本集角色
- 主节点(Primary)
接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。
默认读请求也是发到Primary节点处理的,可以通过修改客户端连接配置以支持读取Secondary节点。
- 副本节点(Secondary)
与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
- 仲裁者(Arbiter)
不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。
三、两种架构模式
- PSS
Primary + Secondary + Secondary模式,通过Primary和Secondary搭建的Replica Set
该模式下 Replica Set节点数必须为奇数,目的是选主投票的时候要出现大多数才能进行选主决策。
- PSA
Primary + Secondary + Arbiter模式,使用Arbiter搭建Replica Set
偶数个数据节点,加一个Arbiter构成的Replica Set
搭建
Primary + Secondary + Arbiter模式搭建Replica Set
配置文件
systemLog:
destination: file
logAppend: true #是否追加方式写入日志
path: logs/mongod.log
net:
bindIp: 0.0.0.0
port: 27017
maxIncomingConnections: 65536 #最大连接数
wireObjectCheck: true #当客户端写入数据时 检测数据的有效性(BSON) 默认值为true
ipv6: false
storage:
dbPath: data
journal:
enabled: true #是否开启 journal 日志持久存储
replication:
oplogSizeMB: 10240 #replication 操作日志的最大尺寸,单位:MB
replSetName: rs0
secondaryIndexPrefetch: all
processManagement:
fork: true #后台启动
#pidFilePath: mongod.pid #进程号
启动三台实例
进入第一台
mongo --port 27001
#添加节点
rsconf = {
_id: "mongo",
members: [
{
_id: 0,
host: "192.168.25.150:27001"
},
{
_id: 1,
host: "192.168.25.150:27002"
},
{
_id: 2,
host: "192.168.25.150:27003"
}
]
}
rs.initiate(rsconf)
输入 rs.conf() 来查看你的集群信息:
修改节点权重
members[0]节点序号
priority 权重 越大容易成为 primary
ps: 需在主节点修改
cfg = rs.conf();
cfg.members[0].priority = 2;
rs.reconfig(cfg);
rs.conf()
设置从节点
进入从节点 执行
mongo --port 27002
#重要且必须, secondary节点允许读取操作在当前节点进行,否则从节点无法复制主节点的数据
#进入secondary实例
rs.slaveOk()
Arbiter节点与从节点配置一致,启动后在设置arbiterOnly:true
rsconf = {
_id: "mongo",
members: [
{
_id: 0,
host: "192.168.25.150:27001"
},
{
_id: 1,
host: "192.168.25.150:27002"
},
{
_id: 2,
host: "192.168.25.150:27003"
,arbiterOnly:true
}
]
}
rs.initiate(rsconf)
增删节点
删除节点:进入主节点27019,然后移除27018节点
myrepl:PRIMARY> use admin
switched to db admin
myrepl:PRIMARY> db.auth("admin","admin")
1
myrepl:PRIMARY> rs.remove("127.0.0.1:27018")
{
"ok" : 1,
"operationTime" : Timestamp(1520340394, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1520340394, 1),
"signature" : {
"hash" : BinData(0,"0VUzGmXGZ4EXAUC/HYJbRaPY6qc="),
"keyId" : NumberLong("6529469760260800513")
}
}
}
myrepl:PRIMARY> rs.isMaster()
{
"hosts" : [
"127.0.0.1:27017",
"127.0.0.1:27019"
],
"setName" : "myrepl",
"setVersion" : 2,
"ismaster" : true,
"secondary" : false,
"primary" : "127.0.0.1:27019",
"me" : "127.0.0.1:27019",
//后面省略
增加节点:进入主节点27019,然后将刚刚删除的节点27018又重新加入到集群中
myrepl:PRIMARY> rs.add("127.0.0.1:27018")
{
"ok" : 1,
"operationTime" : Timestamp(1520340538, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1520340538, 1),
"signature" : {
"hash" : BinData(0,"a3TQIbz8yCaDh4Uxh4yUUkF7auk="),
"keyId" : NumberLong("6529469760260800513")
}
}
}
myrepl:PRIMARY> rs.isMaster()
{
"hosts" : [
"127.0.0.1:27017",
"127.0.0.1:27019",
"127.0.0.1:27018"
],
"setName" : "myrepl",
"setVersion" : 3,
"ismaster" : true,
"secondary" : false,
"primary" : "127.0.0.1:27019",
"me" : "127.0.0.1:27019",
"electionId" : ObjectId("7fffffff0000000000000002"),
后面省略.......