java8新特性

macos环境安装配置

  • jdk8

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

  • eclipse ide

https://www.eclipse.org/downloads/

lambda概述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public static void main(String[] args){
    new Action(){
        @override
        public void execute(){
            System.out.println(content);
        }
    }.execute('aaaaaa');
    Action login = (String content) -> {
        System.out.println(content);
    };
    login.execute('bbbbbb');
}

static interface Action{
    void execute(String content);
}

##

static关键字

静态变量有JVM自动初始化,全局的。 静态方法不能调用非静态的函数或变量。

1
2
3
4
5
6
7
8
9
10
11
static String name;
static char sex;
static short age;
static float height;
static String type;
public static void main(String[] args){
    Scanner scanner = new Scanner(System.in);
    System.out.println("姓名: ");
    name = sacnner.next();
    ...
}

定义无参方法

1
2
3
static void 方法名(){
    方法体 - 具体代码实现
}

定义带参方法

1
2
3
static void 方法名(类型1 变量1,类型2 变量2,...){
    方法体 - 具体代码实现
}

定义带返回值的方法

1
2
3
4
static 返回值类型 方法名(类型1 变量1,类型2 变量2,...){
    方法体 - 具体代码实现
    return 返回的数据;
}

封装性

  • private 私有
  • get set 控制访问

匿名对象

1
2
3
4
5
6
7
class Student{
    public void tell(){
        System.out.println("aaa");
    }
}

new Student().tell();

构造对象

1
2
3
4
5
6
7
class People{
    public People(){
        System.out.println("aaa");
    }
}

People per = new People();

final 关键字

  • 表示最终
  • 不能被继承
1
2
final String NAME = "aaa";
NAME = "bbb";//编译失败不能被改写

被定义 final 的变量,必须用大写标识

abstract 抽象类

  • 声明而未被实现的方法
  • 子类必须实现
1
2
3
4
5
6
7
8
abstract class Aaa{
    public abstract void add();
}
class Bbb extends Aaa{
    public void add(){

    }
}

interface 接口

  • 一种特殊的类,里面全部是常量和公共的抽象方法
  • 一个类可以同时继承抽象类和实现接口
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface InterA{
    public static final int AGE = 1;
    public abstract void add();
}
interface InterB{
    public abstract void say();
}
class Aaa implements InterA,InterB{
    public void add(){

    }
    public void say(){

    }
}

extends 继承

  • 语法
1
2
3
4
5
6
class Aaa{
    ...
}
class Bbb extends Aaa{
    ...
}
  • 限制 只允许单继承

  • 限制 子类不能访问父类的私有成员

  • 子类,先调用父类构造,再去调用子类构造

super 关键字

强行调用父类方法

1
2
3
4
5
6
7
8
9
class A{
    public void tell(){
    }
}
class B extends A{
    public void tell(){
        super.tell();
    }

访问权限

private < default < public

子类重写父类方法,不能比父类方法权限严格

多态性

  • 向上转型 只能用父类方法
  • 向下转型 能用子类方法

instanceof

bool 返回值 判断是否当前类或子类

Collections 集合

  • List、ArrayList(异步,非线程安全)、Vector(同步,线程安全)

  • Set、HashSet、TreeSet

  • Iterator

1
2
3
4
Iterator<String> iter = lists.iterator();
while(iter.hasNext()){
    ...
}
  • Map、HashMap、Hashtable 无需存放,key不允许重复

Generic 泛型

1
2
3
4
5
6
7
8
9
10
11
12
class Point<T,V> {
	private T x;
    private V y;

	public T getX() {
		return this.x;
	}

    public V getY() {
        return this.y;
    }
}
  • 未知对象类型时,可以用 ? 通配符。

  • 泛型方法

1
2
3
4
5
6
7
8
class Gener{
    public <T> tell(T t){
        return t;
    }
}

Gener g = new Gener();
g.tell("aaa");
  • 泛型数组
1
2
3
public static <T> void tell(T arr[]){
    ...
}

变量与数据类型

  • 基础8种类型

byte short int long float double char boolen

变量的命名、定义和初始化

  • 首字母小写
  • 驼峰方式 myImages
  • 定义 类型 变量1, 变量2, …;

变量的作用域

1
2
3
4
5
6
7
{
    String name = "aaa";
}
String name = "bbb";

代码块、局部变量、全局变量

基本数据类型的包装类

  • 首字母大写的 包装类 Byte Short Interger Long Float Double Character Bollean

  • 包装常用方法

二进制补码

  • 补码计算 (1101) 0010 取反 0011 加1 补码 -3

我的博客

Read More

安装

1. 需要Node.js环境

安装地址 https://nodejs.org/en/download/

2. 推荐安装git环境

安装地址 https://git-scm.com/downloads

3. 安装cordova cli环境

命令输入

1
sudo npm install -g cordova

4. 安装完成后检查当前版本

命令输入

1
npm info cordova version

输出

1
6.4.0

如果上面步骤正确,就会显示当前版本号

5. 升级cordova cli环境

命令输入

1
sudo npm update -g cordova

环境配置

检查环境

命令输入

1
$ cordova requirements

输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Requirements check results for android:
Java JDK: installed 1.8.0
Android SDK: installed true
Android target: not installed
Please install Android target: "android-24".

Hint: Open the SDK manager by running: /Users/hans/Documents/Eclipse/sdk/tools/android
You will require:
1. "SDK Platform" for android-24
2. "Android SDK Platform-tools (latest)
3. "Android SDK Build-tools" (latest)
Gradle: installed

Requirements check results for ios:
Apple OS X: installed darwin
Xcode: installed 8.1
ios-deploy: not installed
ios-deploy was not found. Please download, build and install version 1.9.0 or greater from https://github.com/phonegap/ios-deploy into your path, or do 'npm install -g ios-deploy'
CocoaPods: installed
Error: Some of requirements check failed

会检查 android 和 ios 环境配置 检查项目包含 SDK 开发IDE 工具包 同时也会输出处理建议

android 环境配置

1. 安装 Java Development Kit (JDK)

安装地址 http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html

2. 安装 Android SDK

安装地址 https://developer.android.com/studio/index.html

