Nosql Mongodb 集群配置(一)


 

 

 

 

 

Mongo 安装配置集群

 

 

 

 

                                               上篇(复制集群) 下篇(切片集群)

 

 

 

 

 

 

 

 

 

2013.11

 

 

 

 

 

 

 

目录

 

1     MongoStandalone Server)升级... 4

1.1  Mongo升级到相同主版本2.2.6. 4

1.2  Mongo升级到2.4 版本(建议)... 4

2     集群方式选择... 6

2.1  Replica Set复制模式(首先模式)... 6

2.2  Sharding切片分布式模式(未来可扩展)... 8

2.3  Master-Slave模式(简单的复制模式)... 8

3     Mongo 安装(linux 64... 10

3.1  下载mongo linux x86_64. 10

3.2  解压mongodb安装包... 10

3.3  复制解压的文件到指定目录... 10

3.4  创建快捷链接... 10

3.5  启动默认的一个Mongo 实例... 10

4     手动配置Mongodb Linux Service. 12

4.1  安装Mongo 后创建Mongo快捷链接... 12

4.2  创建数据存储或者日志的路径... 12

4.3  创建mongod 的实例的配置文件... 12

4.4  创建启动和停止脚本并是可执行文件... 13

4.5  创建Linux服务mongodb Service. 14

4.6  启动并测试服务... 15

5     Mongo Replica Set Cluster 本地测试安装... 16

5.1  创建Replica Set Cluster 的本地数据存储路径... 16

5.2  本地创建mongod  3个实例... 16

5.3  连接到Mongo 实例,使用Mongo Shell 界面... 16

5.4  初始化第一个Replica Set Cluster17

5.5  New Collection 测试... 17

6     Mongo Replica Set Cluster Product安装... 19

6.1  安装Mongodb. 19

6.2  修改mongodb 的配置文件绑定IP.. 19

6.3  修改Linux 防火墙,开启27017的端口... 19

6.4  配置Replica Set  Primary主服务器... 20

6.5  造数据测试... 21

6.6  查看节点数据,检查是否配置成功... 21

6.6.1       默认Primary才具有读和写的权限,... 21

6.6.2       修改Secondary 支持可读(生产上可以不设置)... 21

6.7  增加节点... 22

6.8  关闭主节点测试自动切主节点... 22

6.9  强制某个节点为主节点... 22

 

 

 

1     MongoStandalone Server)升级

目前Mongo数据库版本为2.2.2,并且为独立服务器(Standalone Server)。

1.1         Mongo升级到相同主版本2.2.6

Mongo2.2.62.2.x最新版本,修复了2.2.2一些问题。

建议升级到2.2.6,本升级是同版本的内部的一些优化和Bug的修改,不会影响现有的数据和或配置。

升级安全。

1.     下载最新的Mongo 2.2.6,解压。

2.     关闭Mongod进程,替换新的Mongo2.2.6 Binary文件到Mongo2.2.2安装目录。

3.     重新启动Mongod,测试检查。

 

1.2         Mongo升级到2.4 版本(建议)

Mongo2.4.8是当前最新版本,在性能上和管理上都相对修复和改进很多。

建议升级到2.4.8,对于独立的数据库Standalone Server,不会影响现有的数据和或配置。只需更新MongoBinary文件。

升级安全。

1.     下载最新的Mongo 2.4.8,解压。

2.     关闭Mongod进程,替换新的Mongo2.4.8 Binary文件到Mongo2.2.2安装目录。

3.     重新启动Mongod,测试检查。

 

升级的优点:

1.     目前独立的Mongo服务器(Standalone Server),升级很方便,数据不需要迁移。

2.     最新的版本对于性能、管理、安全上面都有改进。

3.     未来需要扩展成Standalone Server Mongo Replica Set Cluster

4.     如果现在不升级,在2.2 版本扩展成Replica Set Cluster 那么后续的升级更复杂。

 

 

2     集群方式选择

Mongodb一共有三种集群搭建的方式Replica Set(复制模式、单点失效自动切换)Sharding(切片,分布式)和Master-Slaver(主从,主失效,需要手工切换)。

 

2.1         Replica Set复制模式(首先模式)

说明: Diagram of default routing of reads and writes to the primary.

 

复制模式操作图:

存在2个副节点

 

Diagram of a 3 member replica set that consists of a primary and two secondaries.

只有主的节点才可写入,主节点和副节点都满足Client可以读,一旦Primary 失效了,Client可以从复制节点读取数据。

一旦主节点失效,就会自动选择一个Secondary作为主节点,

