IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Mongo集群部署 -> 正文阅读

[系统运维]Mongo集群部署

连接Mongo集群,应用层面可以直接区分读写状态,无需其他应用做读写分离,架构设计如图所示:

请添加图片描述

1. 获取MongoDB

https://www.mongodb.com/try/download/community

2. 上传解压

cd /mongodb/
rz
rz waiting to receive.
Starting zmodem transfer.  Press Ctrl+C to cancel.
Transferring mongodb-linux-x86_64-rhel70-4.2.8.tgz...
  100%  129656 KB    32414 KB/sec    00:00:04       0 Errors  
tar xf  mongodb-linux-x86_64-rhel70-4.2.8.tgz

3. 关闭THP

修改 /etc/default/grub

GRUB_CMDLINE_LINUX="crashkernel=auto ipv6.disable=1 rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet transparent_hugepage=never"

执行如下命令生效,有些系统不生效是因为没有选对相应的命令

  • EFI使用如下命令
grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
  • BIOS使用如下命令
grub2-mkconfig -o /boot/grub2/grub.cfg

修改完成重启机器

4. 环境准备

  1. 创建所需用户和组

    useradd mongod
    passwd mongod
    
  2. 创建mongodb所需目录结构

    mkdir -p /mongodb/conf
    mkdir -p /mongodb/log
    mkdir -p /mongodb/data
    
  3. 修改权限

    chown -R mongod:mongod /mongodb
    
  4. 切换用户并设置环境变量

    su - mongod
    vi .bash_profile
    export PATH=/mongodb/app/bin:$PATH
    source .bash_profile
    

5. 创建配置文件

bindIp以所在服务器为准

$ cat >> /mongodb/mongodb.yaml <<EOF
systemLog:
  destination: file
  path: /mongodb/log/mongod.log
  logAppend: true
processManagement:
  fork: true
  pidFilePath: /mongodb/mongodb.pid
storage:
  dbPath: /mongodb/data
  journal:
    enabled: true
net:
  bindIp: localhost,192.168.1.11
  port: 27017
security:
  keyFile: /mongodb/secret
  authorization: enabled
replication:
  replSetName: MongoRepl
EOF

6. 创建密码文件

三个节点需要配置相同的keyfile,否则复发互相通信,此处仅需生成一次,拷贝至其他服务器即可

$ openssl rand -base64 666 > /mongodb/secret
$ chmod 400 /mongodb/secret
$ scp /mongodb/secret mongo@192.168.62.22:/mongodb/secret
$ scp /mongodb/secret mongo@192.168.62.23:/mongodb/secret

7. 三个节点启动mongod进程

$ mongod -f /mongodb/mongodb.yaml
$ ps -ef | grep mongod

8. 初始化副本集

$ mongo
> rs.initiate()
{
        "info2" : "no configuration specified. Using a default configuration for the set",
        "me" : "192.168.1.11:27017",
        "ok" : 1,
        "operationTime" : Timestamp(1605262167, 1),
        "$clusterTime" : {
                "clusterTime" : Timestamp(1605262167, 1),
                "signature" : {
                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
                        "keyId" : NumberLong(0)
                }
        }
}

如下设置方式设置了权重

rs.initiate({_id:"MongoRepl",
	version:1,
	members:[{ _id:0, host:"192.168.1.11:27017",priority:2},
		{ _id:1, host:"192.168.1.12:27017",priority:1},
		{ _id:2, host:"192.168.1.13:27017",priority:1}
	]}
)

9. 添加数据库管理用户

$ mongo
MongoRepl:PRIMARY> use admin
MongoRepl:PRIMARY> db.createUser({user: "admin",pwd: "admin1234",roles:[{role: "root",db:"admin"}]})
Successfully added user: {
    "user" : "admin",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}

10. 建立业务数据库及用户

mongo用户创建比较特殊,要想用户能直接登录对应的数据库,需要在创建用户前use数据库

$ mongo
MongoRepl:PRIMARY> use admin
MongoRepl:PRIMARY> db.auth("admin","admin1234")
MongoRepl:PRIMARY> use testdb
MongoRepl:PRIMARY> db.createUser({user: "test",pwd: "test1234",roles:[{role: "readWrite",db:"testdb"}]})
Successfully added user: {
    "user" : "test",
    "roles" : [
        {
            "role" : "readWrite",
            "db" : "testdb"
        }
    ]
}

