环境描述:有三台ubuntu服务器,,每台服务器上已经有mongodb实例。创建3个mongo2.4的新实例,分别作为三个复制集节点,同时保证了当前单节点环境的稳定

规划:

规划:

3台服务器都已经有单个mongo实例运行

replSet 复制集名称: rs1

replSet 复制集名称: rs1

步骤

MongoDB数据库安装安装路径为:/usr/local/mongodb/

MongoDB数据库安装安装路径为:/usr/local/mongodb/

1.创建mongo新实例需要的目录资源   主要是数据库存放目录、日志文件、配置文件、key文件(保证节点通信)  

 
文件可以在任何地方创建,我在/usr/local下的创建mongodb_rs作为新实例的目录,在该目录下创建资源目录

  1.数据库  mkdir db

  2.日志文件  mkdir log 

  3.配置文件  touch rs.conf  可以cat
/etc/mongodb.conf>rs.conf初始化,添加或修改下面几项

port = 29010             #更改端口 先lsof -i:29010查看是否被占用

fork=true                   #后台demon进程运行

journal=true              #启用可靠性日志

oplogSize=2048  

smallfiles=true

replSet=test_rs         #复制集名称

keyFile=/usr/local/mongodb_rs/key.key   #复制集通信key

4.key文件  touch key.key  生成秘钥 openssl rand 888 -base64>key.key
 用888不要太长 key的长度是有限制的

好了
 目前目录资源都已经创建,先不启动。在其它2个节点重复以上过程,当然第4步用重复,把第一台上的key.key文件内容复制到每一个节点的key.key文件下

在每一台服务节点启动mongo的新实例(mongodb_rs目录下)  mongod -f rs.conf
稍等一会儿会提示successful
 如果不成功查看rs.log日志文件查找原因,可能更换一下端口号

复制集成员IP与端口:

复制集成员IP与端口:

2.配置复制集 

   
选一台服务节点作为primary库192.168.1.132,在服务器上连接mongod实例mongo
–port=29010

    1.初始化复制集  rs.initiate()  查看rs.conf()
 正常情况下生成了一个节点hostname:29010

     
 这个hostname是主机名,把这个主机名添加到另外2台节点的/etc/hosts文件里面

    2.添加节点  

      rs.add(“192.168.1.133:29010”)

      rs.add(“192.168.1.134:29010”)

 
 3.设置优先级,当主节点当机之后重启的时候任然能成为primary节点,一个节点为0
 不会成为主节点

    cfg = rs.conf()

    cfg.members[0].priority=3

    cfg.members[1].priority=1

    cfg.members[0].priority=0

      重新加载

     rs.reconfg(cfg)

   4.查看各个节点的状态 (当然你可以先退出 在登录查看状态)

     health:1  #正常状态

    “stateStr” : “PRIMARY”   #标识主节点

STARTUP:刚加入到复制集中,配置还未加载

STARTUP2:配置已加载完,初始化状态

 RECOVERING:正在恢复,不适用读

ARBITER: 仲裁者

DOWN:节点不可到达

UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂

REMOVED:移除复制集

ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态

FATAL:出错。查看日志grep “replSet FATAL”找出错原因,重新做同步

PRIMARY:主节点

SECONDARY:备份节点

   5.为数据库创建用户名和密码
 保证程序任何情况下(主库挂了)访问一个可靠的库  如为app库创建一个账号

     use app

    db.addUser(“test”,”123″)

   

节点1: localhost:28010   (默认的primary节点)

节点1: localhost:28010   (默认的primary节点)

3.测试数据同步  主从切换

     1.完成了配置之后  先看看secondary是否同步了主库的数据  
或者kill主库的mongo进程  等待一会儿看看是否主库发生了切换  
然后重启看主库是不是重新成为了主库

节点2: localhost:20811

节点2: localhost:20811

4.使用pymongo连接mongodb数据库 

import pymongo

client=pymongo.MongoClient(“192.168.1.132:29010″,replicaSet=”test_rs”)

db = client[“app”]

db.authenticate(‘test’,’123′)

db.user.find()

db.connection.host  #打印当前连接服务器

使用pymongo连接数据库之后可以测试   ,当kill主库之后
 再次打印db.connection.host看看是否还是上次那个host  
如果不同说明故障转移了

