邢栋博客
邢栋博客,Action博客,记录工作和生活中的点点滴滴
mongodb复制集学习笔记
conf.conf 如下 bind_ip=192.168.1.100 port = 28001 logpath=/usr/local/mongodb/logs/28001 logappend=true dbpath=/usr/local/mongodb/datas/28001 replSet=imooc fork = true 查看当前复制集状态 rs.status() 或者 use admin; db.adminCommand({replSetGetStatus:1}) 查看当前复制集配置文件 rs.conf() show log rs #查看当前mongodb的日志 rs.stepDown(50) ## 把当前主节点50秒内降级为从节点 rs.isMaster() # 查看节点信息 /usr/local/mongodb/bin/mongo 10.51.105.19:28001/admin //建立配置 config={_id:"imooc",members:[{_id:0,host:"10.51.105.19:28001"}, {_id:1,host:"10.51.105.19:28002"},{_id:2,host:"10.51.105.19:28003"}]} //配置仲裁节点 config.members[2]={"_id":2,"host":"10.51.105.19:28003","arbiterOnly":true} //使配置文件生效,初始化 rs.initiate(config) ### rs.reconfig(config) 重新加载配置文件 测试同步 主节点上 use study imooc:PRIMARY> db.test.insert({"name":"xd"}) 子节点上 imooc:SECONDARY> rs.slaveOk(1) imooc:SECONDARY> use study imooc:SECONDARY> db.test.find() 复制集配置文件参数 _id: 整数0 host:字符串 “127.0.0.1:27017“ arbiterOnly: 布尔值 true priority:整数 0|1 该节点的优先级,如果设置为0,则永远不会升级为主节点 hidden:布尔值 true|false 或者 1|0 ,如果设置为false, 优先级 要设置为0,隐藏节点 votes:整数 0|1 具有投票 slaveDelay 整数 slaveDelay 3600 延迟节点 延迟多少秒进行复制 buildIndexes 布尔值 true|false 或者 1|0 主节点建立索引,子节点是否同步,如果设为false, 优先级 应设置为0 关于oplog Oplog大小及意义 默认大小 64位操作系统linux,windows为当前分区可用空间的5%,体积不会超过50G imooc:PRIMARY> use local imooc:PRIMARY> db.oplog.rs.status() imooc:PRIMARY> db.oplog.rs.find().sort({$natural:-1}).limit(1).pretty() //查看最近的一条数据,pretty()格式化输出 单节点启动复制后,如果要增加机器 rs.add({_id:1,host:" 10.51.105.19:28002"}) 调整oplog大小 imooc:PRIMARY>rs.freeze(100) imooc:PRIMARY>rs.stepDown(100) 然后退出kill掉这个进程,注释掉配置文件的 replSet=imooc,重新启动 >use local >show table ## 可以看到 oplog.rs > db.oplog.rs.find().sort({$natural:-1}).limit(1) >db.temp.save( db.oplog.rs.find().sort({$natural:-1}).limit(1).next()) >db.oplog.rs.drop() >db.createCollection("oplog.rs",{capped:true,size:1024 * 1024 * 1024 * 3}) >db.oplog.rs.save(db.temp.findOne()) 步骤总结 1.将成员以单机模式启动 2.将oplog最新的一条记录保存到临时表中 db.temp.save( db.oplog.rs.find().sort({$natural:-1}).limit(1).next()) 3.删除原来的oplog.rs集合 4.以创建封顶表的形式创建oplog.rs , db.createCollection("oplog.rs",{capped:true,size:1024 * 1024 * 1024 * 3}) 5.将之前保存的原oplog中的最新操作插入到新的oplog.rs集合中 db.oplog.rs.save(db.temp.findOne()) 6.将单节点模式的节点返回到复制集中 复制集状态查看 rs.status() 复制集状态查询 rs.printReplicationInfo() 查看oplog状态 rs.printSlaveReplicationInfo() 查看复制延迟 db.serverStatus() 查看状态详情 mongodb 监控工具 1.mongostat mongostat 常用选项 --host 主机名,或者 主机名:端口 --port 端口 --username 用户(验证) --password 密码(验证) --authenticationDatabase 从哪个数据库进行验证 --discover 发现集群其他节点 重点关注字段 getmore 大量的排序操作在进行 faults 需要的数据不在内存中 locked db 锁比例最高的库 index miss 索引未命中 qr|qw读写产生队列,供求失衡 2.mongotop 监控当前集合读写统计信息 --host 主机名,或者 主机名:端口 --port 端口 --username 用户(验证) --password 密码(验证) --authenticationDatabase 从哪个数据库进行验证 安全篇 开启认证 auth 单点 auth=true keyfile 集群之前认证 集群认证 keyfile文件的生成(内容base64编码集[a-zA-Z+/],长度1000字节,权限chmod 600 keyFile) openssl rand -base64 102 > .keyFile 调整权限 chmod 600 .keyFile 开启认证需要在配置文件中增加 setParameter=enableLocalhostAuthBypass=1 ## 本地例外,mongo localhost:28001 keyFile=/usr/local/mongodb/.keyFile 创建用户(创建第一个用户role要为root,db为admin) db.createUser( { user:'action',#字符串 pwd:'123',#字符串 roles:[{role:'root',db:'admin'}] #数组+对象, }) 创建用户后,然后登录客户端 use admin db.auth('admin','123') 删除用户 db.dropUser(<username>) ###删除某个用户 db.dropAllUsers() ###删除当前库的所有用户 权限 built-in roles 读写 read readWrite 管理员 dbAdmin dbOwner userAdmin clusterAdmin clusterManager clusterMonitor hostManager 备份 backup restore 全局 readAnyDatabase readWriteAnyDatabase userAdminAnyDatabase dbAdminAnyDatabase 超级用户 root 自定义角色 use admin db.createRole( { role:<role_name>, privileges:[ {resource:{db:<db_name>,collection:<coll_name>},actions:[<action_name>]} ], roles:[{role:<role_name>,db:<db_name>}] }) db.runCommand({userInfo:'admin',showPrivileges:1}) ##查看权限详情 修改用户名密码 需要具备 changePassword changeOwnPassword db.changeUserPassword(<user_name>,<new_password>) db.updateUser(<user_name>,{update_object}) 权限伸缩 如何增加权限 db.grantRolesToUser( <user_name>, [{role:<role_name>,db:<db_name>}] ) 如何收缩权限 db.revokeRolesFromUser( <user_name>, [{role:<role_name>,db:<db_name>}] )
mac下ssh登录记录账号
标签:
ssh
vim ~/.ssh/config
Host action1 # 别名
HostName 123.57.204.35 # 主机名
Port 22 # 端口
User root # 用户名
#IdentityFile ~/.ssh/id_rsa # 密钥文件的路径
Host action2
HostName 59.110.218.33
Port 22
User root
要是想要免密登录,可以参考
http://xingdong365.com/network/280.html
linux下自制证书
标签:
linux
cd /etc/pki/tls/certs
make action.key //期间会让你输入密码
mv action.key action.key.raw
openssl rsa -in action.key.raw -out action.key //期间会让你输入刚刚的密码,此步骤是将刚建立的文件的密码取消掉
rm -f action.key.raw
chmod 400 action.key //权限400
make action.crt SERIAL=20170820 //建立所需要的最终证书文件,期间会让你输入证书的信息
ll action* //查看
笔记来源:linux鸟哥的私房菜 服务器架设篇 -www服务器
make action.key //期间会让你输入密码
mv action.key action.key.raw
openssl rsa -in action.key.raw -out action.key //期间会让你输入刚刚的密码,此步骤是将刚建立的文件的密码取消掉
rm -f action.key.raw
chmod 400 action.key //权限400
make action.crt SERIAL=20170820 //建立所需要的最终证书文件,期间会让你输入证书的信息
ll action* //查看
笔记来源:linux鸟哥的私房菜 服务器架设篇 -www服务器
linux下logrotate配置参数说明
参数 功能
monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,轮循不会进行。
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
vim /etc/logrotate.d/nginx
/data/wwwlogs/*nginx.log {
daily
rotate 5
missingok
dateext
compress
notifempty
sharedscripts
postrotate
[ -e /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
monthly: 日志文件将按月轮循。其它可用值为‘daily’,‘weekly’或者‘yearly’。
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,轮循不会进行。
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
vim /etc/logrotate.d/nginx
/data/wwwlogs/*nginx.log {
daily
rotate 5
missingok
dateext
compress
notifempty
sharedscripts
postrotate
[ -e /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}
某公司给的测试题目201708018
标签:
php
演员的技能用字母A-Z表示,某活动需要演员按顺序完成任务,完成得最多的,可获得奖励。由于演员多才多艺,提前告知任务顺序,很容易完成任务。现在让演员随意表演,最后公布活动任务最长匹配度。如一个演员表演顺序 ABCBDAB,最后活动顺序为BDCABA,那么最大匹配度值为4(匹配值为BCBA或者BDAB)。现在编写程序实现以上功能:
<?php $a = 'ABCBDAB'; $b = 'BDCABA'; $aStrlen = strlen($a); $bStrlen = strlen($b); $maxCount = 0; for ($i=0; $i < $aStrlen; $i++) { $ch = $a[$i]; $aIdx = $i; $bIdx = 0; $count = 0; $next = false; for ($j=$bIdx;$j<$bStrlen; $j++) { if($ch == $b[$j]){ $count++; $bIdx = $j; $next = true; } if($j == $bStrlen-1 && $count != 0 && $aIdx < $aStrlen){ $j = $bIdx; $next = true; } if($next){ if(++$aIdx == $aStrlen){ break; } $next = false; $ch = $a[$aIdx]; } } if($count > $maxCount){ $maxCount = $count; } //假如最大次数大于剩余要比较的字符串,则break if($maxCount >= $aStrlen-$i){ break; } } echo $maxCount;
php利用二叉堆算法来实现 TopK
利用二叉堆算法来实现 TopK
实现流程是:
1、先读取10个或100个数到数组里面,这就是我们的topK数.
2、调用生成小顶堆函数,把这个数组生成一个小顶堆结构,这个时候堆顶一定是最小的.
3、从文件或者数组依次遍历剩余的所有数.
4、每遍历出来一个则跟堆顶的元素进行大小比较,如果小于堆顶元素则抛弃,如果大于堆顶元素则替换之.
5、跟堆顶元素替换完毕之后,在调用生成小顶堆函数继续生成小顶堆,因为需要再找出来一个最小的.
6、重复以上4~5步骤,这样当全部遍历完毕之后,我们这个小顶堆里面的就是最大的topK,因为我们的小顶堆永远都是排除最小的留下最大的,而且这个调整小顶堆速度也很快,只是相对调整下,只要保证根节点小于左右节点就可以.
7、算法复杂度的话按top10最坏的情况下,就是每遍历一个数,如果跟堆顶进行替换,需要调整10次的情况,也要比排序速度快,而且也不是把所有的内容全部读入内存,可以理解成就是一次线性遍历.
<?php //为了测试运行内存调大一点 ini_set('memory_limit', '2024M'); //生成小顶堆函数 function Heap(&$arr,$idx){ $left = ($idx << 1) + 1; $right = ($idx << 1) + 2; if (!isset($arr[$left])){ return; } if(isset($arr[$right]) && $arr[$right] < $arr[$left]){ $l = $right; }else{ $l = $left; } if ($arr[$idx] > $arr[$l]){ $tmp = $arr[$idx]; $arr[$idx] = $arr[$l]; $arr[$l] = $tmp; Heap($arr,$l); } } /* 当然这个数据集并不一定全放在内存,也可以在 文件里面,因为我们并不是全部加载到内存去进 行排序 */ for($i=0;$i<500000;$i++){ $numArr[] = $i; } //打乱它们 shuffle($numArr); //先取出10个到数组 $topArr = array_slice($numArr,0,10); //获取最后一个有子节点的索引位置 //因为在构造小顶堆的时候是从最后一个有左或右节点的位置 //开始从下往上不断的进行移动构造(具体可看上面的图去理解) $idx = floor(count($topArr) / 2) - 1; //生成小顶堆 for($i=$idx;$i>=0;$i--){ Heap($topArr,$i); } echo time()."<hr/>"; //这里可以看到,就是开始遍历剩下的所有元素 for($i = count($topArr); $i < count($numArr); $i++){ //每遍历一个则跟堆顶元素进行比较大小 if ($numArr[$i] > $topArr[0]){ //如果大于堆顶元素则替换 $topArr[0] = $numArr[$i]; /* 重新调用生成小顶堆函数进行维护,只不过这次是从堆顶 的索引位置开始自上往下进行维护,因为我们只是把堆顶 的元素给替换掉了而其余的还是按照根节点小于左右节点 的顺序摆放这也就是我们上面说的,只是相对调整下,并 不是全部调整一遍 */ Heap($topArr,0); } } echo "<hr/>"; var_dump($topArr); echo "<hr/>".time()."<hr>";
源文链接:简书 http://www.jianshu.com/p/df71c71cdc57
DNS(Domain Name System)服务器相关的几个命令
DNS(Domain Name System)服务器相关的几个命令
host
example:
host www.baonisheng.cn
host -a www.baonisheng.cn
nslookup
example:
nslookup www.baonisheng.cn
dig
example:
dig www.baonisheng.cn
dig -x 123.57.204.35 //查询反解信息
whois
example:
whois baonisheng.cn //查询域名注册信息