CentOS7.x 设置系统时间

硬件时钟和系统时钟
(1) 硬件时钟
RTC(Real-Time Clock)或CMOS时钟,一般在主板上靠电池供电,服务器断电后也会继续运行。仅保存日期时间数值,无法保存时区和夏令时设置。

(2) 系统时钟
一般在服务器启动时复制RTC时间,之后独立运行,保存了时间、时区和夏令时设置。

CentOS7开始,使用timedatectl设置日期时间:
(1) 读取时间

timedatectl //等同于 timedatectl status

(2) 设置时间

timedatectl set-time "YYYY-MM-DD HH:MM:SS"

(3) 列出所有时区

timedatectl list-timezones

(4) 设置时区

timedatectl set-timezone Asia/Shanghai

(5) 是否NTP服务器同步

timedatectl set-ntp yes //yes或者no

(6) 将硬件时钟调整为与本地时钟一致

timedatectl set-local-rtc 1
hwclock --systohc --localtime //与上面命令效果一致

注意: 硬件时钟默认使用UTC时间,因为硬件时钟不能保存时区和夏令时调整,修改后就无法从硬件时钟中读取出准确标准时间,因此不建议修改。修改后系统会出现下面的警告。

GMT、UTC、CST、DST 时间

(1) UTC

整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC, Universal Time Coordinated)。

(2) GMT

格林威治标准时间 (Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC与GMT时间基本相同,本文中不做区分)

(3) CST

中国标准时间 (China Standard Time)

(4) DST

夏令时(Daylight Saving Time) 指在夏天太阳升起的比较早时,将时钟拨快一小时,以提早日光的使用。(中国不使用)

GMT + 8 = UTC + 8 = CST

zabbix3.x中文图片乱码终极解决

zabbix-logo.png
Zabbix乱码是由于默认使用DejaVuSan.ttf字体,该字体不支持中文,切换语言成中文Zh_cn后,在图表上中文出现乱码,如下图:
lm.png

解决zabbix乱码方法如下:
找到本地C:WindowsFontsmsyh.ttf(微软雅黑)上传到服务器zabbix网站目录fonts目录下
修改includedefines.inc.php中的DejaVuSans为msyh

define('ZBX_GRAPH_FONT_NAME',        'msyh');
define('ZBX_FONT_NAME', 'msyh');

再次刷新即可正常;
tb.png

如果还乱码,就需要检查数据库编码是否是utf8编码了

show create database zabbixdb; #查看数据库创建编码
root@monitor-db 09:23:05 [(none)]>show create database zabbixdb;
+----------+-------------------------------------------------------------------+
| Database | Create Database                                                   |
+----------+-------------------------------------------------------------------+
| zabbixdb | CREATE DATABASE `zabbixdb` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------------+
1 row in set (0.00 sec)

若数据库是utf8编码,但还乱码,就需要继续盘查,php编译参数中是否编译了jpeg、png、freetype等组件,
编译顺序如下:

安装libmcrypt:
cd /opt
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure && make && make install

安装 jpeg6

 mkdir /usr/local/jpeg6
 mkdir /usr/local/jpeg6/bin
 mkdir /usr/local/jpeg6/lib
 mkdir /usr/local/jpeg6/include
 mkdir /usr/local/jpeg6/man
 mkdir /usr/local/jpeg6/man/man1
cd /opt
tar zxf jpegsrc.v6b.tar.gz
cd jpeg-6b
cp /usr/share/libtool/config/config.sub .
cp /usr/share/libtool/config/config.guess .
./configure --prefix=/usr/local/jpeg6/ --enable-shared --enable-static
make && make install

安装png

cd /opt
tar zxvf libpng-1.6.10.tar.gz
./configure --prefix=/usr/local/png --enable-shared
make && make install

安装freetype

cd /opt
tar zxvf freetype-2.5.3.tar.gz
cd freetype-2.5.3
./configure --prefix=/usr/local/freetype --enable-shared
make && make install

最后编译php参数如下:

./configure --prefix=/usr/local/php5 --with-config-file-path=/usr/local/php5/etc --with-mysql --with-mysqli=/usr/bin/mysql_config --with-mysql-sock=/var/lib/mysql/mysql.sock --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-gd --with-iconv --with-zlib --enable-xml --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-fpm --enable-mbstring --enable-ftp --enable-gd-native-ttf --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --without-pear --with-gettext --enable-session --with-mcrypt --with-curl --with-jpeg-dir=/usr/local/jpeg6 --with-png-dir=/usr/local/png --with-freetype-dir=/usr/local/freetype --with-mcrypt=/usr/local/libmcrypt --enable-maintainer-zts --with-ldap=shared --without-gdbm 
make -j 8
make install

CentOS7.x 快速申请部署Let’s Encrypt 证书

Let's Encrypt作为一个公共且免费SSL的项目逐渐被广大用户传播和使用,是由Mozilla、Cisco、Akamai、IdenTrust、EFF等组织人员发起,主要的目的也是为了推进网站从HTTP向HTTPS过度的进程,目前已经有越来越多的商家加入和赞助支持。
https.jpg
申请步骤如下:

#安装git及其他用到的包
yum install git zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel -y

#获取letsencrypt
git clone https://github.com/letsencrypt/letsencrypt

#进入letsencrypt目录
cd letsencrypt

#生成证书
./letsencrypt-auto certonly --standalone --email ice@mail.com -d unixso.com -d www.unixso.com

#证书位置
/etc/letsencrypt/live/unixso.com
cert.pem - Apache服务器端证书
chain.pem - Apache根证书和中继证书
fullchain.pem - Nginx所需要ssl_certificate文件
privkey.pem - 安全证书KEY文件

#Nginx环境中,对应的ssl_certificate和ssl_certificate_key路径设置成的2个文件就可以。

附nginx ssl参数配置文件其他省略:

ssl_certificate cert/unixso.com.pem;
ssl_certificate_key cert/unixso.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5";
        ssl_session_cache builtin:1000 shared:SSL:10m;

Let's Encrypt证书有效期90天的,需要定时更新续期:

./letsencrypt-auto certonly --renew-by-default --email ice@mail.com -d unixso.com -d www.unixso.com

或者加入crontab定时任务执行即可;

0 0 1 */2 *  /data/letsencrypt/up.sh

每两个月的1日0点执行up.sh更新证书续期;
如果报错"Problem binding to port 80: Could not bind to IPv4 or IPv6."
停掉nginx进程重新执行即可;

Dynatrace PerformGo上海峰会掠影

Dynatrace Perform 是IT领域监控行业的领军公司,当然商业授权价格也不菲,三个人监控全球几十家份公司的所有机器,这个还是有比较牛叉;

现在很多公司都爱炒AI,风口上嘛...

以下是抓拍

IMG_20190919_081342.jpg

IMG_20190919_081346.jpg

IMG_20190919_081352.jpg

IMG_20190919_082255.jpg

IMG_20190919_085925.jpg

IMG_20190919_091713.jpg

IMG_20190919_091844.jpg

IMG_20190919_092113.jpg

IMG_20190919_093430.jpg

IMG_20190919_093536.jpg

IMG_20190919_093747.jpg

IMG_20190919_093924.jpg

IMG_20190919_094020.jpg

IMG_20190919_094201.jpg

IMG_20190919_094426.jpg

IMG_20190919_100500.jpg

IMG_20190919_100456.jpg

IMG_20190919_100431.jpg

IMG_20190919_100331.jpg

IMG_20190919_095106.jpg

IMG_20190919_094957.jpg

IMG_20190919_094911.jpg

IMG_20190919_094734.jpg

IMG_20190919_094613.jpg

IMG_20190919_102317.jpg

IMG_20190919_102131.jpg

IMG_20190919_101901.jpg

IMG_20190919_101643.jpg

IMG_20190919_101453.jpg

IMG_20190919_101234.jpg

IMG_20190919_101144.jpg

IMG_20190919_100942.jpg

IMG_20190919_100859.jpg

IMG_20190919_123349.jpg

IMG_20190919_120526.jpg

IMG_20190919_120523.jpg

IMG_20190919_120253.jpg

IMG_20190919_120145.jpg

IMG_20190919_120145.jpg

IMG_20190919_120027.jpg

IMG_20190919_112400.jpg

IMG_20190919_111104.gif

IMG_20190919_111001.gif

IMG_20190919_110726.jpg

IMG_20190919_110207.jpg

IMG_20190919_103200.jpg

IMG_20190919_102416.jpg

IMG_20190919_145718.jpg
最后来一张红帽的小礼物

蓝天

天很蓝,云很低,这样的天气不错,适合出去转转;

IMG_20190916_082932.jpg

微信小程序开发-js判断是否为空

1、判断undefined:

var tmp = undefined; 
if (typeof(tmp) == "undefined"){ 
   console.log("undefined"); 
}

说明:typeof 返回的是字符串,有六种可能:"number"、"string"、"boolean"、"object"、"function"、"undefined"
2、判断null:

var tmp = 0/0; 
if (isNaN(tmp) ){ 
   console.log("NaN"); 
}

3、判断NaN:

var tmp = 0/0; 
if (isNaN(tmp) ){ 
   console.log("NaN"); 
}

说明:NaN 表示非法,如果把 NaN 与任何值(包括其自身)相比得到的结果均是 false,所以要判断某个值是否是 NaN,不能使用 == 或 === 运算符。

提示:isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字。当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的情况。
4.判断undefined和null:

var tmp = undefined; 
if (tmp== undefined) 
{ 
   console.log("null or undefined"); 
}
var tmp = undefined; 
if (tmp== null) 
{ 
   console.log("null or undefined"); 
}

说明:null==undefined
5、判断undefined、null与NaN:

var tmp = null; 
if (!tmp) 
{ 
   console.log("null or undefined or NaN"); 
}