节点3: localhost:28012

节点3: localhost:28012

5.如果要做读写分离,设置从库可读,pymongo也提高了这样的api,大家有兴趣可以看看

复制集各节点的数据文件,日志文件,私钥文件路径:

复制集各节点的数据文件,日志文件,私钥文件路径:

节点1: /data/data/r0  , /data/log/r0.log , /data/key/r0

节点1: /data/data/r0  , /data/log/r0.log , /data/key/r0

节点2: /data/data/r1  , /data/log/r1.log , /data/key/r1

节点2: /data/data/r1  , /data/log/r1.log , /data/key/r1

节点3: /data/data/r2  , /data/log/r2.log , /data/key/r2

节点3: /data/data/r2  , /data/log/r2.log , /data/key/r2

 

 

$ wget

$ wget

–2016-07-22 11:17:12– 

–2016-07-22 11:17:12– 

Resolving fastdl.mongodb.org (fastdl.mongodb.org)… 54.182.5.247,
54.182.5.9, 54.182.5.45, …

Resolving fastdl.mongodb.org (fastdl.mongodb.org)… 54.182.5.247,
54.182.5.9, 54.182.5.45, …

Connecting to fastdl.mongodb.org
(fastdl.mongodb.org)|54.182.5.247|:443… connected.

Connecting to fastdl.mongodb.org
(fastdl.mongodb.org)|54.182.5.247|:443… connected.

HTTP request sent, awaiting response… 200 OK

HTTP request sent, awaiting response… 200 OK

Length: 71943658 (69M) [application/x-gzip]

Length: 71943658 (69M) [application/x-gzip]

Saving to: ‘mongodb-linux-x86_64-rhel70-3.2.8.tgz’

Saving to: ‘mongodb-linux-x86_64-rhel70-3.2.8.tgz’

 

 

100%[===============================================================================>]
71,943,658   116KB/s   in 16m 37s

100%[===============================================================================>]
71,943,658   116KB/s   in 16m 37s

 

 

2016-07-22 11:33:51 (70.5 KB/s) –
‘mongodb-linux-x86_64-rhel70-3.2.8.tgz’ saved [71943658/71943658]

2016-07-22 11:33:51 (70.5 KB/s) –
‘mongodb-linux-x86_64-rhel70-3.2.8.tgz’ saved [71943658/71943658]

 

 

$tar zxvf mongodb-linux-x86_64-rhel70-3.2.8.tgz -C /usr/local/

$tar zxvf mongodb-linux-x86_64-rhel70-3.2.8.tgz -C /usr/local/

$mv mongodb-linux-x86_64-rhel70-3.2.8 mongodb

$mv mongodb-linux-x86_64-rhel70-3.2.8 mongodb

1) 创建数据文件存储路径

1) 创建数据文件存储路径

[root@node222 mongodb]# mkdir -p /data02/mongors/data/r0

[root@node222 mongodb]# mkdir -p /data02/mongors/data/r0

[root@node222 mongodb]# mkdir -p /data02/mongors/data/r1

[root@node222 mongodb]# mkdir -p /data02/mongors/data/r1

[root@node222 mongodb]# mkdir -p /data02/mongors/data/r2

[root@node222 mongodb]# mkdir -p /data02/mongors/data/r2

 

 

 

 

2)创建日志文件路径

2)创建日志文件路径

[root@node222 mongodb]# mkdir -p /data02/mongors/log

[root@node222 mongodb]# mkdir -p /data02/mongors/log

 

 

3)创建主从key文件

3)创建主从key文件

用于标识集群的私钥的完整路径,如果各个实例的key
file内容不一致,程序将不能正常使用

用于标识集群的私钥的完整路径,如果各个实例的key
file内容不一致,程序将不能正常使用

[root@node222 mongodb]# mkdir -p /data02/mongors/key

[root@node222 mongodb]# mkdir -p /data02/mongors/key

[root@node222 mongodb]# echo “this is rs1  key” >
/data02/mongors/key/r0

[root@node222 mongodb]# echo “this is rs1  key” >
/data02/mongors/key/r0

[root@node222 mongodb]# echo “this is rs1  key” >
/data02/mongors/key/r1

[root@node222 mongodb]# echo “this is rs1  key” >
/data02/mongors/key/r1

