Centos 7安装配置NTP网络时间同步服务器

现在的系统大多是微服务化架构,且部署方式大多为分布式集群化部署,也就是说系统的各个组件分布在不同的服务器中运行,导致时间同步对于系统的正常运行来说尤为重要, 由于时间不同同步,会导致系统出现各种异常

NTP是网络时间协议(Network Time Protocol),它是用来同步网络中各个计算机的时间的协议。本文,我们采用ntpd做时间同步,ntpd不仅仅是时间同步服务器,它还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步

时间时区概念理解:

GMT、UTC、CST、DST

UTC:

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

GMT:

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

CST:

中国标准时间 (China Standard Time)

GMT + 8 = UTC + 8 = CST

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

1、查看当前服务器时区&列出时区并设置时区(如已是正确时区,请略过):

查看当前系统时间、时区

$ timedatectl 
Local time: Thu 2018-10-11 13:03:04 CST
Universal time: Thu 2018-10-11 05:03:04 UTC
RTC time: Thu 2018-10-11 01:17:11
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a

$ timedatectl status
Local time: Thu 2018-10-11 13:03:09 CST
Universal time: Thu 2018-10-11 05:03:09 UTC
RTC time: Thu 2018-10-11 01:17:16
Time zone: Asia/Shanghai (CST, +0800)
NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
DST active: n/a

列出全世界所有的时区

# timedatectl list-timezones | grep Asia
...
Asia/Hong_Kong
Asia/Shanghai
Asia/TaipeiAsia/Urumqi
...

设置时区

# 方法1:
# 将时区设置为上海
$ timedatectl set-timezone Asia/Shanghai 
#方法2:
# 直接修改符号链接
$ rm /etc/localtime$ ln -s ../usr/share/zoneinfo/Asia/Shanghai /etc/localtime

若坚持要手动修改时间,先timedatectl set-ntp no。

# 设置日期和时间
$ timedatectl set-time '2018-10-11 09:00:00'
# 设置日期
$ timedatectl set-time '2018-10-11'
# 设置时间
$ timedatectl set-time '09:00:00'

# 方法2:使用date

$ date -s '2018-10-11 09:00:00'

同步系统时间到硬件时间

# 方法1:不建议硬件时间随系统时间变化
# 设置硬件时间随系统时间变化
$ timedatectl set-local-rtc 1
# 设置硬件时间不随系统时间变化
$ timedatectl set-local-rtc 0

# 方法2:
$ hwclock --systohc

是否启用自动同步时间

# 启用|停用自动同步时间
$ timedatectl set-ntp yes|no

# 上面的命令其实是启用、停用时间服务器,若安装了chrony服务,则等同于对该服务启停,若只安装了ntp,则是对ntp服务启停。
# 对chrony服务启停
$ systemctl start|stop chronyd
# 对ntp服务启停
$ systemctl start|stop ntpd

2、确认是否已安装ntp

【命令】rpm –qa | grep ntp

若只有ntpdate而未见ntp,则需删除原有ntpdate。如:

ntpdate-4.2.6p5-22.el7_0.x86_64

fontpackages-filesystem-1.44-8.el7.noarch

python-ntplib-0.3.2-1.el7.noarch

删除已安装ntp
【命令】yum –y remove ntpdate-4.2.6p5-22.el7.x86_64

重新安装ntp
【命令】yum –y install ntp

3、安装NTP

yum install -y ntp

说明:如果本机不支持联网,则可以找一台可以上网的服务器把安装包下载下来,然后做离线安装:

yum install --downloadonly --downloaddir=/home ntp

修改NTP配置

/etc/ntp.conf

#在配置中增加以下配置:
#允许上层时间服务器主动修改本机时间

restrict time.pool.aliyun.com nomodify notrap noquery

#允许所有主机通过本机同步时间

restrict default nomodify notrap

#外部时间服务器不可用时,以本地时间作为时间服务

server time.pool.aliyun.com iburst

server 127.127.1.0
fudge 127.127.1.0 stratum 10

修改完成后保存退出并重启ntp(systemctl restart ntpd)。

说明:
#nomodfiy:客户端不能更改服务端的时间参数,但是客户端可以通过服务端进行网络校时。
#noquery:不提供客户端的时间查询。
#notrap:不提供trap这个远程时间登录的功能

4、启动NTP服务&开机启动设置

#启动NTP服务

systemctl start ntpd

#将NTP服务设置为开机启动

systemctl enable ntpd

5、chrony的安装配置

安装chrony

$ yum -y install chrony

配置chrony

$ vim /etc/chrony.conf
server ntp1.alyun.com
server ntp2.alyun.com
server ntp3.alyun.com
#server 0.centos.pool.ntp.org iburst...

启动chrony

$ systemctl start chronyd

6、配置计划任务,使用ntpdate同步时间

# 启动并开机启动计划任务cron
$ systemctl start crond
$ systemctl enable crond

# 配置计划任务,每5分钟同步一次
$ crontab -e
*/5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com

tp6 解决跨域问题

在和前端js对接接口的时候遇到跨域问题,记录一下

方法一
通过route文件配置
文件位置 : app/api/route/app.php

<?php
/**
 * Created by PhpStorm.
 * User: 雪后西溏 <[email protected]>
 * Date: 2021-02-23
 * Time: 16:06
 */

use think\facade\Route;

