CentOS MongoDB 高可用实战

原文:https://www.sunjianhua.cn/archives/centos-mongodb.html

一、MongoDB 单节点

1.1、Windows 版安装

1.1.1 获取社区版本
A. 查看Windows版本

cmd输入:

B. 下载对应Windows版本
地址: https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/

1.1.2 安装Windows社区版本

mongodb-win32-x86_64-2008plus-ssl-3.4.9-signed.msi

1.1.3 运行Windows社区版本(可直接使用2.1.4)

A.设置环境变量
"D:Program FilesMongoDBServer3.4binmongod.exe" --dbpath d:MongoDBdata

B.启动MongoDB
"D:Program FilesMongoDBServer3.4binmongod.exe"

C.连接MongoDB
"D:Program FilesMongoDBServer3.4binmongo.exe

D.开始使用MongoDB

https://docs.mongodb.com/manual/tutorial/getting-started/#getting-started

1.1.4 配置为服务

A.管理员方式打开命令行
按windows 键,输入cmd,然后按ctrl+shift+alt以管理员方式运行

B.创建目录
mkdir D:MongoDBdatadb
mkdir D:MongoDBdatalog

C.创建配置文件
在安装目录下创建配置文件:
D:Program FilesMongoDBServer3.4mongod.cfg

D.安装为服务

"D:Program FilesMongoDBServer3.4binmongod.exe" --config "D:Program FilesMongoDBServer3.4mongod.cfg" --install

E.启动服务
net start MongoDB

F.停止或移除服务
停止: net stop MongoDB
移除: "D:Program FilesMongoDBServer3.4binmongod.exe" --remove

1.2、Linux 社区版 (centos6 )
1.2.1 安装社区版

#A.配置yum
> vi /etc/yum.repos.d/mongodb-org.3.4.repo

#B.Yum安装
> sudo yum install -y mongodb-org

#C.配置
> vi  /etc/mongod.conf

1.2.2 运行社区版

#A.启动MongoDB

#B.验证是否安装成功
> cat  /var/log/mongodb/mongod.log

出现以上则成功!

#加入开机启动: 

#C.停止MongoDB

#D.重启MongoDB

#E.开始使用MongoDB

https://docs.mongodb.com/manual/tutorial/getting-started/#getting-started

1.2.3 卸载社区版

#A.停止MongoDB

#B.移除安装包

#C.移除数据目录

1.3、单节点配置
1.3.1 配置安全策略

#A.创建管理员
> use admin

#创建超级管理员最大权限
> use admin;
> db.createUser(
    {
        user:"root",
        pwd:"root",
        roles:[{role:"root",db:"admin"}]
    }
)

#然后,我们在修改下配置文件,先在mongo脚本里输入exit退出mongo。之后再输入以下命令修改配置文件:
> vim /etc/mongod.conf

重启 
centos7以下的启动、停止服务命令如下:
sudo service mongod start //启动服务
sudo service mongod stop //停止服务

centos7以上的启动停止服务命令如下:
systemctl start mongod.service //启动服务
systemctl stop mongod.service //停止服务
systemctl status mongod.service //查看服务状态

B.创建新DB

C.创建数据库所有者:

1.3.2、配置防火墙
vi /etc/sysconfig/iptables 加入

-A INPUT -m state --state NEW -m tcp -p tcp --dport 27017 -j ACCEPT

或者:
iptables -I INPUT -s 192.168.20.0/24 -j ACCEPT
iptables -I INPUT -s 192.168.10.0/24 -j ACCEPT

重启: service iptables restart

二、MongoDB 副本集

2.1、副本集架构简介
One、三成员副本集(1主2从/1主1从1决策者)

##### 以上为 (1主1从) #####


##### 以上为 (1主1从1决策者) #####


##### 以上为 (Two、两个或两个以上数据中心副本集) #####

2.2、副本集安装

##### 注 :  此处为1主2从1决策者
##### CentOS release 6.5 (Final)

2.2.1 主从安装

方法同单节点linux安装

2.2.2 决策者安装

