mongoDB复制集搭建+分片

部署MongoDB分片群集
群集部署的搭建思路,利用三台服务器,分别安装mongodb数据库,每台服务器创建五个实例(mongos、configs、shard1、shard2、shard3)。三台不同的服务器上的相同名称的实例,创建为一个复制集,分别包括主节点,副节点,仲裁节点。mongos不需创建复制集,config不需指定主副节点及仲裁节点,但是要创建复制集。三台服务器的操作步骤略有差别,但是大多是都是重复操作,步骤完全一致。

IP:10.0.18.15                IP:10.0.18.16	                     IP:10.0.18.17
mongos(27017)	              mongos(27017)	                     mongos(27017)
config(30000)	              config(30000)	                     config(30000)
shard1主节点(40001)	          shard1副节点(40001)	             shard1仲裁节点(40001)
shard2仲裁节点(40002)	      shard2主节点(40002)	             shard2副节点(40002)
shard3副节点(40003)	          shard3仲裁节点(40003)	             shard3主节点(40003)

安装MongoDB数据库
安装支持软件和mongodb

yum install openssl-devel -y
tar zxf mongodb-linux-x86_64-rhel70-4.0.0.tgz -C /usr/local
mv /usr/local/mongodb-linux-x86_64-rhel70-4.0.0 /usr/local/mongodb  //解压即完成安装

创建数据存储目录和日志存储目录
路由服务器不存储数据,因此就不需要创建数据存储目录,只需创建config、shard1、shaed2、shard3即可,日志文件创建完成之后还需要给予权限。

