1 案例1:配置MongoDB副本集
1.1 问题
具体要求:
准备3台mongodb服务器
配置副本集服务
验证副本集配置
1.2 方案
准备三台虚拟机,配置mongodb副本集,ip分别为192.158.4.51, 192.168.4.52,192.168.4.53其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据,实现存储数据副本,提高了数据的可用性,具体分配如表-1所示:
表-1
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:创建mongodb副本集
1)三台主机安装mongodb(以4.51为例)
[root@mongodb51 ~]# cd mongodb/
[root@mongodb51 mongodb]# mkdir /usr/local/mongodb
[root@mongodb51 mongodb]# cd /usr/local/mongodb
[root@mongodb51 mongodb]# cp -r \
/root/mongodb/mongodb-linux-x86_64-rhel70-3.6.3/bin/ .
[root@mongodb51 mongodb]# ls
bin
[root@mongodb51 mongodb]# mkdir etc
[root@mongodb51 mongodb]# mkdir log
[root@mongodb51 mongodb]# mkdir -p data/db
[root@mongodb51 mongodb]# vim etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db/
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.4.51
port=27077
replSet=rs1
//加入到副本集,rs1名字随便起,想知道谁和我在一个副本集里,三台机器的名字一样,都写rs1
2)设置PATH变量
[root@mongodb51 mongodb]# vim /etc/profile
export PATH=/usr/local/mongodb/bin:$PATH
[root@mongodb51 mongodb]# source /etc/profile
3)由于启动和停止服务名字太长,可以起一个别名
给停止服务起一个别名
[root@mongodb51 mongodb]# alias cmdb='mongod --dbpath=/usr/local/mongodb/data/db/ --shutdown'
给启动服务起一个别名
[root@mongodb51 mongodb]# alias smdb='mongod -f /usr/local/mongodb/etc/mongodb.conf'
4)启动服务并连接
[root@mongodb51 ~]# smdb
about to fork child process, waiting until server is ready for connections.
forked process: 5656
child process started successfully, parent exiting
[root@mongodb51 ~]# mongo --host 192.168.4.51 --port 27077
MongoDB shell version v3.6.3
connecting to: mongodb://192.168.4.51:27077/
MongoDB server version: 3.6.3
...
>
5)配置集群信息,任意一台都可以,在这里在51上面操作
> rs1_config = { //rs1_config随便起变量名,要记住
_id:"rs1", //必须为rs1这个,三台主机集群名,配置文件里面写的是这个
members:[
{_id:0,host:"192.168.4.51:27077"}, //_id值随意,host值固定
{_id:1,host:"192.168.4.52:27078"},
{_id:2,host:"192.168.4.53:27079"}
]
}; //回车,出现下面情况为成功
{
"_id" : "rs1",
"members" : [
{
"_id" : 0,
"host" : "192.168.4.51:27077"
},
{
"_id" : 1,
"host" : "192.168.4.52:27078"
},
{
"_id" : 2,
"host" : "192.168.4.53:27079"
}
]
}
>
6)初始化Replica Sets环境
> rs.initiate(rs1_config)
{
"ok" : 1,
"operationTime" : Timestamp(1538187475, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1538187475, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}
}
rs1:SECONDARY>
rs1:PRIMARY> //提示PRIMARY,51为主
7)在52和53上面查看
[root@mongodb52 ~]# mongo --host 192.168.4.52 --port 27078
MongoDB shell version v3.6.3
connecting to: mongodb://192.168.4.52:27078/
MongoDB server version: 3.6.3
...
...
rs1:SECONDARY> //提示SECONDARY,52为从
rs1:SECONDARY>
rs1:SECONDARY>
[root@192 ~]# mongo --host 192.168.4.53 --port 27079
MongoDB shell version v3.6.3
connecting to: mongodb://192.168.4.53:27079/
MongoDB server version: 3.6.3
...
...
rs1:SECONDARY> //提示SECONDARY,53为从
rs1:SECONDARY>
注意:如果初始化错误,重启服务登陆之后重新设置变量,之后再重新初始化
8)查看状态信息
rs1:PRIMARY> rs.status()
...
"members" : [
{
"_id" : 0,
"name" : "192.168.4.51:27077",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2295,
...
...
},
{
"_id" : 1,
"name" : "192.168.4.52:27078",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 384,
...
...
},
{
"_id" : 2,
"name" : "192.168.4.53:27079",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
...
...
9)查看是否是master库
rs1:PRIMARY> rs .isMaster( )
{
"hosts" : [
"192.168.4.51:27077",
"192.168.4.52:27078",
"192.168.4.53:27079"
],
"setName" : "rs1",
"setVersion" : 1,
"ismaster" : true, //主库
"secondary" : false,
"primary" : "192.168.4.51:27077",
"me" : "192.168.4.51:27077",
...
...
10)验证副本集,同步数据验证(51上面写数据)
rs1:PRIMARY> use gamedb2
switched to db gamedb2
rs1:PRIMARY> db.a.save({name:"yaya",age:75,em:"[email protected]"})
WriteResult({ "nInserted" : 1 })
52上面查看
[root@mongodb52 ~]# mongo --host 192.168.4.52 --port 27078
rs1:SECONDARY> db.getMongo().setSlaveOk()
rs1:SECONDARY> show dbs //有gamedb2库
admin 0.000GB
config 0.000GB
ddsdb 0.000GB
gamedb2 0.000GB
local 0.000GB
test 0.000GB
步骤三:切换主库验证
1)自动切换主库验证
关闭51
[root@mongodb51 ~]# cmdb //之前设置的别名
killing process with pid: 5656
查看52和53
[root@mongodb52 ~]# mongo --host 192.168.4.52 --port 27078
MongoDB shell version v3.6.3
connecting to: mongodb://192.168.4.52:27078/
MongoDB server version: 3.6.3
...
...
rs1:PRIMARY> //52为主
rs1:PRIMARY>
[root@mongodb53 ~]# mongo --host 192.168.4.53 --port 27079
MongoDB shell version v3.6.3
connecting to: mongodb://192.168.4.53:27079/
MongoDB server version: 3.6.3
...
...
rs1:SECONDARY> //53为从
启动51,启动后不会再变为主,会成为52的从
[root@mongodb51 ~]# smdb
about to fork child process, waiting until server is ready for connections.
forked process: 6598
child process started successfully, parent exiting
rs1:SECONDARY> rs.isMaster()
{
"hosts" : [
"192.168.4.51:27077",
"192.168.4.52:27078",
"192.168.4.53:27079"
],
"setName" : "rs1",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"primary" : "192.168.4.52:27078",
"me" : "192.168.4.51:27077",
...