MySQL密码强度审计插件:validate_password的使用说明

相信很多人在日常工作中,都会遇到设置用户、密码之类的问题,很多人使用keepass来生成和保存密码;但是,很多人为了易于记忆,会选择相对简答的密码,这样,在安全性方面,会存在非常严重的安全隐患。

在mysql 5.6对密码的强度进行了加强,推出了validate_password 插件。支持密码的强度要求。

此插件要求版本:5.6.6 以上版本
安装方式:

1.安装插件:(默认安装了插件后,强度插件就启用了,关闭,需要在配置文件假如相关关闭参数)

mysql>INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;

2.配置文件添加部分参数:

[mysqld]

plugin-load=validate_password.so

validate_password_policy=2

validate-password=FORCE_PLUS_PERMANENT

3.以上处理后,就可以测试了:

mysql> SET PASSWORD = PASSWORD(‘abc’);

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

mysql> SET PASSWORD = ‘*0D3CED9BEC10A777AEC23CCC353A8C08A633045E’;

Query OK, 0 rows affected (0.01 sec)

4.相关说明:

(1).相关选项:

validate-password=ON/OFF/FORCE/FORCE_PLUS_PERMANENT: 决定是否使用该插件(及强制/永久强制使用)。

validate_password_dictionary_file:插件用于验证密码强度的字典文件路径。

validate_password_length:密码最小长度。

validate_password_mixed_case_count:密码至少要包含的小写字母个数和大写字母个数。

validate_password_number_count:密码至少要包含的数字个数。

validate_password_policy:密码强度检查等级,0/LOW、1/MEDIUM、2/STRONG。

validate_password_special_char_count:密码至少要包含的特殊字符数。

其中,关于validate_password_policy-密码强度检查等级:

0/LOW:只检查长度。

1/MEDIUM:检查长度、数字、大小写、特殊字符。

2/STRONG:检查长度、数字、大小写、特殊字符字典文件。

(2).插件的安装启用:

插件对应的库对象文件需在配置选项plugin_dir指定的目录中。

可使用–plugin-load=validate_password.so,在server启动时载入插件,或者将plugin-load=validate_password.so写入配置文件。

也可以通过如下语句在server运行时载入插件(会注册进mysql.plugins表)

mysql> INSTALL PLUGIN validate_password SONAME ‘validate_password.so’;

(3).为阻止该插件在运行时被删除可在配置文件中添加:

[mysqld]

plugin-load=validate_password.so

validate-password=FORCE_PLUS_PERMANENT

xtrabackup实现多实例备份实践

多实例备份,我一直未曾去学习使用它,最近,因公司报表机数据增长太快,dump备份太慢,也很容易卡住,因此,决定弃用dunp备份,改用xtrabackup备份,实现增备、全备;

目前,DB存在3307,3308,3309 三个实例,使用的mysqld_multi部署的多实例;

这里,如果需要使用xtrabackup备份多实例的话,需要针对每个实例,将配置文件独立写出一份,放在/home/backup/conf目录下

我们备份的目录为:/home/backup

备份的最新检查点放在:/home/backup/last_backup

备份存放路径:/home/backup/BackupDir_xtrabackup

备份日志存放路径:/home/backup/log

具体目录结构如下:

[root@slave1 home]# tree /home/backup
/home/backup
├── BackupDir_xtrabackup
├── backup_xtrabackup.sh
├── conf
│ ├── my3307.cnf
│ ├── my3308.cnf
│ └── my3309.cnf
├── last_backup
└── log

percona xtrabackup 官方文档地址:

https://www.percona.com/doc/percona-xtrabackup/2.2/innobackupex/innobackupex_script.html

下面,简单讲一下,xtrbackup备份多实例的使用

xtrbackup常用的几个参数:

–user: mysql用户

–password: 用户密码

–defaults-file: 指定my.cnf文件路径,若不指定则读取mysql默认的my.cnf文件,这里我们会指定我们在conf目录独立出的各个实例的文件

–socket:mysql实例对应的socket文件

全备示例:

innobackupex –user=root –password=123456 –socket=/tmp/mysql3307.sock –defaults-file=/home/backup/conf/my3307.cnf /home/backup/BackupDir_xtrabackup/3307/

当备份日志出现:innobackupex: completed OK! 则代表备份成功。

备份结束后,备份目录会出现几个文件,下面,我们解释一下:

backup-my.cnf:主要是记录innobackupex中使用到Mysql参数。

xtrabackup_checkpoints:记录备份类型及开始及结束的lsn位置。backup_type 有两种full-prepared (全备)、incremental (增备)。

xtrabackup_info:记录mysql相关信息。

xtrabackup_logfile: xtrabackup自己的日志文件,新版本中不直接可见。

xtrabackup_binlog_info :这个会记录你备份结束时,主上binlog的位置,可以用于重建主从

增量备份,由于是基于全备执行,而且,方法比较简单,这里就不演示

下面描述一下,恢复需要注意的问题:

1. 对全量备份进行操作

了解两个参数 :

–apply-log :创建新的事务日志,从backup-my.cnf文件中读取innodb配置信息。

–redo-only:只读已提交的事务,在最后一次增量合并时,不需要填写这个参数。

全量备份恢复前准备

innobackupex –apply-log –redo-only /home/backup/BackupDir_xtrabackup/3307/……

2. 将第一次增量备份的数据合并到全量备份中

innobackupex –apply-log –redo-only /home/backup/BackupDir_xtrabackup/3307/…full –incremental-dir= /home/backup/BackupDir_xtrabackup/3307/…..inc

3.将第二次全量备份的数据合并到全量备份中(最后一个增量备份)

innobackupex –apply-log /home/backup/BackupDir_xtrabackup/3307/…full –incremental-dir= /home/backup/BackupDir_xtrabackup/3307/…..inc

注:最后一次的合并操作中不需要添加–redo-only参数。

4.这里需要对全备,再做一次apply-log,网上很多都没有这步,但官方文档上有

innobackupex –apply-log /home/backup/BackupDir_xtrabackup/3307/…full

5.停止mysql服务

恢复时需要停掉MySQL,并且数据目录必须为空,所以,我们需要多原有的数据目录进行备份,最简单方式:mv data data_1011_bak

然后,再新建一个数据目录:mkdir data

6. 恢复数据。

innobackupex –defaults-file=/home/backup/conf/my3307.cnf –copy-back /home/backup/BackupDir_xtrabackup/3307/…full

7.权限设置

恢复完成后,需要对数据目录设置mysql权限

chown -R mysql:mysql /data/

8.启动mysql实例

9. 查看是否恢复成功,这里恢复算完成了,但是,实际情况下,我们还需要根据xtrbackup_binlog_info的信息去恢复 binlog的部分数据,这个环节网上也没有提到,所以,刚才对数据目录的备份就十分有用,这里,就不做演示,相信基于binlog的恢复,应该都十分熟练了

git命令的日常使用

最近,由于工作繁琐,博客好久没有更新了,今天来更新一把~~
目前,说的比较多的技术有docker,云平台,自动化运维,大数据等,还有一些宕机误删除等八卦新闻
github 已经火了很长时间了,我们有必要了解一下基本使用方法。
目前,国内用的比较多的代码托管平台如下:
        开源中国代码托管平台:http://git.oschina.net/
        csdn 代码托管平台:http://code.csdn.net/
国外比较出名的,无非是github:https://github.com/
linux 用户,可以直接yum 安装git,windows 用户,可能需要根据自己机器系统下载对应版本,windows 的git有中文版哦~~
下面,就说说一些基本使用:
1.当我们首次在自己机器上使用时,需要配置用户名和密码:
      $ git config –global user.name “Michael.Xu”
      $ git config –global user.email “Michael.Xu@haowu.com”
2.配置编辑器:(这一步windows用户可以不做)
你的标识已经设置,你可以配置你的缺省文本编辑器,Git在需要你输入一些消息时会使用该文本编辑器。缺省情况下,Git使用你的系统的缺省编辑器,这通常可能是vi 或者 vim。如果你想使用一个不同的文本编辑器,例如Emacs,你可以做如下操作:
      $ git config –global core.editor emacs
