• 副本集 集群


    MongoDB部署Replica Sets

    本节演示在1台服务器上部署3节点的Replica Sets,配置信息如下表所示。

    配置信息 SERVER-1 SERVER-2 SERVER-3
    数据文件存储路径 /data/data/r0 /data/data/r1 /data/data/r2
    日志文件存储路径 /data/log/r0.log /data/log/r1.log /data/log/r2.log
    复制集key文件 /data/key/r0 /data/key/r1 /data/key/r2
    示例监听端口 28010 28011 28012

    分别创建3个节点各自的数据文件存储路径

    mkdir -p /data/data/r0
    mkdir -p /data/data/r1
    mkdir -p /data/data/r2
    

    以上代码创建3个目录,其中SERVER-1使用"/data/data/r0"目录存储数据文件,SERVER-2使用"/data/data/r1"目录存储数据文件,SERVER-3使用"/data/data/r2"目录存储数据文件

    创建日志文件存储路径

    mkdir -p /data/log
    

    在本例中,创建"/data/log"目录用于存储3个节点的系统日志文件

    创建复制集key文件存储路径

    mkdir -p /data/key
    echo "this is rs1 super secret key" > /data/key/r0
    echo "this is rs1 super secret key" > /data/key/r1
    echo "this is rs1 super secret key" > /data/key/r2
    chmod 600 /data/key/r*
    

    以上代码创建3个文件用于存储复制集的key信息,其中SERVER-1使用"/data/key/r0" key文件,SERVER-2使用"/data/key/r1" key文件,SERVER-3使用"/data/key/r2" key文件

    启动3个MongoDB实例来模拟 3个节点

    /usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r0 --fork --port 28010 --dbpath /data/data/r0 --logpath=/data/log/r0.log --logappend
    
    /usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r1 --fork --port 28011 --dbpath /data/data/r1 --logpath=/data/log/r1.log --logappend
    
    /usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r2 --fork --port 28012 --dbpath /data/data/r2 --logpath=/data/log/r2.log --logappend
    

    在本例中,启动3个MongoDB实例来模拟3个节点

    参数说明:

    • replSet:指明复制集的名称。本例的取值是"rs1",其他的节点也必须起这个名字才能保证3个节点间的连通性。
    • keyFile:复制集key文件的路径,对于本例它的取值是"/data/key/r0",其他的节点也必须起这个名字才能保证3个节点间的连通性。
    • fork:将命令放在后台执行。
    • port:MongoDB的监听端口,用于接收客户端请求。
    • dbpath:数据文件存储路径。
    • logpath:系统日志文件存放的位置。
    • logappend:明确指明日志的写入模式是追加,而非覆盖方式。

    配置节点信息,并初始化Replica Sets环境。

    /usr/local/software/mongodb/bin/mongo -port 28010
    
    config_rs1={_id:'rs1',members:[
    	{_id:0,host:'localhost:28010'},
    	{_id:1,host:'localhost:28011'},
    	{_id:2,host:'localhost:28012'}]
    }
    
    rs.initiate(config_rs1);
    

    在本例中,首先通过执行"/Apps/mongo/bin/mongo-port 28010"命令连接到SERVER-1实例;然后通过执行"config_rs1={_id:'rs1',members:……}"命令来命名Replica Sets配置的名字,指定Replica Sets 3个节点的信息。

    其中,参数"id"指明Replica Sets的名字,本例的值是"rs1"。

    接下来通过执行"rs.initiate(config_rs1)"命令启动Replica Sets,其中参数"config_rs1"就是Replica Sets配置的名字。

    配置Replica Sets时需要注意priority(优先级)的概念。当priority=0时,说明这个实例永远不可能被设置成primary。也就是说,它只能作为一个slave而存在,即使在主库当机的情况下,它也不能被选为主库。这种方式其实与最原始的Master-Slave方式是一致的。

    。例如下面的配置中,将28010和28012这两个端口的实例优先级调成0,系统就只能选28011作为主库,如下面的代码所示:

    config_rs1={_id:'rs1',members:[
        {_id:0,host:'localhost:28010',priority:0},
        {_id:1,host:'localhost:28011'},
        {_id:2,host:'localhost:28012',priority:0}]
    }
    

    这样的设置在某些场景中还是非常有实际应用价值的。

    然后可以通过rs.status()查看复制集的状态,分析复制集的各项运行指标(登陆mongo之后查看)

    /usr/local/software/mongodb/bin/mongo -port 28010
    rs1:PRIMARY> rs.status()
    

    脚本

    start.sh

    #!bin/bash
    
    #清空操作
    if [ $1 == 'reset' ]; then
    	pkill -9 mongo
    	rm -rf /data/log
    	rm -rf /data/key
    	rm -rf /data/data/*
    	exit
    fi
    # 启动
    function start() {
    	# 创建必要的文件
        mkdir -p /data/data/r0
        mkdir -p /data/data/r1
        mkdir -p /data/data/r2
        mkdir -p /data/log
        mkdir -p /data/key
        echo "this is rs1 super secret key" > /data/key/r0
        echo "this is rs1 super secret key" > /data/key/r1
        echo "this is rs1 super secret key" > /data/key/r2
        # 给拥有用户授权
        chmod 600 /data/key/r*
    
    	# 启动三个mongo实例
        /usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r0 --fork --port 28010       --dbpath /data/data/r0 --logpath=/data/log/r0.log --logappend
    
        /usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r1 --fork --port 28011       --dbpath /data/data/r1 --logpath=/data/log/r1.log --logappend
    
        /usr/local/software/mongodb/bin/mongod --replSet rs1 --keyFile /data/key/r2 --fork --port 28012       --dbpath /data/data/r2 --logpath=/data/log/r2.log --logappend
    
    	# 连接mongo实例并配置节点
        /usr/local/software/mongodb/bin/mongo -port 28010 << EOF
        config_rs1={_id:'rs1',members:[
            {_id:0,host:'localhost:28010'},
            {_id:1,host:'localhost:28011'},
            {_id:2,host:'localhost:28012'}]
        }
        # 初始化Replica Sets环境
        rs.initiate(config_rs1)
        # 启动完后检查状态
        rs.status()
    EOF
    }
    if [ $1 == 'start' ]; then
    	start
    fi
    

    运行脚本

    # 重置环境
    sh start reset
    # 启动脚本
    sh start start
    

    查看状态

    /usr/local/software/mongodb/bin/mongo -port 28010
    rs1:PRIMARY> rs.status()
    {
    	"set" : "rs1",
    	"date" : ISODate("2019-10-10T15:20:53.814Z"),
    	"myState" : 1,
    	"term" : NumberLong(1),
    	"syncingTo" : "",
    	"syncSourceHost" : "",
    	"syncSourceId" : -1,
    	"heartbeatIntervalMillis" : NumberLong(2000),
    	"optimes" : {
    		"lastCommittedOpTime" : {
    			"ts" : Timestamp(1570720843, 1),
    			"t" : NumberLong(1)
    		},
    		"readConcernMajorityOpTime" : {
    			"ts" : Timestamp(1570720843, 1),
    			"t" : NumberLong(1)
    		},
    		"appliedOpTime" : {
    			"ts" : Timestamp(1570720843, 1),
    			"t" : NumberLong(1)
    		},
    		"durableOpTime" : {
    			"ts" : Timestamp(1570720843, 1),
    			"t" : NumberLong(1)
    		}
    	},
    	"lastStableCheckpointTimestamp" : Timestamp(1570720843, 1),
    	"members" : [
    		{
    			"_id" : 0,
    			"name" : "localhost:28010",
    			//1表明状态正常;0表明状态异常
    			"health" : 1,
    			"state" : 1,
    			// PRIMARY 表明此机器是主库
    			"stateStr" : "PRIMARY",
    			"uptime" : 90,
    			"optime" : {
    				"ts" : Timestamp(1570720843, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDate" : ISODate("2019-10-10T15:20:43Z"),
    			"syncingTo" : "",
    			"syncSourceHost" : "",
    			"syncSourceId" : -1,
    			"infoMessage" : "could not find member to sync from",
    			"electionTime" : Timestamp(1570720782, 1),
    			"electionDate" : ISODate("2019-10-10T15:19:42Z"),
    			"configVersion" : 1,
    			"self" : true,
    			"lastHeartbeatMessage" : ""
    		},
    		{
    			"_id" : 1,
    			"name" : "localhost:28011",
    			"health" : 1,
    			"state" : 2,
    			"stateStr" : "SECONDARY",
    			"uptime" : 82,
    			"optime" : {
    				"ts" : Timestamp(1570720843, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDurable" : {
    				"ts" : Timestamp(1570720843, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDate" : ISODate("2019-10-10T15:20:43Z"),
    			"optimeDurableDate" : ISODate("2019-10-10T15:20:43Z"),
    			"lastHeartbeat" : ISODate("2019-10-10T15:20:52.379Z"),
    			"lastHeartbeatRecv" : ISODate("2019-10-10T15:20:53.450Z"),
    			"pingMs" : NumberLong(0),
    			"lastHeartbeatMessage" : "",
    			"syncingTo" : "localhost:28010",
    			"syncSourceHost" : "localhost:28010",
    			"syncSourceId" : 0,
    			"infoMessage" : "",
    			"configVersion" : 1
    		},
    		{
    			"_id" : 2,
    			"name" : "localhost:28012",
    			"health" : 1,
    			"state" : 2,
    			"stateStr" : "SECONDARY",
    			"uptime" : 82,
    			"optime" : {
    				"ts" : Timestamp(1570720843, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDurable" : {
    				"ts" : Timestamp(1570720843, 1),
    				"t" : NumberLong(1)
    			},
    			"optimeDate" : ISODate("2019-10-10T15:20:43Z"),
    			"optimeDurableDate" : ISODate("2019-10-10T15:20:43Z"),
    			"lastHeartbeat" : ISODate("2019-10-10T15:20:52.379Z"),
    			"lastHeartbeatRecv" : ISODate("2019-10-10T15:20:53.382Z"),
    			"pingMs" : NumberLong(0),
    			"lastHeartbeatMessage" : "",
    			"syncingTo" : "localhost:28010",
    			"syncSourceHost" : "localhost:28010",
    			"syncSourceId" : 0,
    			"infoMessage" : "",
    			"configVersion" : 1
    		}
    	],
    	"ok" : 1,
    	"operationTime" : Timestamp(1570720843, 1),
    	"$clusterTime" : {
    		"clusterTime" : Timestamp(1570720843, 1),
    		"signature" : {
    			"hash" : BinData(0,"crIEP/ps9OmjKTmOvzF9+xNt8O0="),
    			"keyId" : NumberLong("6746194394132512770")
    		}
    	}
    }
    
    

    官网教程

  • 相关阅读:
    【JavaScript】71 厘米换算英尺英寸 (15分)
    【JavaScript PAT乙级】1001 害死人不偿命的(3n+1)猜想
    SQL注入漏洞全接触
    C# 检查字符串,防SQL注入攻击
    经典Sql注入攻击
    putty密钥登陆ssh
    微软自带的WMI查看工具
    SQL Server应用程序中的高级SQL注入
    SQL注入法攻击一日通
    三步堵死SQL注入漏洞
  • 原文地址:https://www.cnblogs.com/qiaozhuangshi/p/11668611.html
Copyright © 2020-2023  润新知