版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
概述:
主节点(Primary)
在复制集中,主节点是唯一能够接收写请求的节点。MongoDB在主节点进行写操作,并将这些操作记录到主节点的oplog中。而从节点将会从oplog复制到其本机,并将这些操作应用到自己的数据集上。(复制集最多只能拥有一个主节点)
从节点(Secondaries)
与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。
仲裁节点(Arbiter)
仲裁节点即投票节点,其本身并不包含数据集,且也无法晋升为主节点。
Replica set有两种架构模式:
1、PSS
Primary + Secondary + Secondary模式,通过Primary和Secondary搭建的Replica Set
该模式下 Replica Set节点数必须为奇数,目的是选主投票的时候要出现大多数才能进行选主决策
2、PSA
Primary + Secondary + Arbiter模式,使用Arbiter搭建Replica Set
偶数个数据节点,加一个Arbiter构成的Replica Set
(关闭顺序PAS)
注意:
在副本集的环境中,要是所有的Secondary都宕机了,只剩下Primary。最后Primary会变成Secondary,不能提供服务。 |
由于生产环境需求,只有三台服务器,安全起见,这里采用PSS架构部署
架构图:
System Edition | Hostname | IP |
---|---|---|
Centos7 | primary | 192.168.16.140 |
Centos7 | secondary-node01 | 192.168.16.141 |
Centos7 | secondary-node02 | 192.168.16.142 |
一、准备工作
以下配置所有机器相同
1、关闭selinux和配置repo
SELINUX=disabled
# vim mongodb-org-3.6.repo # configure mongoDB repo
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
#
# yum clean all
# yum makecache
2、设置主机名
hostnamectl set-hostname xxxx
二、安装配置mongodb
1、设置mongoDB data directory
以下操作所有server相同
[root@primary ~]# mkdir -p /data/mongodb
[root@secondary-node01 ~]# mkdir -p /data/mongodb
[root@secondary-node02 ~]# mkdir -p /data/mongodb
2、安装mongoDB
以下操作所有server相同
# yum install -y mongodb-org #安装最新的稳定版
# rpm -qa |grep mongodb*
mongodb-org-tools-3.6.16-1.el7.x86_64
mongodb-org-server-3.6.16-1.el7.x86_64 # 主服务
mongodb-org-shell-3.6.16-1.el7.x86_64
mongodb-org-mongos-3.6.16-1.el7.x86_64
mongodb-org-3.6.16-1.el7.x86_64
#
# vim /etc/yum.conf #防止mongodb版本意外升级,固定版本
exclude=mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools
3、mongodb集群配置
3.1、配置mongodb
以下操作所有server相同
# rpm -qc mongodb-org-server |egrep *.conf
/etc/mongod.conf
# cp /etc/mongod.conf /etc/mongod.conf.bak
# vim /etc/mongod.conf
replication:
replSetName: replica # 设置复制集名称
启动服务
# mkdir /data/mongodb
# chown -R mongod: /data/mongodb/
# firewall-cmd --permanent --add-port=27017/tcp
# firewall-cmd --reload
# systemctl start mongod # 会自动加入开机自启,无需enable
# ss -nltup |grep 27017
tcp LISTEN 0 128 192.168.16.140:27017 *:* users:(("mongod",pid=2147,fd=11))
测试登录mongodb
# mongo 192.168.16.140:27017 # 登录格式 IP:PORT
MongoDB shell version v3.6.16
connecting to: mongodb://192.168.16.140:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a2633188-014d-479b-8d05-96a9095ff6da") }
MongoDB server version: 3.6.16
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
2020-01-04T04:10:55.758-0500 I CONTROL [initandlisten]
2020-01-04T04:10:55.758-0500 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2020-01-04T04:10:55.758-0500 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2020-01-04T04:10:55.758-0500 I CONTROL [initandlisten]
2020-01-04T04:10:55.759-0500 I CONTROL [initandlisten]
2020-01-04T04:10:55.759-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2020-01-04T04:10:55.759-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-01-04T04:10:55.759-0500 I CONTROL [initandlisten]
2020-01-04T04:10:55.759-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2020-01-04T04:10:55.759-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-01-04T04:10:55.759-0500 I CONTROL [initandlisten]
>
3.2、初始化复制集
找一台节点,这里就在16.140操作
> cfg={_id:"replica",members:[{_id:0,host:"192.168.16.140:27017",priority:3},
... {_id:1,host:"192.168.16.141:27017",priority:2},
... {_id:2,host:"192.168.16.142:27017",priority:1}]}
{
"_id" : "replica",
"members" : [
{
"_id" : 0,
"host" : "192.168.16.140:27017",
"priority" : 3
},
{
"_id" : 1,
"host" : "192.168.16.141:27017",
"priority" : 2
},
{
"_id" : 2,
"host" : "192.168.16.142:27017",
"priority" : 1
}
]
}
PS:第一个_id为/etc/mongod.conf replSetName: replica名字,第二个_id为服务器成员编号0-2,priority设置优先级,值是0到100之间的数字,数字越大优先级越高,priority=0,则此节点永远不能成为主节点primay
> rs.initiate(cfg) #使配置生效
{
"ok" : 1, # 正常状态
"operationTime" : Timestamp(1578134906, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1578134906, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
replica:SECONDARY>
PS:执行“rs.initiate(cfg)“后16.140显示为“replica:SECONDARY”,直接回车后交互界面就会变为“replica:PRIMARY”
replica:SECONDARY>
replica:PRIMARY> rs.status() #查看状态
{
"set" : "replica",
"date" : ISODate("2020-01-04T10:53:16.337Z"),
"myState" : 1,
"term" : NumberLong(1),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"appliedOpTime" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"durableOpTime" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.16.140:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 6142,
"optime" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-01-04T10:53:08Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1578134917, 1),
"electionDate" : ISODate("2020-01-04T10:48:37Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.16.141:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 290,
"optime" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-01-04T10:53:08Z"),
"optimeDurableDate" : ISODate("2020-01-04T10:53:08Z"),
"lastHeartbeat" : ISODate("2020-01-04T10:53:15.736Z"),
"lastHeartbeatRecv" : ISODate("2020-01-04T10:53:15.734Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.16.140:27017",
"syncSourceHost" : "192.168.16.140:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.16.142:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 290,
"optime" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"optimeDurable" : {
"ts" : Timestamp(1578135188, 1),
"t" : NumberLong(1)
},
"optimeDate" : ISODate("2020-01-04T10:53:08Z"),
"optimeDurableDate" : ISODate("2020-01-04T10:53:08Z"),
"lastHeartbeat" : ISODate("2020-01-04T10:53:15.736Z"),
"lastHeartbeatRecv" : ISODate("2020-01-04T10:53:15.878Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.16.140:27017",
"syncSourceHost" : "192.168.16.140:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1, #这是正常状态
"operationTime" : Timestamp(1578135188, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1578135188, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
replica:PRIMARY>
详细说明如下:
“_id” : #集群中节点编号
“name” : #成员服务器名称及端口
“health” : #表示成员中的健康状态(0:down;1:up)
“state” : # ”1”为master,”2”为slave
“stateStr” : #描述该成员是主库(PRIMARY)还是备库(SECONDARY)
“uptime” : #该成员在线时间(秒)
“optime” : #成员最后一次应用日志(oplog)的信息
“optimeDate” : #成员最后一次应用日志(oplog)的时间
“electionTime” : #当前primary从操作日志中选举信息
“electionDate” : #当前primary被选定为primary的日期
“configVersion” : #mongodb版本
“self” : #为true 表示当前节点
4、分别对(secondary-node01/02)两台从节点配置
副本集实现读写分离从库永久设置rs.slaveOk()
[root@secondary-node01 ~]# find / -name .mongorc.js
/root/.mongorc.js
# vim /root/.mongorc.js
rs.slaveOk(); #加入此行
[root@secondary-node01 ~]# mongo 192.168.16.141:27017
replica:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
[root@secondary-node02 ~]# mongo 192.168.16.142:27017
replica:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
5、开启用户登录认证
角色说明:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
PS:如果开启登录认证不设置key authentication,replica set会出现异常
5.1、添加系统管理员
用来管理用户,此为超级用户,超级权限
replica:PRIMARY> use admin #一定要进入此库
replica:PRIMARY> db.createUser({user:"root",pwd:"123456",roles:['root']})
Successfully added user: { "user" : "root", "roles" : [ "root" ] }
replica:PRIMARY>
replica:PRIMARY> show users
{
"_id" : "admin.root", # 登录验证的库及用户
"userId" : UUID("df3f67e0-486f-49d3-b3be-576ccdf0e9a4"),
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root", # 权限
"db" : "admin"
}
]
}
replica:PRIMARY>
5.2、添加数据库管理员
用来管理所有数据库
replica:PRIMARY> db
admin
replica:PRIMARY> db.createUser({user:"admin",pwd:"123456",roles:['userAdminAnyDatabase']})
Successfully added user: { "user" : "admin", "roles" : [ "userAdminAnyDatabase" ] }
replica:PRIMARY>
replica:PRIMARY> show users
{
"_id" : "admin.admin",
"userId" : UUID("3ceee471-6551-4ca8-9700-68962c1dd84b"),
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
{
"_id" : "admin.root",
"userId" : UUID("df3f67e0-486f-49d3-b3be-576ccdf0e9a4"),
"user" : "root",
"db" : "admin",
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
replica:PRIMARY>
5.3、配置文件开启安全认证
所有Server都要开启security
# vim /etc/mongod.conf
security:
authorization: enabled
keyFile: /data/mongodb/mongodb_keyfile
在一台机器上产生mongodb keyfile
[root@primary ~]# openssl rand -base64 741 > /data/mongodb/mongodb_keyfile
PS: 数字741 ,最好是 3 的倍数,否则生成的字符串可能含有非法字符,认证失败
[root@primary ~]# chmod 600 /data/mongodb/mongodb_keyfile
[root@primary ~]# chown mongod: /data/mongodb/mongodb_keyfile
将mongodb keyfile拷贝到各个节点上
[root@secondary-node01 ~]# scp @192.168.16.140:/data/mongodb/mongodb_keyfile /data/mongodb/
[root@secondary-node01 ~]# chown mongod: /data/mongodb/mongodb_keyfile
[root@secondary-node02 ~]# scp @192.168.16.140:/data/mongodb/mongodb_keyfile /data/mongodb/
[root@secondary-node02 ~]# chown mongod: /data/mongodb/mongodb_keyfile
重启mongod服务
[root@primary ~]# systemctl restart mongod
[root@secondary-node01 ~]# systemctl restart mongod
[root@secondary-node02 ~]# systemctl restart mongod
5.4、登录验证
方式一
[root@primary ~]# mongo 192.168.16.140:27017 -u admin -p 123456 --authenticationDatabase admin
MongoDB shell version v3.6.16
connecting to: mongodb://192.168.16.140:27017/test?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("f2737c88-fc7f-4d67-b372-9eb14ca96bb6") }
MongoDB server version: 3.6.16
replica:PRIMARY>
replica:PRIMARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
replica:PRIMARY>
方式二
[root@primary ~]# mongo 192.168.16.140:27017
MongoDB shell version v3.6.16
connecting to: mongodb://192.168.16.140:27017/test?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("fd581025-9d0a-4a1c-80ad-a58a2780c447") }
MongoDB server version: 3.6.16
replica:PRIMARY>
replica:PRIMARY> use admin
switched to db admin
replica:PRIMARY>
replica:PRIMARY> db.auth('admin','123456') # 认证
1
replica:PRIMARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
replica:PRIMARY>
方式三
三、DB验证
1、验证主从切换
[root@primary ~]# hostname
primary
[root@primary ~]# mongo 192.168.16.140:27017 -u admin -p 123456 --authenticationDatabase admin
MongoDB shell version v3.6.16
connecting to: mongodb://192.168.16.140:27017/test?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("0456c9bd-cfe9-47ae-9b42-d18436199924") }
MongoDB server version: 3.6.16
replica:PRIMARY> # 当前16.140是master
replica:PRIMARY>
关闭主16.140 mongod服务
[root@primary ~]# mongo 192.168.16.140:27017 -u root -p 123456 --authenticationDatabase admin
replica:PRIMARY> use admin
switched to db admin
replica:PRIMARY> db.shutdownServer() # 关闭16.140 DB
server should be down...
2020-01-05T20:28:59.853-0500 I NETWORK [thread1] trying reconnect to 192.168.16.140:27017 (192.168.16.140) failed
2020-01-05T20:29:00.803-0500 I NETWORK [thread1] Socket recv() Connection reset by peer 192.168.16.140:27017
2020-01-05T20:29:00.803-0500 I NETWORK [thread1] SocketException: remote: (NONE):0 error: SocketException socket exception [RECV_ERROR] server [192.168.16.140:27017]
2020-01-05T20:29:00.803-0500 I NETWORK [thread1] reconnect 192.168.16.140:27017 (192.168.16.140) failed failed
2020-01-05T20:29:00.807-0500 I NETWORK [thread1] trying reconnect to 192.168.16.140:27017 (192.168.16.140) failed
2020-01-05T20:29:00.807-0500 W NETWORK [thread1] Failed to connect to 192.168.16.140:27017, in(checking socket for error after poll), reason: Connection refused
2020-01-05T20:29:00.807-0500 I NETWORK [thread1] reconnect 192.168.16.140:27017 (192.168.16.140) failed failed
>
PS:必须使用超级管理员“root”登录才能使用“rs.status()”
[root@secondary-node01 ~]# hostname
secondary-node01
[root@secondary-node01 ~]#
[root@secondary-node01 ~]# mongo 192.168.16.141:27017 -u root -p 123456 --authenticationDatabase admin
MongoDB shell version v3.6.16
connecting to: mongodb://192.168.16.141:27017/test?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("d06ba117-f82f-4446-8be5-d248722ae5cf") }
MongoDB server version: 3.6.16
Server has startup warnings:
2020-01-05T00:57:08.623-0500 I CONTROL [initandlisten]
2020-01-05T00:57:08.624-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2020-01-05T00:57:08.624-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-01-05T00:57:08.624-0500 I CONTROL [initandlisten]
2020-01-05T00:57:08.624-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2020-01-05T00:57:08.624-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-01-05T00:57:08.624-0500 I CONTROL [initandlisten]
replica:PRIMARY> # 16.141已经成为master
replica:PRIMARY>
replica:PRIMARY> rs.status()
{
"set" : "replica",
"date" : ISODate("2020-01-05T06:11:40.248Z"),
"myState" : 1,
"term" : NumberLong(31),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1578204698, 1),
"t" : NumberLong(31)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1578204698, 1),
"t" : NumberLong(31)
},
"appliedOpTime" : {
"ts" : Timestamp(1578204698, 1),
"t" : NumberLong(31)
},
"durableOpTime" : {
"ts" : Timestamp(1578204698, 1),
"t" : NumberLong(31)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.16.140:27017",
"health" : 0, # 16.140异常
"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-01-05T06:11:40.196Z"),
"lastHeartbeatRecv" : ISODate("2020-01-05T06:08:06.574Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "Connection refused",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"configVersion" : -1
},
{
"_id" : 1,
"name" : "192.168.16.141:27017",
"health" : 1,
"state" : 1, # 16.141成为primary
"stateStr" : "PRIMARY", # 16.141成为primary
"uptime" : 873,
"optime" : {
"ts" : Timestamp(1578204698, 1),
"t" : NumberLong(31)
},
"optimeDate" : ISODate("2020-01-05T06:11:38Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1578204496, 2),
"electionDate" : ISODate("2020-01-05T06:08:16Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 2,
"name" : "192.168.16.142:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 822,
"optime" : {
"ts" : Timestamp(1578204698, 1),
"t" : NumberLong(31)
},
"optimeDurable" : {
"ts" : Timestamp(1578204698, 1),
"t" : NumberLong(31)
},
"optimeDate" : ISODate("2020-01-05T06:11:38Z"),
"optimeDurableDate" : ISODate("2020-01-05T06:11:38Z"),
"lastHeartbeat" : ISODate("2020-01-05T06:11:39.582Z"),
"lastHeartbeatRecv" : ISODate("2020-01-05T06:11:39.327Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.16.141:27017",
"syncSourceHost" : "192.168.16.141:27017",
"syncSourceId" : 1,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1578204698, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1578204698, 1),
"signature" : {
"hash" : BinData(0,"XXhef/vh418fjTkBUBir455MfpI="),
"keyId" : NumberLong("6778037861485641729")
}
}
}
replica:PRIMARY>
再次开启主16.140 mongod服务
[root@primary ~]# systemctl start mongod
[root@primary ~]#
[root@primary ~]# mongo 192.168.16.140:27017 -u root -p 123456 --authenticationDatabase admin
MongoDB shell version v3.6.16
connecting to: mongodb://192.168.16.140:27017/test?authSource=admin&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("baecda92-20ca-4f8b-99aa-2e193d203485") }
MongoDB server version: 3.6.16
Server has startup warnings:
2020-01-05T01:25:26.787-0500 I CONTROL [initandlisten]
2020-01-05T01:25:26.787-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2020-01-05T01:25:26.787-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-01-05T01:25:26.787-0500 I CONTROL [initandlisten]
2020-01-05T01:25:26.787-0500 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2020-01-05T01:25:26.787-0500 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2020-01-05T01:25:26.787-0500 I CONTROL [initandlisten]
replica:PRIMARY> # 16.140自动变回master
replica:PRIMARY>
replica:PRIMARY> rs.status()
{
"set" : "replica",
"date" : ISODate("2020-01-05T06:30:14.711Z"),
"myState" : 1,
"term" : NumberLong(32),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"heartbeatIntervalMillis" : NumberLong(2000),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"readConcernMajorityOpTime" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"appliedOpTime" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"durableOpTime" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
}
},
"members" : [
{
"_id" : 0,
"name" : "192.168.16.140:27017",
"health" : 1, # 16.140在线状态
"state" : 1,
"stateStr" : "PRIMARY", # 16.140自动变回primary
"uptime" : 289,
"optime" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"optimeDate" : ISODate("2020-01-05T06:30:08Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -1,
"infoMessage" : "",
"electionTime" : Timestamp(1578205537, 1),
"electionDate" : ISODate("2020-01-05T06:25:37Z"),
"configVersion" : 1,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : 1,
"name" : "192.168.16.141:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 287,
"optime" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"optimeDurable" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"optimeDate" : ISODate("2020-01-05T06:30:08Z"),
"optimeDurableDate" : ISODate("2020-01-05T06:30:08Z"),
"lastHeartbeat" : ISODate("2020-01-05T06:30:14.340Z"),
"lastHeartbeatRecv" : ISODate("2020-01-05T06:30:12.884Z"),
"pingMs" : NumberLong(1),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.16.140:27017",
"syncSourceHost" : "192.168.16.140:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
},
{
"_id" : 2,
"name" : "192.168.16.142:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 287,
"optime" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"optimeDurable" : {
"ts" : Timestamp(1578205808, 1),
"t" : NumberLong(32)
},
"optimeDate" : ISODate("2020-01-05T06:30:08Z"),
"optimeDurableDate" : ISODate("2020-01-05T06:30:08Z"),
"lastHeartbeat" : ISODate("2020-01-05T06:30:14.340Z"),
"lastHeartbeatRecv" : ISODate("2020-01-05T06:30:14.531Z"),
"pingMs" : NumberLong(0),
"lastHeartbeatMessage" : "",
"syncingTo" : "192.168.16.140:27017",
"syncSourceHost" : "192.168.16.140:27017",
"syncSourceId" : 0,
"infoMessage" : "",
"configVersion" : 1
}
],
"ok" : 1,
"operationTime" : Timestamp(1578205808, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1578205808, 1),
"signature" : {
"hash" : BinData(0,"wsUy7l3Hu3vunY9w2CmkfoJ+B4I="),
"keyId" : NumberLong("6778037861485641729")
}
}
}
replica:PRIMARY>
2、数据同步
在16.140建库、建表、插入数据
replica:PRIMARY> use test1 # 创建test1 DB,有此库则进入,没有则创建并进入DB
switched to db test1
replica:PRIMARY> show dbs # 并没有test1 DB,因为库中没有数据
admin 0.000GB
config 0.000GB
local 0.000GB
replica:PRIMARY> db.test1.insert({"name":"helloworld"}) # 插入数据
replica:PRIMARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test1 0.000GB # 有此库了
replica:PRIMARY> db.test1.find() # 查询数据
{ "_id" : ObjectId("5e118886b4128d7bf6dfa02c"), "name" : "helloworld" }
在16.141/142上查看
replica:SECONDARY> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test1 0.000GB
replica:SECONDARY> use test1
switched to db test1
replica:SECONDARY>
replica:SECONDARY> db.test1.find()
{ "_id" : ObjectId("5e118886b4128d7bf6dfa02c"), "name" : "helloworld" }
replica:SECONDARY>
Completion !