方法同上!

2.3、副本集配置

2.3.1 配置主从

#副本集名称: mongoReplicas
#副本集keyfiles:
> mkdir -p /usr/local/mongodb/
> openssl rand -base64 756 > /usr/local/mongodb/clientAuth.key
> chown -R mongod.mongod /usr/local/mongodb/clientAuth.key
> chmod 400 /usr/local/mongodb/clientAuth.key

#copy上面key到其他两个机器并赋值权限!

> vi /etc/mongod.conf

最终效果如下图:

#用shell连接mongo,然后初始化副本集:
> rs.initiate(
  {
    _id : "mongoReplicas",
    members: [
      { _id : 0, host : "192.168.10.152:27017" },
      { _id : 1, host : "192.168.10.159:27017" },
      { _id : 2, host : "192.168.10.160:27017" }
    ]
  }
)

#然后rs.status() 查看主节点

查看配置: rs.conf()

2.3.2 配置角色

#初始化完成后,创建用户:

#创建管理员
> db.getSiblingDB("admin").createUser(
    {
        user:"root",
        pwd:"root",
        roles:[{role:"root",db:"admin"}]
    }
);
> use admin;
> db.auth(“root”,”root”);
> db.getSiblingDB("admin").createUser(
  {
    "user" : "clusterAdmin",
    "pwd" : "clusterAdmin",
    roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
  }
)

> db.getSiblingDB("admin").createUser(
    {
        user:"dba",
        pwd:"dba",
        roles:[{role:"userAdminAnyDatabase",db:"admin"}]
    }
);
#创建普通库:
> db.getSiblingDB("sunjianhua").createUser(
    {
        user:"sunjianhua",
        pwd:"sunjianhua",
        roles:[{role:"dbOwner",db:"sunjianhua"}]
    }
)

#搭建完成后,用工具连接,最终效果如下图: 

2.3.3 配置决策者

#安装mongo方式同上,修改配置文件
> vi /etc/mongod.conf

#然后启动: service mongod restart

#在primary节点加入决策者:
> rs.addArb("192.168.10.231:30000")

#最后查看rs.conf() 和rs.status()


2.4、副本集测试

2.4.1 副本集数据同步测试

在主节点插入:

在存节点插入:

查看是否在从节点存在db1了:

2.4.2 副本集选举测试

service mongod stop
然后刷新节点,发现159机器已经变成主节点

再次启动160Down的机器
service mongod start
然后刷新节点,发现160机器已经变成从节点

三、MongoDB 附录

3.1、客户端连接工具
Robo 3T :
https://robomongo.org/download
NoSQL Manager for MongoDB:
https://www.mongodbmanager.com



3.2、MongoDB角色

内置角色
1.数据库用户角色:read、readWrite;
2.数据库管理角色:dbAdmin、dbOwner、userAdmin;
3.集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4.备份恢复角色:backup、restore;
5.所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6.超级用户角色:root, 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7.内部角色:__system
具体角色
1.read:允许用户读取指定数据库
2.readWrite:允许用户读写指定数据库
3.dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
4.userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
5.clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
6.readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
7.readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
8.userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
9.dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
10.root:只在admin数据库中可用。超级账号,超级权限.

3.3、MongoDB基础
英文: https://docs.mongodb.com/manual/
中文: http://www.cnblogs.com/liruihuan/tag/MongoDB/
参考: https://docs.mongodb.com/v3.4/core/replica-set-architectures/
https://help.aliyun.com/document_detail/26558.html?spm=a2c4g.11186623.6.539.r7B3bf
主从: https://docs.mongodb.com/manual/replication/

3.3.1 mongo和sql

https://docs.mongodb.com/manual/reference/sql-comparison/

3.3.2 连接mongo
A.登陆
mongo 192.168.20.250:27017/sunjianhua -usjh_dbOwner -psjh_dbOwner ;

B.切换数据库
use sunjianhua;

C. ......

3.4、主备切换异常
3.4.1 连接失败
A.应正确连接副本集
mongodb://[username:[email protected]]host1:port1,...[,hostN[:portN]]]/[database]

