记一次Mongodb 服务器CPU占用过高的问题排查

某日浏览服务器CPU占用,发现Mongodb的服务器占用CPU达到80%以上。
通过慢查询和当前运行的资源查询,没有找到占用资源过多的查询。
网上爬文也是没有头绪。于是查询Mongodb的日志,发现是日志偏异的警告,并且写日志超时。

2020-11-04T20:26:43.391+0000 W  STORAGE  [FlowControlRefresher] Flow control is engaged and the                   sustainer point is not moving. Please check the health of all secondaries.

这个时候,如果直接以关键字去进行搜索引擎搜索,是查不到任何信息的。根据日志的提示,我们可以知道,问题大概是发生在主从复制上。
于是登录到从服务器查询。服务器架构采用的是replaceSet的架构,主服务器对外提供服务,Secondary服务器用于做数据备份,并没有对外提供服务。

2020-11-06T06:00:28.925+0000 I  CONTROL  [LogicalSessionCacheReap] Failed to reap transaction table: FailedToSatisfyReadPreference: Could not find host matching read preference { mode: "primary" } for set rs1


2020-11-06T06:11:01.675+0000 I  ELECTION [replexec-73] Not starting an election, since we are not electable due to: Not standing for election because I cannot see a majority (mask 0x1)

上述日志,可以说明找不到主库。联想到之前有一次错误的操作过防火墙服务,有可能是此操作导致的找不到主节点。于是重启子节点的Mongodb服务。
重启后,子服务的主从同步正常,主服务器的CPU占用率也下降了。

MACBook Pro 2017安装Win10的问题及解决思路

#

起因

当前使用的MACBook是Mac系统,这个系统针对普通软件的兼容性很好,但是在使用方便性上和Windows还有差别,所以就准备安装WIndows。我的型号是带Bar的2017版本的Pro,只有一个硬盘。

普通安装思路

使用Bootcamp可以直接安装Windows,但安装后,原来就比较少的256GB的空间更是捉襟见肘,而且Windows 256GB更是只能上网用用了,如果后面想再使用Mac还可以通过安装在USB硬盘解决,所以,决定直接全盘安装Windows。

我的硬盘呢

安装第一步是按Commod +R 键进入Mac的恢复模式,将现有系统备份后,抹掉硬盘。

然后使用支持UEFI启动的U盘PE,启动系统。

这个时候悲剧的发现,没有找到Mac的硬盘。而没有硬盘自然就无法安装系统。

安装SSD驱动

百度了网上的资料,得出,苹果电脑自16版本之后,需要使用自己的SSD驱动程序,而普通PE是没有这个驱动的。

解决的第一步就是注入驱动到PE中。注入驱动的方法,是直接使用DISM++的驱动注入功能。

这个时候,你是需要一台Windows电脑的,我呢,是直接使用了WinToGo做了一个U盘的Windows系统来干后面的事,事实证明,如果有了WinToGo的系统,就不需要注入驱动到PE了。

直接使用WinToGo启动系统,安装Bootcamp驱动。由于是Bootcamp驱动的,SSD的驱动不会自动安装,这个时候,需要到Bootcamp中手动安装SSD的驱动。这个时候,就可以在WinToGo的系统中看到这块久违的SSD硬盘驱动。

安装Win10

MAC的SSD驱动是64位驱动程序,微软的安装程序是32位的程序,是不能直接使用安装程序安装的,会找不到硬盘。这里使用WINNT 安装软件进行安装。

在安装之前,需要对硬盘进行分区,直接使用DiskGenis的分区工具,分成GPT分区,增加MSR分区,此分区为UEFI的启动分区,实际上就是一个FAT32分区,里面创建UEFI文件夹,将安装盘中的UEFI直接拷入就可以。

> 如果此步忘记,直接重启系统,会显示一个带问号的文件夹,表明系统没有找到可供启动的分区。

使用WINNT安装工具时,启动分区和系统分区选择,完毕之后,如果你直接重启,会报蓝屏错误。因为你没有设置正确的BCD启动项。

> 在Win7 之后,微软系统使用BCD进行分区引导,使用Dims++的引导修复就可以了。

注入驱动

经过上述几个步骤,重启时,系统会WIN LOGO,然后貌似进入了安装阶段,但是进行了一段之后,系统会重启,如此往复。这就是因为没有注入驱动的原因。直接使用Dism的驱动注入功能注入驱动就可以了,

处理原来的MACOS

这个时候出现了一个问题,Touch Bar不亮,也不知道是啥时候不亮的,反正就是没有亮就对了,网上查询了一番,只有一条路,重装MACOS。启动MacOS修复失灵的TouchBar。

这个时候心中真的是一万个神兽奔跑而过。好,重新安装它。由于已经决定将MacOS安装在U盘上了,所以直接用原来的WinTo的硬盘,安装MacOS。

网上恢复是一个坑

直接使用Commond+R,就可以进入恢复模式了,由于上一步硬盘格式化的时候,将恢复模式的分区删除了,这个时候会显示一个地球图标的,并且要求连接互联网。连网后,滚动条走完,就可以进入恢复模式了。

如果选持重新安装,需要等待大约20个小时安装。我是没有等到它的安装。直接从之前的TimeMachine中进行了恢复。

TimeMachine恢复之后,进入MacOS,TouchBar点亮。

最快的安装方式

现在来总结最快,最省时间的安装方式:

1.找一台Windows的电脑,制作注入了苹果SSD驱动的PE,并且将其设置成可以UEFI启动。下载对应的Bootcamp并将驱动拷贝到U盘。

2.启动到MAC恢复模式,通过磁盘工具的恢复功能,将现有的系统完整的备份到一个用于后面使用的U盘(SSD外置硬盘也可以)中。

3.启动PE,加载苹果SSD的驱动,使用磁盘分区工具,重新分区,要保留MSR(用于EFI)启动分区。

拷贝安装盘中的UEFI文件夹中的内容到启动分区的EFI文件夹

4.安装完毕后,使用Dism++修复启动项,注入SSD驱动(你也可以将Bootcamp中的驱动全部注入)

5.重新启动。进行后续安装。

WORDPRESS 配置腾讯CDN加速

为什么选择腾讯云

之前很长一段时间用百度的云加速,但百度的免费版本不支持HTTPS,腾讯的送了50GB流量,虽然不免费,但是小网站,50的流量差不多也够用了。

配置要点

1.要有一个HTTPS的证书,这点比较容易,直接申请自己的域名证书就可以。
2.配置的时候,要关闭301,302回源。
3.由于回源的时候不是HTTPS的,因此,在后台配置中不要配置https的地址,否则会在登录后台的时候强制跳转。这点非常不爽。正确的解决方案是在wp_functions.php中增加下面的方法

function change_ssl(){
if( true ){
function change_ssl_main ($content){
$siteurl = get_option('siteurl');

$upload_dir = wp_upload_dir();
$content = str_replace( 'http:'.strstr($siteurl,'//'), strstr($siteurl, '//'), $content);
$content = str_replace( 'http:'.strstr($upload_dir['baseurl'], '//'), strstr($upload_dir['baseurl'], '/'), $content);

return $content;
}
ob_start("change_ssl_main");
}
}
add_filter('get_header', 'change_ssl');

增加后,页面同时可以支持http,https访问,方便快捷

自动检测tomcat服务的shell脚本

在实际工作中,需要实时的检测Tomcat服务的状态,并且如果在Tomcat停止时,自动的重启Tomcat服务,以方便我们的应用程序不被中断。

实现思路是使用Linux自带的计划任务,启动一个时间间隔为5分钟的检查服务,这个可以放到 /etc/crontab文件中。

*/5 * * * * su - root -c /root/restartTomcat.sh

接下为就是要实现这个.sh文件,我们可以参考下面的模板。基本思路就是通过PS得出当前的系统进程,然后通过文件的路径来确定指定的进程是否已经启动,如果没有启动,则先执行程序停止服务,再执行启动服务。
示例代码如下:

#!/bin/bash

pnum_server=`ps -wef|grep tomcat |grep -v grep |wc -l`

if test $pnum_server -lt 1

then

  /usr/local/tomcat/bin/shutdown.sh

   sleep 2s

  /usr/local/tomcat/bin/startup.sh

fi

如果这样写你可能会遇到一个小插曲,就是提示fi附近有语法错误。这个问题的原因是由于Windows下面的换行符导致。
因此你可以使用vi打开脚本文件,执行:set fileformat=unix,:wq保存即可。

微信开发之分享和获取用户信息

众所周知,微信是当之无愧的No.1,在产品推广和业务路演的过程中,扫一扫成了最为常见的功能。扫一扫就能获取用户的基础信息,然后可以进行投票啊,留言啊之类的功能几乎是网页的必备功能。 微信最常用的就是分享和获取用户信息的功能,这两个接口尽管微信都有详细的文档,网上也有相应的教程,但是过程中还是有一些坑的,在此记录一下。

继续阅读微信开发之分享和获取用户信息

使用Quartz定时器在Java中执行计划任务

在JavaEE系统中,计划任务的执行是一项很普通的工作,需要我们定时执行一些维护和例行的任务。比如定时统计,发送邮件,报表,甚至通知和提醒等。

计划任务的实现有多种方式。比如使用数据库的定时任务(Jobs和Events),服务器的计划任务(Windows的计划作任务,Linux的Crontab系统。

那么Java本身能否实现定时任务呢,当然是可以的,我们可以使用Java.util.Timer 和 Java.util.TimerTask来完成这项工作,但是这种方法在调用上其实是不方便,需要大量的代码。解决这个问题的通行方法是使用Quartz框架。它是一个基于Java的计划任务框架,在定时执行上,可以使用Linxu的CronExperssion,便于使用和维护。

继续阅读使用Quartz定时器在Java中执行计划任务

Reactive Native 在IOS中集成中的踩坑经历

什么是React Native

React-Native 是由Facebook出品的一款可以使用JavaScript来编写原生app的框架,官方说明是:A framework for building native app with React(一个使用React来编写原生app的框架),然而这个React也是由该公司出品的一款可以用来编写用户界面的JS库。二者的出现,以其强大的功能和便捷的使用方式迅速被广大开发者使用,并在各大平台的应用研发中占据了自己的一席之地。

继续阅读Reactive Native 在IOS中集成中的踩坑经历

C#代码中实现两个表(DataTable)的关联查询(JOIN)

之前通常都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只需要用一个JOIN就可以了,非常方便。近日遇到一种情况,两个表中的数据已经取到代码中,需要在代码中将这两个表关联起来,并得到它们横向拼在一起之后的完整数据。

继续阅读C#代码中实现两个表(DataTable)的关联查询(JOIN)