// 手写资源路由
Route::group(':v/:c', function () {
    Route::get('', '/:v.:c/index');
    Route::get('create', '/:v.:c/create');
    Route::get(':id/edit', '/:v.:c/edit');
    Route::get(':id', '/:v.:c/read');
    Route::post('', '/:v.:c/save');
    Route::put(':id', '/:v.:c/update');
    Route::delete(':id', '/:v.:c/delete');
})->allowCrossDomain([
    /** 设置跨域允许的header头信息,新增token字段 */
    'Access-Control-Allow-Headers'     => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, authKey, Accept, Origin, token',
    /** 允许所有请求 */
    'Access-Control-Allow-Origin'      => '*',
    'Access-Control-Allow-Credentials' => 'true',
]);

更新后写法

<?php
/**
 * Created by PhpStorm.
 * User: 雪后西溏 <[email protected]>
 * Date: 2021-06-16
 * Time: 10:14
 */

use think\facade\Route;

// 开启资源路由
Route::resource(':v/:c', ':v.:c');
// 配置跨域
Route::allowCrossDomain([
    /** 设置跨域允许的header头信息 , 增加token字段 */
    'Access-Control-Allow-Headers'     => 'Authorization, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With, authKey, Accept, Origin, token',
    //    允许所有请求
    'Access-Control-Allow-Origin'      => '*',
]);

参见 官方文档
https://www.kancloud.cn/manual/thinkphp6_0/1037507

 

方法二

设置全局中间件

在 ./app/middleware.php 文件中启用内置中间件即可

\think\middleware\AllowCrossDomain::class
<?php
// 全局中间件定义文件
return [
    // 全局请求缓存
    // \think\middleware\CheckRequestCache::class,
    // 多语言加载
    // \think\middleware\LoadLangPack::class,
    // Session初始化
    // \think\middleware\SessionInit::class
    \think\middleware\AllowCrossDomain::class,
];

 

 

linux命令总结之date命令

命令简介:

date 根据给定格式显示日期或设置系统日期时间。print or set the system date and time

指令所在路径:/bin/date

命令语法:

date [OPTION]… [+FORMAT]

date [-u|–utc|–universal] [MMDDhhmm[[CC]YY][.ss]]

命令参数:

参数 描述
-d 显示字符串描述的时间
-f 显示DATEFILE文件中的每行时间
-r 显示文件的最后修改时间
-R 以RFC-2822兼容日期格式显示时间
-rfc-2822 以RFC-2822兼容日期格式显示时间
-s 设置时间为string
-u 显示或设定为Coordinated Universal Time时间格式
–help 显示date命令的帮助信息
–version 显示date命令的版本信息

Format参数格式

要说写这位程序的 David MacKenzie老兄,真是事无巨细啊,居然整了这么多格式参数,佩服佩服。

参数 描述
%% 显示字符%
%a 星期几的缩写(Sun..Sat)
%A 星期几的完整名称(Sunday…Saturday)
%b 月份的缩写(Jan..Dec)
%B 月份的完整名称(January..December)
%c 日期与时间。只输入date指令也会显示同样的结果
%C 世纪(年份除100后去整) [00-99]
%d 日期(以01-31来表示)。
%D 日期(含年月日)。
%e 一个月的第几天 ( 1..31)
%F 日期,同%Y-%m-%d
%g 年份(yy)
%G 年份(yyyy)
%h 同%b
%H 小时(00..23)
%I 小时(01..12)
%j 一年的第几天(001..366)
%k 小时( 0..23)
%l 小时( 1..12)
%m 月份(01..12)
%M 分钟(00..59)
%n 换行
%N 纳秒(000000000..999999999)
%p AM or PM
%P am or pm
%r 12小时制时间(hh:mm:ss [AP]M)
%R 24小时制时间(hh:mm)
%s 从00:00:00 1970-01-01 UTC开始的秒数
%S 秒(00..60)
%t 制表符
%T 24小时制时间(hh:mm:ss)
%u 一周的第几天(1..7); 1 表示星期一
%U 一年的第几周,周日为每周的第一天(00..53)
%V 一年的第几周,周一为每周的第一天 (01..53)
%w 一周的第几天 (0..6); 0 代表周日
%W 一年的第几周,周一为每周的第一天(00..53)
%x 日期(mm/dd/yy)
%X 时间(%H:%M:%S)
%y 年份(00..99)
%Y 年份 (1970…)
%z RFC-2822 风格数字格式时区(-0500)
%Z 时区(e.g., EDT), 无法确定时区则为空

 

使用示例:

1: 查看date命令帮助信息

 date --help
 man date

2:运用-d参数

[root@Gin scripts]# date
Sun Jan 29 10:46:03 CST 2017
[root@Gin scripts]# date -d now
Sun Jan 29 10:46:07 CST 2017
[root@Gin scripts]# date -d 'next monday'
Mon Jan 30 00:00:00 CST 2017
[root@Gin scripts]# date -d yesterday +%Y%m%d
20170128

3:显示文件中的时间

[root@Gin scripts]# cat >date.txt
2013-11-17 10:54:00
2013-11-22 11:11:11

[root@Gin scripts]# more date.txt
2013-11-17 10:54:00
2013-11-22 11:11:11

[root@Gin scripts]# date -f date.txt
Sun Nov 17 10:54:00 CST 2013
Fri Nov 22 11:11:11 CST 2013

4:显示文件最后修改的时间

[root@Gin scripts]# date -r date.txt
Sun Jan 29 10:49:11 CST 2017

5:按各种格式显示当前日期时间
这个命令的格式参数实在是太多了,在此没有必要每一个参数都尝试一遍,大家可以对照Format参数表,自己敲一敲命令实践一下。

[root@Gin scripts]# date +%Y
2017
[root@Gin scripts]# date +%m
01
[root@Gin scripts]# date +%D
01/29/17
[root@Gin scripts]# date '+%Y-%m-%d'
2017-01-29
[root@Gin scripts]# date +%Y-%m-%d
2017-01-29
[root@Gin scripts]# date +%m/%d/%y
01/29/17

