2017年11月

MongoDB 3.x 添加用户及权限管理配置

MongoDB权限认证流程:

MongoDB没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
切换到admin数据库,添加的账号才是管理员账号
用户只能在用户所在数据库登录,包括管理员账号
管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。

添加管理员账号

[root@c160 ~]# mongo -host 127.0.0.1 -port 30000
MongoDB shell version v3.4.10
connecting to: mongodb://127.0.0.1:30000/
MongoDB server version: 3.4.10

> use admin                     #切换到admin数据库
switched to db admin

> db.system.users.find();      #用户表没有数据
> show users;

> db.createUser(               #创建管理员账号admin
    {
    user:"admin",
    pwd:"123456",
    roles:[{role:"userAdminAnyDatabase",db:"admin"}]
    }
    )

开启权限验证
修改配置文件加上auth=true参数,开启认证,需重启生效

> show dbs                  #显示所有数据库失败,还没认证  
2017-11-30T22:47:12.341+0800 E QUERY    [thread1] 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:781:19
shellHelper@src/mongo/shell/utils.js:671:15
@(shellhelp2):1:1
> use admin        //切换到admin数据库  
switched to db admin  
> db.auth('admin','123456');   //在admin数据库认证成功  
1  
> show dbs
admin  0.000GB
local  0.000GB

---阅读剩余部分---

awk获取文本的某一行,某一列

打印文件的第一列(域)  awk '{print $1}' filename
打印文件的前两列(域)  awk '{print $1,$2}' filename
打印完第一列,然后打印第二列  awk '{print $1 $2}' filename
打印文本文件的总行数  awk 'END{print NR}' filename
打印文本第一行       awk 'NR==1{print}' filename
打印文本第二行第一列  sed -n "2, 1p" filename | awk 'print $1'

Bash里面的赋值方法有两种,格式为

1) arg=`(命令)`
2) arg=$(命令)

想要把某一文件的总行数赋值给变量nlines,可以表达为:

1) nlines=`(awk 'END{print NR}' filename)`
或
2) nlines=$(awk 'END{print NR}' filename)

MongoDB数据库的启动和停止

MongoDB进程如果直接kill掉进程或机器突然断电等都会可能MongoDB造成数据损坏,所以在停止MongoDB服务的时候,不要用kill -9 或 killall -9 直接干掉MongoDB的进程·

要安全停止可以有两种信号:sigint 信号,或者 sigterm信号

如何安全kill停止:

kill -2 `ps -ef | grep mongod| awk 'NR==1 {print $2}'`    #直接查找出mongodb的pid进程号并发送sigint信号kill
 $ kill -2 8888 其中 8888 为mongod进程号,该进程号可以通过 ps -axu |grep mongo 获取; -2 表示向mongod进程发送sigint信号
$ kill -4 8888 其中 8888 为mongod进程号 ,该进程号可以通过 ps -axu |grep mongo 获取; -4 表示向mongod进程发送sigterm信号

mongod进程收到sigint信号或者sigterm信号,会做一些处理:关闭所有打开的连接,将内存数据强制刷新到磁盘,当前的操作执行完毕后在安全停止服务。

---阅读剩余部分---

Django关系之ManyToManyField多对多关系及后台调用显示

Django 的 ORM 有多种关系:一对一,多对一,多对多
各自定义的方式为 :
一对一: OneToOneField (一个有一个,即 has one: OneToOneField)
多对一: ForeignKey (多个属于一个,在建立 ForeignKey 时,另一个表会自动建立对应的关系)
多对多: ManyToManyField (一个既有很多个,又属于很多个,即 has many and belong to : ManyToManyField,同样只能在一个model类中说明,关联表会自动建立。)

多对多关系ManyToManyField
现有三张表,cloud表和project表和Host表,cloud有cloud_type信息,project表中有工程名、cloud_type等信息,host表中有host_name、cloud_type信息;






---阅读剩余部分---

MySQL的sql_mode说明

