其它

linux复盘:mongdb副本集搭建

2021-01-23 08:25:10 阅读数 5487 收藏 0

提到文档,一个新概念JSON,MongoDB的文档类似于JSON对象!

JSON:JavaScript 对象表示法(JavaScript Object Notation)。JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快,更易解析。

来看一下JSON文档:

{
"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
}

在NoSQL中是最像关系型数据库的

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组。

关于JSON http://www.w3school.com.cn/json/index.asp(因为基于分布式,所以很容易扩展)

mongdb副本集搭建

早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主

目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主

在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据

在此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server

三台机器:

192.168.133.130(primary)

192.168.133.132(secondary) 192.168.133.133(secondary)

注意的是副本集搭建前确定没有iptables规则和selinux,否则会破坏通信

早期版本使用master-slave,一主一从和MySQL类似,但slave在此架构中为只读,当主库宕机后,从库不能自动切换为主

目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),只读。支持给它们设置权重,当主宕掉后,权重最高的从切换为主

在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据

在此架构中读写数据都是在主上,要想实现负载均衡的目的需要手动指定读库的目标server

三台机器下载安装mongdb

MongoDB支持yum安装,但是版本比较老,所以我们使用创建一个新的扩展源来安装
cd /etc/yum.repos.d/

vim mongodb.repo
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

yum list |grep mongodb //可以看到mongodb相关的rpm包
yum install -y mongodb-org  //安装

vim /etc/mongod.conf  
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1,192.168.204.131  # Listen to local interface only, comment to listen on all interfaces. ##添加IP的时候需要用逗号分开,这里需要加上自己的内网ip,三台机器三个ip需注意

replication:
 oplogSizeMB: 20   ##就和mysql主从之前创建前缀文件一样
 replSetName: aminglinux  ##注意前面的两个空格

systemctl restart mongod
ps aux |grep mongod
netstat -lntp |grep mongo
mongo --host 192.168.204.131 --port 27017(这里可以直接mongo登录)##这里也是自己的ip,因为是实验咯

副本集配

###连接192.168.133.130主,在主上运行命令mongo,或者带上端口或者ip
>use admin

>config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}
###准备把那一台当做主就是primary就在那一台上执行这个操作

>rs.initiate(config)  ###初始化显示ok即成功

>rs.status() //查看状态
 如果两个从上的状态为"stateStr" : "STARTUP", 则需要进行如下操作需要重新配置一下config一下

> var config={_id:"aminglinux",members:[{_id:0,host:"192.168.133.130:27017"},{_id:1,host:"192.168.133.132:27017"},{_id:2,host:"192.168.133.133:27017"}]}

>rs.reconfig(config)
 此时再次查看rs.status()会发现从的状态变为SECONDARY

副本集测试

###主上建库,建集合
 >use mydb
 >db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
 >show dbs
从上查看
 >show dbs   
若出现错误Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },需要执行
 >rs.slaveok() 
就可以使用show dbs了

###副本集更改权重模拟主宕机

>rs.config()查看权重
默认三台机器权重priority都为1,如果任何一个权重设置为比其他的高,则该台机器马上切换为primary角色,所以我们预设三台机器的权重分别为:130:3,132:2,133:1

在主上执行
>cfg = rs.conf()
>cfg.members[0].priority = 3
>cfg.members[1].priority = 2
>cfg.members[2].priority = 1
>rs.reconfig(cfg)
 这样的话,第二个节点将会成为候选主节点。
 主上执行模拟宕机: iptables -I INPUT -p tcp --dport 27017 -j DROP

>rs.status() //最后查看主从状态分给了谁