6: 设置系统时间

[root@Gin scripts]# date -s "2016-11-11 00:00:00"
Fri Nov 11 00:00:00 CST 2016
[root@Gin scripts]# date
Fri Nov 11 00:00:05 CST 2016

7:请给出如下格式的date命令,如:11-02-26。再给出实现按周输出,如:周六为6,请分别给出命令

[root@Gin scripts]# date +%y-%m-%d
17-01-29
[root@Gin scripts]# date +%F
2017-01-29
[root@Gin scripts]# date "+%Y-%m-%d %H:%M:%S"
2017-01-29 10:57:02

生产场景中常用时间格式来打包数据:

[root@Andy andy]# tar zcvf etc-$(date +%F).tar.gz /etc
[root@Andy andy]# tar zcvf etc-`date +%F`.tar.gz /etc
解析命令方法:反引号,或$(),如上
[root@Andy andy]# date +%w  ##显示周,0-6

显示过去与未来时间:

[root@Andy andy]# date +%F
2016-11-16
[root@Andy andy]# date +%F -d "-1day"
2016-11-15
[root@Andy andy]# date +%F -d "+2day"
2016-11-18
[root@Andy andy]# date +%F -d "+24hour"
2016-11-17
[root@Andy andy]# date +%F-%H -d "+2hour"
2016-11-16-14

centos设置时区且自动同步

Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC)。

系统时间:指当前Linux Kernel中的时间。

硬件时间:主板上有电池供电的时间。

查看系统时间的命令: #date

设置系统时间的命令: #date –set(月/日/年 时:分:秒)

例:#date –set “10/11/10 10:15”

查看硬件时间的命令: # hwclock

设置硬件时间的命令: # hwclock –set –date = (月/日/年 时:分:秒)

上述提到的是手动设置时间到一个时间点,可能与当前网络的时间有误差。下面介绍一下与时间服务器上的时间同步的方法

 

1.查看时间

[root@bogon ~]# date
Thu Apr 4 11:24:24 CST 2019

2.使用date -s修改时间

[root@bogon ~]# date -s "2019/4/4 11:26" 
Thu Apr  4 11:26:00 CST 2019

3.修改时区

使用新的时区文件覆盖系统默认时区
 # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

4.安装ntpdate

yum install ntpdate -y

5.同步网络时间

ntpdate ntp1.aliyun.com

6.保存为bios时间

同步BIOS时钟,强制将系统时间写入CMOS,使之永久生效,避免系统重启后恢复成原时间。
# clock -w

7.设置crontab同步时间

59 23 * * *    ntpdate ntp1.aliyun.com
*  *  *  *  *  command 
分 时 日 月 周 命令 
第1列表示分钟1~59 每分钟用*或者 */1表示 
第2列表示小时1~23(0表示0点) 
第3列表示日期1~31 
第4列表示月份1~12 
第5列标识号星期0~6(0表示星期天) 
第6列要运行的命令

8.查看bios时间

[root@bogon ~]# hwclock  -r
Thu 04 Apr 2019 11:35:20 AM CST  -0.365289 seconds

推荐一个国产的SSH工具FinalShell ,服务器管理,远程桌面加速软件,支持Windows,macOS,Linux

fs5.png

之前管理Linux一直用的是Xshell+xftp的搭配,不得不说,两者的结合还是很完善的,用起来也很方便,但是xshell的界面风格一直有些“反人类”,不止一个同事问过我“除了xshell外有没有其他的好用的ssh连接软件”,最令我生气的是有一次的升级把我的所有服务器的连接凭证全部弄丢了,但我一直没有想到有什么能代替的,要么比xshell更老旧,要么功能不全面。最近不知道为什么看到好多人推荐FinalShell,讲真,我之前是没有听说过的,今天试了一下不得不说真的很强大,接下来今天打算用用试试稳定性如何。
支持Windows,Mac OS X,Linux
FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.
特色功能:

免费海外服务器远程桌面加速,ssh加速,双边tcp加速,内网穿透.

官网:http://www.hostbuf.com/

FinalShell是一体化的的服务器,网络管理软件,不仅是ssh客户端,还是功能强大的开发,运维工具,充分满足开发,运维需求.
特色功能:
免费海外服务器远程桌面加速,ssh加速,双边tcp加速,内网穿透.

Windows版下载地址:
http://www.hostbuf.com/downloads/finalshell_install.exe

Mac版,Linux版安装及教程:
http://www.hostbuf.com/t/1059.html

更新日志:
http://www.hostbuf.com/t/989.html

主要特性:

1.多平台支持Windows,Mac OS X,Linux

2.多标签,批量服务器管理.

3.支持登录Ssh和Windows远程桌面.

4.漂亮的平滑字体显示,内置100多个配色方案.

5.shell,sftp同屏显示,同步切换目录.

6.命令自动提示,智能匹配,输入更快捷,方便.

7.sftp支持,通过各种优化技术,加载更快,切换,打开目录无需等待.

8.服务器网络,性能实时监控,无需安装服务器插件.

9.内置海外服务器加速,加速远程桌面和ssh连接,操作流畅无卡顿.

10.双边加速功能,大幅度提高访问服务器速度.

11.内存,Cpu性能监控,Ping延迟丢包,Trace路由监控.

12.实时硬盘监控.

13.进程管理器.

14.快捷命令面板,可同时显示数十个命令.

15.内置文本编辑器,支持语法高亮,代码折叠,搜索,替换.

16.ssh和远程桌面均支持代理服务器.

17.打包传输,自动压缩解压.