sql_mode直接理解就是:sql的运作模式。官方的说法是:sql_mode可以影响sql支持的语法以及数据的校验执行,这使得MySQL可以运行在不同的环境中以及和其他数据库一起运作。
MySQL5.7.4之后的版本和之前的版本的默认sql_mode有一个比较大的改变。
直接在my.cnf配置:

sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'

在启动的时候带参数--sql-mode="xxxxx"
直接在线修改SET GLOBAL sql_mode = 'xxxxx';
查看当前sql_mode

mysql> show variables like 'sql_mode';
+---------------+------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                  |
+---------------+------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)




---阅读剩余部分---

MySQL冥等模式slave_exec_mode

线上系统DB在MySQL 5.6.12下面的主从环境中经常出现1023错误(记录没找到)、1062错误(主键重复),即使重做主从,过不来多久又会出现,开启slave_exec_mode的idempotent模式:

set global slave_exec_mode='idempotent';
stop slave;
start slave;
show slave status\G;

默认值是strict(严格模式) 设置完毕之后,并不能立即生效,需要重启下复制进程,观察一段时间在没有出现1023、1062等主从同步问题;
在MySQL5.7.18和5.7.20下面的主从也是基于GTID的,并没有出现类似的问题,slave_exec_mode工作在STRICT模式下,可见MySQL5.7在性能、兼容性等等方面有很大的提升,推荐新项目直接上MySQL5.7.20。

MySQLbinlog 查看binlog时报错unknown variable 'default-character-set=utf8'

mysqlbinlog是用来查看binlog文件内容的(使用方式man mysqlbinlog查看),但是使用mysqlbinlog将binlog文件转换成人类可读的内容时却报错:
mysqlbinlog: unknown variable 'default-character-set=utf8'
原因是mysqlbinlog这个工具无法识别binlog中的配置中的default-character-set=utf8这个指令,
直接带上--no-defaults参数即可,

/usr/local/mysql/bin/mysqlbinlog --no-defaults -vv --base64-output=decode-rows binlog.000020

-vv --base64-output=decode-rows参数是进行base64解码,不带的话查看的是乱码·

--start-position=N 从二进制日志中第1个位置等于N参量时的事件开始读。
--stop-position=N 从二进制日志中第1个位置等于和大于N参量时的事件起停止读。

如把binlog.000020文件中75350到75357的记录导出到/tmp/f.log文件中:

/usr/local/mysql/bin/mysqlbinlog --no-defaults -vv --base64-output=decode-rows -v --start-position=263639 --stop-position=265331 /home/data/mysql/binlog/binlog.000020 > /tmp/f.log

也可以直接指定时间点操作
--start-datetime="2017-11-28 00:00:00" --stop-datetime="2017-11-28 23:59:59"

Linux系统消除未被及时释放的TIME_WAIT状态的TCP连接

Linux系统下,TCP连接断开后,会以TIME_WAIT状态保留一定的时间,然后才会释放端口。当并发请求过多的时候,就会产生大量的TIME_WAIT状态的连接,无法及时断开的话,会占用大量的端口资源和服务器资源。这个时候我们可以优化TCP的内核参数,来及时将TIME_WAIT状态的端口清理掉。

[root@web1 ~]netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 1280
FIN_WAIT1 7
SYN_SENT 1
FIN_WAIT2 7
ESTABLISHED 247
LAST_ACK 1

我们只用关心TIME_WAIT的个数,在这里可以看到,有1280多个TIME_WAIT,这样就占用了1280多个端口,端口的数量只有65535个,占用一个少一个,会严重的影响到后继的新连接,就需调整下Linux的TCP内核参数,让系统更快的释放TIME_WAIT连接。

vi /etc/sysctl.conf 增加如下内容:

net.ipv4.tcp_syncookies = 1   #表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1    #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1  #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_fin_timeout = 30    #修改系統默认的 TIMEOUT 时间。

sysctl -p 让内核参数生效
流量小的机器一般就可以了,如果是大流量机器增加如下参数:


---阅读剩余部分---

Nginx的upstream负载均衡参数说明

nginx可以根据客户端IP进行负载均衡,在upstream里设置ip_hash,就可以针对同一个C类地址段中的客户端选择同一个后端服务器,除非那个后端服务器宕了,才剔除:
nginx的upstream目前支持的5种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