  • 方案1 安装完整版 Android Studio , 包含 Android SDK

Windows https://dl.google.com/dl/android/studio/install/2.2.3.0/android-studio-bundle-145.3537739-windows.exe

Mac OS X https://dl.google.com/dl/android/studio/install/2.2.3.0/android-studio-ide-145.3537739-mac.dmg

  • 方案2 只安装SDK工具包,不推荐

Windows https://dl.google.com/android/repository/tools_r25.2.3-windows.zip

Mac https://dl.google.com/android/repository/tools_r25.2.3-macosx.zip

3. 安装SDK对应的包

官方问阅读 https://developer.android.com/studio/intro/update.html

  • 打开 SDK Manager 要打开 SDK 管理器,请点击 Tools > Android > SDK Manager 或点击工具栏中的 SDK Manager

  • SDK对应

cordova-android Version Supported Android API-Levels
5.X.X 14 - 23
4.1.X 14 - 22
4.0.X 10 - 22
3.7.X 10 - 21

当前6.4.0 那对应的包就要 >= 24

4. 设置环境变量

设置 JAVA_HOME , ANDROID_HOME

  • OS X and Linux
1
2
3
4
5
6
7
vi ~/.bash_profile

export ANDROID_HOME=/Users/hans/Documents/Eclipse/sdk/
export PATH=${PATH}:$ANDROID_HOME/platform-tools
export PATH=${PATH}:$ANDROID_HOME/tools

source ~/.bash_profile
  • Windows

开始菜单->环境变量->编辑

1
2
3
设置PATH
C:\Development\android-sdk\platform-tools
C:\Development\android-sdk\tools

ios 环境配置

安装最新的苹果IDE , Xcode, 一步步 往下走自动配置的

安装地址 https://itunes.apple.com/cn/app/xcode/id497799835?mt=12

创建项目

1. 创建 myMobileApp

命令输入

1
cordova create myMobileApp com.myapp.mobile myMobileApp

输出

1
2
3
4
5
6
7
8
9
10
11
Using detached cordova-create
Creating a new cordova project.

$ ls -l

total 8
-rw-r--r--  1 hans  staff  984 12 29 11:09 config.xml
drwxr-xr-x  3 hans  staff  102 12 29 11:09 hooks
drwxr-xr-x  2 hans  staff   68 12 29 11:09 platforms
drwxr-xr-x  2 hans  staff   68 12 29 11:09 plugins
drwxr-xr-x  6 hans  staff  204 12 29 11:09 www
cordova 目录名称 id标识 项目名称

2. 创建平台项目代码

  • IOS

命令输入

1
cordova platform add ios --save
  • android

命令输入

1
cordova platform add android --save

3. 更新平台代码

1
2
cordova platform update android --save
cordova platform update ios --save

编译

IOS

xcode 直接打开文件 /myMobileApp/platforms/ios/myMobileApp.xcworkspace xcode 集成度很好 ,直接点击run, easy完成

Android

用 android studio 打开 /myMobileApp/platforms/android 模拟器用 Genymotion , 自带的模拟器太慢 https://www.genymotion.com/

我的博客

Read More

编辑内容

1. 修改内容

/www 目录就是我们的内容目录

可以把你的网站放入

2. 修改配置文件

/config.xml 是配置的核心文件

这里配置你的启动文件

3. 同步到目标平台 android & IOS

执行命令 cordova prepare android

/www/ 文件会复制到 /platforms/android/assets/www

4. 编译

这里还是推荐用 Android Studio 打开目录 /platforms/android/

插件扩展

cordova plugins 可以让你的程序访问设备端功能

下载地址

https://www.npmjs.com/search?q=cordova-plugin

目前已经有 2268个 开放包

访问设备的电量

  • 下载插件

cordova plugin add cordova-plugin-battery-status