18.免费内网穿透,无需设置路由器,无需公网ip.

界面截图:

Shell终端
fs5.png
p2.png 
p4.pngp6.png
进程管理器
task_manager.png
主机检测,Ping监控,Trace实时跟踪
ping_tracert.png

高级网络监控,监控每个进程监听的端口,以及网络连接状态.222.png
双边加速
http://www.hostbuf.com/upload/image/20170222/1487738221746093924.png
打包传输,自动压缩解压,适合传输大量文件,文件夹和文本文件.
z1.pngz2.png

Linux(centos8) Spug自动化运维平台生产环境一键安装

SPUG是一个面向中小型企业的自动化运维平台,方便管理主机,代码发布,任务计划,配置中心,监控等功能。

官方文档上推荐使用docker安装,我这里使用手动部署。

操作系统

centos8

安装命令

curl https://spug.dev/installer/spug-installer | bash

默认设置

# 默认代码安装路径:
/data/spug

# 默认创建的数据库账号
用户:spug
密码:spug.dev

# 默认创建的系统管理员
账户:admin
密码:spug.dev

如果访问时出现 403 Forbidden 的错误页面,大部分情况下是 selinux 的问题。你可以执行 setenforce 0 来临时关闭 selinux 测试能否正常访问。

安全建议

默认安装的 Redis 服务监听在 127.0.0.1 但未设置密码,如需启用密码认证,请参考 如何配置使用带密码的 Redis 服务?
默认安装了 Mariadb 作为数据存储服务,监听在 127.0.0.1 创建了用户名为 spug 密码为 spug.dev 的用户,安全起见请自行更改该密码,并修改 /data/spug/spug_api/spug/overrides.py 使用新密码。
确保服务端接收到请求 HTTP Header 的 X-Real-IP 为真实的客户端地址,Spug 会使用该IP提高安全性(当登用户的IP发生变化时Token自动失效)。
如果想更多的控制安装过程,请参考 生产环境部署文档 进行手动部署配置。

访问测试

在浏览器中输入 http://localhost:80 访问。

演示环境

演示地址:https://demo.spug.dev

演示账号: admin
演示密码:spug

特性

批量执行: 主机命令在线批量执行
在线终端: 主机支持浏览器在线终端登录
文件管理: 主机文件在线上传下载
任务计划: 灵活的在线任务计划
发布部署: 支持自定义发布部署流程
配置中心: 支持KV、文本、json等格式的配置
监控中心: 支持站点、端口、进程、自定义等监控
报警中心: 支持短信、邮件、钉钉、微信等报警方式
优雅美观: 基于 Ant Design 的UI界面
开源免费: 前后端代码完全开源

SPUG自动化运维平台的简单安装

Spug简介

Spug面向中小型企业设计的轻量级无 Agent 的自动化运维平台,整合了主机管理、主机批量执行、主机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中心、监控、报警等一系列功能。

一、安装SPUG

官方文档上推荐使用docker安装,我这里使用手动部署。

1、拉取spug项目代码

gitclone https://github.com/openspug/spug /data/spug cd /data/spug git checkout v2.3.13

我这里指定的版本是 v2.3.13,大家根据需要自行修改。

2、下载编译好的前端项目

https://gitee.com/openspug/spug/releases

比如:spug_web_2.3.13.tar.gz

tar xf spug_web_2.3.13.tar.gz -C /data/spug/spug_web/

3、安装依赖,创建运行环境

yum install mariadb-devel python3-devel gcc openldap-devel redis nginx supervisor

如果是 cetnos8 系统,报错

No matchfor argument: supervisor

请为 centos8 安装 EPEL 源

yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm

创建虚拟环境

cd /data/spug/spug_api
python3 -m venv venv
source venv/bin/activate

安装python包

pip install -r requirements.txt -i https://pypi.doubanio.com/simple/
pip install gunicorn mysqlclient -i https://pypi.doubanio.com/simple/

注意,这里安装包后,先不退出python虚拟环境,后面初始化数据库和创建管理员账号会需要。

4、配置数据库,我这里使用mysql,大家自行选择

vi spug_api/spug/overrides.py
DEBUG = False
DATABASES = {
    'default': {
        'ATOMIC_REQUESTS': True,
        'ENGINE':'django.db.backends.mysql',
        'NAME':'spug',           # 替换为自己的数据库名,请预先创建好编码为utf8mb4的数据库
        'USER':'root',           # 数据库用户名
        'PASSWORD':'123456',     # 数据库密码
        'HOST':'192.168.1.222',  # 数据库地址
        'OPTIONS': {
            'charset':'utf8mb4',
            'sql_mode':'STRICT_TRANS_TABLES',
            #'unix_socket':'/opt/mysql/mysql.sock' # 如果是本机数据库,且不是默认安装的Mysql,需要指定Mysql的socket文件路径
        }
    }
}

注意,数据库地址,用户名,密码,请自行修改。

5、初始化数据库

cd /data/spug/spug_api
python manage.py initdb

注意这里,需要在python虚拟环境中运行上述命令,不然在我的 centos8 中会报 bash: python: 未找到命令

6、创建默认管理员账号

python manage.py useradd -u admin -p admin -s -n 超级管理员

7、创建启动服务脚本

vi /etc/supervisord.d/spug.ini
[program:spug-api]
command = bash /data/spug/spug_api/tools/start-api.sh
autostart = true
stdout_logfile = /data/spug/spug_api/logs/api.log
redirect_stderr = true
 
[program:spug-ws]
command = bash /data/spug/spug_api/tools/start-ws.sh
autostart = true
stdout_logfile = /data/spug/spug_api/logs/ws.log
redirect_stderr = true
 