3.配置比较工具:
另外一个你可能需要配置的有用的选项是缺省的比较工具它用来解决合并时的冲突。例如,你想使用vimdiff:
      $ git config –global merge.tool vimdiff
Git可以接受kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, 和 opendiff作为有效的合并工具。你也可以设置一个客户化的工具;
4.检查配置:
如果你想检查你的设置,你可以使用 git config –list 命令来列出Git可以在该处找到的所有的设置:
    $ git config –list
         user.name=Michael.Xu
         user.email=Michael.Xu@haowu.com
         color.status=auto
         color.branch=auto
         color.interactive=auto
         color.diff=auto
5.克隆一个git:
  001497@HW001497 MINGW64 /f/python/web/flask/hr/hr (master)
  $ git clone https://git.oschina.net/michael-mysql/hr.git
6.查看当前状态:
  001497@HW001497 MINGW64 /f/python/web/flask/hr/hr (master)
  $ git status
  On branch master
  Your branch is up-to-date with ‘origin/master’.
  nothing to commit, working directory clean
7.如果有文件修改,添加文件:
  001497@HW001497 MINGW64 /f/python/web/flask/hr/hr (master)
  $ git add *
  8.提交你的更改:
  001497@HW001497 MINGW64 /f/python/web/flask/hr/hr (master)
  $ git commit -m “20150923_1a”
  On branch master
  Your branch is ahead of ‘origin/master’ by 1 commit.
    (use “git push” to publish your local commits)
  nothing to commit, working directory clean
9.推送到 服务端:
  001497@HW001497 MINGW64 /f/python/web/flask/hr/hr (master)
  $ git push origin master
  Username for ‘https://git.oschina.net’: ********
  Password for ‘https://*******@git.oschina.net’:
  Counting objects: 16, done.
  Delta compression using up to 2 threads.
  Compressing objects: 100% (16/16), done.
  Writing objects: 100% (16/16), 2.26 KiB | 0 bytes/s, done.
  Total 16 (delta 9), reused 0 (delta 0)
  To https://git.oschina.net/michael-mysql/hr.git
     3c6da84..3ab7849  master -> master
# 其它相关命令:
1.新建仓库,初始化操作
     创建文件夹,进入,执行:git init
2.创建分支:
     git checkout -b “分支名”
3.切换回主分支:
     git checkout master
4.删除新建分支:
     git branch -d “分支名”
5.推送分支:
     git push origin “分支名”
6.更新本地仓库:
     git pull
7.合并其它分支到当前分支:
     git merge “分支名”
8.日志:
     git log

MongoDB 集群分片(涉及分片、副本集等)

     # MongoDB 的命令对大小写是比较敏感的,所以,注意命令大小写问题:
一、MongoDB 集群分片的组成:
mongodb 的集群分片包括 4 个部分:mongos、config server、shard、replica set。
     mongos:
          数据库集群请求的入口,所有的请求都通过mongos进行协调,不需要在应用程序添加一个路由选择器;
          mongos自己就是一个请求分发中心,它负责把对应的数据请求请求转发到对应的shard服务器上;
          在生产环境,通常有多mongos作为请求的入口,防止其中一个挂掉所有的mongodb请求都没有办法操作。
     config server:
          顾名思义为配置服务器,存储所有数据库元信息(路由、分片)的配置;
          mongos本身没有物理存储分片服务器和数据路由信息,只是缓存在内存里,配置服务器则实际存储这些数据;
          mongos第一次启动或者关掉重启就会从 config server 加载配置信息,以后,如果配置服务器信息变化会通知到所有的 mongos 更新自己的状态;
          这样, mongos 就能继续准确路由;
          在生产环境通常有多个 config server 配置服务器,因为它存储了分片路由的元数据,这个可不能丢失!就算挂掉其中一台,只要还有存货, mongodb集群就不会挂掉。
     shard:
          这就是传说中的分片了。
          一台机器的一个数据表 Collection1 存储了 1T 数据,压力太大了;
          在分给4个机器后,每个机器都是256G,则分摊了集中在一台机器的压力;
          也许有人问一台机器硬盘加大一点不就可以了,为什么要分给四台机器呢?不要光想到存储空间,实际运行的数据库还有硬盘的读写、网络的IO、CPU和内存的瓶颈;
          在mongodb集群只要设置好了分片规则,通过mongos操作数据库就能自动把对应的数据操作请求转发到对应的分片机器上;
          在生产环境中分片的片键可要好好设置,这个影响到了怎么把数据均匀分到多个分片机器上,不要出现其中一台机器分了1T,其他机器没有分到的情况,这样还不如不分片!
     replica set:
          分片如果没有 replica set 是个不完整架构;
          假设,其中的一个分片挂掉那四分之一的数据就丢失了,所以,在高可用性的分片架构,还需要对于每一个分片构建 replica set 副本集保证分片的可靠性;
          生产环境通常是 2个副本 + 1个仲裁。
二、MongoDB 集群分片部署规划和集群架构图:
     1.机器或实例数量:
     下面,我们确定一下,机器的大体数量:
          mongos 3个, config server 3个,数据分3片 shard server 3个,每个shard 有一个副本一个仲裁也就是 3 * 2 = 6 个,总共需要部署15个实例
          但是,我们这里只是模拟测试,就准备 4 台机器:
172.16.10.53;172.16.10.54;172.16.10.55;172.16.10.56;
     2.实例端口配置部分:
          这里,由于有的实例部署在同一台机器上,所以进行了端口规划:
          mongos:          20000
          config server:   21000
          shard1:             22001
          shard2:             22002
          shard3:             22003
     3.MongoDB 集群分片架构图:
                  3