  • 编写代码

打开文件 /www/index.html

1
2
3
4
5
6
window.addEventListener("batterystatus", onBatteryStatus, false);

function onBatteryStatus(status) {
    var str = "Level: " + status.level + " isPlugged: " + status.isPlugged;
    $("#status01").html(str);
}

然后运行 cordova prepare android Android Studio 运行到模拟器/真机 很easy

我的博客

Read More

工作账号

创建

1
2
useradd yuu
ls -l /home

设置密码

1
2
passwd yuu
vi /etc/passwd

把某个用户加入组

1
usermod -a -G www yuu

设置目录所有者

1
2
chown -R yuu:yuu yuumanage
chown -R www:www yuumanage

设置目录权限

1
chmod 755 -R ask

d rwx rwx r-x . 所有者 组其他 其他用户 -R 所有子目录

我的博客

Read More

基础扩展

array

数组array https://www.npmjs.com/package/array

string format

字符串格式化 https://www.npmjs.com/package/string-format

async

同步处理 https://www.npmjs.com/package/async http://caolan.github.io/async/index.html

eventproxy

event事件处理框架 https://www.npmjs.com/package/eventproxy https://github.com/JacksonTian/eventproxy

string

http://stringjs.com https://www.npmjs.com/package/string

功能性

config-lite

项目配置 https://www.npmjs.com/package/config-lite

superagent

client-side HTTP request library https://www.npmjs.com/package/superagent

ejs

页面模板引擎 https://www.npmjs.com/package/ejs

cheerio

dom Query 操作 https://www.npmjs.com/package/cheerio

log4js

日志 https://www.npmjs.com/package/log4js

服务端

expressjs

web框架 http://www.expressjs.com.cn/

七牛

npm install qiniu https://www.npmjs.com/package/qiniu http://developer.qiniu.com/code/v6/sdk/nodejs.html

mongolass

mongodb lib ^2.3.3 https://www.npmjs.com/package/mongolass

mongoose

http://mongoosejs.com/ https://github.com/Automattic/mongoose

mysql

https://github.com/mysqljs/mysql

another-json-schema

定义数据模型 https://github.com/nswbmw/another-json-schema

数据模型定义json https://docs.mongodb.com/manual/data-modeling/

node-http-proxy

代理服务器 https://github.com/nodejitsu/node-http-proxy

express-http-proxy

express的代理服务 https://github.com/villadora/express-http-proxy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var express = require("express");
var proxy = require("express-http-proxy");
var app = express();
var port = 8088;

var apiProxy = proxy("localhost:8080",{
	forwardPath:function(req,res){
		return req._parsedUrl.path
	}
})
app.use("/restapi/*",apiProxy);
app.use("/admin/*",apiProxy);
app.use("*.xls",apiProxy);
app.use(express.static('src'));

app.listen(port);
console.log('Now serving the app at http://localhost:'+port);

我的博客

Read More

sharding 分片

手册

https://docs.mongodb.com/v3.2/sharding/ https://docs.mongodb.com/v3.2/reference/configuration-options/#mongos-only-options

hosts规划

1
2
3
4
5
6
7
8
9
10
11
$ vi /etc/hosts

127.0.0.1    mongodb-a1
127.0.0.1    mongodb-a2
127.0.0.1    mongodb-a3

127.0.0.1    mongodb-c1
127.0.0.1    mongodb-c2
127.0.0.1    mongodb-c3

127.0.0.1    mongodb-s

目录规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
数据
/www/mongodb/db/a1
/www/mongodb/db/a2
/www/mongodb/db/a3
/www/mongodb/db/c1
/www/mongodb/db/c2
/www/mongodb/db/c3
/www/mongodb/db/s

验证文件
/www/mongodb/key/mongodb-keyfile.rsa

配置文件
/www/mongodb/conf/mongod-a1.conf
/www/mongodb/conf/mongod-a2.conf
/www/mongodb/conf/mongod-a3.conf
/www/mongodb/conf/mongod-c1.conf
/www/mongodb/conf/mongod-c2.conf
/www/mongodb/conf/mongod-c3.conf
/www/mongodb/conf/mongod-s.conf

日志文件
/www/mongodb/log/a1.log
/www/mongodb/log/a2.log
/www/mongodb/log/a3.log
/www/mongodb/log/c1.log
/www/mongodb/log/c2.log
/www/mongodb/log/c3.log
/www/mongodb/log/s.log

分片服务器

延续之前的副本集群配置,加入config服务集群,加入mongos路由服务器

shardsvr

  • 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi /www/mongodb/conf/mongod-a1.conf
$ sudo chown -R mongodb:mongodb /www/mongodb/db/a1

processManagement:
    fork: true
storage:
  dbPath: /www/mongodb/db/a1
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /www/mongodb/log/a1.log
sharding:
   clusterRole: shardsvr
net:
  port: 28001
  bindIp: 0.0.0.0
  • 运行
1
2
3
$ mongod -f /www/mongodb/conf/mongod-a1.conf
$ mongod -f /www/mongodb/conf/mongod-a2.conf
$ mongod -f /www/mongodb/conf/mongod-a3.conf

configsvr

  • 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vi /www/mongodb/conf/mongod-c1.conf

storage:
  dbPath: /www/mongodb/db/c1
  journal:
    enabled: true 
systemLog:
  destination: file
  logAppend: true
  path: /www/mongodb/log/c1.log
sharding:
   clusterRole: configsvr
net:
  port: 29001
  bindIp: 0.0.0.0
processManagement:
  fork: true
replication:
   replSetName: rscfsvr
  • 运行
1
2
3
4
5
6
7
8
9
mongod -f /www/mongodb/conf/mongod-c1.conf

$ mongo mongodb-c1:29001
> use admin
> rs.initiate()
> rs.conf()
> rs.add("mongodb-c2:29002")
> rs.add("mongodb-c3:29003")
> rs.status()

配置 MongoDB Router

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vi /www/mongodb/conf/mongod-s.conf

systemLog:
  destination: file
  logAppend: true
  path: /www/mongodb/log/s.log
 
sharding:
  configDB: rscfsvr/localhost.localdomain:29001,mongodb-c2:29002,mongodb-c3:29003

net:
  port: 30001
  bindIp: 0.0.0.0
 
processManagement:
  fork: true

运行 MongoDB Router

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ mongos -f /www/mongodb/conf/mongod-s.conf

$ ps -aux|grep mongo
root      2310  0.7  3.4 763972 64628 ?        Sl   00:34   0:40 mongod -f /www/mongodb/conf/mongod-a2.conf
root      2335  0.7  3.2 754192 61876 ?        Sl   00:34   0:40 mongod -f /www/mongodb/conf/mongod-a3.conf
root      2446  0.7  3.4 836340 65488 ?        Sl   00:54   0:33 mongod -f /www/mongodb/conf/mongod-a1.conf
root      3057  0.8  3.1 892784 59564 ?        Sl   02:02   0:01 mongod -f /www/mongodb/conf/mongod-c1.conf
root      3090  0.8  2.8 840808 53976 ?        Sl   02:02   0:01 mongod -f /www/mongodb/conf/mongod-c2.conf
root      3123  0.8  3.2 811844 60432 ?        Sl   02:02   0:01 mongod -f /www/mongodb/conf/mongod-c3.conf
root      3364  0.7  0.6 219100 11592 ?        Sl   02:05   0:00 mongos -f /www/mongodb/conf/mongod-s.conf

$ netstat -lntp
tcp        0      0 0.0.0.0:29001           0.0.0.0:*               LISTEN      3057/mongod
tcp        0      0 0.0.0.0:29002           0.0.0.0:*               LISTEN      3090/mongod 
tcp        0      0 0.0.0.0:29003           0.0.0.0:*               LISTEN      3123/mongod 
tcp        0      0 0.0.0.0:28001           0.0.0.0:*               LISTEN      2446/mongod 
tcp        0      0 0.0.0.0:28002           0.0.0.0:*               LISTEN      2310/mongod 
tcp        0      0 0.0.0.0:28003           0.0.0.0:*               LISTEN      2335/mongod
tcp        0      0 0.0.0.0:30001           0.0.0.0:*               LISTEN      3364/mongos

配置分片

  • 第一步: 连接到mongos
1
$ mongo mongodb-s:30001
  • 第二步: 添加分片 Add Shards

操作

1
2
3
4
> use admin
> sh.addShard("mongodb-a1:28001")
> sh.addShard("mongodb-a2:28002")
> sh.addShard("mongodb-a3:28003")

命令说明

1
2
3
4
5
6
7
1. 单个数据库实例
{ addShard:"<hostname><:port>", maxSize:<size>, name:"<shard_name>" }

2. 副本集群
{ addShard:"<replica_set>/<hostname><:port>", maxSize:<size>, name:"<shard_name>" }

3. 如果你的momgos和 shard 在同一台机器上,添加分片不能使用 localhost 建议使用ip
  • 第三步: Enable Sharding
1
2
mongos> use admin
mongos> db.runCommand({enablesharding:"shtest"})
  • 第四步: 对一个集合进行分片

创建索引

1
2
> use shtest
> db.userid.ensureIndex({"user_id":1})

按索引创建分块

1
mongos> db.runCommand({"shardcollection":"shtest.userid",key:{"user_id":1}})

命令说明

1
2
3
4
5
6
7
1. db.runCommand({shardcollection:"<namespace>", key:"<key>"})
   1 表示升序

2. unique:"true/false"
启动对shard key 的唯一性约束

3. shard key 选择

分片测试

1
2
3
4
5
6
7
8
9
10
> use shtest

1. 查看集合状态
> db.userid.stats()

2. 查看分片状态
> db.printShardingStatus()

3. 写入数据测试
for(i=0;i<100000;i++){db.userid.insert({"user_id":i})}

列表shard

1
2
> use admin
> db.runCommand({listshards:1})

查看shard

1
> printShardingStatus()

是否sharding

1
db.runCommand({isdbgrid:1})

查看状态

1
2
use shtest
db.userid.stats()

修改shard

1
2
3
use config
db.shards.find()
db.shards.remote()

删除shard

1
db.runCommand({removeshard:”127.0.0.1:6666”}). 

调试备用

1
2
3
4
5
6
7
8
9
10
11
12
13
mongod --shutdown --dbpath=/www/mongodb/db/a1
mongod --restart --dbpath=/www/mongodb/db/a1
ps -aux|grep mongo
netstat -lntp | grep 27017

chown mongodb:mongodb /www/mongodb/key/mongodb-keyfile
chown root:root /www/mongodb/key/mongodb-keyfile

vi /www/mongodb/conf/mongod-a1.conf
mongod --shutdown --dbpath=/www/mongodb/db/a1
mongod -f /www/mongodb/conf/mongod-a1.conf
mongo mongodb-a1

我的博客

Read More

Replication(副本) 主备模式

手册

https://docs.mongodb.com/v3.2/replication/

hosts规划

1
2
3
4
5
$ vi /etc/hosts

127.0.0.1    mongodb-a1
127.0.0.1    mongodb-a2
127.0.0.1    mongodb-a3

目录规划

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
数据
/www/mongodb/db/a1
/www/mongodb/db/a2
/www/mongodb/db/a3

验证文件
/www/mongodb/key/mongodb-keyfile

配置文件
/www/mongodb/conf/mongod-a1.conf
/www/mongodb/conf/mongod-a2.conf
/www/mongodb/conf/mongod-a3.conf

日志文件
/www/mongodb/log/a1.log
/www/mongodb/log/a2.log
/www/mongodb/log/a3.log

配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi /www/mongodb/conf/mongod-a1.conf
$ sudo chown -R mongod:mongod /www/mongodb/db/a1

processManagement:
    fork: true
storage:
  dbPath: /www/mongodb/db/a1
  journal:
    enabled: true
systemLog:
  destination: file
  logAppend: true
  path: /www/mongodb/log/a1.log
net:
  port: 28001
  bindIp: 0.0.0.0
replication:
   replSetName: rstest

启动服务

1
2
3
$ mongod -f /www/mongodb/conf/mongod-a1.conf
$ mongod -f /www/mongodb/conf/mongod-a2.conf
$ mongod -f /www/mongodb/conf/mongod-a3.conf

配置集群

1
2
3
4
5
6
7
$ mongo mongodb-a1:28001
> use admin
> rs.initiate()
> rs.conf()
> rs.add("mongodb-a2:28002")
> rs.add("mongodb-a3:28003")
> rs.status()

修改副本名字replSetName

1
2
3
4
5
use local  
var doc = db.system.replset.findOne()  
doc._id = 'NewReplicaSetName'
db.system.replset.save(doc)  
db.system.replset.remove({_id:'OldReplicaSetName'})

修改config配置

1
2
3
cfg = rs.conf()
cfg["version"] = 2
rs.reconfig(cfg, { force: true})

测试数据