[program:spug-worker]
command = bash /data/spug/spug_api/tools/start-worker.sh
autostart = true
stdout_logfile = /data/spug/spug_api/logs/worker.log
redirect_stderr = true
 
[program:spug-monitor]
command = bash /data/spug/spug_api/tools/start-monitor.sh
autostart = true
stdout_logfile = /data/spug/spug_api/logs/monitor.log
redirect_stderr = true
 
[program:spug-scheduler]
command = bash /data/spug/spug_api/tools/start-scheduler.sh
autostart = true
stdout_logfile = /data/spug/spug_api/logs/scheduler.log
redirect_stderr = true

8、创建前端nginx配置文件

vi /etc/nginx/conf.d/spug.conf
server {
    listen 80;
    server_name 192.168.1.111;     # 修改为自定义的访问域名
    root /data/spug/spug_web/build/;
    client_max_body_size 20m;   # 该值会影响文件管理器可上传文件的大小限制,请合理调整
 
    gzip  on;
    gzip_min_length  1k;
    gzip_buffers     4 16k;
    gzip_http_version 1.1;
    gzip_comp_level 7;
    gzip_types       text/plain text/css text/javascript application/javascript application/json;
    gzip_vary on;
 
    location ^~ /api/ {
        rewrite ^/api(.*)$1 break;
        proxy_pass http://127.0.0.1:9001;
        proxy_read_timeout 180s;
        proxy_redirect off;
        proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
    }
 
    location ^~ /api/ws/ {
        rewrite ^/api(.*)$1 break;
        proxy_pass http://127.0.0.1:9002;
        proxy_http_version 1.1;
        proxy_set_header Upgrade$http_upgrade;
        proxy_set_header Connection"Upgrade";
        proxy_set_header X-Forwarded-For$proxy_add_x_forwarded_for;
    }
 
    location / {
        try_files$uri /index.html;
    }
}

注意,我这里 server_name 配置的是 192.168.111,大家可以根据情况自行修改。

9、启动服务

systemctl enable nginx
systemctl enable redis
systemctl enable supervisord
 
systemctl restart nginx
systemctl restart redis
systemctl restart supervisord

10、退出python虚拟环境

deactivate

11、访问 192.168.1.111,如果一直转圈,看看防火墙。

常见问题:

如果访问时报 请求失败: 502 Bad Gateway,通过查看nginx错误日志

cat /var/log/nginx/error.log
failed (13: Permission denied)while connecting to upstream

尝试暂时关闭 selinux

setenforce 0

或者永久关闭

vi /etc/selinux/config

中将 SELINUX=disabled,重启系统。

MySQL数据库分库分表

数据库分库分表

前言

公司最近在搞服务分离,数据切分方面的东西,因为单张包裹表的数据量实在是太大,并且还在以每天60W的量增长。 之前了解过数据库的分库分表,读过几篇博文,但就只知道个模糊概念, 而且现在回想起来什么都是模模糊糊的。

今天看了一下午的数据库分库分表,看了很多文章,现在做个总结,“摘抄”下来。(但更期待后期的实操) 会从以下几个方面说起: 第一部分:实际网站发展过程中面临的问题。 第二部分:有哪几种切分方式,垂直和水平的区别和适用面。 第三部分:目前市面有的一些开源产品,技术,它们的优缺点是什么。 第四部分:可能是最重要的,为什么不建议水平分库分表!?这能让你能在规划前期谨慎的对待,规避掉切分造成的问题。

名词解释

库:database;表:table;分库分表:sharding

数据库架构演变

刚开始我们只用单机数据库就够了,随后面对越来越多的请求,我们将数据库的写操作和读操作进行分离, 使用多个从库副本(Slaver Replication)负责读,使用主库(Master)负责写, 从库从主库同步更新数据,保持数据一致。架构上就是数据库主从同步。 从库可以水平扩展,所以更多的读请求不成问题。

但是当用户量级上来后,写请求越来越多,该怎么办?加一个Master是不能解决问题的, 因为数据要保存一致性,写操作需要2个master之间同步,相当于是重复了,而且更加复杂。

这时就需要用到分库分表(sharding),对写操作进行切分。

分库分表前的问题

任何问题都是太大或者太小的问题,我们这里面对的数据量太大的问题。

用户请求量太大

因为单服务器TPS,内存,IO都是有限的。 解决方法:分散请求到多个服务器上; 其实用户请求和执行一个sql查询是本质是一样的,都是请求一个资源,只是用户请求还会经过网关,路由,http服务器等。

单库太大

单个数据库处理能力有限;单库所在服务器上磁盘空间不足;单库上操作的IO瓶颈 解决方法:切分成更多更小的库

单表太大

CRUD都成问题;索引膨胀,查询超时 解决方法:切分成多个数据集更小的表。

分库分表的方式方法

一般就是垂直切分和水平切分,这是一种结果集描述的切分方式,是物理空间上的切分。 我们从面临的问题,开始解决,阐述: 首先是用户请求量太大,我们就堆机器搞定(这不是本文重点)。

然后是单个库太大,这时我们要看是因为表多而导致数据多,还是因为单张表里面的数据多。 如果是因为表多而数据多,使用垂直切分,根据业务切分成不同的库。

如果是因为单张表的数据量太大,这时要用水平切分,即把表的数据按某种规则切分成多张表,甚至多个库上的多张表。 分库分表的顺序应该是先垂直分,后水平分。 因为垂直分更简单,更符合我们处理现实世界问题的方式。

