1.1 MongoDB复制结构图

1.2 mongodb概念
mongodb是一个nosql数据库,它有高性能、无模式、文档型的特点。他是nosql数据库中功能最丰富,最像关系数据库的,数据结构和JSON基本一样。
副本集具有自动故障恢复的功能。
副本集和主从集群最大的区别就是副本集没有固定的“主节点”;整个集群会选出一个“主节点”,当其挂掉后,又在剩下的从节点中选中其他节点为“主节点”,副本集总有一个活跃节点(primary)和一个或多个备份节点(secondary)。
mongodb副本集至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是副本节点,负责复制主节点上的数据。
副本集包括三种节点:主节点、副本节点、仲裁节点
主节点负责处理客户端请求,读、写数据,记录在其上所有操作的 oplog。
从节点通过获取主节点oplog记录的操作内容以维护相同的数据集,即备份数据,不可写操作,但可以读操作(需要配置),是默认的从节点类型。
仲裁节点不复制数据,仅参与投票。
2.1 这里准备三台虚拟机进行副本集搭建
xxx.xxx.3.101 primary
xxx.xxx.3.102 secondary
xxx.xxx.3.103 secondary
2.2 在对应服务器上新增mongodb compose文件
注意:请根据实际服务器规划,拷贝docker-compose文件到对应的服务器上。
# xxx.xxx.3.101
$ vi docker-compose-mongodb-101.yml
version: ‘3.6’
services:
mongo-1:
container_name: mongodb4.2.9-1
image: xxx.xxx.0.134:9122/voiceprint_library/mongo-replset:v4.2.9
restart: always
ports:
- 27017:27017
volumes:
- data/mongodb4.2.9-1/data/:/data/
- /etc/localtime:/etc/localtime
environment:
TZ: Asia/Shanghai
command: --port "27017" --replSet rs
# xxx.xxx.3.102
$ vi docker-compose-mongodb-102.yml
version: ‘3.6’
services:
mongo-2:
container_name: mongodb4.2.9-2
image: mongo:4.2.9
restart: always
ports:
- 27017:27017
volumes:
- /data/mongodb4.2.9-2/data/:/data/
- /etc/localtime:/etc/localtime
environment:
TZ: Asia/Shanghai
command: --port "27017" --replSet rs
# xxx.xxx.3.103
$ vi docker-compose-mongodb-103.yml
version: ‘3.6’
services:
mongo-3:
container_name: mongodb4.2.9-3
image: mongo:4.2.9
restart: always
ports:
- 27017:27017
volumes:
- /data/mongodb4.2.9-3/data/:/data/
- /etc/localtime:/etc/localtime
environment:
TZ: Asia/Shanghai
command: --port "27017" --replSet rs
2.3 在三台虚拟机上分别执行docker-compose命令后台运行mongodb容器
$ docker-compose -f docker-compose-mongodb-101/102/103.yml up -d
2.4 登录mongodb主库配置副本集信息
1)登录xxx.xxx.3.101服务器执行命令进入主节点容器的shell
$ docker exec -it mongodb4.2.9-1 /bin/bash
2)ip及端口根据实际项目地址修改
$ mongo
$ use admin
$ var config={
_id:"rs",
members:[
{_id:0,host:"xxx.xxx.1.101:27017"},
{_id:1,host:"xxx.xxx.1.102:27017"},
{_id:2,host:"xxx.xxx.1.103:27017"}
]};
3)初始化副本集配置
$ rs.initiate(config)
4)开启权限验证,新建账号密码为admin的账户
$ db.createUser({user:"admin",pwd:"mongodb",roles:[{role:"root",db:"admin"}]})
5)验证用户
$ db.auth("admin","mongodb")
6)查看副本集状态
$ rs.status()
7)mongodb数据库修改内存大小限制,修改方法(具体大小设置根据服务器内存大小确定,临时修改重启失效)
临时修改
$ db.adminCommand({setParameter: 1, wiredTigerEngineRuntimeConfig: "cache_size=10G"})
永久修改(compose文件command列加上 --wiredTigerCacheSizeGB 10),例:
command: --port "27017" --replSet rs --wiredTigerCacheSizeGB 10
2.5 新增成员到副本集
1)启动新节点(新节点的版本、配置建议与原集群一致)
例如,原节点的版本是4.2.9,新节点版本一致,然后启动新节点!
# xxx.xxx.3.104
$ vi docker-compose-mongodb-104.yml
version: ‘3.6’
services:
mongo-3:
container_name: mongodb4.2.9-4
image: mongo:4.2.9
restart: always
ports:
- 27017:27017
volumes:
- /data/mongodb4.2.9-4/data/:/data/
- /etc/localtime:/etc/localtime
environment:
TZ: Asia/Shanghai
command: --port "27017" --replSet rs
$ docker-compose -f docker-compose-mongodb-104.yml up -d
2)将新节点添加至集群
在主库上执行rs.add()将新节点添加进集群中。
生产环境添加节点时,建议将priority及votes设为0,即不会选为主(priority默认1),也没有投票特性(votes默认1,有投票权)。
$ rs.add( { host: "xxx.xxx.1.104:27017", priority: 0, votes: 1 } )
3)查看副本集状态
$ rs.status() # 查看状态信息,发现新节点已经加入集群。

本文作者:事业二部(上海新炬中北团队)
本文来源:“IT那活儿”公众号