Diagram of an election of a new primary. In a three member replica set with two secondaries, the primary becomes unreachable. The loss of a primary triggers an election where one of the secondaries becomes the new primary

  • replica set可以实现自动的failover和自动的recovery
  • replica set由两个或者更多的节点组成,实现彼此的复制。
  • replica set自动选择primary节点,没有一个节点是固定的primary
  • mongos会自动发现一个replica setprimary节点发生变化,并将写操作发送给这个新的primary节点。

通常用于下面几个场景

  • 数据冗余。
  • 自动failover,提供高可用性的服务。
  • 分散读的负载。
  • 简化维护(相对于master-slave来说)。
  • 灾难恢复。

 

Replica Set模式

   优点:

a)     解决单点失效的问题。

b)     满足数据存在多个复制,保证数据的可靠性。

c)     方便运维。

d)     满足未来的扩展更灵活的集群模式。

 

2.2         Sharding切片分布式模式(未来可扩展)

说明: Diagram of a sample sharded cluster for production purposes.  Contains exactly 3 config servers, 2 or more :program:`mongos` query routers, and at least 2 shards. The shards are replica sets.

 

   目前我们的Standalone Server 模式,这种存在一定的风险,如果文件损坏或者单点失效,会造成数据的丢失,或者恢复Standalone Server比较的麻烦。

   需要选择一种集群方式,考虑到数据的增长性,可以考虑目前采用复制模式,保证单点失效,和数据的多份备份。未来可以切换到Sharding模式。

 

 

 

2.3         Master-Slave模式(简单的复制模式)

mongod --master --dbpath /data/masterdb/
mongod --slave --source <masterhostname><:<port>> --dbpath /data/slavedb/
 
 

   一旦主节点失效或者不可用了,

a)     停止主服务器的进程

b)     停止Slave 的进程mongod on Slave

c)     复制Slave 所有的local下的数据文件覆盖到 dbpath目录

d)     启动Slave mongod 进程以—master 的方式启动。

 

主从切换也较复杂,暂不描述,这种方案很容易犯错,而且不方便运维。

 

 

3     Mongo 安装(linux 64

3.1         下载mongo linux x86_64

直接通过浏览器下载

shell 命令下载

curl http://downloads.mongodb.org/linux/mongodb-linux-x86_64-2.4.8.tgz > mongodb-linux-x86_64-2.4.8.tgz
 
 

3.2         解压mongodb安装包

tar -zxvf mongodb-linux-x86_64-2.4.8.tgz

 

3.3         复制解压的文件到指定目录

mkdir -p /usr/mongodb

cp -R -n mongodb-linux-x86_64-2.4.8/  /usr/mongodb

 

3.4         创建快捷链接

ln -s /usr/mongodb/bin/mongod   /usr/bin/mongod

or:

ln -s /usr/mongodb/bin/mongod   /usr/local/bin/mongod

 

这样就可以在任何地方 启用mongod

 

3.5         启动默认的一个Mongo 实例

先创建mongo数据存放的路径或存储设备

例如:

sudo mkdir  /data/mongodb/data

 

并指定当前的用户拥有读的权限:

 

chown mongodbUser /data/mongodb/data
 
 
mongod -dbpath /data/mongodb/data
 
注:详细的mongod 的启动参数,请参看官方文档
也可以配置一个conf文件, 
Mongod -f  *.conf 来启动
 

 

 

4     手动配置Mongodb Linux Service

4.1         安装Mongo 后创建Mongo快捷链接

ln -s /usr/mongodb/bin/mongod   /usr/bin/mongod

or:

ln -s /usr/mongodb/bin/mongod   /usr/local/bin/mongod

 

这样就可以在任何地方 启用mongod

 

4.2         创建数据存储或者日志的路径

mkdir -p /data/mongodb/data

mkdir -p /data/mongodb/log

 

注:指定用户具有读写权限

chmod  752 /data/mongodb

chown mongodbUser -R  /data/mongodb

 

 

4.3         创建mongod 的实例的配置文件

例如mongodb 的安装目录:/usr/mongodb

创建etc的配置路径

mkdir -p /usr/mongodb/etc

vim /usr/mongodb/etc/mongodb.conf

 

dbpath = /data/mongodb/data

logpath = /data/mongodb/log/mongodb.log

replSet = rs0

port = 27017

fork = true

rest = true

 

如果是复制集群模式增加:

replSet = rs0

 

也可以用命令产生:

Mongod -config /usr/mongodb/etc/mongdb.conf 再修改这个文件

 

4.4         创建启动和停止脚本并是可执行文件

创建mongodb 启动和停止脚本的目录:

Mkdir -p /usr/mongodb/sbin

 

创建启动脚本:

vim  /usr/mongodb/sbin/mongodb_start

#!/bin/sh

mongod -f /usr/mongodb/etc/mongodb.conf

 

创建停止脚本:

vim  /usr/mongodb/sbin/mongodb_stop

#!/bin/bash

pid=`ps -o pid,command ax | grep mongod | awk '!/awk/ && !/grep/ {print $1}'`;

if [ "${pid}" != "" ]; then

      kill -2 ${pid};

fi

 

添加执行权限:

chmod a+x /usr/mongodb/sbin/mongodb_start

chmod a+x /usr/ mongodb /sbin/mongodb_stop

4.5         创建Linux服务mongodb Service

创建服务可执行文件

vim /etc/rc.d/init.d/mongodb

 

#! /bin/sh

#

# mongodb - this script starts and stops the mongodb daemon

#

# chkconfig: - 85 15

# description: MongoDB is a non-relational database storage system.

# processname: mongodb

# config: /usr/mongodb/etc/mongodb.conf

PATH=/usr/mongodb/bin:/usr/mongodb/sbin:/bin:/usr/sbin:/usr/bin

NAME=mongodb

test -x $DAEMON || exit 0

set -e

case "$1" in

  start)

        echo -n "Starting MongoDB... "

        /usr/mongodb/sbin/mongodb_start

        ;;

  stop)

        echo -n "Stopping MongoDB... "

        /usr/ mongodb/sbin/mongodb_stop

        ;;

      *)

            N=/etc/init.d/$NAME

            echo "Usage: $N {start|stop}" >&2

            exit 1

            ;;

    esac

    exit 0

 