垂直拆分

  1. 垂直分表也就是“大表拆小表”,基于列字段进行的。一般是表中的字段较多,将不常用的, 数据较大,长度较长(比如text类型字段)的拆分到“扩展表“。 一般是针对那种几百列的大表,也避免查询时,数据量太大造成的“跨页”问题。
  2. 垂直分库垂直分库针对的是一个系统中的不同业务进行拆分,比如用户User一个库,商品Producet一个库,订单Order一个库。 切分后,要放在多个服务器上,而不是一个服务器上。为什么? 我们想象一下,一个购物网站对外提供服务,会有用户,商品,订单等的CRUD。没拆分之前, 全部都是落到单一的库上的,这会让数据库的单库处理能力成为瓶颈。按垂直分库后,如果还是放在一个数据库服务器上, 随着用户量增大,这会让单个数据库的处理能力成为瓶颈,还有单个服务器的磁盘空间,内存,tps等非常吃紧。 所以我们要拆分到多个服务器上,这样上面的问题都解决了,以后也不会面对单机资源问题。数据库业务层面的拆分,和服务的“治理”,“降级”机制类似,也能对不同业务的数据分别的进行管理,维护,监控,扩展等。 数据库往往最容易成为应用系统的瓶颈,而数据库本身属于“有状态”的,相对于Web和应用服务器来讲,是比较难实现“横向扩展”的。 数据库的连接资源比较宝贵且单机处理能力也有限,在高并发场景下,垂直分库一定程度上能够突破IO、连接数及单机硬件资源的瓶颈。

水平拆分

  1. 水平分表针对数据量巨大的单张表(比如订单表),按照某种规则(RANGE,HASH取模等),切分到多张表里面去。 但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈。不建议采用。
  2. 水平分库分表将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。 水平分库分表能够有效的缓解单机和单库的性能瓶颈和压力,突破IO、连接数、硬件资源等的瓶颈。
  3. 水平分库分表切分规则
    1. RANGE从0到10000一个表,10001到20000一个表;
    2. HASH取模一个商场系统,一般都是将用户,订单作为主表,然后将和它们相关的作为附表,这样不会造成跨库事务之类的问题。 取用户id,然后hash取模,分配到不同的数据库上。
    3. 地理区域比如按照华东,华南,华北这样来区分业务,七牛云应该就是如此。
    4. 时间按照时间切分,就是将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据 被查询的概率变小,所以没必要和“热数据”放在一起,这个也是“冷热数据分离”。

分库分表后面临的问题

事务支持

分库分表后,就成了分布式事务了。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价; 如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。

多库结果集合并(group by,order by)

TODO

跨库join

TODO 分库分表后表之间的关联操作将受到限制,我们无法join位于不同分库的表,也无法join分表粒度不同的表, 结果原本一次查询能够完成的业务,可能需要多次查询才能完成。 粗略的解决方法: 全局表:基础数据,所有库都拷贝一份。 字段冗余:这样有些字段就不用join去查询了。 系统层组装:分别查询出所有,然后组装起来,较复杂。

分库分表方案产品

目前市面上的分库分表中间件相对较多,其中基于代理方式的有MySQL Proxy和Amoeba, 基于Hibernate框架的是Hibernate Shards,基于jdbc的有当当sharding-jdbc, 基于mybatis的类似maven插件式的有蘑菇街的蘑菇街TSharding, 通过重写spring的ibatis template类的Cobar Client。

2021年6月黑苹果免驱动独显卡列表

PC、笔记本按win键+F、mac电脑按command + F 输入关键字搜索你要找的显卡。

macOS big sur 11.4 免驱动独显

2021-04-21苹果发布了 macOS 11.4 的首个 Beta 测试版本,为 Intel Mac 机型添加了对 AMD RDNA 2 架构的 Navi 系列 GPU 的支持。已经支持 AMD Radeon RX 6800 / 6800 XT / 6900 XT 显卡。

2021年06月08日上市的专业图形卡

Radeon Pro W6000 系列

Radeon Pro W6800

Radeon Pro W6600

Radeon RX 6600

Radeon RX 6500

Radeon RX 6500 XT

Radeon RX 6600 XT

Radeon RX 6700

Radeon RX 6700 XT

Radeon RX 6800

Radeon RX 6800 XT

Radeon RX 6900 XT

macOS Mojave / macOS Catalina/big sur 系统下AMD免驱动独显:

5700XT 10.15以上系统免驱动
5600XT 10.15以上系统免驱动
5500XT 10.15以上系统免驱动

Radeon Pro W5700 10.15以上系统免驱动

Vega VII
Vega FE (Vega Frontier Edition Air)
Vega 64
Vega 56
Vega Nano
Pro SSG

RX 590
RX 580 2304SP
RX 570
RX 560 (DP输)
RX 560D
RX 550 (DP输出,67FFID的卡)
RX 480
RX 470
RX 470D (DP输出)
RX 460
Pro Duo (Fiji)

WX 9100
WX 8200
WX 7100
WX 5100
WX 4100

W9100
W9100 32GB
W9000
W8100
W8000
W7100
W7000

W5500

W5500X
W5100
W5000
R9 Fury
R9 Fury X
R9 Nano
R9 380
R9 280X
R9 280
R9 370X
R9 270X
HD7990 (DP输出)
HD7970 (DP输出)
HD7950 (DP输出)
HD7870 (DP输出)
HD7850 (DP输出)

最新版RX590 GEM 目前无法驱动(这个卡为RX580 2048马甲版本,有能力就刷570BIOS),另外RX580 2048SP 需要刷570的BIOS才能在macOS系统免驱动!

以上所有显卡有DP接口的,首选都用DP输出。另外XFX品牌的显卡谨慎购买,如果你有能力刷BIOS就考虑。

