yuluo829 发表于 2022-11-6 12:29

Mongodb 复制集搭建

# Mongodb 复制集

主要意义是实现服务高可用。类似于服务集群的概念

- 数据分发
- 读写分离
- 异地容灾

多采用一主二从的集群结构,通过日志来实现数据的读写。

## 目的:搭建复制集

使用三个mongodb数据库服务搭建复制集

## 理论知识

- 安装最新的mongodb数据库
- 有一定的存储空间

**一般情况下,只要有机器就可以**

1. 创建数据目录,mongodb启动时将使用一个数据目录存放所有数据文件,我们将为3个复制集节点创建各自的数据目录

   `mkdir -p /data/db{1,2,3}`

2. 准备配置文件

   我们现在使用一台机器运行3个进程,因此需要为它们各自配置**在线上环境中,应该是一个节点一个机器**

   ```mark
   1. 端口使用28017, 28018,28019。
   2. 不同的数据目录,将使用/data/db1/,其他类似。
   3. 不同的日志文件,使用/data/db1/mongod.log,其他类似。
   ```

   配置文件:mongod.conf

   ```conf
   systemLog:
       destination: file
       logAppend: true
       path: /data/db1/mongod.log
   storage:
       dbPath: /data/db1/
       journal:
         enabled: true
   net:
       port: 28017
       bindIp: 127.0.0.1
   replication:
       replSetName: rs0
   processManagement:
   timeZoneInfo: /usr/share/zoneinfo
   
   ```

3. 配置复制集

   ```sh
   mongo --port 28017
   > rs.initiate()
   rs.add("HOSTNAME:28018")
   rs.add("HOSTNAME:28019")
   
   注意:此方式需要host可以被解析
   ```

4. 验证

   ```sh
   主节点写入
   db.test.insert({ a:1 })
   db.test.insert({ b:2 })
   
   从节点搜索
   rs.slaveok()
   db.test.find()
   ```

## 实际操作

- 文件准备