添加服务

chmod a+x /etc/rc.d/init.d/mongodb

chkconfig --add mongodb

chkconfig --level 345 mongodb on

需要配置Linux mongodb 的用户来启动该服务。

 

4.6         启动并测试服务

$ service mongodb start

$ service mongodb stop

 

手工配置成功,祝你好运

5     Mongo Replica Set Cluster 本地测试安装

Windows Linux差不多

5.1         创建Replica Set Cluster 的本地数据存储路径

/data/db/rep0-0

/data/db/rep0-1

/data/db/rep0-2

创建日志文件目录:

/data/dblog/log0

/data/dblog/log1

/data/ dblog/log2

 

 

注:Linux Or CentOs 保证当前Mongo 用户的权限:

chown -R curUser:curPasswd /data/db

 

5.2         本地创建mongod  3个实例

可以打开3个终端,也可以采用--fork后台运行模式,虚拟机下这种方式会出现分配空间不够的情况。

mongod --dbpath /data/db/rep0-0 --logpath /data/dblog/log0/mongodb.log --port 10001 --replSet repset --oplogSize 700 -rest -fork

 

mongod --dbpath /data/db/rep0-1 --logpath /data/dblog/log1/mongodb.log --port 10002 --replSet repset --oplogSize 700 -rest --fork

 

mongod --dbpath /data/db/rep0-2 --logpath /data/dblog/log2/mongodb.log --port 10003 --replSet repset --oplogSize 700 -rest --fork

 

 

5.3         连接到Mongo 实例,使用Mongo Shell 界面

bin/mongo localhost:10001/admin
MongoDB shell version: 2.4.8
connecting to: localhost:10001/admin
> 

注:“localhost,可以用域名、hostnameIP地址代替。

 

 

5.4         初始化第一个Replica Set Cluster

Use Db command:

db.runCommand({"replSetInitiate" : {"_id" : "repset", "members" : [{"_id" : 1, "host" : "localhost:10001"}, {"_id" : 2, "host" : "localhost:10002"}, {"_id" : 3, "host" : "localhost:10003"}]}})
{
    "info" : "Config now saved locally.  Should come online in about a minute.",
    "ok" : 1
}

 

 

或者使用以下命令:

rs.initiate()
rs.conf()
rs.add("localhost:10002")
rs.add("localhost:10003")

 

 

5.5         New Collection 测试

PRIMARY> use test
switched to db test
PRIMARY> people = ["Marc", "Bill", "George", "Eliot", "Matt", "Trey", "Tracy", "Greg", "Steve", "Kristina", "Katie", "Jeff"];
PRIMARY> for(var i=0; i<1000000; i++){
     name = people[Math.floor(Math.random()*people.length)];
     user_id = i;
     boolean = [true, false][Math.floor(Math.random()*2)];
     added_at = new Date();
     number = Math.floor(Math.random()*10001);
     db.test_collection.save({"name":name, "user_id":user_id, "boolean": boolean, "added_at":added_at, "number":number });
}

 

 

6     Mongo Replica Set Cluster Product安装

