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=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)]
有疑问加站长微信联系(非本文作者)