暗中观察

CentOS MongoDB 高可用实战
一、MongoDB 单节点1.1、Windows 版安装1.1.1 获取社区版本A. 查看Windows版本cmd...
扫描右侧二维码阅读全文
16
2018/08

CentOS MongoDB 高可用实战

一、MongoDB 单节点

1.1、Windows 版安装

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

cmd输入:
mongodb-install-win-cmd.png

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

mongodb-install-win.png

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

mongodb-install-linux-yum.png

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

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

mongodb-install-linux-conf.png

#D.内存大小限制
storage:
  wiredTiger:
    engineConfig:
      cacheSizeGB: 0.5

1.2.2 运行社区版

#A.启动MongoDB

mongodb-install-linux-start.png

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

mongodb-install-linux-start-log.png

出现以上则成功!

#加入开机启动: 

mongodb-install-linux-chkconfig.png

#C.停止MongoDB

mongodb-install-linux-stop.png

#D.重启MongoDB

mongodb-install-linux-restart.png

#E.开始使用MongoDB

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

1.2.3 卸载社区版

#A.停止MongoDB

mongodb-install-linux-stop.png

#B.移除安装包

mongodb-install-linux-erase.png

#C.移除数据目录

mongodb-install-linux-rm.png

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

#A.创建管理员
> use admin

mongodb-user-dba.png

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

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

mongodb-user-auth-conf.png

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

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

B.创建新DB
mongodb-db-new.png

C.创建数据库所有者:
mongodb-db-new-owner.png

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决策者)
mongodb-one-master-two-slave.png
mongodb-one-master-one-slave.png

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

mongodb-one-master-one-slave-one-arbiter.png
mongodb-one-master-one-slave-one-arbiter1.png

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

mongodb-two-datacenter1.png
mongodb-two-datacenter2.png

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

2.2、副本集安装

https://docs.mongodb.com/manual/administration/replica-set-deployment/

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

mongodb-Replication-install1.png

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

最终效果如下图:

mongodb-Replication-install2.png

#用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() 查看主节点

mongodb-Replication-install3.png

查看配置: rs.conf()

mongodb-Replication-install4.png

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"}]
    }
)

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

mongodb-Replication-install5.png

2.3.3 配置决策者

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

mongodb-Replication-install6.png

#然后启动: service mongod restart

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

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

mongodb-Replication-install7.png
mongodb-Replication-install8.png

2.4、副本集测试

2.4.1 副本集数据同步测试

在主节点插入:
mongodb-Replication-install9.png

在存节点插入:
mongodb-Replication-install10.png

查看是否在从节点存在db1了:
mongodb-Replication-install11.png

2.4.2 副本集选举测试

service mongod stop
然后刷新节点,发现159机器已经变成主节点
mongodb-Replication-install12.png

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

三、MongoDB 附录

3.1、客户端连接工具
Robo 3T :
https://robomongo.org/download
NoSQL Manager for MongoDB:
https://www.mongodbmanager.com
mongodb-Replication-install14.png
mongodb-Replication-install15.png
mongodb-Replication-install16.png
mongodb-Replication-install17.png

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/
mongodb-Replication-install18.png
mongodb-Replication-install19.png

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:password@]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 集成
mongodb-Replication-install20.png

配置文件:
mongodb-Replication-install21.png

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 集成
mongodb-Replication-install22.png

配置文件:
mongodb-Replication-install23.png

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);

3.7、备份mongo中的collection

注: 需要在primary节点认证之后执行!
导出测试
mongoexport -h 192.168.40.177:27017 -u dbname -p dbpass --authenticationDatabase dbname -d dbname -c im_member -o /root/test/im_member.dat
导入测试
mongoimport -h 192.168.40.177:27017 -u dbname  -p dbpass  --authenticationDatabase dbname -d dbname -c im_member  --drop /root/test/im_member.dat
Last modification:August 5th, 2021 at 03:03 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment