mongo集群安装

Mongo集群部署

1.部署准备

1.1 Mongo集群环境

1.1.1mongo版本

版本号:4.0.0

1.1.2硬件环境:

<colgroup><col><col><col></colgroup>
|

172.16.18.73

|

172.16.20.211

|

172.16.21.190

|
|

mongos

|

mongos

|

mongos

|
|

config server

|

config server

|

config server

|
|

shard server1主节点

|

shard server1副节点

|

shard server1仲裁

|
|

shard server2副节点

|

shard server2仲裁

|

shard server2主节点

|
|

shard server3仲裁

|

shard server3主节点

|

shard server3副节点

|
| | | |

1.1.3端口规划

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">由于一个机器需要同时部署 mongos、config server 、shard1、shard2、shard3,所以需要用端口进行区分。端口分配:

config:21000

shard1:27001

shard2:27002

shard3:27003

mongos:20000</pre>

1.1.4 目录规划

/opt/module/mongodb/conf # 存放所有服务器的配置文件

/data/mongodb/mongos/logs # 存放路由服务器的日志信息

/data/mongodb/config/data # 存放配置服务器的数据

/data/mongodb/config/logs # 存放配置服务器的日志

/data/mongodb/shard1/data # 存放分片服务器上的数据

/data/mongodb/shard1/logs # 存放分片服务器上的日志

/ data/mongodb/shard2/data # 存放分片服务器上的数据

/ data/mongodb/shard2/logs # 存放分片服务器上的日志

/ data/mongodb/shard3/data # 存放分片服务器上的数据

/ data/mongodb/shard3/logs # 存放分片服务器上的日志

1.2 prometheus和grafana环境

之前部署的环境10.43.200.182,prometheus端口9090,grafana端口3000。

https://segmentfault.com/a/1190000019701235#articleHeader24

2.集群安装

2.1 下载安装包

http://downloads.mongodb.org/linux/mongodb-linux-x86_64-4.0.10.tgz

解压到/opt/module/mongodb目录下

2.2系统变量设置

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">/etc/profile文件增加下面内容:</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">export MONGODB_HOME=/opt/module/mongodb</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">export PATH=MONGODB_HOME/bin:PATH</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">使配置生效:</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">shell> source /etc/profile</pre>

2.3集群配置

2.3.1 配置config-server

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">根据服务器规划,我们在三台机器上部署config server副本集,在该三台服务器上分别添加以下配置文件:进入配置文件目录 conf/config.conf</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">shell> vi conf/config.conf</pre>

配置文件内容:

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">config = {</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;"> _id : "configs",</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;"> members : [</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;"> {_id : 0, host : "172.16.18.73:21000" },</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;"> {_id : 1, host : "172.16.20.211:21000" },</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;"> {_id : 2, host : "172.16.21.190:21000" }</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;"> ]</pre>

} 

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">启动三台服务器的 config server:mongod -f mongodb/conf/config.conf</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">登录任意一台配置服务器(注意是配置端口),初始化配置副本集(执行命令的时候,不要复制注释,只复制命令去一步步执行)。</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">shell> mongo --port 21000</pre>

定义副本集配置(键“_id”对应的值必须与配置文件中的replicaction.replSetName一致)

初始化副本集

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">rs.initiate(config)</pre>

查看分区状态

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">rs.status();</pre>

此时会发现终端上的输出已经有了变化。

rs.initiate(config) 初始化。不成功的话,路由服务器与配置服务器连接不上。
其中,”_id” : “configs”应与配置文件中配置的 replicaction.replSetName 一致,”members” 中的 “host” 为三个节点的 ip 和 配置port。

2.3.2 shard server分片服务器集群配置

配置第一个分片副本集,config/shard1.conf

三台服务器分别添加一下配置文件:

shell >

配置如下内容:

where to write logging data.

systemLog:

destination: file

logAppend: true

path: /data/mongodb/shard1/logs/shard1.log

Where and how to store data.

storage:

dbPath: /data/mongodb/shard1/data

journal:

enabled: true

how the process runs

processManagement:

fork: true

pidFilePath: /data/mongodb/shard1/logs/shard1.pid

network interfaces

net:

port: 27001

bindIp: 0.0.0.0

副本集名称

replication:

replSetName: shard1

声明这是一个集群的分片服务;

sharding:

clusterRole: shardsvr

启动三台服务器的shard1 server:

mongod -f conf/shard1.conf