upstream backserver { 
server 10.10.5.3:8000 max_fails=3 fail_timeout=10s; 
server 10.10.5.4:8000 max_fails=3 fail_timeout=10s;
}



---阅读剩余部分---

Oracle 11g adrci常用功能介绍

ADR(Automatic Diagnostic Repository)是Oracle 11g的一个存放数据库诊断日志、跟踪文件的目录,也作为ADR base。在实例中通过设置初始化参数DIAGNOSTIC_DEST来改变,这个参数是动态参数,修改这个参数后对应的目录和日志文件会立刻被生成并使用,默认在ORACLE_BASE下。

Oracle 11g同时提供了一个ADRCI(ADR Command-Line Utility)命令行工具来查看ADR中的alert日志和trace信息,并生成健康报告,ADRCI工具在$ORACLE_HOME/bin下面,安装oracle 11g以后默认就有·

1、登录adrci

[oracle@Web_121_127 ~]$ adrci

ADRCI: Release 11.2.0.4.0 - Production on Mon Nov 27 10:38:30 2017

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

ADR base = "/oracle/app/oracle"

---阅读剩余部分---

Python使用%操作符格式化字符串

%是Python中内置的对字符串进行格式化的操作符,语法如下:

格式符为真实值预留位置,并控制显示的格式。格式符可以包含有一个类型码,用以控制显示的类型,如下:

%s    字符串 (采用str()的显示)

%r    字符串 (采用repr()的显示)

%c    单个字符

%b    二进制整数

%d    十进制整数

%i    十进制整数

%o    八进制整数

%x    十六进制整数

%e    指数 (基底写为e)

%E    指数 (基底写为E)

%f    浮点数

%F    浮点数,与上相同

%g    指数(e)或浮点数 (根据显示长度)

%G    指数(E)或浮点数 (根据显示长度)

%%    字符"%"

---阅读剩余部分---

Python使用readline逐行读取文件内容 去掉换行符"\n"

直接上脚本:

#/usr/bin/env python
# -*- coding: utf-8 -*-
f1 = open("C:\py\code\demo.txt")  #读取的文件路径
print u'文件名是', f1.name
print u'访问模式是', f1.mode
line = f1.readline()
while line:
    print ("----------%s" % (line)),    # 后面跟 ',' 将忽略换行符
    line = f1.readline()
    #line = line.strip('\n')       #也可以直接用strip去除换行符
f1.close()
print '\nok'

从头来过

很多的东西都忘记了,三四年前的一些的东西,这里就就当整理记录笔记的地方,人都有惰性,记录写下来当做笔记以便查阅;
一天瞎忙乎乎,全是碎片化时间,独立时间太少了;
忽然想到一万小时定律,(每天3小时,坚持1年)来学习训练某种技能,肯定会有所突破;
人生就是时间和金钱的平衡点;

Mysql 8小时内无请求自动断开连接解决方法

Mysql服务器默认的“wait_timeout”是8小时,也就是说一个connection空闲超过8个小时,Mysql将自动断开该 connection。这就是问题的所在,在Hibernate默认连接池中的connections如果空闲超过8小时,Mysql将其断开,而Hibernate默认连接池并不知道该connection已经失效,如果这时有 Client请求connection,Hibernate默认连接池将该失效的Connection提供给Client,将会造成上面的异常。

---阅读剩余部分---

使用curl探测应用能否正常访问的脚本

#!/bin/sh
echo `date "+%Y-%m-%d-%H:%M:%S"----------------------start-------------------------`
for d in `cat /usr/local/monitor/dz.txt`
do
    z='200 OK'
    a=`curl -I --connect-timeout 30 -m 30 ${d}`
    if [[ $a == *$z* ]]
    then
        echo "ok---${d}"
    else
        t=`date +%Y-%m-%d-%H:%M:%S`
        r='abc@123.com c1@123.cn'
        echo "error---${d}"
        echo ${d:7:200} ${t} 'Not Access! Http Status Not 200' | /bin/mail -s 'Projec Not Access' ${r}
    fi
