上一篇文章,把这个架构的起因,和操作系统的选择进行了详细说明。

原文地址:15分钟从零开始搭建支持10w+用户的生产环境(一)

二、数据库的选择

对于一个10W+用户的系统,数据库选择很重要。

一般来说,这个用户量,根据不同的应用,会形成单表年度400W~4000W条的数据量。在这个数据量下,我们需要相对大型的数据库。

可供选择的主流数据库:

类别 数据库
关系型数据库 MySQL, SQL Server for Linux, Oracle, DB2, PostgreDB
NoSQL数据库 Radis, HBase, MongoDB

具体数据库的区别分析,网上有很多文章,这儿就不再多讨论。

在现在讨论的这个架构下,有几个要求:

  1. 数据库要是免费的;
  2. 数据库的安装要简单;
  3. 数据库的使用要方便。这个使用,包括管理和开发;
  4. 最重要的一点,是数据后期可扩展成分布式架构,以保证在不改动代码的情况下,支持B、C轮的数据:P。

在这个要求下,我们选择MongoDB作为主数据库。

MongoDB的官网: https://www.mongodb.com

MongoDB最新版下载: https://www.mongodb.com/download-center/community

community版和professional版本最大的区别是pro版有InMemoryDB模式,可以依托大内存建立存放在内存中的数据库文件。一般应用,社区版足够。

先看看MongoDB的安装有多简单:

第一步:下载数据库,以4.2.6 for Debian版本为例:

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-debian92-4.2.6.tgz

下载完成后,打开压缩包,

tar xvf mongodb-linux-x86_64-debian92-4.2.6.tgz -C /your_folder

我们会得到以下文件,

-rw-r--r-- 1 test test  30608 Apr 17 11:10 LICENSE-Community.txt
-rw-r--r-- 1 test test  16726 Apr 17 11:10 MPL-2
-rw-r--r-- 1 test test   2617 Apr 17 11:10 README
-rw-r--r-- 1 test test  75405 Apr 17 11:10 THIRD-PARTY-NOTICES
-rw-r--r-- 1 test test 183512 Apr 17 11:13 THIRD-PARTY-NOTICES.gotools
drwxr-xr-x 2 test test   4096 Apr 20 19:29 bin

bin目录中,有以下文件,

-rwxr-xr-x 1 test test 12715648 Apr 17 11:12 bsondump
-rwxr-xr-x 1 test test     7694 Apr 17 11:36 install_compass
-rwxr-xr-x 1 test test 47998920 Apr 17 11:36 mongo
-rwxr-xr-x 1 test test 73240640 Apr 17 11:36 mongod
-rwxr-xr-x 1 test test 17526720 Apr 17 11:12 mongodump
-rwxr-xr-x 1 test test 17277000 Apr 17 11:12 mongoexport
-rwxr-xr-x 1 test test 17242056 Apr 17 11:12 mongofiles
-rwxr-xr-x 1 test test 17452192 Apr 17 11:12 mongoimport
-rwxr-xr-x 1 test test 17879808 Apr 17 11:13 mongoreplay
-rwxr-xr-x 1 test test 17851848 Apr 17 11:12 mongorestore
-rwxr-xr-x 1 test test 40628464 Apr 17 11:36 mongos
-rwxr-xr-x 1 test test 17029440 Apr 17 11:12 mongostat
-rwxr-xr-x 1 test test 16707368 Apr 17 11:12 mongotop

其中:

mongo是个shell,用来操作数据库。

mongod是单个数据库的服务程序,每个数据库都需要一个mongod进程。

mongos是集群的路由和入口,做集群时必须要用到。

别的都是一些管理工具,可以慢慢了解。

第二步:安装&启动

MongoDB本身是一个绿色软件,上一节的下载和解压,就是安装的过程了。

下面是启动数据库。

./mongod --dbpath your_database_folder_path

MongoDB运行,只需要一个数据库文件的存放目录。