[root@node222 mongodb]# echo “this is rs1  key” >
/data02/mongors/key/r2

[root@node222 mongodb]# echo “this is rs1  key” >
/data02/mongors/key/r2

[root@node222 mongodb]# chmod 600 /data02/mongors/key/r*

[root@node222 mongodb]# chmod 600 /data02/mongors/key/r*

 

 

4)启动3个实例

4)启动3个实例

依次添加启动参数,其中三个MongoDB实例:

依次添加启动参数,其中三个MongoDB实例:

[root@node222 mongodb]# /usr/local/mongodb/bin/mongod –replSet rs1
–keyFile /data02/mongors/key/r0 –fork –port 28010 –dbpath
/data02/mongors/data/r0 –logpath=/data02/mongors/log/r0.log –logappend

[root@node222 mongodb]# /usr/local/mongodb/bin/mongod –replSet rs1
–keyFile /data02/mongors/key/r0 –fork –port 28010 –dbpath
/data02/mongors/data/r0 –logpath=/data02/mongors/log/r0.log –logappend

about to fork child process, waiting until server is ready for
connections.

about to fork child process, waiting until server is ready for
connections.

forked process: 16629

forked process: 16629

child process started successfully, parent exiting

child process started successfully, parent exiting

[root@node222 mongodb]# /usr/local/mongodb/bin/mongod –replSet rs1
–keyFile /data02/mongors/key/r1 –fork –port 28011 –dbpath
/data02/mongors/data/r1 –logpath=/data02/mongors/log/r1.log –logappend

[root@node222 mongodb]# /usr/local/mongodb/bin/mongod –replSet rs1
–keyFile /data02/mongors/key/r1 –fork –port 28011 –dbpath
/data02/mongors/data/r1 –logpath=/data02/mongors/log/r1.log –logappend

about to fork child process, waiting until server is ready for
connections.

about to fork child process, waiting until server is ready for
connections.

forked process: 16666

forked process: 16666

child process started successfully, parent exiting

child process started successfully, parent exiting

[root@node222 mongodb]# /usr/local/mongodb/bin/mongod –replSet rs1
–keyFile /data02/mongors/key/r2 –fork –port 28012 –dbpath
/data02/mongors/data/r2 –logpath=/data02/mongors/log/r2.log –logappend

[root@node222 mongodb]# /usr/local/mongodb/bin/mongod –replSet rs1
–keyFile /data02/mongors/key/r2 –fork –port 28012 –dbpath
/data02/mongors/data/r2 –logpath=/data02/mongors/log/r2.log –logappend

about to fork child process, waiting until server is ready for
connections.

about to fork child process, waiting until server is ready for
connections.

forked process: 16703

forked process: 16703

child process started successfully, parent exiting

child process started successfully, parent exiting

[root@node222 mongodb]#

[root@node222 mongodb]#

 

 

注:启动命令的参数分别为,mongod为主启动命令,
replSet指定复制集名称为rs1,keyfile指定公钥文件
,fork指定启动方式为deamo后台启动;port指定端口号,dbpath指定数据文件目录,logpath指定日志文件,logappend指定错误日志为日志追加模式;

注:启动命令的参数分别为,mongod为主启动命令,
replSet指定复制集名称为rs1,keyfile指定公钥文件
,fork指定启动方式为deamo后台启动;port指定端口号,dbpath指定数据文件目录,logpath指定日志文件,logappend指定错误日志为日志追加模式;

 

 

通过进程和端口,验证启动状态

通过进程和端口,验证启动状态

[root@node222 mongodb]# ps -ef|grep mongo

[root@node222 mongodb]# ps -ef|grep mongo

root     16629     1  0 17:36 ?        00:00:00
/usr/local/mongodb/bin/mongod –replSet rs1 –keyFile
/data02/mongors/key/r0 –fork –port 28010 –dbpath
/data02/mongors/data/r0 –logpath=/data02/mongors/log/r0.log –logappend

root     16629     1  0 17:36 ?        00:00:00
/usr/local/mongodb/bin/mongod –replSet rs1 –keyFile
/data02/mongors/key/r0 –fork –port 28010 –dbpath
/data02/mongors/data/r0 –logpath=/data02/mongors/log/r0.log –logappend

