一主两备
默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。
环境配置
IP | 端口 | 角色 | 主机名 |
---|---|---|---|
192.168.1.163 | 27017 | 主节点 | mongo01 |
192.168.1.126 | 27017 | 备节点 | mongo02 |
192.168.1.41 | 27017 | 备节点 | mongo03 |
安装mongodb
在三个节点上安装mongodb
修改配置文件
代码语言:javascript复制vim mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true #启动或重启后是否追加写入
path: /var/log/mongodb/mongod.log
# traceAllExceptions: true #打印异常详细信息
# Where and how to store data.
storage:
dbPath: /data/mongodb
journal:
enabled: true
directoryPerDB: false|true #当为true时,mongodb使用单独的目录存储每个数据库,每个目录名称对应于数据库名称
# engine:
# mmapv1:
# wiredTiger:
# engineConfig:
# cacheSizeGB: 1
# directoryForIndexes: true
# collectionConfig:
# blockCompressor: zlib
# indexConfig:
# prefixCompression: true
# how the process runs
processManagement:
fork: true #允许程序在后台运行
pidFilePath: /var/run/mongodb/mongod.pid
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
maxIncomingConnections: 65535 #最大连接数
wireObjectCheck: true #mongod实例在收到客户端时验证所有请求,以防止客户端将格式错误或无效的bson插入到mongod数据库
ipv6: false|true #启用或禁用ipv6支持,默认禁用
unixDomainSocket:
enabled: true #启用或禁用unix套接字上的侦听
pathPrefix: /tmp #unix套接字的路径,默认/tmp目录下
#security:
#operationProfiling:
replication:
# oplogSizeMB: 2048
replSetName: xbd #副本集名称,按需修改
#sharding:
# clusterRole: shardsvr #把此实例作为分片
# clusterRole: configsvr #把此实例作为配置服务器
## Enterprise-Only Options
#auditLog:
#snmp:
初始化副本集(登录任意一个节点)
mongo 192.168.1.163:27017
代码语言:javascript复制> config = {_id:"xbd",members:[
... {_id:0,host:"192.168.1.163:27017"},
... {_id:1,host:"192.168.1.126:27017"},
... {_id:2,host:"192.168.1.41:27017"}]
... }
> rs.initiate(config); # 如果结果返回1,说明初始化成功
常用命令
代码语言:javascript复制rs.status() #查看副本集,所有节点都可以操作
db.isMaster() #查看当前节点是否为主节点
rs.remove("192.168.1.41:27017") #移除一个节点,需要在主节点操作
rs.add("192.168.1.41:27017") #添加一个节点,需要在主节点操作
rs.addArb("192.168.10.108:27017") #添加一个仲裁节点
模拟宕机测试
副本集更新权重模拟宕机
默认三台的权重都为1,如果任何一个权重比其他的高,则该台机器切换为primary角色 在primary节点上执行
代码语言:javascript复制cfg = rs.conf()
cfg.members[0].priority = 3
cfg.members[1].priority = 2
cfg.members[2].priority = 1
rs.reconfig(cfg)
登录备节点查询数据
备节点是不能直接查询数据的,执行此命令把自己提升为从节点才可以查询数据
代码语言:javascript复制rs.slaveOk()
一主一备一仲裁
仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。
初始化副本集(登录任意一个节点)
代码语言:javascript复制cfg = {_id:"xbd",members:[
{_id:0,host:"192.168.1.126:27017",priority:2},
{_id:1,host:"192.168.1.163:27017",priority:1}, {_id:2,host:"192.168.1.41:27017",arbiterOnly:true}]
}
rs.initiate(cfg)
仲裁节点有一个特别的配置--arbiterOnly:true,这个不能少,否则主备不生效
mongodb默认是从主节点读写数据的,副本节点上不允许读,需要设置副本节点可以读
代码语言:javascript复制repset:SECONDARY> db.getMongo().setSlaveOk();