当你看到命令执行后,出现一大篇内容,其中有两行:

I  NETWORK  [listener] Listening on 127.0.0.1
I  NETWORK  [listener] waiting for connections on port 27017

的时候,恭喜你,数据库已经上线了。

简单不?

但是一定要记着,运行简单并不等于这是个Access一样的小东西。

这是个大型的基于文档的NoSQL数据库!

如果想查询各个命令都有什么参数,可以在命令后边加 --help 来查询。

例如:

./mongod --help

里面有详细的说明。

下面列几个常用的参数:

参数 说明
config 配置文件。MongoDB除了直接用命令行参数外,也可以把参数写在一个配置文件中,然后在config参数引用这个配置文件
port MongoDB默认端口是27017,可以改成任何端口
logpath 默认数据库日志是输出到终端的,可以改为保存到文件(也可以不用这个参数,而在命令行重定向)
bind_ip MongoDB默认绑定IP是127.0.0.1,可以改成任意IP地址。
db_path 数据库文件的保存目录

下面,我们检查一下数据库的安装是否正确。

我们用mongo连到数据库进行操作:

$ ./mongo localhost:27017
MongoDB shell version v4.2.5
> use TestDB
switched to db TestDB
> db.collection.insert({"user":"test1"})
WriteResult({ "nInserted" : 1 })
> db.collection.insert({"user":"test2"})
WriteResult({ "nInserted" : 1 })
> db.collection.find()
{ "_id" : ObjectId("5ea0279699857fc83ddf6ef5"), "user" : "test1" }
> db.collection.find({"user":"test2"})
{ "_id" : ObjectId("5ea029a599857fc83ddf6ef6"), "user" : "test2" }
> exit

在这一节的最后,补充两个问题:

  1. 扩展性

上面介绍的是单MongoDB数据库的安装。这是最简单的一种形式,也是应用最多的一种形式。

如果数据很重要,为了防止任何情况的数据丢失,可以采用 Master + N Slave 的方式,做主从结构,把同样的多个库放到多个服务器上,互为备份。同时,这种方式还可以实现读写分离。

如果数据量再大,则可以把数据库扩展成集群,用以增加数据库的容量,并提升访问性能。

  1. 安全

上面介绍安装的时候,采用的默认端口。在实际使用时,可以改换一个端口,减少被扫描攻击的机率。

另外,数据库默认安装时,是不检查用户的。换言之,就是任何人都可以连到数据库。如果用在生产服务器上,一定要在数据库中建议用户和权限,以保证阻挡非法的访问。

MongoDB的安全问题,我会单独写一篇文章来说,敬请关注。

(未完待续)


微信公众号:老王Plus

扫描二维码,关注个人公众号,可以第一时间得到最新的个人文章和内容推送

本文版权归作者所有,转载请保留此声明和原文链接