root     16666     1  0 17:36 ?        00:00:00
/usr/local/mongodb/bin/mongod –replSet rs1 –keyFile
/data02/mongors/key/r1 –fork –port 28011 –dbpath
/data02/mongors/data/r1 –logpath=/data02/mongors/log/r1.log –logappend

root     16666     1  0 17:36 ?        00:00:00
/usr/local/mongodb/bin/mongod –replSet rs1 –keyFile
/data02/mongors/key/r1 –fork –port 28011 –dbpath
/data02/mongors/data/r1 –logpath=/data02/mongors/log/r1.log –logappend

root     16703     1  0 17:36 ?        00:00:00
/usr/local/mongodb/bin/mongod –replSet rs1 –keyFile
/data02/mongors/key/r2 –fork –port 28012 –dbpath
/data02/mongors/data/r2 –logpath=/data02/mongors/log/r2.log –logappend

root     16703     1  0 17:36 ?        00:00:00
/usr/local/mongodb/bin/mongod –replSet rs1 –keyFile
/data02/mongors/key/r2 –fork –port 28012 –dbpath
/data02/mongors/data/r2 –logpath=/data02/mongors/log/r2.log –logappend

root     16739 12972  0 17:37 pts/1    00:00:00 grep –color=auto mongo

root     16739 12972  0 17:37 pts/1    00:00:00 grep –color=auto mongo

 

 

[root@node222 mongodb]# netstat -tunlp |grep mong

[root@node222 mongodb]# netstat -tunlp |grep mong

tcp        0      0 0.0.0.0:28010           0.0.0.0:*              
LISTEN      16629/mongod       

tcp        0      0 0.0.0.0:28010           0.0.0.0:*              
LISTEN      16629/mongod       

tcp        0      0 0.0.0.0:28011           0.0.0.0:*              
LISTEN      16666/mongod       

tcp        0      0 0.0.0.0:28011           0.0.0.0:*              
LISTEN      16666/mongod       

tcp        0      0 0.0.0.0:28012           0.0.0.0:*              
LISTEN      16703/mongod       

tcp        0      0 0.0.0.0:28012           0.0.0.0:*              
LISTEN      16703/mongod       

[root@node222 mongodb]#

[root@node222 mongodb]#

 

 

5)配置及初始化 Replica Sets

5)配置及初始化 Replica Sets

登录到primary服务器上:

登录到primary服务器上:

# /usr/local/mongodb/bin/mongo -port 28010

# /usr/local/mongodb/bin/mongo -port 28010

配置复制集:

配置复制集:

> config = {_id: ‘rs1’, members: [

> config = {_id: ‘rs1’, members: [

                           {_id: 0, host:
‘localhost:28010’,priority:1},

                           {_id: 0, host:
‘localhost:28010’,priority:1},

                           {_id: 1, host: ‘localhost:28011’},

                           {_id: 1, host: ‘localhost:28011’},

                           {_id: 2, host: ‘localhost:28012’}]

                           {_id: 2, host: ‘localhost:28012’}]

            }

            }

初始化配置,使上面的配置生效:

初始化配置,使上面的配置生效:

>  rs.initiate(config);

>  rs.initiate(config);

6)查看复制集状态

6)查看复制集状态

> rs.status()

> rs.status()

在primary节点上查看复制集状态:

在primary节点上查看复制集状态:

> rs.isMaster()

> rs.isMaster()

 

 

可以再primary节点进行各种添删改查等各种数据操作,其他非master节点不能进行各种数据操作,也不能发起复制集修改命令

可以再primary节点进行各种添删改查等各种数据操作,其他非master节点不能进行各种数据操作,也不能发起复制集修改命令

 

 

过程如下:(securecrt执行时候总是会复制一下回显)

过程如下:(securecrt执行时候总是会复制一下回显)

[root@node222 mongodb]#  /usr/local/mongodb/bin/mongo -port 28010

[root@node222 mongodb]#  /usr/local/mongodb/bin/mongo -port 28010

MongoDB shell version: 3.2.8

MongoDB shell version: 3.2.8

connecting to: 127.0.0.1:28010/test

connecting to: 127.0.0.1:28010/test

> use adminduse admind

> use adminduse admind

switched to db admind

switched to db admind

> use adminuse admin

> use adminuse admin

switched to db admin

switched to db admin