例如: 
mongodb://example1.com,example2.com,example3.com/?replicaSet=test&w=2&wtimeoutMS=2000

B.hosts别名导致
cfg = rs.conf()
cfg.members[0].name= "ip:27017”
rs.reconfig(cfg)
3.4.2 切换正常数据异常

可能未禁止primary 故障后,再次启动后又变成主节点!
禁止方法: 设置副本集 Priority 都一致

3.5、Spring data mongo 集成

3.5.1 单节点集成
Spring 版本 : <spring.version>4.3.11.RELEASE</spring.version>

引入jar包

<!-- provide by spring -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-tx</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId>
        <version>1.2.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-test</artifactId>
        <version>${spring.version}</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.7.1</version>
    </dependency>
<!-- provide by spring end -->

    <!-- mongo-java-dirver -->
    <dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongo-java-driver</artifactId>
        <version>3.5.0</version>
    </dependency>

    <!-- spring-data-mongodb -->
    <dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>1.10.7.RELEASE</version>
</dependency>

Spring 集成

配置文件:

3.5.2 副本集集成
Spring 版本 : <spring.version>4.3.11.RELEASE</spring.version>

引入jar包:(同单节点)
注意以下版本:

<!-- mongo-java-dirver -->
     <dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
   <version>3.6.3</version>
</dependency>

<!-- spring-data-mongodb -->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>1.10.11.RELEASE</version>
</dependency>

Spring 集成

配置文件:

3.6、副本集常用命令

注: 需要在primary节点认证之后执行!

添加节点:
rs.add( { host: "192.168.10.153:27017", priority: 1, votes: 1 } )

删除节点:
rs.remove("192.168.10.152:27017")

替换节点:
cfg = rs.conf()
cfg.members[0].host = "192.168.10.154"
rs.reconfig(cfg)

设置priority :
cfg = rs.conf()
cfg.members[2].priority = 0.5
rs.reconfig(cfg)

转换一个单节点为副本集:

rs.initiate(); //需要使用超级管理员执行:

需修改/etc/mongod.conf配置:
# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  # Listen to local interface only, comment to listen on all interfaces.
security:
  authorization: enabled
  keyFile: /usr/local/mongodb/clientAuth.key

replication:
  replSetName: "mongoReplicas"

调整priority(优先级):
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)

阻止从节点变为主节点:
cfg = rs.conf()
cfg.members[2].priority = 0
rs.reconfig(cfg)

配置隐藏节点:
cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
rs.reconfig(cfg)

配置从节点延迟:
cfg = rs.conf()
cfg.members[0].priority = 0
cfg.members[0].hidden = true
cfg.members[0].slaveDelay = 3600
rs.reconfig(cfg)

配置非选举节点:
cfg = rs.conf();
cfg.members[3].votes = 0;
cfg.members[3].priority = 0;
cfg.members[4].votes = 0
cfg.members[4].priority = 0;
cfg.members[5].votes = 0
cfg.members[5].priority = 0;
rs.reconfig(cfg);

原文地址:https://www.cnblogs.com/shihaiming/p/9990462.html

时间: 2024-11-10 15:42:30

CentOS MongoDB 高可用实战的相关文章

MongoDB 高可用集群架构简介

在大数据的时代,传统的关系型数据库要能更高的服务必须要解决高并发读写.海量数据高效存储.高可扩展性和高可用性这些难题.不过就是因为这些问题Nosql诞生了. 转载自严澜的博文--<如何搭建高效的MongoDB集群> NOSQL有这些优势: 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制. 高扩展性,Nosql去掉了关系数据库的关系型特性,很容易横向扩展,摆脱了以往老是纵向扩展的诟病. 高性能,Nosql通过简单的key-value方式获取数据,非常快速.还有

CentOS linux 高可用集群之heartbeat