  • 主服务器: 插入10000数据
1
2
3
4
5
$ mongo mongodb-a1:28001
> use test
> db.isMaster()
> for(i=0;i<10000;i++){db.userid.insert({"user_id":i})}
> db.userid.find().count()
  • 从服务器查看
1
2
3
4
5
6
7
8
9
10
11
$ mongo --nodb

> conn = new Mongo("mongodb-a2:28002")
> db = conn.getDB("test")
> conn.setSlaveOk()
> db.userid.find().count()

> conn2 = new Mongo("mongodb-a3:28003")
> db2 = conn2.getDB("test")
> conn2.setSlaveOk()
> db2.userid.find().count()

key验证文件

  • 生成key文件
1
2
3
$ openssl rand -base64 741 > /www/mongodb/key/mongodb-keyfile
$ chmod 600 /www/mongodb/key/mongodb-keyfile
$ chown mongod:mongod /www/mongodb/key/mongodb-keyfile
  • 改配置
1
2
3
4
$ vi /www/mongodb/conf/mongod-a1.conf

security:
  keyFile:/www/mongodb/key/mongodb-keyfile

注意说明

有效节点不能少于3,否者不能正常工作

调试备用

1
2
3
mongod --shutdown --dbpath=/www/mongodb/db/a1
ps -aux|grep mongo
netstat -lntp | grep 27017

我的博客

Read More

基于账号的验证登录

屏蔽conf的security

1
2
3
4
5
6
$ vi /etc/mongod.conf

# security:
#  authorization: "enabled"

$ systemctl restart mongod.service

创建超级用户

1
2
3
$ mogodb
$ use admin
$ db.createUser({ user: "root" , pwd: "123", roles: ["userAdminAnyDatabase", "dbAdminAnyDatabase", "readWriteAnyDatabase"]});

规则

  • 参考

https://docs.mongodb.com/v3.2/core/security-built-in-roles/

  • 超级权限

readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase, clusterAdmin

  • 上线只用一个超级用户肯定不合适,可以针对具体数据建用户

上线运行设置 readWrite 单库管理可以设置 dbOwner

