mongodb分片副本集高可用部署

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shihao99/article/details/82348480

以三节点为例,详细介绍mongodb高可用架构部署

1、机器列表(ip是虚构的,可根据实际情况修改)

172.16.10.1

172.16.10.2

172.16.10.3

操作系统为centos6.5

ip 172.16.10.1 172.16.10.2 172.16.10.3 端口
组件 mongos mongos mongos 20000
config server config server config server 21000
shard1 shard1 shard1 27001
shard2 shard2 shard2 27002
  shard3 shard3 shard3 27003

从上面的表格可以看出来,在机器规划时主要考虑一下几个方面

1、每个分片的三个副本分别位于三个节点服务器上,这样可以保证任意一台机器出现故障集群仍然可用

2、标绿色的为每个分片的primary节点,将是哪个分片的主节点分散到三个不同服务器,可以将数据写的压力均分

3、本教程将mongos和mongod部署在一起,实际应用时,mongos可以单独部署

2、服务器准备

1、关闭iptables

 service  iptables stop;
 chkconfig  iptables off;

2、禁止Transparent Huge Pages

mongodb官网明确指出,THP对于mongodb的性能有很大影响,具体可参考https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/的说明

(1)查看THP状态

 cat /sys/kernel/mm/transparent_hugepage/defrag;
[always] madvise never
 cat /sys/kernel/mm/transparent_hugepage/enabled;
[always] madvise never

上述状态说明THP是开启的

(2)禁用THP

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag

(3)开启自动禁用

编辑/etc/rc.d/rc.local ,在最后追加如下内容

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

3、修改zone_reclaim参数

内核参数zone_reclaim_mode值为0或1,当某个节点可用内存不足时:
如果为0的话,那么系统会倾向于从其他节点分配内存;
如果为1的话,那么系统会倾向于从本地节点回收Cache内存多数时候。

使用如下命令修改zone_reclaim参数为0

echo 0 | sudo tee /proc/sys/vm/zone_reclaim_mode;
或者
sudo sysctl -w vm.zone_reclaim_mode=0;

4、修改内核参数vm.swappiness 

系统默认值为vm.swappiness = 60

[root@localhost ~]# sysctl -a|grep swappiness
vm.swappiness = 60

设置为1,只有在内存可用很小的情况下,为了避免发生OOM死机才换出

echo vm.swappiness=1 >> /etc/sysctl.conf
sysctl  -p

5、创建mongodb用户

举例

groupadd  mongodb
useradd  -d /home/mongodb  -g mongodb  mongodb
echo 'mongodb312' | passwd --stdin mongodb
chage -M 99999 mongodb

6、为mongodb的dataDir挂载数据卷

根据实际情况进行挂载,这里不再说明

7、修改系统ulimit

修改配置文件/etc/security/limits.conf和/etc/security/limits.d/XXXXX

*            soft     fsize             unlimited
*            hard    fsize             unlimited
*            soft     cpu              unlimited
*            hard    cpu              unlimited
*            soft     as                 unlimited
*            hard    as                unlimited
*            soft     nofile           655350
*            hard    nofile           655350
*            soft     nproc           655350
*            hard    nproc           655350

8、创建路径

mkdir -p /home/mongodb/conf/
mkdir -p /home/mongodb/data/mongos/log/
mkdir -p /home/mongodb/data//config/data/
mkdir -p /home/mongodb/data//config/log/
mkdir -p /home/mongodb/data/shard1/data/
mkdir -p /home/mongodb/data//shard1/log/
mkdir -p /home/mongodb/data//shard2/data/
mkdir -p /home/mongodb/data//shard2/log/
mkdir -p /home/mongodb/data//shard3/data/
mkdir -p /home/mongodb/data//shard3/log/
mkdir -p /home/mongodb/mongokey/

9、添加环境变量

/etc/profile添加如下内容

export MONGODB_HOME=/home/mongodb/mongodb-linux-x86_64-3.2.11/
export PATH=$MONGODB_HOME/bin:$PATH

mongodb可执行文件路径根据实际情况修改

10、准备keyfile

使用keyfile作为集群各节点之间的认证

在一台机器生成keyfile

openssl rand -base64 100 >  /home/mongodb/mongokey/mongodb-keyfile

将mongodb-keyfile拷贝到所有机器的/home/mongodb/mongokey/路径下,并修改权限为600

chmod  600  /home/mongodb/mongokey/mongodb-keyfile

3、搭建config server副本集

(1)编辑配置文件/home/mongodb/conf/config.conf

## content
systemLog:
  destination: file
  logAppend: true
  path: /home/mongodb/data/config/log/config.log
 
# Where and how to store data.
storage:
  dbPath: /home/mongodb/data/config/data
  journal:
    enabled: true
# how the process runs
processManagement:
  fork: true
  pidFilePath: /home/mongodb/data/config/log/configsrv.pid
 
# network interfaces
net:
  port: 21000
  bindIp: 172.16.10.1,127.0.0.1
 
#operationProfiling:
replication:
    replSetName: config

sharding:
    clusterRole: configsvr

具体配置项请参考mongodb官网的文档

(2)分别启动三个config server

numactl --interleave=all mongod  --keyFile   /home/mongodb/mongokey/mongodb-keyfile --config /home/mongodb/conf/config.conf 

如果没有numactl命令,使用yum进行安装即可

yum install numactl

(3)初始化config server

登录任意一个config server

mongo 127.0.0.1:21000