三、MongoDB 集群分片部署
     1.MongoDB 部署:
          默认,已经初始安装好了,安装在 /usr/local/mongodb
     2.MongoDB 多实例 部署:
        # 以下操作,在 172.16.10.54,172.16.10.55 上执行
        (1).新建 MongoDB分片 的 data 目录:(切换到 mongodb 用户下,新建目录)
               mkdir -p   /usr/local/mongodb/data/share_0{1..3}
        (2).在conf 目录,新建并编辑 3份 配置文件(可用root用户新建编辑)
               vim  /usr/local/mongodb/conf/mongodb_01.conf
                    port=22001
                    dbpath=/usr/local/mongodb/data/share_01
                    logpath=/usr/local/mongodb/log/mongodb_01.log
                    logappend=true
                    fork=true
                    oplogSize=4096
                   # replSet=share_01/172.16.10.56:22001,172.16.10.55:22001   # 在10.54 上配置文件,去掉此行前面的注释
                   # replSet=share_01/172.16.10.56:22001,172.16.10.54:22001   # 在10.55 上配置文件,去掉此行前面的注释
               vim  /usr/local/mongodb/conf/mongodb_02.conf
                    port=22002
                    dbpath=/usr/local/mongodb/data/share_02
                    logpath=/usr/local/mongodb/log/mongodb_02.log
                    logappend=true
                    fork=true
                    oplogSize=4096
                   # replSet=share_02/172.16.10.56:22002,172.16.10.55:22002   # 在10.54 上配置文件,去掉此行前面的注释
                   # replSet=share_02/172.16.10.56:22002,172.16.10.54:22002   # 在10.55 上配置文件,去掉此行前面的注释
               vim  /usr/local/mongodb/conf/mongodb_03.conf
                    port=22003
                    dbpath=/usr/local/mongodb/data/share_03
                    logpath=/usr/local/mongodb/log/mongodb_03.log
                    logappend=true
                    fork=true
                    oplogSize=4096
                   # replSet=share_03/172.16.10.56:22003,172.16.10.55:22003   # 在10.54 上配置文件,去掉此行前面的注释
                   # replSet=share_03/172.16.10.56:22003,172.16.10.54:22003   # 在10.55 上配置文件,去掉此行前面的注释
 
        (3).MongoDB 启动测试:
             # 切换用户:
               su – mongodb
             # 启动:
               /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb_01.conf
               /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb_02.conf
               /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb_03.conf
             # 查看是否启动:
                 ps -ef | grep mongodb   或    netstat -tulnap | grep mongo
     3.MongoDB 仲裁配置:【 这个操作在 172.16.10.56 】
        (1).MongoDB 仲裁的安装:
             MongoDB arbiter 安装  和 mongodb 的安装一样(请参照mongodb安装),只需要修改一下配置文件;
             我们,这里修改 mongodb 仲裁的名字叫 mongodb_arbiter,安装在 /usr/local/mongodb_arbiter 目录下;
        (2).MongoDB 仲裁多实例部署 和 上面 mongodb 的多实例部署一致:
             新建 MongoDB的 data 目录:(切换到 mongodb 用户下,新建目录)
               mkdir -p   /usr/local/mongodb/data/arbiter_0{1..3}
        (3).在conf 目录,新建并编辑 3份 配置文件(可用root用户新建编辑)
               vim /usr/local/mongodb_arbiter/conf/mongodb_01.conf
                    port=22001
                    dbpath=/usr/local/mongodb_arbiter/data/arbiter_01
                    logpath=/usr/local/mongodb_arbiter/log/arbiter_01.log
                    logappend=true
                    fork=true
                    replSet=share_01/172.16.10.54:22001,172.16.10.55:22001
               vim /usr/local/mongodb_arbiter/conf/mongodb_02.conf
                    port=22002
                    dbpath=/usr/local/mongodb_arbiter/data/arbiter_02
                    logpath=/usr/local/mongodb_arbiter/log/arbiter_02.log
                    logappend=true
                    fork=true
                    replSet=share_02/172.16.10.54:22002,172.16.10.55:22002
               vim /usr/local/mongodb_arbiter/conf/mongodb_03.conf
                    port=22003
                    dbpath=/usr/local/mongodb_arbiter/data/arbiter_03
                    logpath=/usr/local/mongodb_arbiter/log/arbiter_03.log
                    logappend=true
                    fork=true
                    replSet=share_03/172.16.10.54:22003,172.16.10.55:22003
        (4).mongodb_arbiter启动:
               /usr/local/mongodb_arbiter/bin/mongod –config /usr/local/mongodb_arbiter/conf/mongodb_01.conf
               /usr/local/mongodb_arbiter/bin/mongod –config /usr/local/mongodb_arbiter/conf/mongodb_02.conf
               /usr/local/mongodb_arbiter/bin/mongod –config /usr/local/mongodb_arbiter/conf/mongodb_03.conf
     4.MongoDB 备份集配置:
          # 修改 172.16.10.54,172.16.10.55  三个 mongodb 实例的 配置:
          # 注:
                    修改的部分,就是实例 注释掉的部分,根据需要,去掉需要部分前面的“ # ” ,重启即可;
          # 以上配置修改完成后,需要重启 54,55 上的实例;
          # 在 仲裁端 登录,初始化副本集:
              登录到172.16.10.54:22001 (mongodb master)上,执行如下操作:
                     /usr/local/mongodb/bin/mongo –port 22001
                     /usr/local/mongodb/bin/mongo>use admin
                     /usr/local/mongodb/bin/mongo>config_share01={_id:’share_01‘,members:[
                                                                                                     {_id:0,host:’172.16.10.54:22001‘,priority:10},
                                                                                                     {_id:1,host:’172.16.10.55:22001‘,priority:9},
                                                                                                     {_id:2,host:’172.16.10.56:22001‘,”arbiterOnly”:true} ]}
                     /usr/local/mongodb/bin/mongo>rs.initiate(config_share01)
                     /usr/local/mongodb/bin/mongo>rs.status()
                     /usr/local/mongodb/bin/mongo>rs.config()
          # 其它实例,修改 红色部分端口,和分片号; 这里就不做副本集测试
     5.MongoDB config 服务 和 mongos(路由) 服务部署:
#   在172.16.10.53 上部署;
        #   配置服务和路由服务的安装,只需要正常安装mongodb, 修改相应的配置文件即可:
        #   新建配置服务数据目录(以mongodb身份新建)
             mkdir -p /usr/local/mongodb/data/config_server
        (1).修改 MongoDB  配置服务器的配置文件:
             vim /usr/local/mongodb/conf/config_server.conf
               pidfilepath = /usr/local/mongodb/config/mongodb_config.pid 
               logpath =/usr/local/mongodb/log/config_server.log  
               dbpath = /usr/local/mongodb/data/config_server
               directoryperdb = true  
               configsvr = true  
               port = 21000  
               logappend = true  
               fork = true 
 
        (2).修改 MongoDB  路由服务器的配置文件:
             vim /usr/local/mongodb/conf/mongos.conf
               # 监听的配置服务器,只能有1个或者3个
               configdb = 172.168.10.53:21000   
               port = 20000  
               # 单位 mb 生成环境请使用 100 或删除,删除后默认是64
               chunkSize = 1 
               logpath =/usr/local/mongodb/log/mongos.log  
               logappend = true  
               fork = true  
        (3).启动配置服务器和路由服务器:
               A.配置服务器的启动:
                    /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/config_server.conf
               B.路由服务器的启动:
                    /usr/local/mongodb/bin/mongos –config /usr/local/mongodb/conf/mongos.conf
      6.MongoDB 路由节点配置:
          /usr/local/mongodb/bin/mongo –port 20000
          mongos> use admin
          mongos> db.runCommand({addshard:”share_02/172.16.10.54:22002,172.16.10.55:22002,172.16.10.56:22002″,name:”share_02″,maxsize:20480})
          mongos> db.runCommand({addshard:”share_01/172.16.10.54:22001,172.16.10.55:22001,172.16.10.56:22001″,name:”share_01″,maxsize:20480})
mongos> db.runCommand({addshard:”share_03/172.16.10.54:22003,172.16.10.55:22003,172.16.10.56:22003″,name:”share_03″,maxsize:20480})
mongos> db.runCommand({listshards:1})
               {
          “shards” : [
     {
“_id” : “share_02”,
“host” : “share_02/172.16.10.54:22002,172.16.10.55:22002”
     },
     {
“_id” : “share_01”,
“host” : “share_01/172.16.10.54:22001,172.16.10.55:22001”
     },
     {
“_id” : “share_03”,
“host” : “share_03/172.16.10.54:22003,172.16.10.55:22003”
     }
          ],
          “ok” : 1
               }
               #  注:
                     replica set + shard 功能就配置好了,注意:虽然配置好了,但是还要声明库和表要进行分片
      7.MongoDB 声明库 和 表 分片:
          mongos> use admin  # 切换到admin库
          mongos> db.runCommand({enablesharding:”test2″});   # 声明test2库允许分片
          mongos> db.runCommand( { shardcollection : “test2.books”, key : { id : 1 } } );   # 声明books表要分片
          mongos> use test2    # 切换到test2
          mongos> db.stats();   # 查看数据库状态
          mongos> db.books.stats();   # 查看表状态
四、MongoDB 集群分片测试:
     1.测试脚本:
          mongos> for ( var i=1;i<=20000;i++) db.books.save({id:i,name:”haowu”,sex:”male”,age:28,value:”haowu”});
     2.测试结果:
          (1).这个插入分片数据前的信息:
mongos> db.books.stats();
{
“sharded” : true,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“ns” : “test2.books”,
“count” : 0,
“numExtents” : 1,
“size” : 0,
“storageSize” : 8192,
“totalIndexSize” : 16352,
“indexSizes” : {
“_id_” : 8176,
“id_1” : 8176
},
“avgObjSize” : 0,
“nindexes” : 2,
“nchunks” : 1,
“shards” : {
“share_01” : {
“ns” : “test2.books”,
“count” : 0,
“size” : 0,
“numExtents” : 1,
“storageSize” : 8192,
“lastExtentSize” : 8192,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 16352,
“indexSizes” : {
“_id_” : 8176,
“id_1” : 8176
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551b02945399f93109d3a39”)
}
}
},
“ok” : 1
}
          (2).这个插入分片数据后的信息:
mongos> db.books.stats();
{
“sharded” : true,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“ns” : “test2.books”,
“count” : 20000,
“numExtents” : 11,
“size” : 2240000,
“storageSize” : 5595136,
“totalIndexSize” : 1267280,
“indexSizes” : {
          “_id_” : 678608,
“id_1” : 588672

},
“avgObjSize” : 112,
“nindexes” : 2,
“nchunks” : 5,
“shards” : {
“share_01” : {
“ns” : “test2.books”,
    “count” : 10028,
“size” : 1123136,
“avgObjSize” : 112,
“numExtents” : 5,
“storageSize” : 2793472,
“lastExtentSize” : 2097152,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 629552,
“indexSizes” : {
“_id_” : 335216,
“id_1” : 294336
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551b02945399f93109d3a39”)
}
},
“share_02” : {
“ns” : “test2.books”,
    “count” : 9964,
“size” : 1115968,
“avgObjSize” : 112,
“numExtents” : 5,
“storageSize” : 2793472,
“lastExtentSize” : 2097152,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 621376,
“indexSizes” : {
“_id_” : 335216,
“id_1” : 286160
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551af01cfe537190558b164”)
}
},
“share_03” : {
“ns” : “test2.books”,
        “count” : 8,
“size” : 896,
“avgObjSize” : 112,
“numExtents” : 1,
“storageSize” : 8192,
“lastExtentSize” : 8192,
“paddingFactor” : 1,
“paddingFactorNote” : “paddingFactor is unused and unmaintained in 3.0. It remains hard coded to 1.0 for compatibility only.”,
“userFlags” : 1,
“capped” : false,
“nindexes” : 2,
“totalIndexSize” : 16352,
“indexSizes” : {
“_id_” : 8176,
“id_1” : 8176
},
“ok” : 1,
“$gleStats” : {
“lastOpTime” : Timestamp(0, 0),
“electionId” : ObjectId(“5551af39bc340be250ae0cb4”)
}
}
},
“ok” : 1
}
     # 注:
          从上面看,我们这个插入的数据,分配很不均衡,至于何解,有待研究
     3.集群分片信息的查看:
mongos> sh.status();
— Sharding Status —
sharding version: {
“_id” : 1,
“minCompatibleVersion” : 5,
“currentVersion” : 6,
“clusterId” : ObjectId(“5551bfe62d6d99e8bbbc8840”)
}
shards:
{  “_id” : “share_01”,  “host” : “share_01/172.16.10.54:22001,172.16.10.55:22001” }
{  “_id” : “share_02”,  “host” : “share_02/172.16.10.54:22002,172.16.10.55:22002” }
{  “_id” : “share_03”,  “host” : “share_03/172.16.10.54:22003,172.16.10.55:22003” }
balancer:
Currently enabled:  yes
Currently running:  no
Failed balancer rounds in last 5 attempts:  0
Migration Results for the last 24 hours:
3 : Success
1 : Failed with error ‘migration already in progress’, from share_01 to share_02
databases:
{  “_id” : “admin”,  “partitioned” : false,  “primary” : “config” }
{  “_id” : “test”,  “partitioned” : false,  “primary” : “share_01” }
{  “_id” : “test2”,  “partitioned” : true,  “primary” : “share_01” }
test2.books
shard key: { “id” : 1 }
chunks:
share_01     2
share_02     2
share_03     1
{ “id” : { “$minKey” : 1 } } –>> { “id” : 2 } on : share_02 Timestamp(2, 0)
{ “id” : 2 } –>> { “id” : 10 } on : share_03 Timestamp(3, 0)
{ “id” : 10 } –>> { “id” : 4691 } on : share_01 Timestamp(4, 1)
{ “id” : 4691 } –>> { “id” : 10038 } on : share_01 Timestamp(3, 3)
{ “id” : 10038 } –>> { “id” : { “$maxKey” : 1 } } on : share_02 Timestamp(4, 0)

MongoDB 特性:副本集

一、Mongodb的主从模式种类:

     1.master/slave模式(这种结构无法实现自动 failover,MongoDB 官方已经不建议使用主从模式)
     2.Replicat sets模式
二、Mongodb Replicat sets模式 简介:
     MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模式。
     主从模式其实就是一个单副本的应用,没有很好的扩展性和容错性。而副本集具有多个副本保证了容错性,就算一个副本挂掉了还有很多副本存在,并且解决了上面第一个问题“主节点挂掉了,整个集群内会自动切换”。
     其架构图如下:
1=故障后=>
2     由图可以看到,客户端连接到整个副本集,不关心具体哪一台机器是否挂掉。
     主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。
     副本集中的副本节点,在主节点挂掉后,通过心跳机制检测到后,就会在集群内发起主节点的选举机制,自动选举一位新的主服务器。
     注:
          使用副本集时,如果 PRIMARY 挂掉,SECONDARY 会成为 PRIMARY, Mongodb 的访问地址是会改变的。
          但是,Mongodb 提供了各种开发语言访问 Mongodb replica sets 的驱动程序,所以,访问地址的高可用在客户端访问代码中实现。
三、Mongodb Replicat sets 部署规划:
          172.16.10.55:27017     (mongodb master)
          172.16.10.56:27017     (mongodb slave)
          172.16.10.56:27018     (mongodb 仲裁点)
四、Mongodb Replicat sets 配置文件修改:
     1.修改172.16.10.55:27017(mongodb master) 的配置文件如下:
          vim /usr/local/mongodb/conf/mongodb.conf
               port=27017
               dbpath=/usr/local/mongodb/data
               logpath=/usr/local/mongodb/log/mongodb.log
               logappend=true
               fork=true
               oplogSize=4096
               replSet=haowu/172.16.10.56:27017,172.16.10.56:27018
     2.修改172.16.10.56:27017(mongodb slave) 的配置文件如下:
          vim /usr/local/mongodb/conf/mongodb.conf
               port=27017
               dbpath=/usr/local/mongodb/data
               logpath=/usr/local/mongodb/log/mongodb.log
               logappend=true
               fork=true
               oplogSize=4096
               replSet=haowu/172.16.10.55:27017,172.16.10.56:27018
     3.修改172.16.10.56:27018(mongodb 仲裁点) 的配置文件如下:
          vim /usr/local/mongodb_arbirer/conf/mongodb.conf
               port=27018
               dbpath=/usr/local/mongodb_arbirer/data
               logpath=/usr/local/mongodb_arbirer/log/mongodb.log
               logappend=true
               fork=true
 
     # oplogSize:
               用于指定复制时的日志大小,默认大小是磁盘剩余空间的5%,其实就是一个缓存,缓存PRIMARY产生的日志。
     # replSet:
               设置副本集的命令,名字后跟其他的实例地址。实例地址也可以不指定或者指定一个,mongodb可以自动去发现其他节点。为了使配置清晰,指定了节点地址。
五、Mongodb Replicat sets 启动:
      1.172.16.10.55:27017(mongodb master)启动:
          /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf
      2.172.16.10.56:27017(mongodb slave)启动:
         /usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf
      3.172.16.10.56:27018(mongodb 仲裁点)启动:
          /usr/local/mongodb_arbirer/bin/mongod –config /usr/local/mongodb_arbirer/conf/mongodb.conf
          # 在启动集群后,需要对集群做初始化配置,初始化配置需要所有的节点都在启动状态
六、Mongodb Replicat sets 集群初始化:
     登录到172.16.10.55:27017(mongodb master)上,执行如下操作:
      /usr/local/mongodb/bin/mongo>config_rs1={_id:’haowu’,members:[
                                                                      {_id:0,host:’172.16.10.55:27017′,priority:10},
                                                                      {_id:1,host:’172.16.10.56:27017′,priority:9},
                                                                      {_id:2,host:’172.16.10.56:27018′,”arbiterOnly”:true}
                                                                      ]}
        /usr/local/mongodb/bin/mongo>rs.initiate(config_rs1)
        /usr/local/mongodb/bin/mongo>rs.status()
        /usr/local/mongodb/bin/mongo>rs.config()
        /usr/local/mongodb/bin/mongo>rs.initiate(config_rs1)