![请添加图片描述](https://img-blog.csdnimg.cn/1f29fd0d409f44959a05a4ef8806ddd4.png)


- 创建data文件夹

![请添加图片描述](https://img-blog.csdnimg.cn/011a69518ce24915ad20f4f134ea53e4.png)


- 在data下创建三个文件夹,表示三个节点存储的日志文件和数据文件

![请添加图片描述](https://img-blog.csdnimg.cn/fa55b7f705a54924b25f354b66fdd88a.png)


- 配置文件准备,拷贝mongod.conf文件并编辑

![请添加图片描述](https://img-blog.csdnimg.cn/e8310b98989943f09b631df638d51100.png)


编辑文件

- 过滤掉配置文件中的注释 `cat../mongod.conf | grep -v '^#' | grep -v '^$' > mongod.conf`

![请添加图片描述](https://img-blog.csdnimg.cn/b041939ed11c440682f261d45a5aba6e.png)


- 编辑文件为
![请添加图片描述](https://img-blog.csdnimg.cn/d24e786b32da498a8b66e3b7a4a3e5dc.png)



    **主要配置是:replcation这行配置**

   

- 复制配置文件到db1,db2,db3中
![请添加图片描述](https://img-blog.csdnimg.cn/2fec72b47ccf41dd8f3ee1f6b79a12b7.png)
![请添加图片描述](https://img-blog.csdnimg.cn/7a4e3a62d2924f03a9ebcdd4cace31f1.png)

- 修改db2和3中的路径和端口

**数据文件和日志文件和端口需要更改**

db2:

![请添加图片描述](https://img-blog.csdnimg.cn/4edb746a5ee249d68a4dd20ecdb0be2c.png)


db3:
![请添加图片描述](https://img-blog.csdnimg.cn/9793d14e535d4da3bac691636ab94007.png)


- 启动进程
![请添加图片描述](https://img-blog.csdnimg.cn/ce1fd583e8c5448fb9f8445235d9b571.png)

> 出现此种情况时,前面加入sudo吗,以root用户启动
>
> `sudo ../mongodb-linux-x86_64-ubuntu2004-6.0.1/bin/mongod -f db1/mongod.conf `

![请添加图片描述](https://img-blog.csdnimg.cn/ce8b38636f484471b5542d0929ef21c8.png)

> 出现启动失败时,是端口占用的原因,服务器上已经有一个27107的mongo数据库在跑,所以将主节点的服务器端口改为**27020**(db1中的配置文件)
> 再次启动,启动成功!

- 依次启动db2和db3即可

![请添加图片描述](https://img-blog.csdnimg.cn/5b1ac3a1333b464f9fae7238f535c16a.png)


> 注意:一定要出现`successfully`在进行下一步,否则有可能是配置文件出错

- 查看进程 `sudo lsof -i -s tcp:listen`
![请添加图片描述](https://img-blog.csdnimg.cn/0cb09a87aedc4c01aec706fe1244d394.png)


服务启动成功!

- 使用mongosh来登录主数据库节点

`sudo ../mongosh-1.5.4-linux-x64/bin/mongosh --port 27020`(这里不同于27017,端口冲突,所以改成了27020)
![请添加图片描述](https://img-blog.csdnimg.cn/93322db952994f2ebf54aa93b43caa11.png)


**登录成功!**

- 启动复制集`rs.initiate()` 出现ok为1,则证明操作成功

![请添加图片描述](https://img-blog.csdnimg.cn/e589cb8b9f3543e3bd06f88ac375c7d8.png)


`rs.status()` 查看状态

- members:成员节点

![请添加图片描述](https://img-blog.csdnimg.cn/0db2c5211d2847e6be2129efa8e60c33.png)


- 加入其他两个节点

`rs.add('127.0.0.1:27018')`

`rs.add('127.0.0.1:27019')`
![请添加图片描述](https://img-blog.csdnimg.cn/0cece2b4df024e018b3d48e0f97298da.png)


**出现ok为1,则添加成功**

再次查看状态`rs.status()`

![请添加图片描述](https://img-blog.csdnimg.cn/fcb027e9f6f74edcad25c63ab7554375.png)


**member就会出现变化,加入两个从节点**

- 插入一个数据

```sh
db.user.insertOne({name: "tom"})
```

![请添加图片描述](https://img-blog.csdnimg.cn/b30beeefc63b4974a2e241954d6d5f2b.png)


```sh
db.user.find()
```

![请添加图片描述](https://img-blog.csdnimg.cn/0df03790ceb54656a575ce7b8641ceff.png)


- 登录到另外一个节点去,
![请添加图片描述](https://img-blog.csdnimg.cn/bcaa91ae4847483aa36477e21ed936b0.png)

这里可以再打开一个会话,点击复制会话即可

![请添加图片描述](https://img-blog.csdnimg.cn/5d2aa979f9404d599947f02dc28276cb.png)

在另一个页面中登录从节点

`sudo ../mongosh-1.5.4-linux-x64/bin/mongosh --port 27018`\

![请添加图片描述](https://img-blog.csdnimg.cn/1e9d06eb96d94abdbf0fe14bdc54baf5.png)


**注意:这里左边的提示符是secondary**

- 读取数据

```sh
输入db.use.find()的时候会出现

MongoServerError: not primary and secondaryOk=false - consider using db.getMongo().setReadPref() or readPreference in the connection string

默认不允许从从节点读取数据,需要做一个配置才可以读取

执行rs.secondaryOk()

出现这个之后:
DeprecationWarning: .setSecondaryOk() is deprecated. Use .setReadPref("primaryPreferred") instead
Setting read preference from "primary" to "primaryPreferred"

才允许从节点读取数据
```

输入

`db.user.find()`

![请添加图片描述](https://img-blog.csdnimg.cn/ef2ab9c998ad43b88c0367f685b069e7.png)


从节点读取数据成功

完成!

Bingguner 发表于 2022-11-6 13:01

感谢分享!
页: [1]
查看完整版本: Mongodb 复制集搭建