11. 副本集验证

  1. 验证同步

    登录主节点新增数据

    $ mongo
    MongoRepl:PRIMARY> use testdb
    MongoRepl:PRIMARY> db.auth("test","test1234")
    MongoRepl:PRIMARY> db.test.insert({"name":"test"})
    WriteResult({ "nInserted" : 1 })
    MongoRepl:PRIMARY> db.test.find()
    { "_id" : ObjectId("5ac9f5e06e02cf1ec5d82ae7"), "name" : "test" }
    
    

    登录从节点192.168.1.12查询数据

    $ mongo
    MongoRepl:SECONDARY> use testdb
    MongoRepl:SECONDARY> db.auth("test","test1234")
    MongoRepl:SECONDARY> rs.slaveOk()
    MongoRepl:SECONDARY> db.test.find()
    { "_id" : ObjectId("5ac9f5e06e02cf1ec5d82ae7"), "name" : "test" }
    
  2. 验证故障转移

    关闭主节点

    $ mongo
    MongoRepl:PRIMARY> use admin
    MongoRepl:PRIMARY> db.auth("admin","admin1234")
    MongoRepl:PRIMARY> db.shutdownServer()
    server should be down...
    2018-04-09T09:50:30.195+0800 I NETWORK  [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
    2018-04-09T09:50:30.195+0800 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
    

    确认主节点mongod进程已关闭

    $ ps -ef|grep mongod
    mongo      3799   1581  0 09:54 pts/0    00:00:00 grep mongod
    

    登录从节点查看集群状态

    $ mongo
    MongoRepl:PRIMARY> db.auth("admin","admin1234")
    1
    MongoRepl:PRIMARY> rs.status()
    {
            "set" : "MongoRepl",
            "date" : ISODate("2020-11-13T10:47:45.141Z"),
            "myState" : 1,
            "term" : NumberLong(2),
            "heartbeatIntervalMillis" : NumberLong(2000),
            "optimes" : {
                    "lastCommittedOpTime" : {
                            "ts" : Timestamp(1605264400, 1),
                            "t" : NumberLong(1)
                    },
                    "readConcernMajorityOpTime" : {
                            "ts" : Timestamp(1605264400, 1),
                            "t" : NumberLong(1)
                    },
                    "appliedOpTime" : {
                            "ts" : Timestamp(1605264456, 1),
                            "t" : NumberLong(2)
                    },
                    "durableOpTime" : {
                            "ts" : Timestamp(1605264456, 1),
                            "t" : NumberLong(2)
                    }
            },
            "members" : [
                    {
                            "_id" : 0,
                            "name" : "192.168.1.11:27017",
                            "health" : 0,
                            "state" : 8,
                            "stateStr" : "(not reachable/healthy)",
                            "uptime" : 0,
                            "optime" : {
                                    "ts" : Timestamp(0, 0),
                                    "t" : NumberLong(-1)
                            },
                            "optimeDurable" : {
                                    "ts" : Timestamp(0, 0),
                                    "t" : NumberLong(-1)
                            },
                            "optimeDate" : ISODate("1970-01-01T00:00:00Z"),
                            "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
                            "lastHeartbeat" : ISODate("2020-11-13T10:47:43.243Z"),
                            "lastHeartbeatRecv" : ISODate("2020-11-13T10:46:45.196Z"),
                            "pingMs" : NumberLong(0),
                            "lastHeartbeatMessage" : "Connection refused",
                            "configVersion" : -1
                    },
                    {
                            "_id" : 1,
                            "name" : "192.168.1.12:27017",
                            "health" : 1,
                            "state" : 1,
                            "stateStr" : "PRIMARY",
                            "uptime" : 7748,
                            "optime" : {
                                    "ts" : Timestamp(1605264456, 1),
                                    "t" : NumberLong(2)
                            },
                            "optimeDate" : ISODate("2020-11-13T10:47:36Z"),
                            "infoMessage" : "could not find member to sync from",
                            "electionTime" : Timestamp(1605264415, 1),
                            "electionDate" : ISODate("2020-11-13T10:46:55Z"),
                            "configVersion" : 3,
                            "self" : true
                    },
                    {
                            "_id" : 2,
                            "name" : "192.168.1.13:27017",
                            "health" : 1,
                            "state" : 7,
                            "stateStr" : "ARBITER",
                            "uptime" : 1241,
                            "lastHeartbeat" : ISODate("2020-11-13T10:47:43.186Z"),
                            "lastHeartbeatRecv" : ISODate("2020-11-13T10:47:44.331Z"),
                            "pingMs" : NumberLong(0),
                            "configVersion" : 3
                    }
            ],
            "ok" : 1,
            "operationTime" : Timestamp(1605264456, 1),
            "$clusterTime" : {
                    "clusterTime" : Timestamp(1605264456, 1),
                    "signature" : {
                            "hash" : BinData(0,"j7wJlWUpy/znoe6RSdnRL/yfVz0="),
                            "keyId" : NumberLong("6894548517361025025")
                    }
            }
    }
    
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-01-17 11:52:14  更:2022-01-17 11:52:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 6:24:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码