done
echo `date "+%Y-%m-%d-%H:%M:%S"----------------------end----------------------------`

crontab里面5分钟探测一次

*/5 * * * * sh /usr/local/monitor/monitor_web.sh >> /usr/local/monitor/monitor.log 2>&1

dz.txt里面是要探测的地址
curl探测返回结果不含200的时候,直接发邮件报警;

wget参数用法详解整理

wget 是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理。

所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统,wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。

wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作”递归下载”。在递归下载的时候,wget 遵循Robot Exclusion标准(/robots.txt). wget可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。

---阅读剩余部分---

修改sync_binlog innodb_flush_log_at_trx_commit和sync_binlog参数 提高写入速度

innodb_flush_log_at_trx_commit和sync_binlog 两个参数是控制MySQL 磁盘写入策略以及数据安全性的关键参数。

innodb_flush_log_at_trx_commit
如果innodb_flush_log_at_trx_commit设置为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行,该模式下,在事务提交的时候,不会主动触发写入磁盘的操作。
如果innodb_flush_log_at_trx_commit设置为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去。



---阅读剩余部分---

Kafka0.8.2.1删除主题并重建操作步骤

在启动kafka时候确保删除在server.properties中有delete.topic.enable的配置,

delete.topic.enable=true

执行删除主题命令:

/usr/local/app/msg_server/kafka/0.8.2.1/bin/kafka-topics.sh --delete --zookeeper k1:2181,k2:2181,k3:2181 --topic parking_enter

此时只是打上了删除标记,不会真正删除,用list显示会看到主题后面带上了 - marked for deletion

登陆zookeeper控制台并删除brokers、admin、config节点的对应内容:

/usr/local/app/msg_server/zookeeper/3.4.6/bin/zkCli.sh
rmr /brokers/topics/parking.enter
rmr /admin/delete_topics/parking.enter
rmr /config/delete_topics/parking.enter

关闭三台机器上的kafka进程,查看对应的数据文件,并删除,否则在创建同名主题的时候回自动打上marked for deletion标签

[kafka@wgq_idc_cache_3_41 data]$ ll /usr/local/app/msg_server/kafka/0.8.2.1/data  | grep parking_enter
drwxr-xr-x 2 kafka kafka  4096 10月 30 15:05 parking_enter-0
drwxr-xr-x 2 kafka kafka  4096 10月 30 19:27 parking_enter-1
drwxr-xr-x 2 kafka kafka  4096 10月 30 15:07 parking_enter-2
drwxr-xr-x 2 kafka kafka  4096 10月 30 10:51 parking_enter-3
drwxr-xr-x 2 kafka kafka  4096 10月 30 11:53 parking_enter-4
drwxr-xr-x 2 kafka kafka  4096 10月 30 16:25 parking_enter-5
drwxr-xr-x 2 kafka kafka  4096 10月 30 11:40 parking_enter-6
drwxr-xr-x 2 kafka kafka  4096 10月 30 13:17 parking_enter-7
drwxr-xr-x 2 kafka kafka  4096 10月 30 10:12 parking_enter-8
drwxr-xr-x 2 kafka kafka  4096 10月 30 10:51 parking_enter-9
rm /usr/local/app/msg_server/kafka/0.8.2.1/data/parking_enter-* -rf   #删除parking_enter开头的主题

三台都删除完以后,重新启动kafka和zookeeper进程,三台都启动ok以后,使用list查看主题:

/usr/local/app/msg_server/kafka/0.8.2.1/bin/kafka-topics.sh --list --zookeeper k1:2181,k2:2181,k3:2181

使用create创建主题

/usr/local/app/msg_server/kafka/0.8.2.1/bin/kafka-topics.sh --create --zookeeper k1:2181,k2:2181,k3:2181 --replication-factor 2 --partitions 10 --topic parking_enter

此处为创建同名主题,相当于删除后重建,完成。

最新

分类

归档

评论

  • 安安: 都是af
  • Liang: 嗯,有点不通顺·
  • 王庭威: “MySQL互为主从...
  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...

其它