环境准备
- 一台linux服务器,并且需要root权限
- mongodb客户端,用于验证连接是否成功,下载地址
1. 单机版安装
- 配置程序包管理系统(yum)
1
| vi /etc/yum.repos.d/mongodb-org-4.2.repo
|
1 2 3 4 5 6
| [mongodb-org-4.2] name=mongodb Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
|
- 安装mongodb
1
| yum install -y mongodb-org
|
默认情况下,mongodb使用mongod用户帐户运行,并使用以下默认目录
1 2 3 4
| # 数据目录 /var/lib/mongo # 日志目录 /var/log/mongodb
|
- 开启远程访问
1 2
| vi /etc/mongod.conf bindIp: 0.0.0.0
|
- 基本命令
1 2 3 4 5 6
| systemctl start mongod systemctl restart mongod systemctl status mongod systemctl stop mongod systemctl enable mongod systemctl is-enabled mongod
|
- 创建管理员用户
1 2 3 4 5
| # 进入mongo mongo # 创建管理员,用户名密码可自定义,root角色是mongo最高权限用户,用于对整个mongo进行管理 use admin db.createUser({user:"admin",pwd:"admin",roles:["root"]})
|
- 创建普通用户
1 2 3 4 5
| # 进入mongo mongo # 创建数据库 use wx db.createUser({user:"wx",pwd:"123456",roles:[{role:"dbOwner",db:"wx"}]})
|
- 开启权限认证
1 2 3 4
| vi /etc/mongod.conf # 开启认证 security: authorization: enabled
|
- 重启mongo
1 2 3 4
| systemctl restart mongod # 之后登录的时候就需要加上用户名和密码 mongo admin -u admin -p admin mongo wx -u wx -p 123456
|
- 卸载
1 2 3 4
| sudo yum erase $(rpm -qa | grep mongodb-org)
rm -rf /var/log/mongodb/ rm -rf /var/lib/mongo/
|
2. 副本集模式安装
| 服务器 |
端口 |
说明 |
备注 |
| 192.168.186.128 |
27017 |
primary |
主节点 |
| 192.168.186.131 |
27017 |
secondary |
从节点 |
| 192.168.186.132 |
27017 |
arbiter |
仲裁者 |
- 按照单机版 1,2,3,4 步骤为三台机器分别安装上mongo
确保三台机器之间可以互相通信
- 进入主节点,创建admin用户
1 2 3
| mongo use admin db.createUser({user:"admin",pwd:"admin",roles:["root"]})
|
- 为每个节点设置副本集名称
1 2 3 4 5 6
| vi /etc/mongod.conf
replication: replSetName: test # 更改完成后分别重启三台服务器 systemctl restart mongod
|
- 进入主节点,配置副本集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # 用admin账户登录 mongo admin -u admin -p admin
# 配置副本 config = { _id: "test", members: [ { _id: 0, host: "192.168.186.128:27017",priority:2 }, { _id: 1, host: "192.168.186.131:27017",priority:1 }, { _id: 2, host: "192.168.186.132:27017",arbiterOnly:true } ] }
# 初始化配置 rs.initiate(config) # 查询配置 rs.conf() # 查询状态 rs.status() # 推出 exit
|
- 副本集认证
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 在主节点生成keyfile文件,并将该文件同步到其他节点 openssl rand -base64 745 > /usr/local/lib/mongodb-keyfile
# 在每个节点下为文件赋予权限 chown mongod /usr/local/lib/mongodb-keyfile chmod 600 /usr/local/lib/mongodb-keyfile
# 编辑每个节点的配置文件 vi /etc/mongod.conf # 开启认证 security: authorization: enabled keyFile: /usr/local/lib/mongodb-keyfile # 依次重启每个节点,先启动主节点 systemctl restart mongod
|
- 故障测试
从节点故障测试
- 128 和 132 对 131 的心跳失败。因为主节点还在,因此,没有触发投票选举。
- 如果此时,在主节点写入数据。再启动从节点,会发现,主节点写入的数据,会自动同步给从节点。
- 此时副本集具有读写功能
主节点故障测试
- 131 和 132 对 128 的心跳失败,当失败超过10秒,此时因为没有主节点了,会自动发起投票。
- 而从节点只有一个,因此,候选人只有一个就是131
- 132 向 131 投了一票,131本身自带一票,因此共两票,超过了“大多数”
- 132 是仲裁节点,没有选举权,131不向其投票,其票数是0
- 此时副本集具有读写功能
仲裁节点和主节点故障
- 131 仍然是从节点,副本集中没有主节点了,导致此时副本集是只读状态,无法写入
- 为啥不选举了? 因为131 的票数,没有获得大多数,即没有大于等于2,它只有默认的一票(优先级 是1) 如果要触发选举,随便加入一个成员即可。 如果只加入132 节点,则主节点一定是131,因为没得选了,仲裁节点不参与选举, 但参与投票
如果只加入128 节点,会发起选举。因为128和131都是两票,则按照谁数据新,谁当主节点。
仲裁节点和从节点故障
- 128 主节点自动降级为副本节点。(服务降级)
- 此时副本集是只读状态,无法写入
3. 分片集群安装
4. 注意点