登陆任意一台服务器(注意是分片端口),初始化副本集. 定义副本集配置(键“_id”对应的值必须与配置文件中的replicaction.replSetName一致,priority代表权重[1,100],大的被分配为主服务器,0永久不会变为主服务器)

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">shell> mongo --port 27001</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">config = {</pre>


        members : [
            {
            {
            {
        ]
    }

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">初始化副本集:rs.initiate(config)</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">查看分区状态:rs.status()</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">另外两个shard分片副本集类似。</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">config={_id:"shard1",members:[{_id :0,host:"172.16.18.73:27001",priority:2},{_id:1,host:"172.16.21.190:27001",arbiterOnly:true},{_id:2,host:"172.16.20.211:27001",priority :1}]}</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">config={_id:"shard2",members:[{_id :0,host:"172.16.21.190:27002",priority:2},{_id:1,host:"172.16.20.211:27002",arbiterOnly:true},{_id:2,host:"172.16.18.73:27002",priority :1}]}</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">config={_id:"shard3",members:[{_id :0,host:"172.16.20.211:27003",priority:2},{_id:1,host:"172.16.18.73:27003",arbiterOnly:true},{_id:2,host:"172.16.21.190:27003",priority :1}]}</pre>

2.3.3 mongos server路由服务器集群配置

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">注意:启动mongodb时,先启动配置服务器,再启动分片服务器,最后启动路由服务器。三台服务器上分别添加以下配置文件:

进入配置文件:vi conf/mongos.conf,添加以下内容</pre>

where to write logging data.

systemLog:

destination: file

logAppend: true

path: /data/mongodb/mongos/logs/mongos.log

how the process runs

processManagement:

fork: true

pidFilePath: /var/log/nginx/mongos.pid

network interfaces

net:

port: 20000

bindIp: 0.0.0.0

监听的配置服务器,只能有1个或者3个,configs为配置服务器的副本集名字,ip:configs配置服务器的端口

sharding:

configDB: configs/172.16.18.71:21000,172.16.21.190:21000,172.16.20.211:21000

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">启动三台服务器的mongos server</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">mongos -f conf/mongos.conf</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">目前已经搭建好配置服务器、数据分片服务器、路由服务器,下面进行分片启用,使得app连接到路由服务器时可以使用分片机制</pre>

2.3.4串联路由服务器与分配副本集

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">登录任意一台mongos:</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">mongo --port 20000</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">使用admin数据库</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">use admin</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">串联路由服务器与分片副本集: </pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">sh.addShard("shard1/172.16.18.73:27001,172.16.21.190:27001,172.16.20.211:27001") </pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">sh.addShard("shard2/172.16.21.190:27002, 172.16.20.211:27002,172.16.18.73:27002")</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">sh.addShard("shard3/172.16.20.211:27003,172.16.21.190:27003,172.16.18.73:27003")</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">查看集群状态:</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">sh.status()</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">如图:</pre>

[图片上传失败...(image-cd8832-1589181243203)]

3.3.5启动分片

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">目前配置服务、路由服务、分片服务、副本集服务都已经串联起来了,但我们的目的是希望插入数据,数据能够自动分片。连接在mongos上,准备让指定的数据库、指定的集合分片生效。

指定testdb分片生效</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">use admin </pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;"># enableSharding只能针对admin数据库运行,适宜选用admin</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">db.runCommand( { enablesharding :"testdb"});</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">指定数据库里需要分片的集合和片键:

我们设置testdb的 testcoll 表需要分片,根据 id 自动分片到 shard1 ,shard2,shard3 上面去。</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">use testdb;</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">db.runCommand( { shardcollection : "testdb.testcoll",key : {id: "hashed"} } )</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">要这样设置是因为不是所有mongodb 的数据库和表 都需要分片!!</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">查看分片状态</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">db.testcoll.stats()</pre>

3.3.6 分片测试

用NoSQLBooster for mongodb 连接路由服务,执行测试语句:

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">db.runCommand( { enablesharding :"test1"});</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">db.runCommand( { shardcollection : "test1.testtable",key : {id: "hashed"} } )</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">Use test1</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">for(i=1;i<=10000;i++){db.testtable.insert({"id":i,"name":"111"})};</pre>

结果如图,10000数据被分配到三个shard上,说明分片成功

[图片上传失败...(image-a0fee3-1589181243203)]

Prometheus+ grafana监控mongodb集群

1 Prometheus 配置

1.1部署mongodb_exporter

1.1.1 安装golang

Mongodb集群的三台服务器都需要,下载go安装包:https://studygolang.com/dl/golang/go1.7.3.linux-amd64.tar.gz

解压到/usr/lib/go目录下

设置GOROOT和GOPATH

在/etc/profile 文件追加如下内容:

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">export GOROOT=/usr/lib/go</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">export GOPATH=/opt/module/go</pre>

1.1.2 部署 mongodb_export

Mongodb集群的三台服务器都需要,下载mongodb_exporter,下载地址:https://github.com/percona/mongodb_exporter/releases/download/v0.8.0/mongodb_exporter-0.8.0.linux-amd64.tar.gz

解压到 /opt/module/go/src目录下。

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">cd /opt/module/go/src</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">export MONGODB_URI='mongodb://localhost:21000'</pre>

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">nohup ./mongodb_exporter &</pre>

mongodb_exporter服务已经启动,端口9216

1.2 Prometheus 配置

在10.43.200.182服务器中,配置prometheus.yml文件

<pre style="margin: 10px 0px 0px; padding: 0px; font-family: ConfluenceInstalledFont, monospace;">vi /etc/prometheus/prometheus.yml</pre>

  • job_name: 'mongos'

    static_configs:

    • targets: '172.16.18.73:9216','172.16.20.211:9216','172.16.21.190:9216']

重启prometheus服务

访问http://10.43.200.182:9090/targets,可以看到mongos三个服务是up的状态

[图片上传失败...(image-e63d8e-1589181243203)]

1.3 grafana 设置

访问http://10.43.200.182:3000,导入mongodb的模板,编码为2583。

[图片上传失败...(image-b8433f-1589181243203)]

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,175评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,674评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,151评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,597评论 1 269
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,505评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,969评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,455评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,118评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,227评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,213评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,214评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,928评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,512评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,616评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,848评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,228评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,772评论 2 339