macOS Mojave / macOS Catalina /big Sur 系统下Nvidia免驱动独显:

GTXTitan
GTXTitan Z
GTX Titan Black
GTX690
GTX680
GTX760
GTX770
GTX780
GTX780Ti
GTX650
GTX650Ti
GT640
GT620
GT710
GT740
K6000
K5200
K5000
K4000
K4200
K2000
K2000D
K600
K420

以下部分有闪屏花屏现象:

GTX650Ti Boost
GTX660
GTX660Ti
GTX670
GT720
GT730
GT640

macOS 10.13.6系统下可以驱动的Nvidia独显:

GTX Titan X(GP 102-400 Pascal核心)
GTX Titan Xp(GP 102-450 Pascal核心)
GTX 1080/ti
GTX 1070/ti
GTX 1060/ti
GTX 1050/ti
GTX Titan X(GM 200 Maxwell core)
GTX 980/ti
GTX 970
GTX 960
GTX 950
GTX 750/ti
GTX 745
GT 1030
Quadro Mxxxx
Quadro Pxxx
Quadro Pxxxx
Quadro GP100
NVS 510

所有开普勒架构核心的N卡都可以安装WebDriver驱动实现独显驱动。麦克斯韦,帕斯卡,伏特,图灵架构等构架独显无法驱动。

如:P620,P600,P400、P6000,P5200,P5000、GTX2060,GTX2070,GTX2080、RTX2060,RTX2070,RTX2080,RTX2080TI都无法在macOS 10.13.x及以上系统驱动。

10.14-10.15需要折腾仿冒的AMD显卡:

R9 260/360
R9 270/370
R9 270X/370X
R9 280/380
R9 280X/380X
R9 390
R9 390X
R7 260X/360X
HD7750
R7 260x / 360x
R7 265
R9 Nano
R9 Fury
R9 Fury x
R7 240
R7 250

关于硬解:

N卡单卡在mac下是不支持硬解的,因为开普勒架构在mac系统下只有基础metal的,无视频解码器功能。

Intellij IDEA快捷键大全汇总(Mac )

温馨提示:在 IntelliJ IDEA 中有两个 Mac 版本的快捷键,分别为 Mac OS X 和 Mac OS X 10.5+, 其中 Mac OS X 10.5+ 为 IntelliJ IDEA 默认的快捷键版本。此外,建议将 Mac 系统中与 IntelliJ IDEA 冲突的快捷键取消或更改,不建议改 IntelliJ IDEA 的默认快捷键。

Mac 键盘符号和修饰键说明
⌘ ——> Command
⇧ ——> Shift
⌥ ——> Option
⌃ ——> Control
↩︎ ——> Return/Enter
⌫ ——> Delete
⌦ ——> 向前删除键(Fn + Delete)
↑ ——> 上箭头
↓ ——> 下箭头
← ——> 左箭头
→ ——> 右箭头
⇞ ——> Page Up(Fn + ↑)
⇟ ——> Page Down(Fn + ↓)
⇥ ——> 右制表符(Tab键)
⇤ ——> 左制表符(Shift + Tab)
⎋ ——> Escape(Esc)
End ——> Fn + →
Home ——> Fn + ←

Part 1:Editing(编辑)

 

