1.Mongodb集群搭建的三种方式

1.Replica Set(首选)【简称:副本集,集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。】
2.Sharding【只有真的是大数据,Sharding才能显现威力,毕竟备节点同步数据是需要时间的;Sharding可以将多片数据集中到路由节点上进行一些对比,然后将数据返回给客户端,但是效率还是比较低的说。】
3.Master-Slaver【最简单的集群搭建,不过准确说也不能算是集群,只能说是主备。并且官方已经不推荐这种方式】


2.Replica Set工作原理

1.Replica Set叫做副本集,集群当中包含了多份数据,保证主节点挂掉了,备节点能继续提供数据服务,提供的前提就是数据需要和主节点一致。
2.Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。
3.默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。
4.仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。


使用Replica Set副本集方式搭建mongodb副本集群_mongodb



3.安装mongodb

tar -xf mongodb-linux-x86_64-rhel70-4.2.9.tgz
/bin/mv mongodb-linux-x86_64-rhel70-4.2.9 /usr/local/mongodb
ln -svf /usr/local/mongodb/bin/* /usr/local/bin/


4.Replica Set搭建配置【生产环境应该主,备,仲裁节点各占一台主机,这里测试环境,只在一台机器上验证了】

5.分别在主,备,仲裁节点创建目录

mkdir -p /data/mongodb_test/master/data
mkdir -p /data/mongodb_test/slaver/data
mkdir -p /data/mongodb_test/arbiter/data


6.编辑配置文件【更多参数详细查看官方文档】

#master.conf
dbpath=/data/mongodb_test/master/data
logpath=/data/mongodb_test/master/master.log
pidfilepath=/data/mongodb_test/master/master.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27517
oplogSize=10000
fork=true
#slaver.conf
dbpath=/data/mongodb_test/slaver/data
logpath=/data/mongodb_test/slaver/slaver.log
pidfilepath=/data/mongodb_test/slaver/slaver.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27617
oplogSize=10000
fork=true
#arbiter.conf
dbpath=/data/mongodb_test/arbiter/data
logpath=/data/mongodb_test/arbiter/arbiter.log
pidfilepath=/data/mongodb_test/arbiter/arbiter.pid
directoryperdb=true
logappend=true
replSet=testrs
bind_ip=0.0.0.0
port=27577
oplogSize=10000
fork=true


7.运行mongodb主,备,仲裁节点

/usr/local/mongodb/bin/mongod -f /data/mongodb_test/master/master.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/arbiter/arbiter.conf


使用Replica Set副本集方式搭建mongodb副本集群_副本集_02

8.保证各节点网络互通,配置集群

登录master节点:mongo 127.0.0.1:27517
> use admin
> cfg={ _id:"testrs", members:[ {_id:0,host:'10.21.210.78:27517',priority:10}, {_id:1,host:'10.21.210.78:27617',priority:1},
{_id:2,host:'10.21.210.78:27717',arbiterOnly:true}] };
> rs.initiate(cfg)  # 使cfg配置生效
# priority:优先级越大,则优先分配成主节点
# 对于仲裁节点,必须要有arbiterOnly:true,不然主备模式就不能生效
登录从节点:mongo 127.0.0.1:27617
> db.getMongo().setSlaveOk()  # 当要去从节点查询数据时,直接插会报错,需要设置从节点为只读.注意从节点的前缀现在是SECONDARY。


查看集群状态:> rs.status(),重点看这些字段

使用Replica Set副本集方式搭建mongodb副本集群_客户端_03

9.开启mongodb认证配置

(1)配置主节点:
登录master节点:mongo 127.0.0.1:27517
> use admin
> db.createUser({user: "admin",pwd: "123456",roles:[{role:"userAdminAnyDatabase",db:"admin"},"readWriteAnyDatabase"]});
> db.grantRolesToUser("admin", ["clusterAdmin"])  # 需要给admin赋予集群权限,否则在后面执行rs.status()会出现如下报错:
"errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0,.....


使用Replica Set副本集方式搭建mongodb副本集群_mongodb_04

> db.auth("admin", "123456")  # 登录数据库
> db.system.users.find()  # 查看用户
mongo 127.0.0.1:27517 -u admin -p 123456 --authenticationDatabase admin # 使用命令验证登录


(2)生成mongodb_key文件:
openssl rand -base64 21 > /data/mongodb_test/mongodb_key
chmod 600 mongodb_key
cat mongodb_key
HnYdGbfazRVLdIl2xIuaDmasYXT0
# 注意:上面的数字 21,最好是 3 的倍数,否则生成的字符串可能含有非法字符,认证失败。


(3)修改mongodb主,备,仲裁节点的配置文件
# 增加下面两行
......
auth=true
keyFile =/data/mongodb_test/mongodb_key


(4)重启mongodb主,备,仲裁节点
# 关闭
kill $(pgrep -f "/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf")
kill $(pgrep -f "/usr/local/mongodb/bin/mongod -f /data/mongodb_test/arbiter/arbiter.conf")
kill $(pgrep -f "/usr/local/mongodb/bin/mongod -f /data/mongodb_test/master/master.conf")
# 启动
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/master/master.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb_test/arbiter/arbiter.conf


10.测试集群,验证主备切换

> rs.status() 查看主节点,27517为主节点,27617为从节点

"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",


模拟故障,kill主节点

使用Replica Set副本集方式搭建mongodb副本集群_客户端_05

登录其中正常的节点查看状态:27517为非健康状态,27617成为新的主节点

"_id" : 0,
"name" : "10.21.210.78:27517",
"health" : 0,
"state" : 8,
"stateStr" : "(not reachable/healthy)",
"uptime" : 0,
"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 2116,


恢复故障节点后,查看集群状态:27517成为主节点,27617为从节点

/usr/local/mongodb/bin/mongod -f /data/mongodb_test/slaver/slaver.conf

"_id" : 0,
"name" : "10.21.210.78:27517",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 18,
"_id" : 1,
"name" : "10.21.210.78:27617",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 15,


验证集群正常

11.验证数据同步

使用Replica Set副本集方式搭建mongodb副本集群_客户端_06

使用Replica Set副本集方式搭建mongodb副本集群_存储数据_07

12.实际应用程序如何连接副本集群?

副本集连接字符串格式:
mongodb://username:password@host1:port1,host2:port2[,...,hostN:portN]/database?options
# options是连接配置中的可选项,replicaSet是其中的一个子项。
示例可以写成:mongodb://admin:123456@10.21.210.78:27517,10.21.210.78:27617/DbName?replicaSet=testrs"


注意:因为仲裁节点没有数据副本,仲裁节点也不可能会被选举为主节点,所以连接字符串信息中不要包含仲裁节点的信息。