15分钟从零开始搭建支持10w+用户的生产环境(二)的更多相关文章

  1. 15分钟从零开始搭建支持10w+用户的生产环境(三)

    上一篇文章介绍了这个架构中,选择MongoDB做为数据库的原因,及相关的安装操作. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(二)   三.WebServer 在SOA和gRPC大行其 ...

  2. 15分钟从零开始搭建支持10w+用户的生产环境(四)

    上一篇文章,介绍了这个架构中,WebServer的选择,以及整个架构中扩展时的思路. 原文地址:15分钟从零开始搭建支持10w+用户的生产环境(三)   五.架构实践 前边用了三篇文章,详细介绍了这个 ...

  3. 15分钟从零开始搭建支持10w+用户的生产环境(一)

    前言 这是一个基于中小型企业或团队的架构设计. 不考虑大厂.有充分的理由相信,大厂有绝对的实力来搭建一个相当复杂的环境. 中小型企业或团队是个什么样子? 开发团队人员配置不全,部分人员身兼开发过程上下 ...

  4. 从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建

    从零开始搭建WebAPI Core_SqlSugar管理系统(一) 项目环境需求以及项目搭建 环境需求 想要使用.NET Core,首先你的Visual Studio(以下简称vs)升级到较高的版本, ...

  5. 搭建Hadoop集群(生产环境)

    1.搭建之前:百度copy一下介绍 (本博客几乎全都是生产环境的配置..包括mongo等hbase其他) Hadoop是一个由Apache基金会所开发的分布式系统基础架构. 用户可以在不了解分布式底层 ...

  6. Centos6.3 下使用 Tomcat-6.0.43 非root用户 部署 生产环境 端口转发方式

    一.安装JDK环境 方法一. 官方下载链接 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260 ...

  7. 从零开始搭建支持http2的web服务

    前段时间开始,公司各项业务开始陆续接入http2,关于http2的优点与所适用的场景网上有很多的文档可以查阅,这里我主要是总结分享一下如何从0到1搭建http2服务. 这里先说明一下,要完成http2 ...

  8. [IOS]从零开始搭建基于Xcode7的IOS开发环境和免开发者帐号真机调试运行第一个IOS程序HelloWorld

    首先这篇文章比较长,若想了解Xcode7的免开发者帐号真机调试运行IOS程序的话,直接转到第五部分. 转载请注明原文地址:http://www.cnblogs.com/litou/p/4843772. ...

  9. Django1.8教程——从零开始搭建一个完整django博客(二)

    在上一节中,我们已经创建了一个Django模型Post,并使Post模型与数据库同步.这一节中,我们将介绍Django管理站点,通过Django管理站点来管理我们创建的Post模型实例. 为你的模型创 ...

随机推荐

  1. 【狂神说】JAVA Mybatis 笔记+源码

    简介 自学的[狂神JAVA]MyBatis GitHub源码: https://github.com/Donkequan/Mybatis-Study 分享自写源码和笔记 配置用的 jdk13.0.2 ...

  2. java实现小功能

    // 自写逻辑,遍历所有匹配的子字符串坐标 private static void forMatchIdx(String str1, String str2) { char[] arr1 = str1 ...

  3. effective-java学习笔记---使用枚举类型替代整型常量34

    1.要将数据与枚举常量相关联,请声明实例属性并编写一个构造方法,构造方法带有数据并将数据保存在属性中. // Enum type with data and behavior public enum ...

  4. coding++:java—提取Html文本字符串中的内容

    package com.tree.ztree_demo; import java.util.regex.Matcher; import java.util.regex.Pattern; public ...

  5. PHP序列化及反序列化分析学习小结

    PHP反序列化 最近又遇到php反序列化,就顺便来做个总结. 0x01 PHP序列化和反序列化 php序列化:php对象 序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性.序 ...

  6. 人生苦短,学用python

    1. 我为什么开始学着用 python 啦?   扯扯网上疯传的一组图片.网上流传<人工智能实验教材>的图片,为幼儿园的小朋友们量身打造的实验教材,可谓是火了.甚至有网友调侃道:pytho ...

  7. Java对字母大小写转换

    Java对字母大小写转换 1.小写——大写String aa = "abc".toUpperCase(); 2.大写——小写 String bb = "ABC" ...

  8. MVC分层设计

    MVC分层设计 什么是MVC? MVC 是一种软件架构模式,利用分层的思想来设计交互式应用程序,由以下3层组成: Model 业务模型层. View 展示层. Controller 控制层. MVC包 ...

  9. MTK Android 如何获取系统权限

    Android如何获得系统(system)权限 Android中如何修改系统时间(应用程序获得系统权限) 在 android 的API中有提供 SystemClock.setCurrentTimeMi ...

  10. MTK Android 预置APK

    [FAQ03038] 如何预置APK [DESCRIPTION]1, 如何将带源码的 APK 预置进系统?2, 如何将无源码的APK预置进系统?3, 如何预制APK使得用户可以卸载?4, 如何使得用户 ...