Rootop 服务器运维与web架构

2020-05-18
发表者 Venus
xargs清空文件已关闭评论

xargs清空文件

#目的:
查找指定目录下的日志文件,超过指定大小后就清空

#方法:

find /tmp -size +500M -type f | grep *.log | xargs -I dellist sh -c 'cat /dev/null > dellist'

大部分命令只能在命令行输入参数,不能用管道符传递参数。
xargs命令就是把标准输入做为执行命令的参数。

-I 作用是指定要替换的字符串,也就是把dellist替换为标准输入读取的字符串

2020-05-08
发表者 Venus
mysql导入报@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty错误已关闭评论

mysql导入报@@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty错误

从阿里云mysqldump的sql文件导入本地库报错

[root@localhost ~]# mysql -uroot -p$(cat mysql_password.txt) xxx < /home/backup/xxx/xxx2020-05-07-04-00-01.sql 
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

原因是阿里云rds自带主从复制,开启了gtid全局事务id用于保证主从复制一致,备份的时候没有忽略gtid,导致导入本地时报错。

方法1、

# 查看当前的gtid
mysql> select @@global.gtid_executed\G;

# 清空本地的gtid
mysql> reset master;
Query OK, 0 rows affected (0.04 sec)

方法2、删掉sql文件中的 SET @@GLOBAL.GTID_PURGED 2行

-- MySQL dump 10.13  Distrib 5.7.17, for linux-glibc2.5 (x86_64)
--
-- Host: rm-xxx.mysql.rds.aliyuncs.com    Database: xxx
-- ------------------------------------------------------
-- Server version       5.7.25-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;
SET @@SESSION.SQL_LOG_BIN= 0;

--
-- GTID state at the beginning of the backup 
--

SET @@GLOBAL.GTID_PURGED='6822560b-3659-11e8-afba-7cd30adaf22a:1-33310212,
79abd425-3659-11e8-8eeb-7cd30adaf28e:1-36989543';

方法3、

/usr/local/mysql/bin/mysqldump --set-gtid-purged=OFF
加上--set-gtid-purged=OFF参数再备份,这样就忽略。

2020-05-07
发表者 Venus
filebeat7.6.1修改索引名字后elasticsearch中没有生成新索引已关闭评论

filebeat7.6.1修改索引名字后elasticsearch中没有生成新索引

filebeat7.6.1修改索引名字后,比如下面这样,shop-api xxx

output.elasticsearch:
  hosts: ["http://192.168.0.10:9200"]
  index: "shop-api-%{[agent.version]}-%{+yyyy.MM.dd}"
setup.template.name: "shop-api"
setup.template.pattern: "shop-api-*"

启动后,发现在es中并没有生成新的索引。
filebeat有打印下面的日志信息

2020-05-07T02:40:53.010Z	INFO	[index-management]	idxmgmt/std.go:258	Auto ILM enable success.
2020-05-07T02:40:53.012Z	INFO	[index-management.ilm]	ilm/std.go:139	do not generate ilm policy: exists=true, overwrite=false
2020-05-07T02:40:53.012Z	INFO	[index-management]	idxmgmt/std.go:271	ILM policy successfully loaded.
2020-05-07T02:40:53.012Z	INFO	[index-management]	idxmgmt/std.go:410	Set setup.template.name to '{filebeat-7.6.1 {now/d}-000001}' as ILM is enabled.

提示开启了ILM策略

翻官方文档(https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html)后发现:
index配置部分中提示 The index setting is ignored when index lifecycle management is enabled
意思就是index设置的参数在索引生命周期管理(ilm)开启后会忽略。

查看ilm文档 https://www.elastic.co/guide/en/beats/filebeat/current/ilm.html 提示:
Starting with version 7.0, Filebeat uses index lifecycle management by default when it connects to a cluster that supports lifecycle management
从7.0版本开始,当elasticsearch支持生命周期管理时,filebeat默认使用索引生命周期管理,这样就导致自己修改的日志文件名无效了。

关闭ilm功能即可(setup.ilm.enabled: false)。

[root@node1 shop-api]# cat filebeat.yml
filebeat.inputs:
- type: log
  paths:
   - /mnt/logs/*.log
  fields:
   java: true
  fields_under_root: true
  multiline.pattern: '^[0-9]{2}:[0-9]{2}:[0-9]{2}.* \[http-nio'
  multiline.negate: true
  multiline.match: after

setup.ilm.enabled: false
output.elasticsearch:
  hosts: ["http://192.168.0.10:9200"]
  index: "shop-api-%{[agent.version]}-%{+yyyy.MM.dd}"
setup.template.name: "shop-api"
setup.template.pattern: "shop-api-*"

2020-04-30
发表者 Venus
nginx http重定向到https,post数据丢失。已关闭评论

nginx http重定向到https,post数据丢失。

nginx配置http跳转https

if ($scheme = http) {
	return 301 https://$host$request_uri;
}

如果状态码返回301或者302,当post数据到http协议时,重定向后会出现请求方法变为 get,post数据丢失。

解决这个问题就要换返回的状态码。

if ($scheme = http) {
	return 307 https://$host$request_uri;
}

307、308 都可以保持post数据的重定向,包括请求方法也不会变化。
307是临时,308是永久

所以当往一个http地址发送post请求,服务器重定向到https,要配置为307或者308状态码。

2020-04-29
发表者 Venus
阿里云ecs服务器arp映射表与实际mac地址不一致的疑问已关闭评论

阿里云ecs服务器arp映射表与实际mac地址不一致的疑问

最近在排查k8s问题的时候发现arp表中的mac地址和实际的mac地址不一致。但还能通信,这就很疑惑了。(以前也没注意过这个mac地址)
几台服务器都在在同一个可用区、同一个网络同一个安全组下。

# 服务器1
内网IP:172.19.34.91

[root@iZuf60rpsu8z9v5nzviztlZ ~]# ping 172.19.34.89 # ping 服务器2
PING 172.19.34.89 (172.19.34.89) 56(84) bytes of data.
64 bytes from 172.19.34.89: icmp_seq=1 ttl=64 time=0.208 ms

# 查看服务器1的arp

[root@iZuf60rpsu8z9v5nzviztlZ ~]# arp -e
Address                  HWtype  HWaddress           Flags Mask            Iface
172.17.0.9               ether   02:42:ac:11:00:09   C                     docker0
172.19.34.89             ether   ee:ff:ff:ff:ff:ff   C                     eth0

通过arp -e查看arp表,172.19.34.89 ip的mac地址为 ee:ff:ff:ff:ff:ff

# 服务器2

[root@iZuf60rpsu8z9v5nzviztmZ ~]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.19.34.89  netmask 255.255.240.0  broadcast 172.19.47.255
        ether 00:16:3e:0e:36:60  txqueuelen 1000  (Ethernet)
        RX packets 1248357423  bytes 321629365565 (299.5 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 794943098  bytes 186700299960 (173.8 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

服务器2通过ifconfig查看到的mac地址为 00:16:3e:0e:36:60

为何服务器1上arp表中服务器2的mac地址和实际的eth0网卡的mac地址不一致?

发工单后回答说:
ecs底层是虚拟化的网络,不是传统的物理网络。表项的学习是通过arp代理实现,为了避免大量ARP学习影响组件性能,所以看到的都是同一个MAC ee:ff:ff:ff:ff:ff ,是正常的现象。

同样一个问题,腾讯云回答并没有很直观的得到答案(也不知道是不是我表述有问题)。

再后来腾讯云客服回了个电话也只是说虚拟化架构的问题,并不影响使用。