  • 权限维度

单库、超级用户、服务器群组、备份

启动授权登录

1
2
3
4
$ vi /etc/mongod.conf

security:
  authorization: "enabled"

验证登录

1
2
3
4
5
6
7
8
9
10
11
12
13
$ mongo
$ show dbs
2016-12-07T13:06:20.774-0500 E QUERY    [main] Error: listDatabases failed:{
	"ok" : 0,
	"errmsg" : "not authorized on admin to execute command { listDatabases: 1.0 }",
	"code" : 13,
	"codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:755:19
shellHelper@src/mongo/shell/utils.js:645:15
@(shellhelp2):1:1

现在默认登录 就没权限了

1
2
3
4
5
6
> use admin
> db.auth('root','123');
1
> show dbs
admin  0.000GB
local  0.000GB

验证成功

创建数据库用户

1
2
3
4
5
6
7
8
use mydb
db.createUser(
    {
     user: "yuu",
     pwd: "yuu:pwd",
     roles: [ { role: ["readWrite","dbOwner"], db: "mydb" } ]
   }
)

权限整理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
内建的角色
数据库用户角色:read、readWrite;
数据库管理角色:dbAdmin、dbOwner、userAdmin;
集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
备份恢复角色:backup、restore;
所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
内部角色:__system

角色说明:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

我的博客

Read More

mongod.conf

1
$ vi /etc/mongod.conf

手册

https://docs.mongodb.com/manual/reference/configuration-options https://docs.mongodb.com/manual/reference/parameters/

进程管理

1
2
3
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
名称 说明
fork 运行在后台
pidFilePath PID文件路径

网络

1
2
3
net:
  port: 27017
  bindIp: 127.0.0.1  # Listen to local interface only, comment to listen on all interfaces.
名称 说明
port 端口
bindIp 绑定外网op 多个用逗号分隔
maxIncomingConnections 进程允许的最大连接数 默认值为65536
wireObjectCheck 当客户端写入数据时 检测数据的有效性(BSON) 默认值为true
ipv6 默认值为false

存储

1
2
3
4
5
6
7
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:
名称 说明
dbPath mongod进程存储数据目录,此配置仅对mongod进程有效
indexBuildRetry 当构建索引时mongod意外关闭,那么再次启动是否重新构建索引;索引构建失败,mongod重启后将会删除尚未完成的索引,但是否重建由此参数决定。默认值为true。
repairPath 配合–repair启动命令参数,在repair期间使用此目录存储临时数据,repair结束后此目录下数据将被删除,此配置仅对mongod进程有效。不建议在配置文件中配置,而是使用mongod启动命令指定。
engine 存储引擎类型,mongodb 3.0之后支持“mmapv1”、“wiredTiger”两种引擎,默认值为“mmapv1”;官方宣称wiredTiger引擎更加优秀。
journal 是否开启journal日志持久存储,journal日志用来数据恢复,是mongod最基础的特性,通常用于故障恢复。64位系统默认为true,32位默认为false,建议开启,仅对mongod进程有效。
directoryPerDB 是否将不同DB的数据存储在不同的目录中 默认值为false
syncPeriodSecs mongod使用fsync操作将数据flush到磁盘的时间间隔,默认值为60(单位:秒)强烈建议不要修改此值 mongod将变更的数据写入journal后再写入内存,并间歇性的将内存数据flush到磁盘中,即延迟写入磁盘,有效提升磁盘效率
mmapv1 仅对MMAPV1引擎
quota:  
enforced:false 配额管理,是否限制每个DB所能持有的最大文件数量 默认值为false
maxFilesPerDB:8 如果enforce开启,每个DB所持有的存储文件不会超过此阀值
smallFiles: false 是否使用小文件存储数据;如果此值为true mongod将会限定每个数据文件的大小为512M(默认最大为2G),journal降低到128M(默认为1G)。如果DB的数据量较大,将会导致每个DB创建大量的小文件,这对性能有一定的影响。在production环境下,不建议修改此值,在测试时可以设置为true,节约磁盘。
journal:  
commitIntervalMs: 100 mongod进程提交journal日志的时间间隔,即fsync的间隔。单位:毫秒
nsSize: 每个database的namespace文件的大小,默认为16,单位:M;最大值可以设置为2048,即dbpath下“.ns”后缀文件的大小。16M基本上可以保存24000条命名条目,新建一个collection或者index信息,即会增加一个namespace条目;如果你的database下需要创建大量的collection(比如数据分析),则可以适度调大此值。
wiredTiger 如下配置仅对wiredTiger引擎生效(3.0以上版本)
engineConfig:  
cacheSizeGB: 8 wiredTiger缓存工作集(working set)数据的内存大小,单位:GB,此值决定了wiredTiger与mmapv1的内存模型不同,它可以限制mongod对内存的使用量,而mmapv1则不能(依赖于系统级的mmap)。默认情况下,cacheSizeGB的值为假定当前节点只部署一个mongod实例,此值的大小为物理内存的一半;如果当前节点部署了多个mongod进程,那么需要合理配置此值。如果mongod部署在虚拟容器中(比如,lxc,cgroups,Docker)等,它将不能使用整个系统的物理内存,则需要适当调整此值。默认值为物理内存的一半。
journalCompressor: snappy journal日志的压缩算法,可选值为“none”、“snappy”、“zlib”。
directoryForIndexes: false 是否将索引和collections数据分别存储在dbPath单独的目录中。即index数据保存“index”子目录,collections数据保存在“collection”子目录。默认值为false,仅对mongod有效。
collectionConfig:  
blockCompressor: snappy collection数据压缩算法,可选值“none”、“snappy”、“zlib”。开发者在创建collection时可以指定值,以覆盖此配置项。如果mongod中已经存在数据,修改此值不会带来问题,旧数据仍然使用原来的算法解压,新数据文件将会采用新的解压缩算法。
indexConfig:  
prefixCompression: true 是否对索引数据使用“前缀压缩”(prefix compression,一种算法)。前缀压缩,对那些经过排序的值存储,有很大帮助,可以有效的减少索引数据的内存使用量。默认值为true。

性能分析器

1
operationProfiling:
名称 说明
slowOpThresholdMs: 100 数据库profiler判定一个操作是“慢查询”的时间阀值,单位毫秒;mongod将会把慢查询记录到日志中,即使profiler被关闭。当profiler开启时,慢查询记录还会被写入“system.profile”这个系统级的collection中。请参看mongod profiler相关文档。默认值为100,此值只对mongod进程有效。
mode: off 数据库profiler级别,操作的性能信息将会被写入日志文件中,可选值:
  1)off:关闭profiling
  2)slowOp:on,只包含慢操作日志
  3)all:on,记录所有操作
  数据库profiling会影响性能,建议只在性能调试阶段开启。此参数仅对mongod有效。

主从复制

1
replication:

名称|说明 ———————–|————————————— oplogSizeMB: 10240 | replication操作日志的最大尺寸,单位:MB。mongod进程根据磁盘最大可用空间来创建oplog,比如64位系统,oplog为磁盘可用空间的5%,一旦mongod创建了oplog文件,此后再次修改oplogSizeMB将不会生效。此值不要设置的太小, 应该足以保存24小时的操作日志,以保证secondary有充足的维护时间;如果太小,secondary将不能通过oplog来同步数据,只能全量同步。 enableMajorityReadConcern: false | 是否开启readConcern的级别为“majority”,默认为false;只有开启此选项,才能在read操作中使用“majority”。(3.2+版本) replSetName: <无默认值> | “复制集”的名称,复制集中的所有mongd实例都必须有相同的名字,sharding分布式下,不同的sharding应该使用不同的replSetName secondaryIndexPrefetch: all | 只对mmapv1存储引擎有效。复制集中的secondary,从oplog中运用变更操作之前,将会先把索引加载到内存中,默认情况下,secondaries首先将操作相关的索引加载到内存,然后再根据oplog应用操作。可选值: | 1)none:secondaries不将索引数据加载到内容 | 2)all:sencondaries将此操作有关的索引数据加载到内存 | 3)_id_only:只加载_id索引 | 默认值为:all,此配置仅对mongod有效。 localPingThresholdMs: 15 | ping时间,单位:毫秒,mongos用来判定将客户端read请求发给哪个secondary。仅对mongos有效。默认值为15,和客户端driver中的默认值一样。当mongos接收到客户端read请求,它将: | 1、找出复制集中ping值最小的member。 | 2、将延迟值被此值允许的members,构建一个列表 | 3、从列表中随机选择一个member。 | ping值是动态值,每10秒计算一次。mongos将客户端请求转发给延迟较小(与此值相比)的某个secondary节点。

