MongoDB副本集搭建、连接php

PHP连接MongoDB

php连接MongoDB需要安装拓展包有两种,分别是mongo.so和mongodb.so,mongo.so比较老(最新版本是2017.9.5的,目前已停止更新),主要用于php5.x版本,两个拓展包都可以在pecl网站(https://pecl.php.net)下载

下载mongodb拓展包:

[root@linux ~]# cd /usr/local/src/
[root@linux src]# wget https://pecl.php.net/get/mongodb-1.6.1.tgz

解压:

[root@linux src]# tar -zxvf mongodb-1.6.1.tgz 

生成configure文件:

[root@linux src]# cd mongodb-1.6.1/
[root@linux mongodb-1.6.1]# /usr/local/php-fpm/bin/phpize 

配置编译参数:

[root@linux mongodb-1.6.1]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config

编译安装:

[root@linux mongodb-1.6.1]# make && make install

修改php配置文件:

[root@linux mongodb-1.6.1]# vim /usr/local/php-fpm/etc/php.ini 

添加以下内容:

extension=mongodb.so

检查拓展模块是否被加载:

[root@linux mongodb-1.6.1]# /usr/local/php-fpm/bin/php -m|grep mongodb
mongodb

重启php-fpm:

[root@linux mongodb-1.6.1]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm  done

#如果web服务器用的是Apache,需要重启httpd

创建php测试脚本:

[root@linux ~]# vim mongodb.php

添加以下内容:

<?php
$bulk = new MongoDB\Driver\BulkWrite;
$document = ['_id' => new MongoDB\BSON\ObjectID, 'name' => 'mongodb_test'];

$_id= $bulk->insert($document);

var_dump($_id);

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");  
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.mongodbtest', $bulk, $writeConcern);
?>

将脚本放到网站目录下请求:

[root@linux ~]# curl localhost/mongodb.php

登录MongoDB查看:

root@linux ~]# mongo -uuser1 -puser1
> use test
switched to db test
> show tables
mongodbtest
> db.mongodbtest.find()
{ "_id" : ObjectId("5dfa1feb915600294542e6e3"), "name" : "mongodb_test" }

#测试成功,数据已存储到MongoDB中

注意:如果MongoDB启动脚本配置了- - auth密码验证,该测试可能导致数据数据不能存储到MongoDB中

MongoDB副本集介绍

MongoDB主从也叫副本集,早期版本使用master-slave,一主一从和MySQL主从类似,但slave在此架构中为只读,当主宕机后,从不能自动切换为主,目前已经淘汰master-slave模式,改为副本集,这种模式下有一个主(primary),和多个从(secondary),从也是只读,支持给它们设置权重,当主宕掉后,权重值最高的从自动切换为主,在此架构中还可以建立一个仲裁(arbiter)的角色,它只负责裁决,而不存储数据

MongoDB副本集搭建

A机器(primary):192.168.234.128
B机器(secondary):192.168.234.130

编辑两台机器的MongoDB配置文件:

[root@linux ~]# vi /etc/mongod.conf 

bindip需要指定本机地址:
在这里插入图片描述
将replication的注释去掉,并添加以下两行内容:

replication:
    oplogSizeMB: 20
    replSetName: mongodb_test

#oplog类似MySQL主从中的binlog,replSetName指定副本集名称

两台机器都修改完后重启MongoDB服务:

[root@linux ~]# systemctl restart mongod

在A机器连接MongoDB:

[root@linux ~]# mongo
> use admin

创建副本集的集合:

> config={_id:"mongodb_test",members:[{_id:0,host:"192.168.234.128:27017"},{_id:1,host:"192.168.234.130:27017"}]}

初始化:

> rs.initiate(config)
{
	"ok" : 1,
	"$clusterTime" : {
		"clusterTime" : Timestamp(1576679573, 1),
		"signature" : {
			"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
			"keyId" : NumberLong(0)
		}
	},
	"operationTime" : Timestamp(1576679573, 1)
}
mongodb_test:SECONDARY> 