6.1         安装Mongodb

1.     准备三台电脑,或3台虚拟机,设置统一的用户,mongo设置统一的端口。虚拟机,我是先安装好一台,然后复制,通过copy 形成三个Mongo 节点。

2.     每台电脑参照上章《Mongo 安装(linux 64)》

3.     每台电脑参照上章《mongodb Service

 

6.2         修改mongodb 的配置文件绑定IP

修改各节点的配置文件,绑定节点IP地址,并保证IP地址可以互相PING

$ cd /usr/mongodb/etc/

$ vim mongodb.conf

dbpath = /data/mongodb/data

logpath = /data/mongodb/log/mongodb.log

replSet = rs0

bind_ip=192.168.200.X

port = 27017

fork = true

rest = true

 

6.3         修改Linux 防火墙,开启27017的端口

$ iptables -F

$ iptables -P INPUT ACCEPT

$ vim /etc/sysconfig/iptables

 

#增加下列一行,开始端口访问

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT

 

6.4         配置Replica Set  Primary主服务器

$ cd /usr/mongodb/bin
$ ./mongo 192.168.200.234:27017/admin
 

> rs.initiate()
{
        "info2" : "no configuration explicitly specified -- making one",
        "me" : "192.168.200.236:27017",
        "info" : "Config now saved locally.  Should come online in about a minute.",
        "ok" : 1
}
 
> rs.conf()
{
        "_id" : "rs0",
        "version" : 1,
        "members" : [
               {
                       "_id" : 0,
                       "host" : "192.168.200.236:27017"
               }
        ]
}
 
这时主的以配置好了,增加节点
rs0:PRIMARY> rs.add("192.168.200.237:27017");
{ "ok" : 1 }
rs0:PRIMARY> rs.add("192.168.200.239:27017");
{ "ok" : 1 }
 

6.5         造数据测试

 

rs0:PRIMARY> use test

switched to db test

rs0:PRIMARY>db.example.add({name:”primary”, type:”test”});

 

6.6         查看节点数据,检查是否配置成功

6.6.1    默认Primary才具有读和写的权限,

登陆Secondany,会提示无法进行查询和任何的写入操作。

./mongo 192.168.200.239:27017

MongoDB shell version: 2.4.7

connecting to: 192.168.200.239:27017/test

rs0:SECONDARY> show tables;

Thu Nov  7 18:52:59.234 error: { "$err" : "not master and slaveOk=false", "code" : 13435 } at src/mongo/shell/query.js:128

6.6.2    修改Secondary 支持可读(生产上可以不设置)

如果修改此设置,那么主的只有写入权限,读的权限就分配给了各节点。

在写多读少的应用中,使用Replica Sets来实现读写分离

从库设置可以读:

rs0:SECONDARY> db.getMongo()

connection to 192.168.200.239:27017

rs0:SECONDARY> db.getMongo().setSlaveOk();

 

在主库上设置 slaveok=ok

[mongodb@ligh bin]$ ./mongo 192.168.200.236:27017

MongoDB shell version: 2.4.8

connecting to: 192.168.200.236:27017/test

PRIMARY> db.getMongo().setSlaveOk();

 

从库查看:

SECONDARY> db.example.find();

 

6.7         增加节点

增加新的节点,并重新配置。

$ cd /usr/mongodb/bin
$ ./mongo 192.168.200.236:27017/admin

 

   rs.add('192.168.0.21:27017') 
   rs.addArb('192.168.0.21:27017') 
   rs.reconfig(rs.conf()) 

6.8         关闭主节点测试自动切主节点

关闭主节点mongodb Service.

进入另外二个节点,使用mongo shell 登陆 发现有个节点 自动变成主节点了。

关闭的主节点启动,该主节点又自动变为secondary 节点。

 

6.9         强制某个节点为主节点

$ cd /usr/mongodb/bin
$ ./mongo 192.168.200.236:27017/admin
rs.reconfig()

显示

{

      "_id" : "rs0",

      "version" : 3,

      "members" : [

             {

                    "_id" : 0,

                    "host" : "192.168.200.236:27017"

             },

             {

                    "_id" : 1,

                    "host" : "192.168.200.237:27017"

             },

             {

                    "_id" : 2,

                    "host" : "192.168.200.239:27017"

             }

      ]

}

 

如果设置第2个为主节点:

mongo shell 中输入:

cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 0.5
cfg.members[2].priority = 1
rs.reconfig(cfg)
 

 
当前节点变成Secondary 192.168.200.239的变成主节点了。
 

 

 

 

猜你喜欢

转载自hevanwang.iteye.com/blog/2002362