一、单机副本集部署方案:
单台物理机,一个主节点,一个副本节点,一个仲裁节点。
二、部署步骤
1、在mongodb目录下新建config
目录(目录及位置可随意指定,在此按照config目录搭建),在config
目录中新建主节点配置文件primary.conf
(文件名可随意指定):
[root@Thor config]# cat primary.conf
port = 51077 #主节点端口号
directoryperdb = true #设置每个数据库将被保存在一个单独的目录
shardsvr = true #声明这是一个集群的分片
bind_ip = 10.41.62.65 #绑定服务IP
dbpath = /home/ssd1/data_primary51077 #指定数据库存储路径
logpath = /home/ssd/log/mongodb/primary/mongodb51077.log #指定主节点日志路径
logappend = true #使用追加的方式写日志
oplogSize = 20480 #设置oplog的大小(MB),mongodb采用的是根据oplog来从主节点同步数据。oplog不是无限大,默认如果不手动设置,那么oplogSize就是磁盘空间的5%。超过了5%,oplog会被覆盖。
fork = true #以守护进程的方式运行MongoDB,创建服务器进程
wiredTigerCacheSizeGB = 20 #指的就是Cache size,包括数据和索引。Mongod本身使用内存如连接池堆栈以及sorting buffer等都是额外的,不会被统计到这个数字里面。
#auth = true 启用验证
#keyFile = /home/soft/mongodb/key51077/keyfile #集群的私钥的完整路径
replSet = shard51/10.41.62.65:51078,10.41.62.65:51079 #设置副本集名称:name/ip:port...(只识别/以前)
2、在config
目录中新建从节点配置文件secondary.conf
:
[root@Thor config]# cat secondary.conf
port = 51078
directoryperdb = true
shardsvr = true
bind_ip = 10.41.62.65
dbpath = /home/ssd2/data_Second51077
logpath = /home/ssd/log/mongodb/secondary/mongodb51077.log
logappend = true
oplogSize = 20480
fork = true
wiredTigerCacheSizeGB = 20
#auth = true
#keyFile = /home/soft/mongodb/key51077/keyfile
replSet = shard51/10.41.62.65:51077,10.41.62.65:51079
注意:
从节点的数据目录和主节点尽量放在两块盘上,容灾。
3、在config
目录中新建仲裁节点配置文件arbiter.conf
:
[root@Thor config]# cat arbiter7.conf
port = 51079
shardsvr = true
directoryperdb = true
bind_ip = 10.41.62.65
dbpath = /home/soft/mongodb/data_Arbiter51077
logpath = /home/ssd/log/mongodb/arbiter/mongodb51077.log
logappend = true
oplogSize = 4096
fork = true
wiredTigerCacheSizeGB = 2
#auth = true
#keyFile = /home/soft/mongodb/key51077/keyfile
replSet = shard51/10.41.62.65:51077,10.41.62.65:51078
4、在config
目录中新建配置节点配置文件configsvr.conf
:
[root@Thor config]# cat configsvr.conf
dbpath = /home/soft/mongodb/configsvr51077
bind_ip = 10.41.62.65
directoryperdb = true
configsvr = true
port = 51075
logpath =/home/ssd/log/mongodb/configsvr/mongodb51077.log
logappend = true
#auth = true
#keyFile = /home/soft/mongodb/key51077/keyfile
fork = true
replSet = configsvr65/10.41.62.65:51075 #配置节点副本集
5、在config
目录中新建路由节点配置文件mongos.conf
:
mongodb3.4以后要求配置服务器也创建副本集,不然集群搭建不成功。
configdb = configsvr65/10.41.62.65:51075
bind_ip = 10.41.62.65
port = 51076
logpath = /home/ssd/log/mongodb/mongos/mongodb51077.log
fork = true
logappend = true
#keyFile = /home/soft/mongodb/key51077/keyfile
6、新建以上配置文件中所需要的目录:
mkdir -p /home/ssd1/data_primary51077
mkdir -p /home/ssd/log/mongodb/primary/
cd /home/ssd/log/mongodb/primary/
touch mongodb51077.log
mkdir -p /home/soft/mongodb/key51077/
mkdir -p /home/ssd2/data_Second51077
mkdir -p /home/ssd/log/mongodb/secondary/
cd /home/ssd/log/mongodb/secondary/
touch mongodb51077.log
mkdir -p /home/soft/mongodb/data_Arbiter51077
mkdir -p /home/ssd/log/mongodb/arbiter/
cd /home/ssd/log/mongodb/arbiter/
touch mongodb51077.log
mkdir -p /home/soft/mongodb/configsvr51077
mkdir -p /home/ssd/log/mongodb/configsvr/
cd /home/ssd/log/mongodb/configsvr/
touch mongodb51077.log
mkdir -p /home/ssd/log/mongodb/mongos/
cd /home/ssd/log/mongodb/mongos/
touch mongodb51077.log
7、启动主、备、仲裁三个节点:
./bin/mongod -f ./config/primary.conf
./bin/mongod -f ./config/secondary.conf
./bin/mongod -f ./config/arbiter.conf
8、单个副本集配置:
./bin/mongo 10.41.62.65:51077
在控制界面输入:
cfg = {
_id:"shard51",
members:[
{_id:0,host:"10.41.62.65:51077",priority:10},
{_id:1,host:"10.41.62.65:51078",priority:8},
{_id:2,host:"10.41.62.65:51079",arbiterOnly:true}
]
}
# _id:"shard51":将分片的副本集名称命名为shard51
rs.initiate(cfg)
rs.status()
通过rs.status()
命令查看集群是否配置成功。
9、配置单机配置节点:
./bin/mongod -f ./config/configsvr.conf
./bin/mongo 10.41.62.65:51075
cfg = {_id:"configsvr65",configsvr:true,members:[{_id:0,host:"10.41.62.65:51075",priority:10}]}
rs.initiate(cfg)
rs.status()
10、配置分片信息:
./bin/mongos -f ./config/mongos.conf
./bin/mongo 10.41.62.65:51076
use admin
db.runCommand({addshard:"shard51/10.41.62.65:51077,10.41.62.65:51078,10.41.62.65:51079"})
#如里shard是单台服务器,用 db.runCommand( { addshard : “[: ]” } )这样的命令加入
#如果shard是副本集,用db.runCommand( { addshard : “replicaSetName/[:port][,serverhostname2[:port],…]” });这样的格式表示 。
sh.startBalancer() #开启数据均衡器,实现数据在分片副本集中数据均衡
sh.enableSharding("mydatabase") #对mydatabase数据库启用分片能力
#对表collection_a与collection_b设置片键
sh.shardCollection("mydatabase.collection_a",{"uuid":1,"t_id":1},true)
sh.shardCollection("mydatabase.collection_b",{"h_id":1,"l_id":1},true)
11、创建用户
MongoDB默认是没有用户权限验证的,所以我们需要手动去添加用户,以便可以更加安全的进行访问,在没添加用户验证之前,通过mongos进入数据库时会有警告
./bin/mongo 10.41.62.65:51077
use admin
db.createUser({user:'admin',pwd:'xiang12345',roles:[{role:'root',db:'admin'},"readWriteAnyDatabase"]})
./bin/mongo 10.41.62.65:51075
use admin
db.createUser({user:'admin',pwd:'xiang12345',roles:[{role:'root',db:'admin'},"readWriteAnyDatabase"]})
./bin/mongo 10.41.62.65:51076
use admin
db.createUser({user:'admin',pwd:'xiang12345',roles:[{role:'root',db:'admin'},"readWriteAnyDatabase"]})
这里就添加了一个useradmin这么一个用户,他可以进行所有数据库的用户管理。在添加这个用户后,我们连接mongodb时仍然不需要进行登录,这是因为我们未在配置中开启权限验证。
12、kill掉所有mongdb进程
killall mongod
killall mongos
13、增加安全认证机制KeyFile:
一个合理的keyFile应该满足下面的条件:
1.在分片集群环境中,副本集内成员之间需要用keyFile认证,mongos与配置服务器,副本集之间也要keyFile认证,集群所有mongod和mongos实例使用内容相同的keyFile文件。
2.进行初始化,修改副本集时,都从本地例外登录进行操作
3.由于启用了认证,需要建立一个管理员帐号,才能从远程登录。建立管理员帐户,利用管理员账户从远程登录后,需要建立一个可以操作某个数据库的用户,客户端就用这个用户访问数据库。
4.分片集群中的管理员帐号需要具备配置服务器中admin和config数据库的读写权限,才能进行分片相关操作
5.集群中每个分片有自己的admin数据库,存储了集群的各自的证书和访问权限。如果需要单独远程登录分片,也可以
#生成key
cd /home/soft/NodeServer/mongodb/key51077/
openssl rand -base64 753 > keyfile
chmod 600 keyfile # 该key的权限必须是600
将该key放到集群中机器的每一台上,记住必须保持一致,权限设置成600;
14、对各配置文件中auth与keyFile 选项取消屏蔽;
15、启动mongodb:
./bin/mongod -f ./config/configsvr51077.conf
./bin/mongos -f ./config/mongos51077.conf
./bin/mongod -f ./config/primary51077.conf
./bin/mongod -f ./config/secondary51077.conf
./bin/mongod -f ./config/arbiter51077.conf
16、进入数据库
./bin/mongo 10.41.62.65:51076
use admin
db.auth("admin","xiang12345")
use mydatabase