七、Mongodb Replicat sets 同步测试:
      1. 登录 mongodb master 上,插入数据:
          haowu:PRIMARY> show collections;
haowu:PRIMARY> db.haowu.insert({name:”haowu”,age:28})
haowu:PRIMARY> db.haowu.find();
      2. 登录 mongodb slave 上,执行如下操作,看是否同步:
          # mongodb默认是从主节点读写数据的,副本节点上不允许读,下面,设置副本节点可读
          haowu:SECONDARY> rs.slaveOk()
haowu:SECONDARY> db.haowu.find();

八、Mongodb Replicat sets 故障切换测试:
      1. 登录 mongodb master 上,关闭master:
          haowu:PRIMARY> use admin、
haowu:PRIMARY> db.shutdownserver();
      2. 登录 mongodb slave 上,查看slave日志切换信息:
          其实,登录slave,你会发现slave的标识由:haowu:SECONDARY>  变为  haowu:PRIMARY>
          haowu:SECONDARY> rs.isMaster()
      3.我们这里,因为设置了副本集成员的优先级,所以,当宕机的master 重新启动后,会自动再次成为 master;
         因此,如果想避免此类事件发生,我们可以去掉优先级设置
九、Mongodb Replicat sets 读写分离配置:
     读写分离,将读压力分散到副本集的副本节点上,可以减轻主节点的读写压力
     (1)设置读写分离,需要先在副本节点SECONDARY ,设置 setSlaveOk。
     (2)在程序中设置副本节点负责读操作,

MariaDB 10 多源复制特性

mariadb multi-source replication(mariadb多主复制),在mariadb-10.0里面加入了多主复制功能。

修改过的语法:
     针对每个复制线程会有一个对应的connection_name
     而connection_name是default_master_connection变量的值;
     如果你要操作对应的复制线程,需要将这个变量设置为对应的复制线程的名字。
connection_name的值是长度小于64的任何字符串,并且对大小写不敏感
     你需要尽量让连接名固定,因为它会被作为文件名的一部分。

以下是新增加的一些语法:
     关注点主要在connection_name,也就是在以前的语法上增加了connection_name,如果没加connection_name,那么默认的就是空(”).
CHANGE MASTER [‘connection_name’] …
FLUSH RELAY LOGS [‘connection_name’]
MASTER_POS_WAIT(….,[‘connection_name’])
RESET SLAVE [‘connection_name’]
SHOW RELAYLOG [‘connection_name’] EVENTS
SHOW SLAVE [‘connection_name’] STATUS
SHOW ALL SLAVES STATUS
START SLAVE [‘connection_name’…]]
START ALL SLAVES …
STOP SLAVE [‘connection_name’] …
STOP ALL SLAVES …

原来的老式的连接是一个空字符串 ”,如果你不想用的话可以不用这个连接。
你可以使用change master创建一个新的master 连接。
你可以使用reset slave ‘connect_name’ ALL;完全的删除一个连接。

多源复制的变量
     新复制变量 @@default_master_connection 指定了;
     如果你不指定一个连接的话那个链接将会被命令和变量使用。默认这个值是 ” (默认连接名)。
     下面的复制变量是针对局部的连接的(换句话说,他们显示了 @@default_master_connection 的值)。
我们正致力于将重要的对于连接局部化。
类型                      名称                                                                   描述
变量           Max_relay_log_size                      relay log的最大值. 如果是0的话,那么在启动的时候就会被设置成 max_binlog_size 的大小
状态           Slave_heartbeat_period               多久从master请求一个心跳包 (以秒计算).
状态           Slave_received_heartbeats          我们从master收到了多少个心跳包.
状态           Slave_running                             显示slave是否正在运行。YESS表示 sql 和 IO 线程是活动的。
                                                                    No表示其中任意一个没在运行中。
                                                                    ””表示 @@default_master_connection 不存在。
变量           Sql_slave_skip_counter                复制日志要忽略多少个条目(主要用在日志中有错误的情况下)。
     你可以用 SESSION 或者是 GLOBAL 访问以上所有的变量。
注意,和MySQL形成对比的是,所有的变量总是显示正确的有效的值!
例如:
set @@default_master_connection=”;
show status like ‘Slave_running’;
set @@default_master_connection=’other_connection’;
show status like ‘Slave_running’;

如果 @@default_master_connection 包含一个不存在的名称,你将收到一个警告.
所有其他的master相关的变量都是全局的,并且影响 “” 连接或者是所有的连接。例如, Slave_retried_transactions 现在显示所有的slave的重试事务次数。

新添加的状态变量:
               名称                                     描述
Com_start_all_slaves                执行 START ALL SLAVES 命令的次数。
Com_start_slave                      执行 START SLAVE 命令的次数。取代了 Com_slave_start.
Com_stop_slave                      执行 STOP SLAVE 命令的次数。取代了 Com_slave_stop.
Com_stop_all_slaves                执行 STOP ALL SLAVES 命令的次数

SHOW ALL SLAVES STATUS 有以下的新的列:

               名称                                     描述

     Connection_name                 master的连接名。 这是第一个变量
Slave_SQL_State                    SQL 线程的状态
Retried_transactions              这个连接重试事务的次数。
Max_relay_log_size                这个连接的最大的relay日志的大小。
Executed_log_entries             slave已经指向了多少个日志条目。
Slave_received_heartbeats     从master获得了多少个心跳。
Slave_heartbeat_period          多久从master请求一个心跳包(以秒计算)。

新文件
     被多源复制使用的新文件的基本准则是:他们有在扩展名前被冠以 连接名 前缀的和原来的中继日志文件类似的名字。
主要的例外是,保存所有连接名字的 文件master-info-file 被简单的命名为带有 multi- 前缀的 master-info-file 。

当你使用多源复制的时候,下面的文件将被创建:

               名称                                                                   描述

     multi-master-info-file                                          master-info-file (一般是 master.info) 带上了 multi- 前缀。这里面是所有使用中的master连接信息。
master-info-file-connection_name.extension       包含了当前master应用到slave的位置。扩展名一般是 .info
relay-log-connection_name.xxxxx relay-log         有了一个 connection_name 的前缀. xxxxx 是 relay log 的编号。这里面保存的是从master读取的复制数据。
relay-log-index-connection_name.extension        包含可用的 relay-log-connection_name.xxxxx 文件的名字。扩展名一般是 .index
relay-log-info-file-connection_name.extension    包含relay日志中的当前master的位置。扩展名一般是 .info

当创建这些文件的时候,连接名被转化成小写的,并且其中所有的特殊字符都被转化了,就和mysql表名中的特殊字符被转化一样。
这样做是为了方便文件名可以在不同系统上移植。
提示:
你只需要指定 –log-base-name ,所有的其他变量将会使用这个作为前缀;
     而不用为mysqld指定 –relay-log, –relay-log-index,–general-log, –slow-log, –log-bin, –log-bin-index 这些的名字。

其他事项
     所有slave的错误信息都会加上connection name,然后被写入到error log.
ER_MASTER_INFO和WARN_NO_MASTER_INFO现在会加上connection_name
这里没有冲突的解决方案,我们假设所有的master之间没有冲突.
所有执行的命令都被存储在正常的binary log里面。
如果你server variable log_warnings>1,那么你就会收到一些multi-master-info文件更新的信息
show slave status;看见的第一行是增加的,叫做connection_name.
reset slave命令现在会删除所有的relay-log文件。

典型的使用案例
     将多个master的数据整合到一个slave上,方面查询分析。
将多个mariadb/mysql服务器的数据整合到一个slave,方便备份。

受限的事项
     一个slave最多可以有64个master