> config = {_id: ‘rs1’, members: [config = {_id: ‘rs1’, members:
[

> config = {_id: ‘rs1’, members: [config = {_id: ‘rs1’, members:
[

…              {_id: 0, host:
‘localhost:28010’,priority:1},             {_id: 0, host:
‘localhost:28010’,priority:1},

…              {_id: 0, host:
‘localhost:28010’,priority:1},             {_id: 0, host:
‘localhost:28010’,priority:1},

…              {_id: 1, host: ‘localhost:28011’},             {_id:
1, host: ‘localhost:28011’},

…              {_id: 1, host: ‘localhost:28011’},             {_id:
1, host: ‘localhost:28011’},

…              {_id: 2, host: ‘localhost:28012’}]             {_id:
2, host: ‘localhost:28012’}]

…              {_id: 2, host: ‘localhost:28012’}]             {_id:
2, host: ‘localhost:28012’}]

…       }      }

…       }      }

{

{

        “_id” : “rs1”,

        “_id” : “rs1”,

        “members” : [

        “members” : [

                {

                {

                        “_id” : 0,

                        “_id” : 0,

                        “host” : “localhost:28010”,

                        “host” : “localhost:28010”,

                        “priority” : 1

                        “priority” : 1

                },

                },

                {

                {

                        “_id” : 1,

                        “_id” : 1,

                        “host” : “localhost:28011”

                        “host” : “localhost:28011”

                },

                },

                {

                {

                        “_id” : 2,

                        “_id” : 2,

                        “host” : “localhost:28012”

                        “host” : “localhost:28012”

                }

                }

        ]

        ]

}

}

> rs.initiate(config);rs.initiate(config);

> rs.initiate(config);rs.initiate(config);

{ “ok” : 1 }

{ “ok” : 1 }

rs1:OTHER>

rs1:OTHER>

rs1:SECONDARY>

rs1:SECONDARY>

rs1:SECONDARY> rs.status()rs.status()

rs1:SECONDARY> rs.status()rs.status()