mkdir -p /data/mongodb/logs/
mkdir /etc/mongodb/
mkdir /data/mongodb/config/
mkdir /data/mongodb/shard{1,2,3}
touch /data/mongodb/logs/shard{1,2,3}.log
touch /data/mongodb/logs/mongos.log
touch /data/mongodb/logs/config.log
chmod 777 /data/mongodb/logs/*.log

创建管理用户,修改目录权限

useradd -M -u 8000 -s /sbin/nologin mongo
chown -R mongo.mongo /usr/local/mongodb
chown -R mongo.mongo /data/mongodb

设置环境变量

echo "PATH=/usr/local/mongodb/bin:$PATH" >> /etc/profile
source /etc/profile

系统内存优化

ulimit -n 25000
ulimit -u 25000
sysctl -w vm.zone_reclaim_mode=0
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag  //*注意*这些优化都是临时的,重启失效

部署配置服务器
创建配置文件
#vi /etc/mongodb/config.conf

pidfilepath = /data/mongodb/logs/config.pid           #pid文件位置
dbpath = /data/mongodb/config/                        #数据文件存放位置
logpath = /data/mongodb/logs/config.log               #日志文件位置
logappend = true                 
bind_ip = 0.0.0.0    #监听地址
port = 30000         #端口号
fork = true 
replSet=configs      #复制集名称
configsvr = true
maxConns=20000       #最大连接数

将配置文件发送到其他服务器

scp /etc/mongodb/config.conf mongo2:/etc/mongodb/
scp /etc/mongodb/config.conf mongo3:/etc/mongodb/

启动config实例

./mongod -f /etc/mongodb/config.conf  //三台服务器操作一致

配置复制集(任一台操作即可)

./mongo --port 30000                    //建议三台服务器都进入数据库,方便查看角色变更
config={_id:"configs",members:[{_id:0,host:"10.0.18.15:30000"},{_id:1,host:"10.0.18.16:30000"},{_id:2,host:"10.0.18.17:30000"}]}    //创建复制集
rs.initiate(config)                //初始化复制集

部署shard1分片服务器
创建配置文件
#vi /etc/mongodb/shard1.conf

pidfilepath = /data/mongodb//logs/shard1.pid
dbpath = /data/mongodb/shard1/
logpath = /data/mongodb//logs/shard1.log
logappend = true
journal = true
quiet = true
bind_ip = 0.0.0.0
port = 40001
fork = true
replSet=shard1
shardsvr = true
maxConns=20000

将配置文件发送到其他服务器

scp /etc/mongodb/shard1.conf mongo2:/etc/mongodb/
scp /etc/mongodb/shard1.conf mongo3:/etc/mongodb/

启动shard1实例

./mongod -f /etc/mongodb/shard1.conf  //三台服务器操作一致

配置shard1复制集
在shard分片服务器的创建中,需要注意的点是,不是在任一台服务器上创建都能成功的,如果选择在预先设置为仲裁节点的服务器上创建复制集会报错。以shard1分片服务器为例,可以在172.16.10.26和172.16.10.27服务器上创建复制集,在172.16.10.29上创建则会失败,因为在复制集创建之前,172.16.10.29已经被设置为仲裁节点。

./mongo --port 40001    //建议三台服务器都进入数据库,方便查看角色变更
use admin
config={_id:"shard1",members:[{_id:0,host:"10.0.18.15:40001",priority:2},{_id:1,host:"10.0.18.16:40001",priority:1},{_id:2,host:"10.0.18.17:40001",arbiterOnly:true}]}
rs.initiate(config)

部署shard2分片服务器
创建配置文件
#vi /etc/mongodb/shard2.conf

pidfilepath = /data/mongodb//logs/shard2.pid
dbpath = /data/mongodb/shard2/
logpath = /data/mongodb//logs/shard2.log
logappend = true
journal = true
quiet = true
bind_ip = 0.0.0.0
port = 40002
fork = true
replSet=shard2
shardsvr = true
maxConns=20000

将配置文件发送到其他服务器

scp /etc/mongodb/shard2.conf mongo2:/etc/mongodb/
scp /etc/mongodb/shard2.conf mongo3:/etc/mongodb/

启动shard2实例

./mongod -f /etc/mongodb/shard2.conf  //三台服务器操作一致

配置shard复制集(非仲裁节点服务器)

./mongo --port 40002    //建议三台服务器都进入数据库,方便查看角色变更
use admin
config={_id:"shard2",members:[{_id:0,host:"10.0.18.15:40002",arbiterOnly:true},{_id:1,host:"10.0.18.16:40002",priority:2},{_id:2,host:"10.0.18.17:40002",priority:1}]}
rs.initiate(config)

部署shard3分片服务器
创建配置文件
#vi /etc/mongodb/shard3.conf

pidfilepath = /data/mongodb//logs/shard3.pid
dbpath = /data/mongodb/shard3/
logpath = /data/mongodb//logs/shard3.log
logappend = true
journal = true
quiet = true
bind_ip = 0.0.0.0
port = 40003
fork = true
replSet=shard3
shardsvr = true
maxConns=20000

将配置文件发送到其他服务器

scp /etc/mongodb/shard3.conf mongo2:/etc/mongodb/
scp /etc/mongodb/shard3.conf mongo3:/etc/mongodb/

启动shard3实例

./mongod -f /etc/mongodb/shard3.conf  //三台服务器操作一致

配置shard复制集(非仲裁节点服务器)

./mongo --port 40003    //建议三台服务器都进入数据库,方便查看角色变更
use admin
config={_id:"shard3",members:[{_id:0,host:"10.0.18.15:40003",priority:1},{_id:1,host:"10.0.18.16:40003",arbiterOnly:true},{_id:2,host:"10.0.18.17:40003",priority:2}]}
rs.initiate(config)

部署路由服务器
创建配置文件
vi /etc/mongodb/mongos.conf

pidfilepath = /data/mongodb/logs/mongos.pid
logpath=/data/mongodb/logs/mongos.log
logappend = true
bind_ip = 0.0.0.0
port = 27017
fork = true
configdb = configs/10.0.18.15:30000,10.0.18.16:30000,10.0.18.17:30000
maxConns=20000

将配置文件发送到其他服务器

scp /etc/mongodb/mongos.conf mongo2:/etc/mongodb/
scp /etc/mongodb/mongos.conf mongo3:/etc/mongodb/

启动mongos实例
./mongos -f /etc/mongodb/mongos.conf //三台服务器操作一致注意这里是“mongos”而非“mongod”
启用分片功能

mongo    //因为默认端口即是27017,所以此处不接端口号
use admin
sh.addShard("shard1/10.0.18.15:40001,10.0.18.16:40001,10.0.18.17:40001")
sh.addShard("shard2/10.0.18.15:40002,10.0.18.16:40002,10.0.18.17:40002")
sh.status()           //查看群集状态

//此处先添加两各分片服务器,还有一个,待会添加

测试服务器分片功能
设置分片chunk大小

use config
db.settings.save({"_id":"chunksize","value":1})   //设置块大小为1M是方便实验,不然就需要插入海量数据
模拟写入数据
use testdb
show collections
for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"test"+i})}

//在testdb库的user表中循环写入五万条数据

启用数据库分片

sh.enableSharding("testdb")

//数据库分片就有针对性,可以自定义需要分片的库或者表,毕竟也不是所有数据都是需要分片操作的

为表创建的索引
创建索引的规则是不能一致性太高,要具有唯一性,例如序号,比如性别这一类重复性太高的就不适合做索引

db.user.createIndex({"id":1})   //以”id“为索引

启用表分片

sh.shardCollection("testdb.user",{"id":1})

查看分片情况

sh.status()
--- Sharding Status --- 
            ···省略内容
  shards:
        {  "_id" : "shard1",  "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002",  "state" : 1 }
            ···省略内容
                        chunks:
                                shard1  3
                                shard2  3
                        { "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard1 Timestamp(2, 0) 
                        { "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(3, 0) 
                        { "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0) 
                        { "id" : 29679 } -->> { "id" : 39572 } on : shard2 Timestamp(4, 1) 
                        { "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(1, 4) 
                        { "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5) 

手动添加分片服务器,查看分片情况是否发生变化

use admin

sh.addShard("shard3/10.0.18.15:40003,10.0.18.16:40003,10.0.18.17:40003")
sh.status()
--- Sharding Status --- 
           ···省略内容
  shards:
        {  "_id" : "shard1",  "host" : "shard1/172.16.10.26:40001,172.16.10.27:40001",  "state" : 1 }
        {  "_id" : "shard2",  "host" : "shard2/172.16.10.27:40002,172.16.10.29:40002",  "state" : 1 }
        {  "_id" : "shard3",  "host" : "shard3/172.16.10.26:40003,172.16.10.29:40003",  "state" : 1 }
           ···省略内容
                        chunks:
                                shard1  2
                                shard2  2
                                shard3  2
                        { "id" : { "$minKey" : 1 } } -->> { "id" : 9893 } on : shard3 Timestamp(6, 0) 
                        { "id" : 9893 } -->> { "id" : 19786 } on : shard1 Timestamp(6, 1) 
                        { "id" : 19786 } -->> { "id" : 29679 } on : shard1 Timestamp(4, 0) 
                        { "id" : 29679 } -->> { "id" : 39572 } on : shard3 Timestamp(5, 0) 
                        { "id" : 39572 } -->> { "id" : 49465 } on : shard2 Timestamp(5, 1) 
                        { "id" : 49465 } -->> { "id" : { "$maxKey" : 1 } } on : shard2 Timestamp(1, 5) 

服务器又对数据进行重新分片,当你再次移除一个分片服务器,此时又会对数据再次进行分片处理,MongoDB对数据的处理非常灵活

mongodb的启动顺序是,先启动配置服务器,在启动分片,最后启动mongos.
数据库未加密
启动

mongod -f /etc/mongodb/config.conf
mongod -f /etc/mongodb/shard1.conf
mongod -f /etc/mongodb/shard2.conf
mongod -f /etc/mongodb/shard3.conf
mongos -f /etc/mongodb/mongos.conf

关闭

mongod -f /etc/mongodb/config.conf  --shutdown
mongod -f /etc/mongodb/shard1.conf  --shutdown
mongod -f /etc/mongodb/shard2.conf  --shutdown
mongod -f /etc/mongodb/shard3.conf  --shutdown

==================================

数据库加密后
启动

mongod -f /etc/mongodb-auth/config.conf
mongod -f /etc/mongodb-auth/shard1.conf
mongod -f /etc/mongodb-auth/shard2.conf
mongod -f /etc/mongodb-auth/shard3.conf
mongos -f /etc/mongodb-auth/mongos.conf

关闭

mongod -f /etc/mongodb-auth/config.conf  --shutdown
mongod -f /etc/mongodb-auth/shard1.conf  --shutdown
mongod -f /etc/mongodb-auth/shard2.conf  --shutdown
mongod -f /etc/mongodb-auth/shard3.conf  --shutdown

==================================

可以使用操作系统的 kill 命令,给 mongod 进程发送 SIGINT 或 SIGTERM 信号,
即 “kill -2 PID,” 或者 “kill -15 PID“。

建议不要使用 ”kill -9 pid“,因为如果 MongoDB 运行在没开启日志(–journal)的情况下,可能会造成数据损失。

或者 ps -ef|grep mongo|grep -v grep|awk '{print $2}'|xargs kill -2

开启分片集群的权限验证
首先生成一个添加keyFile文件----->用于认证使用
一个合理的keyFile应该满足下面的条件:

1.在分片集群环境中,副本集内成员之间需要用keyFile认证,mongos与配置服务器,副本集之间也要keyFile认证,集群所有mongod和mongos实例使用内容相同的keyFile文件。
2.进行初始化,修改副本集时,都从本地例外登录进行操作
3.由于启用了认证,需要建立一个管理员帐号,才能从远程登录。建立管理员帐户,利用管理员账户从远程登录后,需要建立一个可以操作某个数据库的用户,客户端就用这个用户访问数据库。
4.分片集群中的管理员帐号需要具备配置服务器中admin和config数据库的读写权限,才能进行分片相关操作
5.集群中每个分片有自己的admin数据库,存储了集群的各自的证书和访问权限。如果需要单独远程登录分片,可以按照3.2的办法建立用户

openssl rand -base64 753

利用上述命令就可以生成一个满足条件的keyFile(如下图),然后将生成的code拷入到keyFile.key中:

cat  /usr/local/mongodb/key/keyFile.key

#然后要给该文件限定权限,必须是600

chmod 600  /usr/local/mongodb/key/keyFile.key

在各个分片以及configserver的配置文件中加上如下语句

#开启权限验证
auth=true
keyFile=/usr/local/mongodb/key/keyFile.key
在mongos配置文件中添加如下语句:
#指向keyFile
keyFile=/usr/local/mongodb/key/keyFile.key
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值