CentOS linux 高可用集群之heartbeat Heartbeat 项目是 Linux-HA 工程的一个组成部分,它实现了一个高可用集群系统.心跳服务和集群通信是高可用集群的两个关键组件,在 Heartbeat 项目里,由 heartbeat 模块实现了这两个功能. Heartbeat是Linux-HA工程的一个组件,自1999年开始到现在,发布了众多版本,是目前开源Linux-HA项目最成功的一个例子,在行业内得到了广泛的应用. 随着Linux在关键行业应用的逐渐增多,它必将提供一些

MongoDB 高可用集群副本集+分片搭建

MongoDB 高可用集群搭建 一.架构概况 192.168.150.129192.168.150.130192.168.150.131 参考文档:https://www.cnblogs.com/vadim/p/7100683.html mongos mongos    mongos Config   server      Config server  Config serverShared1 server 1 Shared1 server 1 副本 Shared1 server 1 仲裁/隐

MongoDB 高可用切换

MongoDB 高可用集群切换 MongoDB最简单的集群模式是三节点搭建Replica Set(副本集),这样可以保证一个节点故障后,其余节点还可以继续提供服务. 在MongoDB集群中,也存在主节点和备用节点的角色,如主节点出现问题,会通过选举在备用节点中产生一个新的主节点,其主备用节点会自动向新的主节点进行同步. 在新旧主节点完成切换后,对前端应用几乎是透明的,原因在于MongoDB特殊的连接字符串配置方式: mongodb://[username:[email protected]]ho

Mongodb高可用架构—Replica Set 集群实战

Replica Set使用的是n个mongod节点,构建具备自动的容错功能(auto-failover),自动恢复的(auto-recovery)的高可用方案. 使用Replica Set来实现读写分离.通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作. 对于Replica Set中的secondary 节点默认是不可读的. 架构图: 分别在各服务器上运行两个mongod实例: shard11 + shard12 + shard13 -

企业级Nginx负载均衡与keepalived高可用实战(二)keepalived篇

1.Keepalived高可用软件 1.1.Keepalived介绍 Keepalived软件起初是专门为LVS负载均衡软件设计的,用来管理并监控LVS集群系统中各个服务节点的状态,后来又加入了可以实现高可用的VRRP功能.因此,Keepalived除了能够管理LVS软件外,还可以作为其他服务(例如:Nginx,Haproxy,MySQL等)的高可用解决方案软件. Keepalived软件主要是通过VRRP协议实现高可用功能的.VRRP是Virtual Router Redundancy Pro

DRBD+Heartbeat+NFS高可用实战

实验环境:Centos 6.7_64位 服务器: Master节点:dm1 IP地址:10.0.0.61(eth0) 192.168.3.150(eth1,心跳) Slave节点:dm2 IP地址:10.0.0.62(eth0) 192.168.3.160(eth1,心跳) VIP地址:192.168.0.180 一.DRBD环境搭建 1. host映射 # vi  /etc/hosts 127.0.0.1   localhostlocalhost.localdomain localhost4

Pacemaker+ISCSI 实现Apache高可用实战

Pacemaker 1.1 概述 pacemaker(直译:心脏起搏器),是一个群集资源管理器.它实现最大可用性群集服务(亦称资源管理)的节点和资源级故障检测和恢复使用您的首选集群基础设施(OpenAIS的或Heaerbeat)提供的消息和成员能力. Pacemaker 承担集群资源管理者(CRM - Cluster Resource Manager)的角色,它是一款开源的高可用资源管理软件,适合各种大小集群.Pacemaker 由 Novell 支持,SLES HAE 就是用 Pacemake

DRBD+Heartbeat+Mysql 高可用实战

实验环境:Centos 6.7_64位 服务器: Master节点:dm1 IP地址:10.0.0.61(eth0) 192.168.3.150(eth1,心跳) Slave节点:dm2  Ip地址:10.0.0.62(eth0) 192.168.3.160(eth1,心跳) VIP地址:192.168.0.180 一.DRBD环境搭建 DRBD(DistributedReplicatedBlockDevice)是一个基于块设备级别在远程服务器直接同步和镜像数据的软件,用软件实现的.无共享的.服