每个活跃的连接会创建两个线程(和mariadb复制相同)
你需要确认所有的master需要有不同的server-id。
max_relay_log_size 在启动后修改是不能生效的。
innodb-recovery-update-relay-log 值对默认的复制连接生效,这个参数是xtradb的特新用来存储relay log的位置号。但是这个方案存在安全隐患,我们不推荐使用
Slave_net_timeout 对所有参数有效,我们不检查它是否小于Slave_heartbeat_period,因为对多主复制来说没有特别意义。

将要完成的功能
multi-source现在还不支持semisync,我们将在下个release版本中解决。
所有关于multi-source的bugs可以在这里找到https://mariadb.atlassian.net/secure/IssueNavigator.jspa?mode=hide&requestId=11400
允许多线程复制

TIPS:
mysql库需要过滤掉,不能复制.
半同步(Semi-sync)暂时无法使用。
如果需要sql_slave_skip_counter,需要先制定一个通道 set @@default_master_connection=’connection_name’

MongoDB 单实例部署 [ 非源码编译安装 ]

MongoDB 官方网址:
http://www.mongodb.org

本文,主要介绍 MongoDB 单实例的安装部署~

1.下载MongoDB的安装包并解压,安装相关依赖包 [ 这里不采用源码编译安装 ]
yum -y install net-snmp.x86_64 net-snmp-devel.x86_64 net-snmp-libs.x86_64
mkdir /usr/local/mongodb
tar -xf mongodb-linux-x86_64-enterprise-rhel62-3.0.2.tgz
mv mongodb-linux-x86_64-enterprise-rhel62-3.0.2 /usr/local/mongodb

2. 创建数据目录,日志目录,配置目录等相关目录
cd /usr/local/mongodb
mkdir data conf log

3.编辑MongoDB 的配置文件:
vim conf/mongodb.conf
port=27017
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true

4.启动/关闭MongoDB:
(1).启动MongoDB:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf

(2).关闭MongoDB:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf –shutdown

(3).主从启动的相关要点: [也可将其参数写入配置文件 master=true ]
A. 如果mongodb 做为 master 的话,只要在启动时,加 –master 参数即可:
ex:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf –master
# 同时,查看日志,日志会有相关master 的信息

B. 如果mongodb 做为 SLAVE 的话,只要在启动时,加 –slave –source ip:端口 参数即可:
ex:
/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/conf/mongodb.conf –slave –source 172.16.10.55:27017
# 同时,查看日志,日志会有相关slave 的信息

C.主从数据源信息的变更:
> db.printSlaveReplicationInfo();
source: 172.16.10.5627017
doing initial sync
> use local
> db.sources.find();
{ “_id” : ObjectId(“5549957a542399f1888879b2”), “host” : “172.16.10.5627017”, “source” : “main” }
> db.sources.insert({“host”: “172.16.10.56:27017”}); # 添加一个新的主数据源
WriteResult({ “nInserted” : 1 })
> db.sources.find();
{ “_id” : ObjectId(“5549957a542399f1888879b2”), “host” : “172.16.10.5627017”, “source” : “main” }
{ “_id” : ObjectId(“5549c25670656588c7058016”), “host” : “172.16.10.56:27017” }
> db.sources.remove({“host”: “172.16.10.5627017”}); # 删除一个已存在的数据源
WriteResult({ “nRemoved” : 1 })
> db.sources.find();
{ “_id” : ObjectId(“5549c25670656588c7058016”), “host” : “172.16.10.56:27017” }

D.查看主从复制信息:
> db.printReplicationInfo();
configured oplog size: 1550MB
log length start to end: 72993secs (20.28hrs)
oplog first event time: Tue May 05 2015 17:27:01 GMT+0800 (CST)
oplog last event time: Wed May 06 2015 13:43:34 GMT+0800 (CST)
now: Wed May 06 2015 14:24:21 GMT+0800 (CST)
> db.printSlaveReplicationInfo();
source: 172.16.10.55:27017
syncedTo: Wed May 06 2015 14:24:24 GMT+0800 (CST)
13 secs (0 hrs) behind the freshest member (no primary available at the moment)

5.注意事项:
启动后,日志信息如下,红色警告部分,是我们需要进行调整的地方:
2015-05-05T15:14:48.310+0800 I JOURNAL [initandlisten] journal dir=/usr/local/mongodb/data/journal
2015-05-05T15:14:48.311+0800 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed
2015-05-05T15:14:48.368+0800 I JOURNAL [durability] Durability thread started
2015-05-05T15:14:48.368+0800 I JOURNAL [journal writer] Journal writer thread started
2015-05-05T15:14:48.369+0800 I CONTROL [initandlisten] MongoDB starting : pid=8874 port=27017 dbpath=/usr/local/mongodb/data 64-bit host=Templet
2015-05-05T15:14:48.369+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2015-05-05T15:14:48.369+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is ‘always’.
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is ‘always’.
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] ** We suggest setting it to ‘never’
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten]
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] db version v3.0.2
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] git version: 6201872043ecbbc0a4cc169b5482dcf385fc464f modules: enterprise
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] build info: Linux ip-10-171-117-53 2.6.32-220.el6.x86_64 #1 SMP Wed Nov 9 08:03:13 EST 2011 x86_64 BOOST_LIB_VERSION=1_49
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] allocator: tcmalloc
2015-05-05T15:14:48.370+0800 I CONTROL [initandlisten] options: { config: “/usr/local/mongodb/conf/mongodb.conf”, net: { port: 27017 }, processManagement: { fork: true }, storage: { dbPath: “/usr/local/mongodb/data” }, systemLog: { destination: “file”, logAppend: true, path: “/usr/local/mongodb/log/mongodb.log” } }
2015-05-05T15:14:48.372+0800 I INDEX [initandlisten] allocating new ns file /usr/local/mongodb/data/local.ns, filling with zeroes…
2015-05-05T15:14:48.435+0800 I STORAGE [FileAllocator] allocating new datafile /usr/local/mongodb/data/local.0, filling with zeroes…
2015-05-05T15:14:48.435+0800 I STORAGE [FileAllocator] creating directory /usr/local/mongodb/data/_tmp
2015-05-05T15:14:48.439+0800 I STORAGE [FileAllocator] done allocating datafile /usr/local/mongodb/data/local.0, size: 64MB, took 0 secs
2015-05-05T15:14:48.450+0800 I NETWORK [initandlisten] waiting for connections on port 27017

下面,我们进行调整:
(1).创建mongodb用户
注:Mongodb不建议使用root用户来运行
# groupadd -g 1010 mongodb
# useradd -g 1010 -u 1010 mongodb
调整目录和文件权限
# cd /usr/local/mongodb
# chown -R mongodb. data/ log/