sharding架构

1
sharding:

名称|说明 ———————–|————————————— clusterRole: <无默认值> | 在sharding集群中,此mongod实例的角色,可选值: | 1、configsvr:此实例为config server,此实例默认侦听27019端口 | 2、shardsvr:此实例为shard(分片),侦听27018端口 | 此配置仅对mongod有效。通常config server和sharding server需要使用各自的配置文件。 archiveMovedChunks: true| 当chunks因为“负载平衡”而迁移到其他节点时,mongod是否将这些chunks归档,并保存在dbPath下“moveChunk”目录下,mongod不会删除moveChunk下的文件。默认为true。 autoSplit: true | 是否开启sharded collections的自动分裂,仅对mongos有效。如果所有的mongos都设定为false,那么collections数据增长但不能分裂成新的chunks。因为集群中任何一个mongos进程都可以触发split,所以此值需要在所有mongos行保持一致。仅对mongos有效。 configDB: <无默认值> | 设定config server的地址列表,每个server地址之间以“,”分割,通常sharded集群中指定1或者3个config server。(生产环境,通常是3个config server,但1个也是可以的)。所有的mongos实例必须配置一样,否则可能带来不必要的问题。 chunkSize: 64 | sharded集群中每个chunk的大小,单位:MB,默认为64,此值对于绝大多数应用而言都是比较理想的。chunkSize太大会导致分布不均,太小会导致分裂成大量的chunk而经常移动. 整个sharding集群中,此值需要保持一致,集群启动后修改此值将不再生效。

系统日志

1
2
3
4
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log
名称 说明
verbosity: 0 日志级别,0:默认值,包含“info”信息,1~5,即大于0的值均会包含debug信息
quiet: true “安静”,此时mongod/mongos将会尝试减少日志的输出量。不建议在production环境下开启,否则将会导致跟踪错误比较困难。
traceAllExceptions: true 打印异常详细信息。
path: logs/mongod.log 日志路径
logAppend: false 如果为true,当mongod/mongos重启后,将在现有日志的尾部继续添加日志。否则,将会备份当前日志文件,然后创建一个新的日志文件;默认为false。
logRotate: rename 日志“回转”,防止一个日志文件特别大,则使用logRotate指令将文件“回转”,可选值:
  1)rename:重命名日志文件,默认值。
  2)reopen:使用linux日志rotate特性,关闭并重新打开此日志文件,可以避免日志丢失,但是logAppend必须为true。
destination: file 日志输出目的地,可以指定为“ file”或者“syslog”,表述输出到日志文件,如果不指定,则会输出到标准输出中(standard output)

与安全有关的配置

1
2
3
4
5
6
7
8
security:  
    authorization: enabled  
    clusterAuthMode: keyFile  
    keyFile: /srv/mongodb/keyfile  
    javascriptEnabled: true  
setParameter:   
    enableLocalhostAuthBypass: true  
    authenticationMechanisms: SCRAM-SHA-1  
名称 说明
authorization disabled或者enabled,仅对mongod有效;表示是否开启用户访问控制(Access Control),即客户端可以通过用户名和密码认证的方式访问系统的数据,默认为“disabled”,即客户端不需要密码即可访问数据库数据。(限定客户端与mongod、mongos的认证)
clusterAuthMode 集群中members之间的认证模式,可选值为“keyFile”、“sendKeyFile”、“sendX509”、“x509”,对mongod/mongos有效;默认值为“keyFile”,mongodb官方推荐使用x509,不过我个人觉得还是keyFile比较易于学习和使用。不过3.0版本中,mongodb增加了对TLS/SSL的支持,如果可以的话,建议使用SSL相关的配置来认证集群的member,此文将不再介绍。(限定集群中members之间的认证)
keyFile 当clusterAuthMode为“keyFile”时,此参数指定keyfile的位置,mongodb需要有访问此文件的权限。
javascriptEnabled true或者false,默认为true,仅对mongod有效;表示是否关闭server端的javascript功能,就是是否允许mongod上执行javascript脚本,如果为false,那么mapreduce、group命令等将无法使用,因为它们需要在mongod上执行javascript脚本方法。如果你的应用中没有mapreduce等操作的需求,为了安全起见,可以关闭javascript。
setParameter 允许指定一些的Server端参数,这些参数不依赖于存储引擎和交互机制,只是微调系统的运行状态,比如“认证机制”、“线程池参数”等。参见【parameter】
enableLocalhostAuthBypass true或者false,默认为true,对mongod/mongos有效;表示是否开启“localhost exception”,对于sharding cluster而言,我们倾向于在mongos上开启,在shard节点的mongod上关闭。
authenticationMechanisms 认证机制,可选值为“SCRAM-SHA-1”、“MONGODB-CR”、“PLAN”等,建议为“SCRAM-SHA-1”,对mongod/mongos有效;一旦选定了认证机制,客户端访问databases时需要与其匹配才能有效。

性能有关的参数