{

{

        “set” : “rs1”,

        “set” : “rs1”,

        “date” : ISODate(“2016-07-22T09:40:47.831Z”),

        “date” : ISODate(“2016-07-22T09:40:47.831Z”),

        “myState” : 1,

        “myState” : 1,

        “term” : NumberLong(1),

        “term” : NumberLong(1),

        “heartbeatIntervalMillis” : NumberLong(2000),

        “heartbeatIntervalMillis” : NumberLong(2000),

        “members” : [

        “members” : [

                {

                {

                        “_id” : 0,

                        “_id” : 0,

                        “name” : “localhost:28010”,

                        “name” : “localhost:28010”,

                        “health” : 1,

                        “health” : 1,

                        “state” : 1,

                        “state” : 1,

                        “stateStr” : “PRIMARY”,

                        “stateStr” : “PRIMARY”,

                        “uptime” : 266,

                        “uptime” : 266,

                        “optime” : {

                        “optime” : {

                                “ts” : Timestamp(1469180428, 2),

                                “ts” : Timestamp(1469180428, 2),

                                “t” : NumberLong(1)

                                “t” : NumberLong(1)

                        },

                        },

                        “optimeDate” : ISODate(“2016-07-22T09:40:28Z”),

                        “optimeDate” : ISODate(“2016-07-22T09:40:28Z”),

                        “infoMessage” : “could not find member to sync
from”,

                        “infoMessage” : “could not find member to sync
from”,

                        “electionTime” : Timestamp(1469180428, 1),

                        “electionTime” : Timestamp(1469180428, 1),

                        “electionDate” :
ISODate(“2016-07-22T09:40:28Z”),

                        “electionDate” :
ISODate(“2016-07-22T09:40:28Z”),

                        “configVersion” : 1,

                        “configVersion” : 1,

                        “self” : true

                        “self” : true

                },

                },

                {

                {

                        “_id” : 1,

                        “_id” : 1,

                        “name” : “localhost:28011”,

                        “name” : “localhost:28011”,

                        “health” : 1,

                        “health” : 1,

                        “state” : 2,

                        “state” : 2,

                        “stateStr” : “SECONDARY”,

                        “stateStr” : “SECONDARY”,

                        “uptime” : 31,

                        “uptime” : 31,

                        “optime” : {

                        “optime” : {

                                “ts” : Timestamp(1469180428, 2),

                                “ts” : Timestamp(1469180428, 2),

                                “t” : NumberLong(1)

                                “t” : NumberLong(1)

                        },

                        },

                        “optimeDate” : ISODate(“2016-07-22T09:40:28Z”),

                        “optimeDate” : ISODate(“2016-07-22T09:40:28Z”),

                        “lastHeartbeat” :
ISODate(“2016-07-22T09:40:46.077Z”),

                        “lastHeartbeat” :
ISODate(“2016-07-22T09:40:46.077Z”),

                        “lastHeartbeatRecv” :
ISODate(“2016-07-22T09:40:47.815Z”),

                        “lastHeartbeatRecv” :
ISODate(“2016-07-22T09:40:47.815Z”),

                        “pingMs” : NumberLong(0),

                        “pingMs” : NumberLong(0),

                        “syncingTo” : “localhost:28010”,

                        “syncingTo” : “localhost:28010”,

                        “configVersion” : 1

                        “configVersion” : 1

                },

                },

                {

                {

                        “_id” : 2,

                        “_id” : 2,

                        “name” : “localhost:28012”,

                        “name” : “localhost:28012”,

                        “health” : 1,

                        “health” : 1,

                        “state” : 2,

                        “state” : 2,

                        “stateStr” : “SECONDARY”,

                        “stateStr” : “SECONDARY”,

                        “uptime” : 31,

                        “uptime” : 31,

                        “optime” : {

                        “optime” : {

                                “ts” : Timestamp(1469180428, 2),

                                “ts” : Timestamp(1469180428, 2),

                                “t” : NumberLong(1)

                                “t” : NumberLong(1)

                        },

                        },

                        “optimeDate” : ISODate(“2016-07-22T09:40:28Z”),

                        “optimeDate” : ISODate(“2016-07-22T09:40:28Z”),

                        “lastHeartbeat” :
ISODate(“2016-07-22T09:40:46.104Z”),

                        “lastHeartbeat” :
ISODate(“2016-07-22T09:40:46.104Z”),

                        “lastHeartbeatRecv” :
ISODate(“2016-07-22T09:40:47.813Z”),

                        “lastHeartbeatRecv” :
ISODate(“2016-07-22T09:40:47.813Z”),

                        “pingMs” : NumberLong(0),

                        “pingMs” : NumberLong(0),

                        “syncingTo” : “localhost:28010”,

                        “syncingTo” : “localhost:28010”,

                        “configVersion” : 1

                        “configVersion” : 1

                }

                }

        ],

        ],

        “ok” : 1

        “ok” : 1

}

}

rs1:PRIMARY> rs.isMaster()rs.isMaster()

rs1:PRIMARY> rs.isMaster()rs.isMaster()

{

{

        “hosts” : [

        “hosts” : [

                “localhost:28010”,

                “localhost:28010”,

                “localhost:28011”,

                “localhost:28011”,

                “localhost:28012”

                “localhost:28012”

        ],

        ],

        “setName” : “rs1”,

        “setName” : “rs1”,

        “setVersion” : 1,

        “setVersion” : 1,

        “ismaster” : true,

        “ismaster” : true,

        “secondary” : false,

        “secondary” : false,

        “primary” : “localhost:28010”,

        “primary” : “localhost:28010”,

        “me” : “localhost:28010”,

        “me” : “localhost:28010”,

        “electionId” : ObjectId(“7fffffff0000000000000001”),

        “electionId” : ObjectId(“7fffffff0000000000000001”),

        “maxBsonObjectSize” : 16777216,

        “maxBsonObjectSize” : 16777216,

        “maxMessageSizeBytes” : 48000000,

        “maxMessageSizeBytes” : 48000000,

        “maxWriteBatchSize” : 1000,

        “maxWriteBatchSize” : 1000,

        “localTime” : ISODate(“2016-07-22T09:41:07.987Z”),

        “localTime” : ISODate(“2016-07-22T09:41:07.987Z”),

        “maxWireVersion” : 4,

        “maxWireVersion” : 4,

        “minWireVersion” : 0,

        “minWireVersion” : 0,

        “ok” : 1

        “ok” : 1

}

}

rs1:PRIMARY>

rs1:PRIMARY>

 

 

相关文章