(2).内核参数调整
调整前:
# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] never
# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] never
调整方法:
# echo “never” > /sys/kernel/mm/transparent_hugepage/enabled
# echo “never” > /sys/kernel/mm/transparent_hugepage/defrag
调整后:
# cat /sys/kernel/mm/transparent_hugepage/enabled
always [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always [never]

(3).调整限制参数
启动日志,提示启动mongodb的这个用户能打开的进程数不到能打开的文件数的二分之一;
建议调整该用户能打开进程数为能打开的文件数的二分之一以上;
在CentOS系统中,默认情况用户能打开的进程数和文件数都为1024,因此不会出现该提示;
至于限制参数可以通过ulimit命令和/etc/security/limits.conf来设置
设置完毕后重启服务(切换到 mongodb 用户,启动mongodb)

MongoDB的日常使用

一、 查看collection和db信息:
1.查看DB以及DB空间大小:
show dbs
2.选择DB:
use hoss
3.查看DB中的collections:
show collections

二、查看collection使用大小:
1.查看DB给collection分配的大小。相当于oracle的segment大小:
db.fs.files.storageSize()
2.查看collection实际使用的大小。相当于oracle的HWR之下的:
db.fs.files.dataSize()
block,即已使用的block
3.查看collection的大小(storageSize)与索引大小的总和:
db.fs.files.totalSize()
4.查看collection的详细信息:
db.fs.files.stats()

三、 删除collection和db:
1.删除当前数据库:
db.dropDatabase()
2.删除当前collection的索引:
db.mycoll.dropIndexes()
3.删除当前collection
db.mycoll.drop()

四、检查同步状态
db.printReplicationInfo()
db.printSlaveReplicationInfo()
haowu:SECONDARY> db.printReplicationInfo()
configured oplog size: 4096MB
log length start to end: 449727secs (124.92hrs)
oplog first event time: Thu Dec 11 2014 11:00:40 GMT+0800 (CST)
oplog last event time: Tue Dec 16 2014 15:56:07 GMT+0800 (CST)
now: Tue Dec 16 2014 15:56:57 GMT+0800 (CST)

haowu:SECONDARY> db.printSlaveReplicationInfo()
source: 172.16.10.40:27017
syncedTo: Tue Dec 16 2014 15:56:07 GMT+0800 (CST)
= 55 secs ago (0.02hrs)
source: 172.16.10.22:27017
no replication info, yet. State: ARBITER

只要 oplog last event time 和 syncedTo 一致,就代表没有同步延迟

五、备份和恢复操作:
1.备份:mongodump
mongodump使用的是普通的查询机制(无锁定),所以产生的备份不一定是服务器数据的实时快照,即当运行备份同时有客户端写入数据,该数据就不会备份到磁盘,备份时的查询会对其他客户端的性能产生不利的影响。即可对运行的数据库使用,也可对未运行的数据使用。
如果想要获取一致的备份,可以使用命令 db.fsyncLock() 给数据库加锁,阻塞写操作,备份结束后使用命令 db.fsyncUnlock() 解锁。
例:
备份数据库:
mongodump -d test -o ./backup

2.恢复:mongorestore
使用 mongorestore 命令来恢复数据,数据源是 mongodump 命令产生的文件
恢复所有数据:
./mongorestore –drop /opt/backup/mongodb
恢复数据库:
./mongorestore -d test –drop /opt/backup/mongodb/test/
恢复集合:
./mongorestore -d test -c wu –drop /opt/backup/mongodb/test/wu.bson

六、导入和导出操作:
1.导出:mongoexport
使用mongoexport命令导出的数据是文本模式,用户可读的。
导出的粒度就是集合,也只是集合,不能导出某个数据库。
导出的数据格式可以有三种:json,csv,jsonArray。
使用最多的就是json和csv。
例:
mongoexport –port 27018 -d test -c test -o test.json

2.导入:mongoimport
mongoimport命令也只能导入集合。
默认导入json格式的文件。
如果是csv,需要使用–type来指定,并配合–headerline参数。
例:
mongoimport -d test -c test –drop –type csv –headerline –file ~/test.csv

Haproxy 服务部署(利用Keepalived实现Haproxy 高可用)

一、Haproxy 简述:
HAProxy是一个开源的、高性能的,基于TCP(第四层)和HTTP(第7层)应用的负载均衡软件。使用HAProxy可以快速可靠地实现基于TCP和HTTP应用的负载均衡解决方案。
作为一个专业的负载均衡软件,他有如下优点:
1.可靠性和稳定性非常好,可以与硬件级的F5负载均衡设备想媲美
2.最高可以同时维护40000-50000个并发连接,单位时间处理的最大请求数达20000个,最大数据处理能力可达10Gbps。
3.支持多达8种负载均衡算法,同时也支持session保持
4.支持虚拟主机功能,使实现web负载均衡更加灵活
5.从HAProxy 1.3版本后开始支持连接拒绝、全透明代理等功能,这些功能是其他负载均衡器所不具备的。
6.有功能强大的监控页面,通过此页面可以实时了解系统的运行状况。
7.拥有功能强大的ACL支持。
HAProxy是借助操作系统的技术特性来实现性能最大化的,因此要想发挥HAProxy的最大性能需要对操作系统性能进行优化。
HAProxy非常适用于那些并发量特别大且需要持久连接或四层和七层处理机制的web系统,例如门户网站或电子商务网站等。
HAProxy也可以用于MySQL数据库(读操作)的负载均衡。

HAProxy的官方文档地址:
http://cbonte.github.io/haproxy-dconv/

二、Haproxy的部署:
1.Haproxy的下载、安装:
下载地址:http://www.haproxy.org/
# 默认已经下载好了
tar -xf haproxy-1.5.11.tar.gz
cd haproxy-1.5.11
make TARGET=linux26 CPU=x86_64 PREFIX=/usr/local/haproxy
make install PREFIX=/usr/local/haproxy

2.Haproxy 配置文件 修改:[ 配置文件具体含义,参考 linux — linux 配置文件详解 — keepalived 配置文件详解 ]
cd /usr/local/haproxy
mkdir etc logs
cp examples/haproxy.cfg /usr/local/haproxy/etc
cd /usr/local/haproxy/etc
vim haproxy.cfg
global
log 127.0.0.1 local0 info
maxconn 4096
chroot /usr/local/haproxy
uid 99
gid 99
daemon
nbproc 1
pidfile /usr/local/haproxy/logs/haproxy.pid

defaults
mode http
option redispatch
option abortonclose
timeout connect 5000ms
timeout client 30000ms
timeout server 3000ms
log 127.0.0.1 local0 err
balance roundrobin

listen admin_stats
bind 0.0.0.0:8888
mode http
option httplog
stats refresh 30s
stats uri /haproxy-status
stats realm Welcome\ login\ Haproxy
stats auth admin:admin
stats hide-version
stats admin if TRUE

listen test1
bind :12345
mode http
server t1 172.16.10.55:80
server t2 172.16.10.56:80

#listen test2 :80
# option httpclose
# option forwardfor
# server s1 192.168.1.101:8080 check weight 1 minconn 1 maxconn 3 check inter 40000
# server s2 192.168.1.102:8080 check weight 1 minconn 1 maxconn 3 check inter 40000

3.编写Haproxy启动脚本:
vim /etc/init.d/haproxy
#!/bin/bash
#chkconfig: 2345 10 90
#description:haproxy
NAME=”haproxy”
DESC=”Haproxy daemon”
BASE_DIR=”/usr/local/haproxy”
CONF=$BASE_DIR/etc/haproxy.cfg
PIDFILE=$BASE_DIR/logs/haproxy.pid
SCRNAME=/etc/init.d/$NAME
ARGV=”$@”

start()
{
echo “START HAPoxy SERVERS”
$BASE_DIR/sbin/haproxy -f $CONF
}
stop()
{
echo “STOP HAPoxy Listen”
kill -TTOU $(cat $PIDFILE)
echo “STOP HAPoxy process”
kill -USR1 $(cat $PIDFILE)
}
case $ARGV in
start)
start
ERROR=$?
;;
stop)
stop
ERROR=$?
;;
restart)
stop
start
ERROR=$?
;;
*)
echo “Useage:$SCRNAME [start|restart|stop]”
esac
exit $ERROR

# 给予脚本执行权限:
chmod +x /etc/init.d/haproxy
# 脚本添加开机启动:
chkconfig -add haproxy
# 注:
如果报如下错:
service haproxy does not support chkconfig
解决方法:
在/etc/init.d/haproxy 中添加下面两句到 #!/bin/bash之后,添加如下内容:
# chkconfig: 2345 10 90
# description:haproxy
—-其中2345是默认启动级别,级别有0-6共7个级别。
—-等级0表示:表示关机
—-等级1表示:单用户模式
—-等级2表示:无网络连接的多用户命令行模式
—-等级3表示:有网络连接的多用户命令行模式
—-等级4表示:不可用
—-等级5表示:带图形界面的多用户模式
—-等级6表示:重新启动
—-10是启动优先级,90是停机优先级,优先级范围是0-100,数字越大,优先级越低。