1
2
3
4
setParameter:  
    connPoolMaxShardedConnsPerHost: 200  
    connPoolMaxConnsPerHost: 200  
    notablescan: 0 
名称 说明
connPoolMaxShardedConnsPerHost 默认值为200,对mongod/mongos有效;表示当前mongos或者shard与集群中其他shards链接的链接池的最大容量,此值我们通常不会调整。连接池的容量不会阻止创建新的链接,但是从连接池中获取链接的个数不会超过此值。维护连接池需要一定的开支,保持一个链接也需要占用一定的系统资源。
connPoolMaxConnsPerHost 默认值为200,对mongod/mongos有效;同上,表示mongos或者mongod与其他mongod实例之间的连接池的容量,根据host限定。

配置样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
systemLog:
    quiet: false
    path: /data/mongodb/logs/mongod.log
    logAppend: false
    destination: file
processManagement:
    fork: true
    pidFilePath: /data/mongodb/mongod.pid
net:
    bindIp: 127.0.0.1
    port: 27017
    maxIncomingConnections: 65536
    wireObjectCheck: true
    ipv6: false	
storage:
    dbPath: /data/mongodb/db
    indexBuildRetry: true
    journal:
        enabled: true
    directoryPerDB: false
    engine: mmapv1
    syncPeriodSecs: 60 
    mmapv1:
        quota:
            enforced: false
            maxFilesPerDB: 8
        smallFiles: true	
        journal:
            commitIntervalMs: 100
    wiredTiger:
        engineConfig:
            cacheSizeGB: 8
            journalCompressor: snappy
            directoryForIndexes: false	
        collectionConfig:
            blockCompressor: snappy
        indexConfig:
            prefixCompression: true
operationProfiling:
    slowOpThresholdMs: 100
    mode: off

如果你的架构模式为replication Set,那么还需要在所有的“复制集”members上增加如下配置:

1
2
3
4
replication:
    oplogSizeMB: 10240
    replSetName: rs0
    secondaryIndexPrefetch: all

如果为sharding Cluster架构,则需要在shard节点增加如下配置:

1
2
3
sharding:
    clusterRole: shardsvr
    archiveMovedChunks: true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
systemLog:
    quiet: false
    path: /data/mongodb/logs/mongod.log
    logAppend: false
    destination: file
processManagement:
    fork: true
    pidFilePath: /data/mongodb/mongod.pid
net:
    bindIp: 127.0.0.1
    port: 37017
    maxIncomingConnections: 65536
    wireObjectCheck: true
    ipv6: false	
replication:
    localPingThresholdMs: 15			
sharding:
    autoSplit: true
    configDB: m1.com:27018,m2.com:27018,m3.com:27018
    chunkSize: 64

mongos实例不需要存储实际的数据,对内存有一定的消耗,在sharding架构模式下使用;mongos需接收向客户端请求(后端的sharded和replication set则不需要让客户端知道),它可以将客户端请求转发到一个分片集群上(分片集群基于复制集)延迟相对较小的secondary上,同时还负责chunk的分裂和迁移工作。

repair修复

“修复”数据库,当mongodb运行一段时间之后,特别是经过大量删除、update操作之后,我们可以使用repair指令对数据存储进行“repair”,它将整理、压缩底层数据存储文件,重用磁盘空间,相当于数据重新整理了一遍,对数据优化有一定的作用。

1
$ ./mongod --dbpath=/data/mongodb/db --repair

mongodump与mongorestore

我们通常会使用到mongodb数据的备份功能,或者将一个备份导入到一个新的mongod实例中(数据冷处理),那么就需要借助这两个指令。

  • 备份
1
>./mongodump --host m1.com --port 27017 -u root -p pass --out /data/mongodb/backup/dump_2015_10_10
  • 还原
1
./mongorestore --db mydatabase /data/mongodb/backup/dump_2015_10_10  

mongoimport和mongoexport

mongoexport将数据导出为JSON或者CSV格式,以便其他应用程序解析。

mongo shell

1)help:列出所有的function 2)show dbs:展示当前实例中所有的databases。 3)use :切换到指定的db,接下来的操作将会在此db中。 4)show collections:展示出当前db中所有的collections。 5)show users:展示当前db中已经添加的所有用户。 6)show roles:展示当前db中所有内置的或者自定义的用户角色。 7)show profile:这涉及到profile相关的配置,默认情况下展示出最近5个操作耗时超过1秒的操作,通常用于跟踪慢查询。 8)db.help():展示出可以在db上进行的操作function。 9)db..help():展示出可以在colleciton上进行的操作。

我的博客

Read More

yum方式

配置.repo

  • 创建 /etc/yum.repos.d/mongodb-org-3.4.repo
1
2
3
4
5
6
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

安装install

1
$ yum install -y mongodb-org

运行

1
$ systemctl start mongod.service

停止

1
$ systemctl stop mongod.service

设置开机启动

1
$ systemctl enable mongod.service

关闭开机启动

1
$ systemctl disable mongod.service

重启

1
$ systemctl restart mongod.service

删除包

1
yum erase $(rpm -qa | grep mongodb-org)

清理文件

1
2
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongo

检测后台进程是否存在

1
$ ps -ef |grep mongo

检测27017端口是否在监听

1
$ netstat -lntp | grep 27017

第三方GUI客户端

Mongoclient

  • 官网

http://www.mongoclient.com/

  • 下载

https://github.com/rsercano/mongoclient

User Management

Robomongo

https://robomongo.org/

MongoChef

http://3t.io/mongochef/

我的博客

Read More