说明:此处使用127.0.0.1登录mongoshell而不是业务网卡的ip,是因为开启了权限认证,使用127.0.0.1可以绕过认证,后续的几个步骤使用127.0.0.1登录都是出于这个原因

登录mongoshell后,输入

config = {
...    _id : "config",
...     members : [
...         {_id : 0, host : "172.16.10.1:21000" },
...         {_id : 1, host : "172.16.10.2:21000" },
...         {_id : 2, host : "172.16.10.3:21000" }
...     ]
... }

然后执行初始化命令

rs.initiate(config);

查看集群状态

rs.status();

4、搭建shard副本集

编辑配置文件/home/mongodb/conf/shard1.conf

# where to write logging data.
systemLog:
  destination: file
  logAppend: false
  path: /home/mongodb/data/shard1/log/shard1.log
 
# Where and how to store data.
storage:
  dbPath: /home/mongodb/data/shard1/data
  journal:
    enabled: true
  wiredTiger:
    engineConfig:
       cacheSizeGB: 10

# how the process runs
processManagement:
  fork: true 
  pidFilePath: /home/mongodb/data/shard1/log/shard1.pid
 
# network interfaces
net:
  port: 27001
  bindIp: 172.16.10.1,127.0.0.1
  maxIncomingConnections: 2000
#operationProfiling:
replication:
    replSetName: shard1
sharding:
    clusterRole: shardsvr
#operationProfiling:
operationProfiling:
   slowOpThresholdMs: 500
   mode: slowOp
security:
  authorization: enabled
  clusterAuthMode: keyFile
  keyFile: /home/mongodb/mongokey/mongodb-keyfile 
  javascriptEnabled: true
setParameter:
  enableLocalhostAuthBypass: true
  authenticationMechanisms: SCRAM-SHA-1

重点配置项说明

  •  wiredTigerEngineConfigCacheSizeGB:存储引擎使用的最大内存量,如果一个节点只部署一个shard进程,建议设置为物理内存的一半;如果部署多个进程,根据实际情况进行修改。
  • maxIncomingConnections:最大连接数,默认在100000,相当于不限制,建议不超过2000.

三个副本的配置类似,自行修改

分别启动三个节点上的shard1进程

numactl --interleave=all mongod  --config /home/mongodb/conf/shard1.conf 

登录172.16.10.1的shard1

mongo 127.0.0.1:27001

说明:为什么此处要登录172.16.10.1的shard1进行初始化?因为mongodb默认第一次选举时会选择初始化使用的这个节点作为primary节点。在上面的表格中,我们规划了172.16.10.1作为shard1的primary节点,因此在172.16.10.1上进行初始化,下面shard2和shard3的初始化也遵循这一原则。

mongo 127.0.0.1:27001
use admin
#定义副本集配置
config = {
...    _id : "shard1",
...     members : [
...         {_id : 0, host : "172.16.10.1:27001" },
...         {_id : 1, host : “172.16.10.2:27001" },
...         {_id : 2, host : "172.16.10.3:27001" }
...     ]
... }
#初始化副本集配置
rs.initiate(config);
#查看分区状态
rs.status();
#为shard集群的设置root密码
db.createUser(
... {
... user:"root",
... pwd: "yourPasswd",
... roles: [{ role: "root", db: "admin"}]
... }
... )

三个shard副本集的root密码建议都创建一下,以后可能会用得到。

mongodb用户管理具体的可参考官网https://docs.mongodb.com/v3.4/reference/method/js-user-management/

shard2和shard3的搭建参考shard1即可,过程都一样,配置按实际修改即可。

5、搭建mongos集群

编辑配置文件/home/mongodb/conf/mongos.conf,内容如下

systemLog:
  destination: file
  logAppend: false
  path: /home/mongodb/data/mongos/log/mongos.log
processManagement:
  fork: true
  pidFilePath: /home/mongodb/data/mongos/log/mongos.pid
 
# network interfaces
net:
  port: 20000
  bindIp: 172.16.10.1,127.0.0.1
  maxIncomingConnections: 2000
#监听的配置服务器,只能有1个或者3个 configs为配置服务器的副本集名字
sharding:
   configDB: config/172.16.10.1:21000,172.16.10.2:21000,172.16.10.3:21000
#结束

另外两个mongos配置大同小异,稍加修改即可不再赘述。

重点配置说明

  • shardingConfigDB:config server集群地址

分别启动三个mongos进程

mongos  --keyFile    /home/mongodb/mongokey/mongodb-keyfile --config   /home/mongodb/conf/mongos.conf 

任意登录一个mongos

mongo 127.0.0.1:20000

设置集群root用户密码

use admin
db.createUser(
... {
... user:"root",
... pwd: "yourPasswd",
... roles: [{ role: "root", db: "admin"}]
... }
... )

6、启动分片

前面几步搭建好了配置服务器、路由服务器,各个分片服务器,但是还不能使用分片机制,需要配置分片使其生效。

登录任意一个mongos

mongo 172.16.10.1:20000

切换到admin库并登录root用户

use admin;
db.auth("root","yourPasswd");

添加分片

sh.addShard("shard1/172.16.10.1:27001,172.16.10.2:27001,172.16.10.3:27001");
sh.addShard("shard2/172.16.10.1:27002,172.16.10.2:27002,172.16.10.3:27002");
sh.addShard("shard3/172.16.10.1:27003,172.16.10.2:27003,172.16.10.3:27003")

至此,mongodb基于分片副本集的高可用集群就搭建完成了。

猜你喜欢

转载自blog.csdn.net/shihao99/article/details/82348480