4.日志支持功能添加
# vim /etc/rsyslog.conf
在最下边增加
local0.* /usr/local/haproxy/logs/haproxy.log
# 重启日志服务
/etc/init.d/rsyslog restart

5.haproxy测试:
(1).10.55/10.56默认web服务已经部署好,默认80 端口;
(2).启动haproxy:
/etc/init.d/haproxy start
(3).登录haproxy监控页面:
http://172.16.10.54:8888/haproxy-status
(4).登录haproxy测试负载均衡:[ 不断刷新,观察变化 ]
http://172.16.10.54:12345/

三、keepalived 部署:
1.10.53/10.54安装keepalived
keepalived 的安装,请参照keepalived服务部署一篇,下面主要讲解相关配置

2.修改keepalived配置文件:vim /etc/keepalived/keepalived.conf [ 没有就创建 ]
global_defs {
notification_email
{
13501960667@139.com # 收件邮箱
}
notification_email_from mysql_lab@localhost # 发件邮箱
smtp_server localhost # 发件服务器
smtp_connect_timeout 30 # 超时时间
router_id HAOWU_55
}
vrrp_script chk_haproxy {
script “/usr/local/keepalived/chk_haproxy.sh”
# interval 2
# weight 2
}
vrrp_sync_group VG1 {
group
{
VI_1
}
}
vrrp_instance VI_1 {
# state MASTER
state BACKUP
nopreempt
interface eth0
virtual_router_id 96
priority 110
advert_int 1
authentication
{
auth_type PASS
auth_pass Pa$$w0rd
}
track_script {
chk_haproxy # 监测haproxy进程状态
}
virtual_ipaddress
{
172.16.10.251
}
}

# 蓝色部分: 是相对其它脚本需要添加的内容;
# 红色部分:是必须要注释掉的部分。如果,不注释掉,keepalived将无法调用脚本;
# 至于master 和backup 配置文件的异同和要修改的部分,请参考keepalived服务部署一篇.

3.编写haproxy 检测脚本:
vim /usr/local/keepalived/chk_proxy.sh
#!/bin/bash
A=`ps -C haproxy –no-header |wc -l`
# 当检测到haproxy宕机后,试图重新启动haproxy,如果是测试,建议先注释掉所有红色部分代码
if [ $A -eq 0 ];then
/etc/init.d/haproxy start
sleep 3
if [ `ps -C haproxy –no-header |wc -l` -eq 0 ];then
/etc/init.d/keepalived stop
fi
fi

4.给予检测脚本执行权限:
chmod +x /usr/local/keepalived/chk_proxy.sh

5.官网建议的内存优化配置:
echo 1024 60999 > /proc/sys/net/ipv4/ip_local_port_range
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 4096 > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo 262144 > /proc/sys/net/ipv4/tcp_max_tw_buckets
echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
echo 300 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
echo 0 > /proc/sys/net/ipv4/tcp_ecn
echo 1 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_dsack

四、下面就可以进行测试了
1.启动所有服务:
先启动haproxy,再启动keepalived,再启动 55 56上的web
2.输入 172.16.10.251:12345 测试
期间停止haproxy,看vip是否漂移
网站是否能正常打开

twemproxy 简介、安装配置

官方地址:
https://github.com/twitter/twemproxy

一、Twemproxy简介及其特性、缺点:
1.Twemproxy简介:
Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII协议和更新的Redis协议。它全部用C写成,使用Apache 2.0 License授权。
项目在Linux上可以工作,而在OSX上无法编译,因为它依赖了epoll API.
twemproxy 主要用于Redis 和 Memcached 的集群代理

2.Twemproxy特性:
速度快
轻量级
维护持久的服务器连接
Keeps connection count on the backend caching servers low.
启用请求和响应的管道
支持代理到多个服务器
同时支持多个服务器池
多个服务器自动分享数据
实现了完整的 memcached ascii 和 redis 协议.
服务器池配置简单,通过一个 YAML 文件即可
Supports multiple hashing modes including consistent hashing and distribution.
可配置在失败时禁用某个节点
Observability through stats exposed on stats monitoring port.
支持 Linux, *BSD, OS X and Solaris (SmartOS)

3.Twemproxy不足之处:
不支持针对多个值的操作,比如取sets的子交并补等(MGET 和 DEL 除外)
不支持Redis的事务操作
出错提示还不够完善
也不支持select操作
虽然可以动态移除节点,但该移除节点的数据就丢失了
redis集群动态增加节点的时候,twemproxy不会对已有数据做重分布。maillist里面作者说这个需要自己写个脚本实现性能上的损耗

二、Twemproxy部署:
1.Twemproxy 编译安装:
autoconf下载地址: http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
twemproxy下载地址:https://codeload.github.com/twitter/twemproxy/zip/master
twemproxy的安装要求autoconf的版本在2.64以上,否则提示”error: Autoconf version 2.64 or higher is required“
twemproxy的安装方法与git上README.md里面的过程基本相同,只是configure过程中多了–prefix选项,将工具安装到指定目录
(1).autoconf的安装:
tar -xf autoconf-2.69.tar.gz
cd autoconf-2.69
./configure
make
make install
# 测试是否安装成功:
autoconf –version

(2).twemproxy的安装:
unzip twemproxy-master.zip
cd twemproxy-master
autoreconf -fvi
./configure –prefix=/usr/local/twemproxy
make -j 2
make install

2.Twemproxy 配置文件:
cd /usr/local/twemproxy/
mkdir run conf
vim conf/nutcracker.yml
redis:
listen: 172.16.10.54:6666 # 使用哪个端口启动Twemproxy
redis: true # 是否是Redis的proxy
hash: fnv1a_64 # 指定具体的hash函数
distribution: ketama # 具体的hash算法
auto_eject_hosts: true # 是否在结点无法响应的时候临时摘除结点
timeout: 400 # 超时时间(毫秒)
server_retry_timeout: 3000 # 重试的时间(毫秒)
server_failure_limit: 1 # 结点故障多少次就算摘除掉
servers: # 下面表示所有的Redis节点(IP:端口号:权重)
– 172.16.10.55:6379:1
– 172.16.10.56:6379:1

3.Twemproxy 配置文件测试,命令生效,服务启动:
(1).命令生效:
vim ~/.bash_profile
PATH=$PATH:$HOME/bin:/usr/local/keepalived/sbin:/usr/local/twemproxy/sbin
. ~/.bash_profile # 使命令生效
(2).配置文件测试:
nutcracker -t
nutcracker: configuration file ‘conf/nutcracker.yml’ syntax is ok # 显示此信息,说明配置文件正常
(3).Twemproxy服务启动:
nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log
(4).Twemproxy配置文件书写需要注意的问题:
A.yml配置文件中每个参数值对分隔符”:”后,需要有一个空格;
B.不同层次的参数需要缩进区分,最好使用tab键缩进,否则nutcracker进程不能启动;
C.在auto_eject_hosts: true的时候,关闭一个redis实例后,写入数据还是提示“(error) ERR Connection refused”
这个与server_retry_timeout参数设置太小有关,默认值30000msec是一个很好的选择。

4.Twemproxy 启动、停止脚本编写:
vim /etc/init.d/twemproxy
#!/bin/bash
#chkconfig: 2345 10 90
#description:twemproxy

function Stop()
{
/usr/bin/pkill nutcracker
}
function Start()
{
nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log
}
case $1 in
stop)
Stop
;;
start)
Start
;;
restart)
Stop
Start
;;
*)
echo “Usage: `basename $0` {stop|start}”
;;
esac
# 添加twemproxy 服务:
chkconfig –add twemproxy

三、Twemproxy测试:
redis-cli -h 172.16.10.54 -p 6666
172.16.10.54:6666> select 0 # 不支持select
Error: Server closed the connection
172.16.10.54:6666> get name
“Michael.xu”
172.16.10.54:6666> set names “wu.zhong”
OK
172.16.10.54:6666> get names
“wu.zhong”

# 性能测试:
redis-benchmark -h 172.16.10.54 -p 6666 -c 100 -t set -d 100 -l -q