提示:一般不那么区分就使用这个足够,举例说明:

    if (typeof (username) == '' || typeof (username) == 'undefined') {
      wx.showModal({
        title: "系统提示",
        content: "资产管理员账号不能为空!",
        showCancel: false
      })
    }else if (typeof (pwd) == '' || typeof (pwd) == 'undefined') {
      wx.showModal({
        title: "系统提示",
        content: "资产管理员密码不能为空!",
        showCancel: false
        
      })
    } else {
      console.log("账号:" + username + "密码:" + pwd)
}
 },

Oracle11g查询数据量最大的表及存储空间大小

数据量最大的表:

select * from user_tables t where t.NUM_ROWS is not  null  order by t.NUM_ROWS  desc

table.png

存储空间可以用如下语句查:

select tablespace_name, sum(bytes) / 1024 / 1024 as MB from dba_data_files group by tablespace_name;

tablespace.png

查询最大表记录:

select count(1) from LBPM_RT_NODEHANDLER_DEFINE;

select_max_row.png
最大记录数量两千三百多万;

秋天到了

秋天到了,河边的花已是晚期了,早晚外面凉快多了,但是室内还是那么闷热;

立秋以后,北方已经秋高气爽了,魔都估计得到十月份才能彻底凉快下来;

秋天是个收获的季节,不过前提是得种下才有收获;

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

MySQL网络超时错误Got timeout reading communication packets的解决方法

MySQL大量报错Got timeout reading communication packets,error显示日志如下:

2018-11-14T23:27:01.130760Z 2876756 [Note] Aborted connection 2876756 to db: 'zabbix_db' user: 'zabbix_u' host: '192.168.255.209' (Got timeout reading communication packets)
2018-11-14T23:27:03.437908Z 2874970 [Note] Aborted connection 2874970 to db: 'zabbix_db' user: 'zabbix_u' host: '192.168.255.209' (Got timeout reading communication packets)

当前MySQL主要timeout相关的参数如下:

show session variables like '%timeout%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| connect_timeout             | 10       |
| delayed_insert_timeout      | 300      |
| have_statement_timeout      | YES      |
| innodb_flush_log_at_timeout | 1        |
| innodb_lock_wait_timeout    | 10       |
| innodb_rollback_on_timeout  | ON       |
| interactive_timeout         | 60       |
| lock_wait_timeout           | 31536000 |
| net_read_timeout            | 60      |
| net_write_timeout           | 30      |
| rpl_stop_slave_timeout      | 31536000 |
| slave_net_timeout           | 60       |
| wait_timeout                | 900      |
+-----------------------------+----------+
13 rows in set (0.01 sec)

connect_timeout:默认为10S
wait_timeout:默认是8小时,即28800秒
interactive_timeout:默认是8小时,即28800秒
net_read_timeout:默认是30S
net_write_timeout:默认是60S
如果是认证过程中超时,不管是读还是,都是 connect_timeout;
对于读网络超时,一般是 wait_timeout/interactive_timeout,基本不会是 net_read_timeout(特例是业务用到 LOAD DATA LOCAL FILE);
对于写网络超时,都是 net_write_timeout。
解决方法如下:

set global interactive_timeout=900;
set global net_read_timeout=900;
set global net_write_timeout=900;

再次tail日志,已经无该信息报错了,可以把以上参数加入到my.cnf里面,900根据实际场景设置;

参考文档:
http://mysql.taobao.org/monthly/2017/05/04/
http://cenalulu.github.io/mysql/mysql-timeout/
https://www.cnblogs.com/xiaoboluo768/p/6222862.html

CentOS7启用ena网络增强模块

CentOS7.4.1708及以上版本内核中已经集成了亚马逊的ena驱动程序已被加进内核,参考https://wiki.centos.org/zh/Manuals/ReleaseNotes/CentOS7.1708 官方页面;
maxresdefault.jpg
如果是7.4以上版本直接使用下面的方法即可加载ena模块:

[root@monitor ~]# yum update -y
[root@monitor ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

[root@monitor ~]# modinfo ena
filename:       /lib/modules/3.10.0-957.12.2.el7.x86_64/kernel/drivers/net/ethernet/amazon/ena/ena.ko.xz
version:        1.5.0K
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
retpoline:      Y
rhelversion:    7.6
srcversion:     1B9931F07C26733BA8D4F94
alias:          pci:v00001D0Fd0000EC21sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd0000EC20sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00001EC2sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00000EC2sv*sd*bc*sc*i*
depends:
intree:         Y
vermagic:       3.10.0-957.12.2.el7.x86_64 SMP mod_unload modversions
signer:         CentOS Linux kernel signing key
sig_key:        8D:E6:4F:B5:96:9B:55:7E:DC:7F:03:2E:EA:BC:BE:4F:37:17:7F:4E
sig_hashalgo:   sha256
parm:           debug:Debug level (0=none,...,16=all) (int)

查看内核版本:

[root@monitor ~]# uname -r
3.10.0-957.12.2.el7.x86_64

添加模块:

dracut -f --add-drivers nvme /boot/initramfs-$(uname -r).img $(uname -r)

查看内核镜像内容并过滤nvme:

[root@monitor ~]# lsinitrd /boot/initramfs-3.10.0-957.12.2.el7.x86_64.img | grep -i nvme
Arguments: -f --add-drivers 'nvme'
drwxr-xr-x   3 root     root            0 Aug 14 19:43 usr/lib/modules/3.10.0-957.12.2.el7.x86_64/kernel/drivers/nvme
drwxr-xr-x   2 root     root            0 Aug 14 19:43 usr/lib/modules/3.10.0-957.12.2.el7.x86_64/kernel/drivers/nvme/host
-rw-r--r--   1 root     root        28480 May 15 05:48 usr/lib/modules/3.10.0-957.12.2.el7.x86_64/kernel/drivers/nvme/host/nvme-core.ko.xz
-rw-r--r--   1 root     root        16908 May 15 05:48 usr/lib/modules/3.10.0-957.12.2.el7.x86_64/kernel/drivers/nvme/host/nvme.ko.xz

CentOS7.4以下版本需要重新安装,操作步骤如下:
1、先更新升级Linux内核:

yum --enablerepo=extras install epel-release
yum -y install patch dkms kernel-devel perl
yum update
yum --enablerepo=elrepo-kernel install kernel-lt -y

vi /etc/default/grub
将GRUB_DEFAULT=saved 改成 GRUB_DEFAULT=0
grub2-mkconfig -o /boot/grub2/grub.cfg 
reboot 重启后生效

2、安装ena驱动

cd /opt
curl -o ena_linux_2.1.1.tar.gz https://codeload.github.com/amzn/amzn-drivers/tar.gz/ena_linux_2.1.1
tar zxvf ena_linux_2.1.1.tar.gz
mv amzn-drivers-ena_linux_2.1.1 /usr/src/ena-2.1.1
cat <<EOF > /usr/src/ena-2.1.1/dkms.conf
PACKAGE_NAME="ena"
PACKAGE_VERSION="2.1.1"
AUTOINSTALL="yes"
REMAKE_INITRD="yes"
BUILT_MODULE_LOCATION[0]="kernel/linux/ena"
BUILT_MODULE_NAME[0]="ena"
DEST_MODULE_LOCATION[0]="/updates"
DEST_MODULE_NAME[0]="ena"
CLEAN="cd kernel/linux/ena; make clean"
MAKE="cd kernel/linux/ena; make BUILD_KERNEL=\${kernelver}"
EOF

dkms add -m ena -v 2.1.1
dkms build -m ena -v 2.1.1
dkms install -m ena -v 2.1.1

dracut -f --add-drivers ena

#安装完毕查看
[root@devops ~]# modinfo ena
filename:       /lib/modules/3.10.0-957.27.2.el7.x86_64/extra/ena.ko.xz
version:        2.1.1g
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
retpoline:      Y
rhelversion:    7.6
srcversion:     F342F1BEE707726508E3DF8
alias:          pci:v00001D0Fd0000EC21sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd0000EC20sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00001EC2sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00000EC2sv*sd*bc*sc*i*
depends:
vermagic:       3.10.0-957.27.2.el7.x86_64 SMP mod_unload modversions
parm:           debug:Debug level (0=none,...,16=all) (int)
parm:           rx_queue_size:Rx queue size. The size should be a power of 2. Max value is 8K
 (int)
parm:           force_large_llq_header:Increases maximum supported header size in LLQ mode to 224 bytes, while reducing the maximum TX queue size by half.
 (int)

3、添加驱动

查看内核版本:uname -r

添加模块:dracut -f --add-drivers nvme /boot/initramfs-$(uname -r).img $(uname -r)

查看内核镜像内容并过滤nvme:
lsinitrd /boot/initramfs-3.10.0-957.1.3.el7.x86_64.img | grep -i nvme

4、最后关机,并启用ena模块

aws ec2 modify-instance-attribute --instance-id i-07xxxxxxxxxxxxx --ena-support  #使i-07xxxxxxxxxxxxx虚机支持ena
aws ec2 describe-instances --instance-id i-07xxxxxxxxxxxxx --query "Reservations[].Instances[].EnaSupport"  #查询是否启用了ena模块

最后启动虚机即可生效,查看ena信息:

[root@monitor ~]# modinfo ena
filename:       /lib/modules/3.10.0-957.27.2.el7.x86_64/extra/ena.ko.xz
version:        2.1.1g
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
retpoline:      Y
rhelversion:    7.6
srcversion:     F342F1BEE707726508E3DF8
alias:          pci:v00001D0Fd0000EC21sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd0000EC20sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00001EC2sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00000EC2sv*sd*bc*sc*i*
depends:        
vermagic:       3.10.0-957.27.2.el7.x86_64 SMP mod_unload modversions 
parm:           debug:Debug level (0=none,...,16=all) (int)
parm:           rx_queue_size:Rx queue size. The size should be a power of 2. Max value is 8K
 (int)
parm:           force_large_llq_header:Increases maximum supported header size in LLQ mode to 224 bytes, while reducing the maximum TX queue size by half.
 (int)

[root@monitor ~]# ethtool -i ens5
driver: ena
version: 2.1.1g
firmware-version: 
expansion-rom-version: 
bus-info: 0000:00:05.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

via:https://gist.github.com/Ray33/ba189a729d81babc99d7cef0fb6fbcd8

MySQL使用存储过程插入100万条记录

业务上为了测试DB写入性能,需测试大量数据写入速度,数据库部署在aws上,4核8G内存100G硬盘,MySQL5.7.27
mysql.png

--创建测试数据库
create database a1 default charset utf8mb4;
--创建测试表
CREATE TABLE `test110` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `user` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `comp` varchar(200) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `cid` int(11) DEFAULT NULL,
  `aid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
--创建插入存储过程
DELIMITER $$
CREATE PROCEDURE test_insert()
BEGIN
declare i int;
set i=0;
while i<1000000 do
INSERT INTO `test110` VALUES (null,'TMP01','user11','会员中台','2019-08-15 00:00:02','11','22');
set i=i+1;
end while;
end $$
DELIMITER ;

测试如下,速度很快:

mysql> call test_insert();
Query OK, 1 row affected (44.71 sec)

mysql> call test_insert();
Query OK, 1 row affected (44.74 sec)

mysql> call test_insert();
Query OK, 1 row affected (44.71 sec)

mysql> select count(1) from test110;
+----------+
| count(1) |
+----------+
|  3000000 |
+----------+
1 row in set (0.44 sec)

MySQL配置如下my.cnf

[client]
default-character-set = utf8mb4
port        = 3306
socket        = /data/mysql/mysql.sock

[mysql]
default-character-set = utf8mb4
prompt="\u@oatestdb \R:\m:\s [\d]> "
no-auto-rehash

[mysqld]

secure_file_priv = ''
#validate-password = off
slow_query_log = On
log_output = FILE
slow-query-log-file=/data/mysql/slow.log
long_query_time = 30 
log_queries_not_using_indexes = ON

lower_case_table_names=1
auto-increment-increment = 1
auto-increment-offset = 1

log_warnings=1
log_error_verbosity=1

default-storage-engine=INNODB
group_concat_max_len = 18446744073709551615
# generic configuration options
port        = 3306
socket        = /data/mysql/mysql.sock 
pid-file        = /data/mysql/mysqld.pid
basedir        = /usr/local/mysql
datadir         = /data/mysql/db
language    = /usr/local/mysql/share/english 
user        = mysql
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
skip-external-locking
skip-name-resolve
skip-character-set-client-handshake
character-set-server = utf8mb4
explicit_defaults_for_timestamp = true
init_connect='SET NAMES utf8mb4'
character-set-client-handshake = FALSE
collation-server = utf8mb4_unicode_ci
explicit_defaults_for_timestamp

#replication
expire_logs_days = 30
sync-binlog = 1000
server_id=1
gtid_mode=ON
enforce_gtid_consistency=ON
master_info_repository=TABLE
relay_log_info_repository=TABLE
binlog_checksum=NONE
log_slave_updates=ON
log_bin=/data/mysql/binlog/binlog
binlog_format=ROW


relay_log_recovery = 1
skip_slave_start = 0
slave-skip-errors = all
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G

#group replication
transaction_write_set_extraction=XXHASH64
loose-group_replication_group_name="e4668cea-d7ca-11e6-86b5-18a99b76310d"
loose-group_replication_start_on_boot=off
loose-group_replication_local_address= "db1:24901"
loose-group_replication_group_seeds= "db1:24901,db2:24902,db3:24903"
loose-group_replication_bootstrap_group= off
loose-group_replication_single_primary_mode=FALSE
loose-group_replication_enforce_update_everywhere_checks= TRUE

skip_name_resolve = 1
open_files_limit    = 65535
back_log = 1024
max_connections = 5000
max_connect_errors = 100000
max_prepared_stmt_count=1048576
table_open_cache = 10240
table_definition_cache = 10240
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 16M
join_buffer_size = 16M
thread_cache_size = 7680
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 900
wait_timeout = 900
tmp_table_size = 256M
max_heap_table_size = 256M

# innodb
innodb_buffer_pool_size = 12G 
innodb_data_file_path = IBdata1:1024M;IBdata2:1024M:autoextend
innodb_temp_data_file_path = ibtmp1:12M:autoextend:max:5G
innodb_thread_concurrency = 16
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_flush_method=O_DSYNC

innodb_io_capacity = 50000
innodb_io_capacity_max = 80000
innodb_flush_neighbors = 0
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
#innodb_file_format = Barracuda
#innodb_file_format_max = Barracuda
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0

[mysqld_safe]
open-files-limit = 8192
log-error=/data/mysql/error.log
pid-file=/data/mysql/mysqld.pid

[mysqldump]
quick
max_allowed_packet = 32M

BASH比较运算及字符串包含关系判断方法收集

1、算术运算比较运算符(bash自身不能比较浮点数)

-eq 等于          [ $num1 -eq $num2 ] 
-ne 不等于       [ 100   -ne $num1 ] 
-lt 小于           [ 100   -lt `expr $num1 + $num2` ] 
-le 小于或等于   [ 100   -le `expr $num1 \* $num2` ] 
-gt 大于           [ 100   -gt `expr $num1 / $num2` ] 
-ge 大于或等于   [ 100   -ge `expr $num1 % $num2` ]

2、字符串比较运算符

-z string  如果 string 长度为零,则为真  [ -z "`ps aux | grep mysql`" ] 
-n string  如果 string 长度非零,则为真  [ -n "$string" ]
              【注意】 $string 一定要放在双引号里面 "$string",否则使用 -n -z 的结果都为真!
string1 != string2  如果 string1 与 string2 不同,则为真  [ "$str1" != "Snail" ] 
string1 == string2  如果 string1 与 string2 相同,则为真  [ "$str1" == "$str2" ]
                    (上面用一个 = 也可以,在严格的 POSIX 兼容下使用)
string1 < string2   如果 string1 按字典顺序比较小于 string2,则为真
string1 > string2   如果 string1 按字典顺序比较大于 string2,则为真

3、文件比较运算符

-a filename  如果 filename 存在,则为真                   [ -e $HOME/.bashrc ]
-e filename  (同上)
-b filename  如果 filename 存在,并且是块文件,则为真     [ -e /dev/loop0 ]
-c filename  如果 filename 存在,并且是字符文件,则为真   [ -e /dev/ttyS0 ]
-d filename  如果 filename 存在,并且为目录,则为真       [ -d /home/snail ] 
-f filename  如果 filename 存在,并且为常规文件,则为真   [ -f /dev/ttyS0 ]
-g filename  如果 filename 存在,并且为set-group-id,为真 [ -f $HOME/ak47 ]
-h filename  如果 filename 存在,并且为符号连接,则为真   [ -h /bin/vi ]
-L filename  (同上)
-k filename  如果 filename 存在,并且设置了sticky位,为真 [ -k /bin/ping ]
-p filename  如果 filename 存在,并且为有名管道(FIFO),真 [ -p /tmp/pipe ]
-r filename  如果 filename 存在,并且可读,则为真         [ -r /etc/passwd ]
-s filename  如果 filename 存在,并且大小不为零,为真     [ -s ./none-zero ]
-u filename  如果 filename 存在,并且为set-user-id,为真  [ -f $HOME/ak47 ]       
-w filename  如果 filename 存在,并且可写,则为真         [ -w /var/log/mail ] 
-x filename  如果 filename 存在,并且可执行,则为真       [ -x ./start.sh ]

下面这些不常用的:

-t fd        如果文件描述符被打开并指向一个终端,则为真   [ -t /proc/1/fd/10 ]
              【提示】在 /proc/进程号/fd 下可以找到文件描述符:)
-O filename  如果 filename 存在,并且被有效用户ID所拥有,则为真
-G filename  如果 filename 存在,并且被有效组ID所拥有,则为真
-S filename  如果 filename 存在,并且为一个socket,则为真 [ -S /tmp/mysql.sock ]
-N filename  如果 filename 存在,并且在上次读取后被修改过,则为真
-o optname   如果 shell 选项 optname 被开启,则为真
              【提示】使用 set -o 来查看
file1 -nt file2  如果 file1 比 file2 新,或者 file1 存在 file2 不存在,则为真
file1 -ot file2  如果 file1 比 file2 旧,或者 file2 存在 file1 不存在,则为真
file1 -ef file2  如果 file1 和 file2 都指向同样的设备(device)和索引节点号(inode numbers),则为真
              【提示】查看文件的索引节点可以用 ls -i 选项

以下是shell中判断字符串包含的方法:
方法一:利用grep查找
先打印长字符串,然后在长字符串中 grep 查找要搜索的字符串,用变量result记录结果

strA="long string"
strB="string"
result=$(echo $strA | grep "${strB}")
if [[ "$result" != "" ]]
then
  echo "包含"
else
  echo "不包含"
fi

如果结果不为空,说明strA包含strB。如果结果为空,说明不包含。
这个方法充分利用了grep 的特性,最为简洁。

方法二:利用字符串运算符

strA="helloworld"
strB="low"
if [[ $strA =~ $strB ]]
then
  echo "包含"
else
  echo "不包含"
fi

利用字符串运算符 =~ 直接判断strA是否包含strB。(这不是比第一个方法还要简洁吗!)

方法三:利用通配符

A="helloworld"
B="low"
if [[ $A == *$B* ]]
then
  echo "包含"
else
  echo "不包含"
fi

这个也很easy,用通配符*号代理strA中非strB的部分,如果结果相等说明包含,反之不包含。

方法四:利用case in 语句

thisString="1 2 3 4 5" # 源字符串
searchString="1 2" # 搜索字符串
case $thisString in 
  *"$searchString"*) echo Enemy Spot ;;
  *) echo nope ;;
esa

这个就比较复杂不推荐;

Centos7.x kvm设置桥接br0网络

KVM部署在Linux物理机的时候使用桥接网络比较方便,虚拟机可以和宿主机一样的网络进行上网数据交互,查看网卡em1的设置:

cat /etc/sysconfig/network-scripts/ifcfg-em1 
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTRPOTO=none
BRIDGE=br0
#IPADDR=10.0.0.6
#NETMASK=255.255.255.0
#GATEWAY=10.0.0.1
#DNS1=10.0.0.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=em1
UUID=009de6fd-475e-4d1e-b1fc-c12f57190113
DEVICE=em1
ONBOOT=yes

创建br0虚拟网卡配置文件:

 cat /etc/sysconfig/network-scripts/ifcfg-br0 
TYPE=Bridge
DEVICE=br0
PROXY_METHOD=none
BOOTPROTO=static
IPADDR=10.0.0.6
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS1=10.0.0.1
DEFROUTE=yes
ONBOOT=yes

绑定桥接并重启网络服务:

brctl addif br0 em1
systemctl restart network

正常情况下就可以使用br0桥接了,如果不能链接,尝试删除br0绑定:

brctl delif br0 em1    #解除绑定
ifconfig br0 down      #关闭br0
brctl delbr br0        ##删除br0

CentOS7.X使用MegaCli查看Raid信息

下载MegaCli-8.07.14-1

cd /opt
wget http://mirror.cogentco.com/pub/misc/MegaCli-8.07.14-1.noarch.rpm

安装:

rpm -ivh MegaCli-8.07.14-1.noarch.rpm

安装完毕后会在/opt/下面生成MegaRAID/MegaCLI目录,直接执行即可:

./MegaCli64 -FwTermLog -Dsply -aALL > /tmp/ttylog.txt    
创建 RAID 控制器日志 (ttylog)


./MegaCli64 -PDList -aALL > /tmp/disks.txt    
创建一个列表, 其中包含有关已安装的 RAID 控制器、虚拟磁盘和硬盘的信息

./MegaCli64 -LDInfo -LALL -aALL > /tmp/LDinfo.txt    
创建包含有关现有 RAID 卷和配置的信息的列表

./MegaCli64 -AdpAllInfo -aALL > /tmp/Adapterinfo.txt    
创建包含 RAID 控制器设置信息的列表

./MegaCli64 -AdpBbuCmd -aALL > /tmp/Battery.txt    
创建 RAID 控制器 (充电状态、学习周期等) 的电池状态的详细列表

./MegaCli64 -AdpEventLog -IncludeDeleted -f deleted.txt -aALL    
创建 RAID 控制器日志 (ttylog), 其中包含自第一个控制器初始化后的所有信息
(注意: 此文件将始终保存在了根文件夹中)

贴一张RAID 卷和配置的信息的图:
RAID.png
MegaCli命令使用:

查看所有物理磁盘信息
MegaCli -LDInfo -Lall -aALL 查raid级别
MegaCli -AdpAllInfo -aALL 查raid卡信息
MegaCli -PDList -aALL 查看硬盘信息
MegaCli -AdpBbuCmd -aAll 查看电池信息
MegaCli -FwTermLog -Dsply -aALL 查看raid卡日志

MegaCli常用参数介绍
MegaCli -adpCount 【显示适配器个数】
MegaCli -AdpGetTime –aALL 【显示适配器时间】
MegaCli -AdpAllInfo -aAll 【显示所有适配器信息】
MegaCli -LDInfo -LALL -aAll 【显示所有逻辑磁盘组信息】
MegaCli -PDList -aAll 【显示所有的物理信息】
MegaCli -AdpBbuCmd -GetBbuStatus -aALL |grep ‘Charger Status’ 【查看充电状态】
MegaCli -AdpBbuCmd -GetBbuStatus -aALL【显示BBU状态信息】
MegaCli -AdpBbuCmd -GetBbuCapacityInfo -aALL【显示BBU容量信息】
MegaCli -AdpBbuCmd -GetBbuDesignInfo -aALL 【显示BBU设计参数】
MegaCli -AdpBbuCmd -GetBbuProperties -aALL 【显示当前BBU属性】
MegaCli -cfgdsply -aALL 【显示Raid卡型号,Raid设置,Disk相关信息】
MegaCli -LDGetProp -Cache -L0 -a0 查看磁盘缓存策略

VIA:
https://www.cnblogs.com/276815076/p/3282422.html
https://www.dell.com/support/article/us/en/19/sln292232/%E9%80%9A%E8%BF%87%E4%BA%86%E8%A7%A3%E5%8E%8B-raid-%E6%8E%A7%E5%88%B6%E5%99%A8%E6%97%A5%E5%BF%97?lang=zh

MySQL查询所有视图并给用户授予指定视图权限

视图其实就是一张虚拟的表,所有也可以认为是一张表,MySQL查询所有视图:

show table status where comment='view'\G;

查询视图结构:

 DESC master_data_user;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| username  | varchar(255) | YES  |     | NULL    |       |
| org_id    | varchar(255) | YES  |     | NULL    |       |
| status    | varchar(255) | YES  |     | NULL    |       |
| name      | varchar(255) | YES  |     | NULL    |       |
| org_name  | varchar(255) | YES  |     | NULL    |       |
| email     | varchar(255) | YES  |     | NULL    |       |
| telephone | varchar(255) | YES  |     | NULL    |       |
| post      | varchar(255) | YES  |     | NULL    |       |
+-----------+--------------+------+-----+---------+-------+
8 rows in set (0.00 sec)

或者

SHOW TABLE STATUS LIKE 'master_data_user'\G;
*************************** 1. row ***************************
           Name: master_data_user
         Engine: NULL
        Version: NULL
     Row_format: NULL
           Rows: NULL
 Avg_row_length: NULL
    Data_length: NULL
Max_data_length: NULL
   Index_length: NULL
      Data_free: NULL
 Auto_increment: NULL
    Create_time: NULL
    Update_time: NULL
     Check_time: NULL
      Collation: NULL
       Checksum: NULL
 Create_options: NULL
        Comment: VIEW
1 row in set (0.00 sec)

创建data_view用户并授予单个视图权限:

grant select,show view on escdb.master_data_org to data_view@'192.168.%' IDENTIFIED BY 'xxxxxxx';
grant select,show view on escdb.master_data_user to data_view@'192.168.%' ;
flush privileges;

data_view登录后即只能查看master_data_org和master_data_user视图;
查看当前登录用户权限:

 show grants;
+----------------------------------------------------------------------------------+
| Grants for data_view@192.168.%                                                   |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'data_view'@'192.168.%'                                    |
| GRANT SELECT, SHOW VIEW ON `escdb`.`master_data_org` TO 'data_view'@'192.168.%'  |
| GRANT SELECT, SHOW VIEW ON `escdb`.`master_data_user` TO 'data_view'@'192.168.%' |
+----------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

河边

一个人的河边,经常能看见钓鱼大叔,基本很少见年轻人钓鱼;
美人蕉,菊花,香彩雀,风车草,绿化做的挺好;


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

Linux中FIN_WAIT2链接过多的解决方法

在对erp老的架构进行改造中,对外前端使用了Nginx,部署在CentOS中,通过查看当前系统链接发现有不少FIN_WAIT2链接:

[root@hd_my_n1 /]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
SYN_RECV 30
ESTABLISHED 968
FIN_WAIT2 301
TIME_WAIT 145

服务端由于某种原因关闭连接,如KEEPALIVE的超时,这样,作为主动关闭的服务端一方就会进入 FIN_WAIT2状态,但TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不象TIME_WAIT状态),所以如果CLIENT不关闭,这个FIN_WAIT_2状态将保持到系统重新启动,越来越多的FIN_WAIT_2状态会致使内核crash。
解决方法如下:
修改内核配置vim /etc/sysctl.conf ,加入以下内容:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog = 8192

然后执行

/sbin/sysctl -p

让参数生效。
参数说明:

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  修改系統默认的 TIMEOUT 时间
net.ipv4.tcp_max_syn_backlog = 8192  表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。

参考:CentOS下TIME_WAIT过多-问题处理方法

nginx warn an upstream response is buffered to a temporary file /usr/local/nginx/proxy_temp/3/47/0003311473 while reading upstream报错解决方法

今天发现nginx的log里面有报错,log如下

2019/06/10 19:01:46 [warn] 8294#0: *231715335 an upstream response is buffered to a temporary file /usr/local/nginx/proxy_temp/3/47/0003311473 while reading upstream, client: 144.123.15.66, server: oa.xxx.com.cn, request: "GET /sys/attachment/sys_att_main/sysAttMain.do?method=readDownload&fdId=16b406e3861578ee83d15344deb88105&open=1 HTTP/1.1", upstream: "http://10.254.2.16:80/sys/attachment/sys_att_main/sysAttMain.do?method=readDownload&fdId=16b406e3861578ee83d15344deb88105&open=1", host: "oa.xxx.com.cn", referrer: "http://oa.xxx.com.cn/km/review/km_review_main/kmReviewMain.do?method=view&fdId=16b4063ca15ddfca4ed8e3747d09968f"
2019/06/10 19:01:52 [warn] 8292#0: *231712177 an upstream response is buffered to a temporary file /usr/local/nginx/proxy_temp/4/47/0003311474 while reading upstream, client: 115.173.28.199, server: aqhcrm.xxx.com.cn, request: "GET /weixinfile/bonuspic/ebd192724baf49e782eb89a9f1b78e3f.png HTTP/1.1", upstream: "http://10.254.2.21:80/weixinfile/bonuspic/ebd192724baf49e782eb89a9f1b78e3f.png", host: "aqhcrm.xxx.com.cn", referrer: "http://aqhcrm.xxx.com.cn/modules/weixin/bonusSelf.html"

从error日志来看是nginx某一块的buffer设置的太小,(包含response header和response body)导致response结果不得不临时写到文件中,解决办法:
在nginx的http段,或location段增加如下参数,参数值根据实际应用需求调整,

proxy_buffering on;
client_max_body_size 500M;
client_body_buffer_size 500M;
proxy_buffer_size 5120k;
proxy_buffers 2560 5120k;
proxy_busy_buffers_size 5120k;
proxy_temp_file_write_size 5120k;

最后重启nginx报错日志消失;

最新

分类

归档

评论

其它