mongodb Replica Sets副本集与读写分离

概述

对于mongodb的相关介绍,在此不多累赘,如需了解请见:

http://www.mongodb.org/display/DOCS/Home 

本文目的是说明如下几个功能:
1.在测试环境构建Replica Set方案
2.在服务器端和客户端测试failover
3.测试天然的读写分离,减轻服务器压力
4.添加权限认证功能


部署Replica Sets 方案 

Relica Sets使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案,理论上需要三个mongodb实例,在这个测试环境中,我采用的方案是2个mongod+1个arbiter。
(0)基础环境
mongod1 : deploy 
ip : 10.12.7.107 
port : 27031 
$ mkdir -p /data/db/0 
./mongod  --dbpath /data/db/0 --port 27031 --replSet myset 
mongod2 : doc 
ip : 10.12.7.108 
port : 27032 
$ mkdir -p /data/db/1 
./mongod  --dbpath /data/db/1 --port 27032 --replSet myset 
mongod3 : deploy 
ip : 10.12.7.107 
port : 27033 
$ mkdir -p /data/db/2 
./mongod  --dbpath /data/db/2 --port 27033 --replSet myset 

(1)实例化Replica Sets
任选一个mongod节点,mongo shell 登陆进去,执行如下内容:
> config = {_id: 'myset', members: [ 
        {_id: 0, host: '10.12.7.107:27031'}, 
        {_id: 1, host: '10.12.7.108:27032'}, 
        {_id: 2, host: '10.12.7.107:27033', arbiterOnly: true}]} 
> rs.initiate(config) 
> rs.conf() #查看配置信息 
> rs.staus() 
到此,Replica Sets配置就算完成了,相关的配置信息保存在local数据库中。
 
(2)执行流程说明
在同一时刻,每组 Replica Sets 只有一个 Primary,用于接受写操作。而后会异步复制到其他成员数据库中。一旦 primary 死掉,会自动投票选出接任的 primary 来,原服务器恢复后成为普通成员。如果数据尚未从先前的 primary 复制到成员服务器,有可能会丢失数据。


在服务器端和客户端测试failover

(1)服务器端
在 mongo 中向 primary (27031) 插入数据:
> use test 
switched to db test 
> db.users.insert({name:"terrylc"}) 
这样就会在其他几个副本都插入数据
分别到其他几个去查数据可以查到,但会报not master slaveOk=false这样的错,莫认是不可读,需要设一下:
使用命令;db.getMongo().setSlaveOk();就可以了
 
  
 
  
下面是读写分离部分

一. 配置文件方式

<!-- 读写分离级别配置  -->

<!-- 首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。 -->

<bean id="primaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.PrimaryPreferredReadPreference"></bean>

<!-- 最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点。  -->

<bean id="nearestReadPreference" class="com.mongodb.TaggableReadPreference.NearestReadPreference"></bean>

<!-- 从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。存在的问题是secondary节点的数据会比primary节点数据旧。  -->

<bean id="secondaryReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryReadPreference"></bean>

<!-- 优先从secondary节点进行读取操作,secondary节点不可用时从主节点读取数据  -->
<bean id="secondaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryPreferredReadPreference"></bean>

<!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 -->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
<constructor-arg name="mongoConverter" ref="mappingConverter" />
<!-- 配置读写分离的模式:默认主节点模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。 -->
<!-- <property name="readPreference" ref="secondaryPreferredReadPreference"></property>  -->

</bean>

二. 通过mongoTemplate对象

 mongoTemplate.setReadPreference(readPreference);

 
  
上面是复别人的,有两种配治方式,一种是xml文件配,另一种是代码上写。
一共有5种模式,莫认是在主读的,我选用的是secondaryPreferredReadPreference,下面是我的spring data mongodb 的配治


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:mongo="http://www.springframework.org/schema/data/mongo"  
    xsi:schemaLocation="http://www.springframework.org/schema/context   
          http://www.springframework.org/schema/context/spring-context-3.0.xsd   
          http://www.springframework.org/schema/data/mongo   
          http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd   
          http://www.springframework.org/schema/beans   
          http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
          <!-- 从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。存在的问题是secondary节点的数据会比primary节点数据旧。  -->
          <bean id="secondaryPreferredReadPreference" class="com.mongodb.TaggableReadPreference.SecondaryPreferredReadPreference"></bean>
        <!-- 定义mongo对象,对应的是mongodb官方jar包中的Mongo,replica-set设置集群副本的ip地址和端口 -->  
        <mongo:mongo id="mongo" replica-set="127.0.0.1:27031,127.0.0.1:27032,127.0.0.1:27033">  
            <!-- 一些连接属性的设置 -->      
            <mongo:options  
                 connections-per-host="${mongo.connectionsPerHost}"  
                 threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"  
                 connect-timeout="${mongo.connectTimeout}" 
                 max-wait-time="${mongo.maxWaitTime}"  
                 auto-connect-retry="${mongo.autoConnectRetry}"  
                 socket-keep-alive="${mongo.socketKeepAlive}" 
                 socket-timeout="${mongo.socketTimeout}" />  
        </mongo:mongo>  
                      
        <!-- mongo的工厂,通过它来取得mongo实例,dbname为mongodb的数据库名,没有的话会自动创建 -->  
        <mongo:db-factory dbname="pacific" mongo-ref="mongo"/>  
      
        <!-- mongodb的主要操作对象,所有对mongodb的增删改查的操作都是通过它完成 -->  
        <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">  
          <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>  
          <!-- 配置读写分离的模式:默认主节点模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。 -->
          <property name="readPreference" ref="secondaryPreferredReadPreference"></property>
        </bean>  
    </beans>  
就这样使用实现了读写分离
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值