快捷键 作用
Control + Space 基本的代码补全(补全任何类、方法、变量)
Control + Shift + Space 智能代码补全(过滤器方法列表和变量的预期类型)
Command + Shift + Enter 自动结束代码,行末自动添加分号
Command + P 显示方法的参数信息
Control + J 快速查看文档
Shift + F1 查看外部文档(在某些代码上会触发打开浏览器显示相关文档)
Command + 鼠标放在代码上 显示代码简要信息
Command + F1 在错误或警告处显示具体描述信息
Command + N, Control + Enter, Control + N 生成代码(gettersetterhashCodeequalstoString、构造函数等)
Control + O 覆盖方法(重写父类方法)
Control + I 实现方法(实现接口中的方法)
Command + Option + T 包围代码(使用if...elsetry...catchforsynchronized等包围选中的代码)
Command + / 注释 / 取消注释与行注释
Command + Option + / 注释 / 取消注释与块注释
Option + 方向键上 连续选中代码块
Option + 方向键下 减少当前选中的代码块
Control + Shift + Q 显示上下文信息
Option + Enter 显示意向动作和快速修复代码
Command + Option + L 格式化代码
Control + Option + O 优化 import
Control + Option + I 自动缩进线
Tab / Shift + Tab 缩进代码 / 反缩进代码
Command + X 剪切当前行或选定的块到剪贴板
Command + C 复制当前行或选定的块到剪贴板
Command + V 从剪贴板粘贴
Command + Shift + V 从最近的缓冲区粘贴
Command + D 复制当前行或选定的块
Command + Delete 删除当前行或选定的块的行
Control + Shift + J 智能的将代码拼接成一行
Command + Enter 智能的拆分拼接的行
Shift + Enter 开始新的一行
Command + Shift + U 大小写切换
Command + Shift + ] / Command + Shift + [ 选择直到代码块结束 / 开始
Option + Fn + Delete 删除到单词的末尾
Option + Delete 删除到单词的开头
Command + 加号 / Command + 减号 展开 / 折叠代码块
Command + Shift + 加号 展开所以代码块
Command + Shift + 减号 折叠所有代码块
Command + W 关闭活动的编辑器选项卡

Part 2:Search / Replace(查询/替换)

快捷键 作用
Double Shift 查询任何东西
Command + F 文件内查找
Command + G 查找模式下,向下查找
Command + Shift + G 查找模式下,向上查找
Command + R 文件内替换
Command + Shift + F 全局查找(根据路径)
Command + Shift + R 全局替换(根据路径)
Command + Shift + S 查询结构(Ultimate Edition 版专用,需要在 Keymap 中设置)
Command + Shift + M 替换结构(Ultimate Edition 版专用,需要在 Keymap 中设置)

Part 3:Usage Search(使用查询)

快捷键 作用
Option + F7 / Command + F7 在文件中查找用法 / 在类中查找用法
Command + Shift + F7 在文件中突出显示的用法
Command + Option + F7 显示用法

Part 4:Compile and Run(编译和运行)

 

快捷键 作用
Command + F9 编译 Project
Command + Shift + F9 编译选择的文件、包或模块
Control + Option + R 弹出 Run 的可选择菜单
Control + Option + D 弹出 Debug 的可选择菜单
Control + R 运行
Control + D 调试
Control + Shift + R, Control + Shift + D 从编辑器运行上下文环境配置

Part 5:Debugging(调试)

快捷键 作用
F8 进入下一步,如果当前行断点是一个方法,则不进入当前方法体内
F7 进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方法,则不会进入该内嵌的方法中
Shift + F7 智能步入,断点所在行上有多个方法调用,会弹出进入哪个方法
Shift + F8 跳出
Option + F9 运行到光标处,如果光标前有其他断点会进入到该断点
Option + F8 计算表达式(可以更改变量值使其生效)
Command + Option + R 恢复程序运行,如果该断点下面代码还有断点则停在下一个断点上
Command + F8 切换断点(若光标当前行有断点则取消断点,没有则加上断点)
Command + Shift + F8 查看断点信息

Part 6:Navigation(导航)

快捷键 作用
Command + O 查找类文件
Command + Shift + O 查找所有类型文件、打开文件、打开目录,打开目录需要在输入的内容前面或后面加一个反斜杠/
Command + Option + O 前往指定的变量 / 方法
Control + 方向键左 / Control + 方向键右 左右切换打开的编辑 tab 页
F12 返回到前一个工具窗口
Esc 从工具窗口进入代码文件窗口
Shift + Esc 隐藏当前或最后一个活动的窗口,且光标进入代码文件窗口
Command + Shift + F4 关闭活动 run/messages/find/... tab
Command + L 在当前文件跳转到某一行的指定处
Command + E 显示最近打开的文件记录列表
Option + 方向键左 / Option + 方向键右 光标跳转到当前单词 / 中文句的左 / 右侧开头位置
Command + Option + 方向键左 / Command + Option + 方向键右 退回 / 前进到上一个操作的地方
Command + Shift + Delete 跳转到最后一个编辑的地方
Option + F1 显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择(如在代码编辑窗口可以选择显示该文件的 Finder)
Command + B / Command + 鼠标点击 进入光标所在的方法/变量的接口或是定义处
Command + Option + B 跳转到实现处,在某个调用的方法名上使用会跳到具体的实现处,可以跳过接口
Option + Space, Command + Y 快速打开光标所在方法、类的定义
Control + Shift + B 跳转到类型声明处
Command + U 前往当前光标所在方法的父类的方法 / 接口定义
Control + 方向键下 / Control + 方向键上 当前光标跳转到当前文件的前一个 / 后一个方法名位置
Command + ] / Command + [ 移动光标到当前所在代码的花括号开始 / 结束位置
Command + F12 弹出当前文件结构层,可以在弹出的层上直接输入进行筛选(可用于搜索类中的方法)
Control + H 显示当前类的层次结构
Command + Shift + H 显示方法层次结构
Control + Option + H 显示调用层次结构
F2 / Shift + F2 跳转到下一个 / 上一个突出错误或警告的位置
F4 / Command + 方向键下 编辑 / 查看代码源
Option + Home 显示到当前文件的导航条
F3 选中文件 / 文件夹 / 代码行,添加 / 取消书签
Option + F3 选中文件 / 文件夹/代码行,使用助记符添加 / 取消书签
Control + 0Control + 9 定位到对应数值的书签位置
Command + F3 显示所有书签

Part 7:Refactoring(重构)

快捷键 作用
F5 复制文件到指定目录
F6 移动文件到指定目录
Command + Delete 在文件上为安全删除文件,弹出确认框
Shift + F6 重命名文件
Command + F6 更改签名
Command + Option + N 一致性
Command + Option + M 将选中的代码提取为方法
Command + Option + V 提取变量
Command + Option + F 提取字段
Command + Option + C 提取常量
Command + Option + P 提取参数

Part 8:VCS / Local History(版本控制 / 本地历史记录)

快捷键 作用
Command + K 提交代码到版本控制器
Command + T 从版本控制器更新代码
Option + Shift + C 查看最近的变更记录
Control + C 快速弹出版本控制器操作面板

Part 9:Live Templates(动态代码模板)

快捷键 作用
Command + Option + J 弹出模板选择窗口,将选定的代码使用动态模板包住
Command + J 插入自定义动态代码模板

Part 10:General(通用)

快捷键 作用
Command + 1Command + 9 打开相应编号的工具窗口
Command + S 保存所有
Command + Option + Y 同步、刷新
Control + Command + F 切换全屏模式
Command + Shift + F12 切换最大化编辑器
Option + Shift + F 添加到收藏夹
Option + Shift + I 检查当前文件与当前的配置文件
Control + ` 快速切换当前的 scheme(切换主题、代码样式等)
Command + , 打开 IDEA 系统设置
Command + ; 打开项目结构对话框
Shift + Command + A 查找动作(可设置相关选项)
Control + Shift + Tab 编辑窗口标签和工具窗口之间切换(如果在切换的过程加按上 delete,则是关闭对应选中的窗口)