#初始化完成后,命令行前缀变成了mongodb_test:SECONDARY,此时主从两台机器前缀都相同,过一会儿再按回车键,A机器的命令行前缀就会变为mongodb_test:PRIMARY>,当两台机器权重值相同时,在哪台机器上创建配置副本集的集合,哪台机器就优先变为主

查看状态:

mongodb_test:PRIMARY> rs.status()

如果从机器的stateStr项对应的值为STARTUP,则需进行如下操作:

>var config={_id:"mongodb_test",members:[{_id:0,host:"192.168.234.128:27017"},{_id:1,host:"192.168.234.130:27017"}]}
>rs.reconfig(config)

#此时再次查看rs.status()会发现从的状态变为SECONDARY

MongoDB副本集测试

在主(A机器)上创建库与集合:

mongodb_test:PRIMARY> use mytest
switched to db mytest
mongodb_test:PRIMARY> db.acc.insert({accID:1,UserName:"123",password:"123456"})
WriteResult({ "nInserted" : 1 })

在从(B机器)上查看:

mongodb_test:SECONDARY> show dbs

出现以下报错:
在这里插入图片描述
需要执行以下命令:

mongodb_test:SECONDARY> rs.slaveOk()

即可查看:

mongodb_test:SECONDARY> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
mytest  0.000GB
test    0.000GB
mongodb_test:SECONDARY> use mytest
switched to db mytest
mongodb_test:SECONDARY> show tables
acc
mongodb_test:SECONDARY> db.acc.find()
{ "_id" : ObjectId("5dfa3afa91ec600ff57a3b57"), "accID" : 1, "UserName" : "123", "password" : "123456" }

#在主上创建的库与集合已成功同步到从上

查看权重值 rs.config():

mongodb_test:PRIMARY> rs.config()
{
	"_id" : "mongodb_test",
	"version" : 1,
	"protocolVersion" : NumberLong(1),
	"writeConcernMajorityJournalDefault" : true,
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.234.128:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		},
		{
			"_id" : 1,
			"host" : "192.168.234.130:27017",
			"arbiterOnly" : false,
			"buildIndexes" : true,
			"hidden" : false,
			"priority" : 1,
			"tags" : {
				
			},
			"slaveDelay" : NumberLong(0),
			"votes" : 1
		}
	],
	"settings" : {
		"chainingAllowed" : true,
		"heartbeatIntervalMillis" : 2000,
		"heartbeatTimeoutSecs" : 10,
		"electionTimeoutMillis" : 10000,
		"catchUpTimeoutMillis" : -1,
		"catchUpTakeoverDelayMillis" : 30000,
		"getLastErrorModes" : {
			
		},
		"getLastErrorDefaults" : {
			"w" : 1,
			"wtimeout" : 0
		},
		"replicaSetId" : ObjectId("5dfa38954a1d61732c89ae6a")
	}
}

#priority对应的值就是权重值,当前两台机器权重值都为1,当A机器宕机时,B机器会自动切换为主,当A机器恢复时,A机器会变为从,B机器依然是主,因为两台机器权重值相同

设置权重值:

在当前的主上执行以下命令:

mongodb_test:PRIMARY> cfg=rs.config()
mongodb_test:PRIMARY> cfg.members[0].priority=2
mongodb_test:PRIMARY> rs.reconfig(cfg)

members:配置副本集的集合
0:主机器的id

再次查看主机器的权重值已改变:
在这里插入图片描述
#这种情况下,A机器宕机后,B机器自动切换为主,当A机器恢复后,B机器会自动变为从,因为A机器的权重值大于B机器

补充: 需要配置一主多从的副本集同样按此步骤操作即可,当有多台从时,可以给每台设置不一样的权重值,这样当主宕机后,将由权重值最大的从优先切换为主

发布了114 篇原创文章 · 获赞 851 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Powerful_Fy/article/details/103604693
今日推荐