1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/unrar.sh | bash |
下载源码: wget wget https://www.rarlab.com/rar/rarlinux-x64-612.tar.gz
编译安装: make && make install
但是老家的 ESXI 没办法安装 Zerotier 所以需要在 ESXI 上加一台虚拟机 用于转发
Zerotier 具体如何配置 请自行百度
我们的 vCenter 安装在 Windows 上 所以可以直接安装 Zerotier
代理虚拟机 安装好之后配置一个 ESXI4 同网段的 IP 然后安装 Zerotier
然后配置一个和两边没冲突的子网 我选择了 172.25.0.0/16
安装好之后的网络配置
ip a
1 | 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 |
ens192
Zerotier网卡是 ztqu3fun4g
1 | sysctl -w net.ipv4.ip_forward=1 |
https://my.zerotier.com/network/{你的网络ID}
Settings
=> Advanced
=> Managed Routes
Add Routes
Destination
填上 192.168.0.0/23
(via)
填上 172.25.1.2
Submit
提交vCenter
打开 CMD
执行 route print
命令1 | C:\Users\Administrator\Desktop>route print |
192.168.0.0/23
网关 172.25.1.2
route -p add 192.168.0.0 MASK 255.255.254.0 172.25.1.2 IF 15
192.168.0.0
掩码 255.255.254.0
也就是 23
route print | findstr Zero
可以查询到 最前面的数字就是接口ID1 | C:\Users\Administrator\Desktop>route print | findstr Zero |
1 | C:\Users\Administrator\Desktop>route print |
如你的 Zerotier 网络中 存在与 ESXI4 的网段 存在冲突 或者 通过 Web 添加失败
可以手动添加路由条目
route add -net 192.168.0.0 netmask 255.255.254.0 gw 172.25.1.2 ztqu3fun4g
192.168.0.0
掩码 255.255.254.0
也就是 23
ztqu3fun4g
(此参数可以不填)添加完成后的结果
1 | [root@2-5 iso]$ route |
操作
=> 服务
=> 启用安全 Shell(SSH)
开打 SSH esxcfg-route -a 172.25.0.0/16 192.168.1.2
添加路由条目172.25.0.0/16
是 Zerotier 的目标网段192.168.1.2
是代理节点的 局域网IP地址esxcf-route -n
查看路由表1 | [root@localhost:~] esxcfg-route -n |
ping 172.25.2.15
172.25.0.0/16
的路由192.168.0.0/22
的路由 这样就可以用 192.168.2.15
的地址了1 | [root@localhost:~] ping 172.25.2.15 |
文件和打印机共享(回显请求 - ICMPv4-In)
右键 启用规则CMD
执行 ping 192.168.1.4
1 | C:\Users\Administrator\Desktop>ping 192.168.1.4 |
vSphere Web Client
主机和集群
=> 右键集群
=> 添加主机
192.168.1.4
正常 (已连接到 vCenter Server,位于 172.25.2.15)
此主机由 vCenter Server 管理。 vCenter Server 可以自动执行这些操作,无需干预。 操作
1 | # 脚本一键安装 |
1 | cd /var/lib/zerotier-one |
1 | vi moon.json |
1 | mkdir -p moons.d |
C:\ProgramData\ZeroTier\One
/Library/Application\ Support/ZeroTier/One
/var/lib/zerotier-one
/var/db/zerotier-one
1 | cd C:\ProgramData\ZeroTier\One |
1 | zerotier-cli orbit 00000039b4f***** 00000039b4f***** |
sc stop ZeroTierOneService && sc start ZeroTierOneService
systemctl restart zerotier-one
ssh2 扩展
依赖 libssh2
1 | git clone https://github.com/libssh2/libssh2.git |
1 | wget http://pecl.php.net/get/ssh2-1.3.1.tgz |
php.ini
/usr/local/php/etc/php.ini
php-config
命令 看下 --ini-path
1 | vi php.ini |
1 | lnmp php-fpm restart |
1 | [root@CodeServer ~]# fdisk -l |
sda
那就执行 echo 1 > /sys/block/sda/device/rescan
fdisk -l
看大小1 | [root@CodeServer ~]# fdisk -l |
df -h
看下分区情况1 | [root@Theia ~]# df -h |
fdisk /dev/sda
1 | 欢迎使用 fdisk (util-linux 2.23.2)。 |
p
1 | 磁盘 /dev/sda:21.5 GB, 21474836480 字节,41943040 个扇区 |
/dev/sda1
是根分区 所以我们要操作的是 /dev/sda2
/dev/sda2
的 Start
的位置 2099200
d
=> 2
1 | 命令(输入 m 获取帮助):d |
p
2
(如果默认和上面的一致直接回车)2099200
(如果默认和上面的一致直接回车)1 | 命令(输入 m 获取帮助):n |
t
输入 8e
回车1 | 命令(输入 m 获取帮助):t |
p
看下结果 没问题的话 执行 w
写入磁盘1 | 命令(输入 m 获取帮助):p |
partprobe
pvresize /dev/sda2
1 | [root@Theia ~]# pvresize /dev/sda2 |
lvextend -l +100%FREE /dev/mapper/centos-root
(+100%FREE 就是空闲大小全部加上)1 | [root@Theia ~]# lvextend -l +100%FREE /dev/mapper/centos-root |
xfs_growfs /dev/mapper/centos-root
1 | [root@Theia ~]# xfs_growfs /dev/mapper/centos-root |
1 | [root@Theia ~]# df -h |
https://osdn.net/projects/android-x86/releases
Grub
的时候选择 debug mode
mount -o remount,rw /mnt
vi /mnt/grub/menu.lst
在第一条启动项的 quiet
后面加上 nomodeset
Gogs
到 Gitea
但是官方表示 只能升级老版本的 折腾了一下 升级成功了 这里做个记录Gogs
的 Repo
目录 仓库数据Gogs
的 Data
目录 头像等自定义数据/data/gitea
)Gitea
1 | docker run --rm -p 3000:3000 -v /data/gitea:/data --name gitea gitea/gitea:1.0.2 |
http://主机IP:3000
完成安装流程Ctrl + C
关闭容器/data/gitea/git/repositories
注意原有目录结构/data/gitea/gitea
注意原有目录结构/data/gitea/gitea/conf/app.ini
文件配置/data/gitea/gitea/conf/app.ini
1 | [security] |
git
执行 chown git:git /data/gitea -R
version
表的 version
记录值为 13
1 | UPDATE `version` SET `version` = 13 WHERE `id` = 1 |
http://主机IP:3000
查看是否存在问题1 | docker run --rm -p 3000:3000 -v $(pwd):/data --name gitea gitea/gitea:1.1.4 |
Listen: http://0.0.0.0:3000
的时候 关闭容器1.0.2
> 1.1.4
> 1.2.3
(这次应该从这里开始) > 1.3.3
> 1.4.3
> 1.5.3
> 1.6.4
> 1.7.6
> 1.8.3
> 1.9.6
> 1.10.2
1 | docker run -p 3000:3000 -v /data/gitea:/data --restart=always --name gitea gitea/gitea:1.10.2 |
1.0.2
=> 1.1.4
的时候发生1.1.4
的源代码 https://github.com/go-gitea/gitea/blob/34182c87ec50f647fc6f5b97ba201c3bd42f0728/models/migrations/v20.go#L221 | names, err := d.Readdirnames(0) |
/data/avatar(/data/gitea/gitea/avatar)
目录1.7.6
=> 1.8.4
的时候发生1.8.4
的源代码 https://github.com/go-gitea/gitea/blob/11f6ed4f83/models/migrations/v82.go#L711 | releases := make([]*Release, 0, batchSize) |
releases
表 搜索 RepoID
等于对应报错的记录Token
curl -X PATCH "https://{{host}}/api/v1/repos/{{user}}/{{repo}}?access_token={{token}}" -H "accept: application/json" -H "Content-Type: application/json" -d "{}"
1 | INSERT INTO repo_unit ( "repo_id", "type", "config" ) |
1 | remote: ./hooks/pre-receive.d/pre-receive: line 2: /opt/gogs/gogs: No such file or directory |
find repositories -path \*-receive.d/\*-receive | xargs rm -r
fdisk /dev/sdc
g
转换为 GPT 分区n
一路回车 创建一个新分区w
保存分区pvcreate /dev/sdc1
1 | [root@2-5 ~]# pvscan |
1 | [root@2-5 ~]# vgcreate iscsi /dev/sdc1 |
1 | [root@2-5 ~]# lvcreate -L 1T -n vmware iscsi |
1 | [root@2-5 ~]# lvscan |
yum -y install targetcli -y
安装 targetcli
targetcli
进入管理界面1 | [root@iscsi ~]# targetcli |
ls
1 | /> ls |
block
1 | /> /backstores/block create iscsi /dev/iscsi/vmware |
iscsi
的 iqn
格式为 iqn.yyyy-mm.域名反向:名称
1 | /> /iscsi create iqn.2019-11.yumc.pw:vmware |
iqn
的 acls
用户 格式为 iqn.yyyy-mm.域名反向:名称
1 | /> /iscsi/iqn.2019-11.yumc.pw:vmware/tpg1/acls create iqn.2019-11.yumc.pw:vmware |
block
到 lun
1 | /> /iscsi/iqn.2019-11.yumc.pw:vmware/tpg1/luns create /backstores/block/iscsi |
1 | /> /iscsi/iqn.2019-11.yumc.pw:vmware/tpg1/portals delete 0.0.0.0 3260 |
1 | /> /iscsi/iqn.2019-11.yumc.pw:vmware/tpg1/portals create 192.168.2.5 3260 |
iSCSI 发起程序
(Win+R 输入 iscsicpl)发现
标签页目标
标签页配置
标签页iqn.1991-05.com.microsoft:desktop-6kqg5lg
你们自己看targetcli
继续进入交互界面1 | /> /iscsi/iqn.2019-11.yumc.pw:vmware/tpg1/acls create iqn.1991-05.com.microsoft:desktop-6kqg5lg |
vSwitch0
已启用
iqn.1998-01.com.vmware:vserver-1-3c377af4
targetcli
继续进入交互界面1 | /> /iscsi/iqn.2019-11.yumc.pw:vmware/tpg1/acls create iqn.1998-01.com.vmware:vserver-1-3c377af4 |
添加网卡端口绑定
选择刚才新建的网卡添加动态目标
填写服务器地址 点击保存配置iscsi
LIO-ORG iSCSI Disk
lvresize -L +512G /dev/iscsi/vmware
使用
git filter-branch
可以批量操作所有的分支历史
1 | git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 需要清理的文件' --prune-empty --tag-name-filter cat -- --all |
1 | rm -rf .git/refs/original/ |
1 | git push origin --force --all |
--tree-filter
表示修改文件列表--msg-filter
表示修改提交信息--prune-empty
表示清理空提交-f
是忽略备份批量删除文件 git filter-branch --index-filter 'git rm --cached --ignore-unmatch <your-file-name>'
Gitlab提供的命令 git filter-branch --force --tree-filter 'git rm -f <your-file-name>' HEAD
删除原始引用 rm -rf .git/refs/original/
清理本地缓存 git reflog expire --expire=now --all && git gc --prune=now --aggressive
重新打包 git repack -A -d
查找历史大文件 git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
npm install
的时候 遇到 Error: EACCES: permission denied, scandir '/root/.npm/_logs
错误npm
全局目录 然后重新安装1 | mkdir ~/.npm-global |
安装 NSCD
全称是 Name Service Cache Daemon
然后通过 restart
reload
或者 指定某个域名失效 nscd -i xxxxxx
1 | yum install -y nscd |
帮助如下
1 | [root@2-111 ~]$ nscd --help |
Win+R
输入 regedit
计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\cmd
HideBasedOnVelocityId
的 DWORKD
键值HideBasedOnVelocityId
重命名为 ShowBasedOnVelocityId
即可Administrators
Powershell
要隐藏或者显示 修改 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell
下面的键值即可1 | git clone https://github.com/esnet/iperf.git |
1 | iperf3 -s |
1 | [root@NAS iperf]$ iperf3 -c 192.168.0.2 |
GRUB
界面 按 e 修改Ctrl + x
启动echo 'pa$sW0rd' | passwd --stdin root
selinux
的问题 需要在根目录创建 .autorelabel
touch /.autorelabel
exec /sbin/init
启动系统1 | yum install -y cups hplip-gui hplip hpijs |
1 | vi /etc/cups/cupsd.conf |
http://服务器地址:631/admin
Add Printer
root
然后服务器密码cups
的 或者默认的都行(暂时不知道有什么区别)Windows
上找对应的PPD文件 然后上传Add Printer
完成添加http://服务器地址:631/printers/
Maintenance
=> Print Test Page
打印测试页(点一下就行)http://服务器地址:631/admin
Share printers connected to this system
Allow printing from the Internet
Change Settings
应用配置控制面板
=> 打印机和扫描仪
添加打印机
=> 我需要的打印机不在列表中
按名称选择共享打印机
输入地址http
的 https
的不支持)http://服务器地址:631/printers/HP_DeskJet_2130_series
Windows
共享打印机一样了1 | yum install sane-backends hplip* |
+
1 | [root@local sane.d]$ nano /etc/sane.d/saned.conf |
1 | # 开机自动启 |
1 | [root@local swirl]$ sane-find-scanner -p |
Windows
软件Startup
=> Use an interface language
=> zh_CN
ScanMode
选择 Color
1 | <title>北京赛车pk精准计划_全天稳赚计划</title> |
index.php
文件只能在 htdocs
目录下.htaccess
文件1 | <IfModule mod_rewrite.c> |
public
目录导致了public
目录不能屏蔽1 | <IfModule mod_rewrite.c> |
libc6-compat
apk add libc6-compat
CGO_ENABLED=0 go build -tags netgo -a -v
running gcc failed
1 | /usr/lib/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1 |
apk add musl-dev
1 | func main() { |
1 | package gopool |
1 | package main |
1 | mysql> SELECT STR_TO_DATE( '20180111185832000+0800', '%Y%m%d%H%i%s000+0800' ) |
Files > Sesstins > Editor > General > Editor Tabs > Appearance
1 | mkdir /tmp/empty |
1 | touch /tmp/zore |
1 | tar -C 原始目录 -cvf - . | tar -C 目标目录 -xvf - |
1 | nc -l 2121 | tar -C 目标目录/ -zxvf - |
1 | tar -cvf - 原始目录/ | nc 接收端地址 2121 |
1 | tar -cvf - * | gzip | ssh 目标IP "gzip -d | tar -xC /home/project" |
1 | tar -cvf - DATA | pigz -9 -p 线程数 | ssh -c arcfour128 目标IP "gzip -d | tar -xC /data" |
1 | GetDllVersion |
1 | package main |
1 | $ GOARCH=386 go run main.go |
syscall.StringToUTF16Ptr
但是类库只能读取到一个字节 改成 syscall.StringBytePtr
正常读取是由于 Jackson2 优先转换导致的
直接贴上新配置 ( 本来这个是继承接口的 但是Java8有默认实现 所以简化了)
1 | package com.sixi.micro.common.config; |
由于 SpringBoot 2.0 为了安全 禁止了 / 的类型 所以 转换的时候替换一下就好了 继承 重写 方法
1 | package com.sixi.micro.common.convert.converter; |
BSON
存储到 Mongodb
的时候 BigDacemel
查阅文档 + 看源码 找了一个简单的方案
1 | package pw.yumc.cloud.core.config; |
原理 使用 CURL 读取网页信息 然后组装为 JSON 供网页调用 话不多说 直接上代码
1 | # 发送钉钉通知 |
这里就是常规配置了
1 | server |
用了 Avalon 简单的渲染了一下
1 |
|
1 | [root@2-230 monitor]# ll |
原来的 驼峰 中横线 下划线 均改为 中横线识别 不然启动会报错 找不到变量
1.0
1 | eureka: |
2.0
1 | eureka: |
配置
spring.http
调整到spring.servlet
1.0
1 | spring: |
2.0
1 | spring: |
1.0
1 | # 管理端点 |
2.0
1 | # 管理端点 |
1.0
1 | <dependency> |
2.0
1 | <dependency> |
1.0
1 | <dependency> |
2.0
1 | <dependency> |
1.0
1 | <dependency> |
2.0
1 | <dependency> |
1.0
1 | <dependency> |
2.0
1 | <dependency> |
1.0
1 | import org.springframework.amqp.rabbit.support.CorrelationData; |
2.0
1 | import org.springframework.amqp.rabbit.connection.CorrelationData; |
1.0
1 | import org.springframework.cloud.netflix.feign.EnableFeignClients; |
2.0
1 | import org.springframework.cloud.openfeign.EnableFeignClients; |
1.0
1 |
|
2.0
1 |
|
spring.datasource.type
导致的 删除即可1 | *************************** |
EnableGroupPolicy.bat
1 | @echo off |
博主自建了一个
Ngrok
服务器 用于简单的测试
-subdomain wechat
自定义子域名-hostname wechat.yourdomain.com
自定义域名 请自行配置 CNAME 到 n.yumc.pw-httpauth user:pass
添加HttpBasic效验./ngrok 8080
1 | > ./ngrok 8080 |
./ngrok -subdomain test 8080
1 | ngrok by MiaoWoo hosted on n.yumc.pw (Ctrl+C to quit) |
./ngrok -hostname ngrok.sixi.com 8080
需要 CNAME 到 n.yumc.pw
1 | ngrok by MiaoWoo hosted on n.yumc.pw (Ctrl+C to quit) |
脚本 还没写完 只是记录了一下
1 | # 构建的主站域名 |
1 | emm 后来发现 只要指定一下 VHOST 就好了 |
1 | set [+-abCdefhHklmnpPtuvx] # -代表配置 +代表取消 |
1 | -a 标示已修改的变量 以供输出至环境变量 |
sed [-i|-e] 's/原字符串/新字符串/[g]' [文件|-]
-i
是直接替换文件 不输出-i
是直接替换文件 不输出g
则是多次替换-
则代表读取 Stdin
s
后第一个字符是分割符可以自行替换 例如 需要替换 /
的时候1 | > echo k8s.gcr.io/pause:3.1 | sed s@/@_@g - |
还在填坑
1 | wget -O${TGZ_NAME} https://storage.googleapis.com/harbor-releases/harbor-offline-installer-v1.6.1.tgz |
1 | tar -xvzf harbor-offline-installer-v1.6.1.tgz |
1 | sed -i "s/hostname = .*/hostname = harbor.yumc.pw/g" harbor.cfg |
1 | sed -i "s/80:80/3080:80/g" docker-compose.yml |
1 | ./install.sh |
blog
或者别的 但是下面要做对应修改CloudStudio
中初始化一个工作空间blog
环境选择 Hexo
点击创建Hexo
先测试一下 hexo
命令是否可以使用 如果不行
1 | npm install hexo |
切换到 source
分支 因为Master分支需要用来部署静态文件
1 | git checkout -b source |
初始化博客 (下列所有的配置 均在 blog 文件夹下完成)
1 | hexo init blog |
测试博客 运行临时服务器
1 | hexo s |
看到下列内容代表启动成功
1 | INFO Start processing |
4000
_config.yml
填写相关参数1 | # Site |
Next
主题下载 Next
主题
1 | git clone https://github.com/theme-next/hexo-theme-next themes/next |
配置主题 在 CloudStudio
中依次打开 _config.yml
按下 Ctrl+F
搜索 theme
1 | # Extensions |
测试主题 开启临时服务器然后 创建临时访问链接
1 | hexo s |
基本配置 新建 source/_data/next.yml
文件 不存在的文件夹请自行新建 或者执行下列命令
1 | mkdir -p source/_data |
配置底部 主题配置 next.yml
新增
1 | footer: |
切换到 Pisces
主题 主题配置 next.yml
新增
1 | scheme: Pisces |
设置头像 主题配置 next.yml
新增
1 | avatar: |
侧边栏配置 主题配置 next.yml
新增
1 | sidebar: |
开启字数统计
npm install hexo-symbols-count-time --save
_config.yml
新增1 | # hexo-symbols-count-time |
next.yml
新增1 | # hexo-symbols-count-time |
开启代码块复制 主题配置 next.yml
新增
1 | codeblock: |
开启 Copyright
主题配置 next.yml
新增
1 | post_copyright: |
配置高亮主题 主题配置 next.yml
新增
1 | highlight_theme: night eighties |
开启 nest
动画效果 就是我博客里 线条跟随鼠标的
cd themes/next
git clone https://github.com/theme-next/theme-next-canvas-nest source/lib/canvas-nest
next.yml
新增1 | canvas_nest: true |
更多主题配置 请详见 NexT主题官网
hexo-deployer-git
插件当前插件用于部署静态文件到Git上
1 | npm install hexo-deployer-git --save |
1 | git config --global user.email "you@example.com" |
_config.yml
按下 Ctrl+F
搜索 Deployment
1 | # Deployment |
master
分支1 | hexo d |
https://dev.tencent.com/u/<用户名>/p/<项目名称>/git
代码
=> Pages服务
=> 一键开启 Pages 服务
https://用户名.coding.me/项目名称/
发现样式丢失了 因为没有修改主站根后缀blog/_config.yml
修改 root 为 /<项目名称>/
1 | # URL |
1 | hexo d |
hexo-neat
插件此插件用于压缩 CSS 和 JS
1 | npm install hexo-neat --save |
_config.yml
在底部追加下列配置1 | # Neat |
hexo-generator-search
插件当前插件用于给博客添加搜索功能 详见左边的搜索
1 | npm install hexo-generator-search --save |
_config.yml
新增1 | search: |
next.yml
新增1 | local_search: |
MyBatis
SQL 执行计时器 的实现拦截器文件 SqlCostInterceptor.java
1 | package com.sixi.enquiry.interceptor.mybatis; |
配置类注入拦截器
1 | package com.sixi.enquiry.config; |
1 | 2018-10-16 11:16:20.031 DEBUG [wechatapp-enquiry-service] --- 10236 [restartedMain] c.s.enquiry.mapper.ConfigMapper.get : ==> Preparing: SELECT `value` FROM config WHERE `key` = ? AND is_deleted = 0 |
1 | --> Finished Dependency Resolution |
1 | [root@local ~]$ yum downgrade libgpod |
/tmp
目录1 | mtd write breed-mt7621-hiwifi-hc5962.bin u-boot |
Breed中断工具
官方地址 博客备份http://192.168.1.1
OpenWrt
的固件 官方地址 博客备份BreedWeb
选择刷写固件 点击 固件 选择 openwrt-18.06.1-ramips-mt7621-hc5962-squashfs-factory.bin
http://192.168.1.1
Kubernetes
上拉取私有仓库的镜像sixi
的密钥1 | $ kubectl create secret docker-registry sixi \ |
imagePullSecrets
1 | apiVersion: v1 |
Kubernetes
部署的工具Kubernetes
集群一键安装脚本 版本 v2.11.0 适用于 Linux amd64
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/helm.sh | bash |
1 | wget https://storage.googleapis.com/kubernetes-helm/helm-v2.11.0-linux-amd64.tar.gz |
1 | tar -xvzf helm-v2.11.0-linux-amd64.tar.gz |
1 | sudo mv linux-amd64/helm /usr/local/bin/helm |
helm
查看是否安装成功1 | jtb @ yumc-pw in ~/src/linux-amd64 [21:05:05] |
RBAC
权限控制 还需要创建一个账户配置1 | $ cat > helm-rbac-config.yaml<<EOF |
Helm
1 | jtb @ yumc-pw in ~/src/linux-amd64 [21:05:05] |
Tiller
服务端时 提示部署失败 0/1 nodes are available: 1 node(s) had taints that the pod didn't tolerate.
1 | $ kubectl taint nodes --all node-role.kubernetes.io/master- |
Helm
安装 Gitlab
点击前往Kubeadm
在 CentOs 上安装 Kubernetes
集群DockerMachine
安装 Docker
DockerMachine
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/docker/machine.sh | bash |
1 | firewall-cmd --zone=public --add-port=2376/tcp --permanent |
1 | swapoff -a |
/etc/fstab
注释 Swap 相关的条目1 | sed -i '/swap/s/^/#/' /etc/fstab |
1 | echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf |
Machine
1 | docker-machine create --driver generic --generic-ip-address=192.168.2.225 2-225 |
Kubeadm
1 | docker-machine ssh 225 |
Kubernetes
源1 | cat > /etc/yum.repos.d/kubernetes.repo<<EOF |
Kubeadm
1 | yum install -y -q kubeadm |
1 | curl -qs https://raw.githubusercontent.com/502647092/k8s/master/pull_from_aliyun.sh | bash |
Kubeadm
搭建 Kubernetes
集群旧版本初始化配置(v1.11.3之前的版本)
1 | apiVersion: kubeadm.k8s.io/v1alpha2 |
创建初始化配置(当前发布时的最新版本)
1 | cat > kubeadm.yml<<EOF |
初始化 Master 节点
1 | kubeadm init --config kubeadm.yml |
1 | [root@2-225 ~]$ kubeadm init --config kubeadm.yml |
init
之后最后出现的命令1 | [root@2-223 ~]$ kubeadm join 192.168.2.225:6443 --token 8qebd3.g81fncibeelo542a --discovery-token-ca-cert-hash sha256:d15f7dc588ec3b14b076837657c8dc3af0759eb65beac919984cb134a912ab09 |
1 | [root@k8s-node1 ~]$ kubeadm join 192.168.10.44:6443 --token 4ihi3s.jx91ma431zq8cjmj --discovery-token-ca-cert-hash sha256:63c0fd0455e216bd4128a91ecf1400db4b17fb846ccc39814d43aa5e3be015f3 |
1 | [root@k8s-node1 ~]$ kubeadm join 192.168.10.44:6443 --token 30z69g.k420edr94ms96hmv --discovery-token-ca-cert-hash sha256:ee5dbd2a205a775f8cb26f10ead191cb91648dabec0d742b68a1473757146995 |
kubectl
1 | mkdir -p $HOME/.kube |
1 | kubectl get nodes,po,svc --all-namespaces |
1 | [root@2-225 k8s]$ kubectl get nodes,po,svc --all-namespaces |
NotReady
原因可以用 kubectl describe node <节点状态>
看到1 | [root@2-225 ~]$ kubectl describe node 2-225 |
coredns
容器状态 可以在 Event
看到因为网络插件未就绪 所以容器没有启动成功1 | kubectl describe po $(kubectl get po -n=kube-system | grep coredns | tail -n 1 | awk '{print $1}') -n=kube-system |
1 | [root@2-225 ~]$ kubectl describe po $(kubectl get po -n=kube-system | grep coredns | tail -n 1 | awk '{print $1}') -n=kube-system |
所有节点
设置 kubelet
开机自启动1 | systemctl enable kubelet.service |
CNI
网络插件Weave
网络插件1 | kubectl apply -f https://git.io/weave-kube-1.6 |
1 | [root@2-225 ~]$ kubectl apply -f https://git.io/weave-kube-1.6 |
Rook
存储插件1 | kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml |
1 | [root@2-225 k8s]$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml |
1 | [root@2-225 k8s]$ kubectl describe pods -n rook-ceph-system |
PV
1 | cat > rook-storage.yaml<<EOF |
Dashboard
控制面板如果点登陆没反应 记得注意官方文档这句话 也就是登录到 Dashboard 必须满足 HTTPS访问 或者 HTTP+localhost 访问 不然点击登陆按钮不会有任何反应 详见 ISSUES
NOTE: Dashboard should not be exposed publicly using kubectl proxy command as it only allows HTTP connection. For domains other than localhost and 127.0.0.1 it will not be possible to sign in. Nothing will happen after clicking Sign in button on login page.
1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
Dashboard
的账户这里推荐使用第二种方式
给 kubernetes-dashboard
的 ServiceAccount
绑定权限
1 | cat > dashboard-admin.yaml<<EOF |
此账户获取Token的方式
1 | kubectl describe secrets $(kubectl get secrets --namespace kube-system | grep dashboard-token | awk '{print $1}') --namespace kube-system | grep token: | awk '{print $2}' |
安全一点的方式是新建一个账户 赋予权限
1 | cat > admin-role.yaml<<EOF |
此账户获取Token的方式
1 | kubectl describe secrets $(kubectl get secrets --namespace kube-system | grep admin-token | awk '{print $1}') --namespace kube-system | grep token: | awk '{print $2}' |
kubectl proxy
暴露API (这种方法只能本地访问)1 | kubectl proxy & |
http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/#!/login
NodeIP+NodePort
访问 此方法可以任意访问 但是存在证书问题 忽略即可kubernetes-dashboard.yaml
文件 1 | wget -Okubernetes-dashboard.yaml https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml |
Service
区域 spec
改为 NodePort
1 | kind: Service |
1 | kubectl apply -f kubernetes-dashboard.yaml |
https://NodeIP:30443
如果提示 NET::ERR_CERT_INVALID
点击继续访问Dashboard
之后 点击 Token
登录 输入上面获取到的 Token
登录即可1 | kubectl logs $(kubectl get po -n=kube-system | grep dashboard | tail -n 1 | awk '{print $1}') -n=kube-system |
1 | [root@local k8s]$ kubectl logs $(kubectl get po -n=kube-system | grep dashboard | tail -n 1 | awk '{print $1}') -n=kube-system |
kube-system
的状态结果1 | [root@localhost k8s]$ kubectl get nodes,po,svc -n=kube-system |
coredns
是否启动完成 如果没有 重新配置weave
CNI 网络插件是否启动完成 如果没有 重新配置Google
吧Heapster
监控1 | kubectl apply -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/standalone/heapster-controller.yaml |
1 | kubeadm reset -f |
Kubernetes
集群没有自动启动1 | [root@2-225 ~]$ kubelet |
/etc/fstab
注释类型为 swap
的条目1 | # |
2018-09-14 14:05:00
Navicat版本: 12.1.7 Patch版本: V3.72018-12-25 14:35:00
Navicat版本: 12.1.11 Patch版本: V4.22019-02-25 01:08:00
Navicat版本: 12.1.15 Patch版本: V4.8Navicat Premium
下载激活工具Navicat Premium
Navicat Premium
官网下载Backup
Host
Navicat v12
Navicat Premium
帮助 => 注册Site License
Generate
序列码会自动填入(如果没问题的话)Navicat
并且清空注册表 HKEY_CURRENT_USER\Software\PremiumSoft
然后重启电脑 重复上述步骤Request Code
里面 点击 Generate
理论上会自动帮你生成并且复制到输入框内@SneakyThrows
无法对 Lambda
表达式生效很多人喜欢用
@SneakyThrows
抑制某些方法抛出异常 但是在 Java8 中 Lambda 表达式上发现 这个东西无效了 这是为啥呐
URLDecoder.decode
演示一下1 |
|
forEach
发现在 decode 方法上报错了 Unhandled exception: java.io.UnsupportedEncodingException
1 |
|
Lambda
表达式 只是一个语法糖 我们还原一下现场1 |
|
@SneakyThrows
就可以正常了Lambda
的情况下 使用 @SneakyThrows
呐1 | public void testLambda() { |
初始化 更新 克隆项目
.gitmodule
文件1 | git submodule add https://git.i.sixi.com/Crm/crm-customer-service.git |
1 | git clone https://git.i.sixi.com/sixi-micro-service-crm.git |
--recursive
1 | git clone --recursive https://git.i.sixi.com/sixi-micro-service-crm.git |
查看Git子模块状态
1 | git submodule status |
查看子模块汇总统计 (Commit更新)
1 | git submodule summary |
同步子模块信息
1 | git submodule sync |
在各个子模块目录批量执行命令
1 | git submodule foreach git checkout master # 批量切换子模块到master |
1 | git submodule foreach git pull |
VSCode
显示错位的问题/etc/systemd/logind.conf
1 | #处理按电源建的逻辑 |
systemctl restart systemd-logind
即可生效一健安装脚本
1 | curl -L -s https://install.direct/go.sh | bash |
1 | Installing V2Ray v4.16.0 on x86_64 |
服务端配置 /etc/v2ray/config.json
1 | { |
客户端配置 /etc/v2ray/config.json
1 | { |
开启防火墙端口
1 | firewall-cmd --zone=public --add-port=38325/udp --permanent |
参考资料
PlantUML
可以用代码画图 本文记录如何安装Visual Studio Code
安装插件Ctrl + P
输入 ext install plantuml
回车PlantUML
查找 安装第一个Graphviz
1 | sudo yum install graphviz |
1 | @"%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe" -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin" |
Visual Studio Code
新建一个 wsd
文件alt + d
生成图片Zsh
1 | yum -y install zsh |
Oh-My-Zsh
1 | wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh |
1 | git clone https://github.com/powerline/fonts.git --depth=1 |
配置主题
bullet-train
安装1 | wget -O$ZSH_CUSTOM/themes/bullet-train.zsh-theme http://raw.github.com/caiogondim/bullet-train-oh-my-zsh-theme/master/bullet-train.zsh-theme |
~/.zshrc
中的主题配置 改为1 | # Set name of the theme to load. Optionally, if you set this to "random" |
~/.zshrc
中新增1 | export TERM=xterm-256color |
安装终端配色
1 | git clone git://github.com/sigurdga/gnome-terminal-colors-solarized.git |
Zsh
插件 修改~/.zshrc
1 | Which plugins would you like to load? (plugins can be found in ~/.oh-my-zsh/plugins/*) |
VirtualBox
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/vbox.sh | bash |
1 | wget https://download.virtualbox.org/virtualbox/5.2.18/Oracle_VM_VirtualBox_Extension_Pack-5.2.18.vbox-extpack |
1 | VBoxManage createvm \ |
1 | VBoxManage createmedium \ |
1 | VBoxManage modifymedium \ |
1 | VBoxManage clonemedium \ |
1 | VBoxManage storagectl \ |
1 | VBoxManage storageattach xp \ |
1 | VBoxManage storageattach xp \ |
1 | VBoxManage storageattach xp \ |
1 | VBoxManage storageattach xp \ |
1 | VBoxManage modifyvm xp --boot1 dvd |
1 | VBoxManage modifyvm xp \ |
如果打开这个功能 但是本地没有监听端口或者连不上 请检查扩展第一步扩展是否安装完成!!!
1 | VBoxManage modifyvm xp --vrde on |
1 | VBoxManage modifyvm xp --memory 1024 |
1 | VBoxManage startvm xp --type headless |
1 | VBoxHeadless -s xp & |
1 | VBoxManage clonevm xp |
1 | VBoxManage controlvm xp pause |
--delete
)1 | VBoxManage closemedium /yumc/app/vbox/vdi/image.vdi |
1 | VBoxManage unregistervm --delete xp |
vboxdrv
服务无法启用的问题1 | WARNING: The vboxdrv kernel module is not loaded. Either there is no module |
1 | yum install -y kernel-devel kernel-devel-$(uname -r) |
1 | /sbin/vboxconfig |
ls
命令1 | JSch jSch = new JSch(); |
1 | client_linux_amd64 |
composer install
的时候比较慢 推荐用下列命令1 | wget https://blog.yumc.pw/attachment/tgz/walle-web.vendor.tgz |
/usr/local/nginx/conf/fastcgi.conf
注释下列行1 | PHP only, required if PHP was built with --enable-force-cgi-redirect |
/usr/local/php/etc/php.ini
修改下列行 去除 exec
函数1 | disable_functions = passthru,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,sy$ |
假设 代理服务器为 Socket5 地址为 192.168.2.200:1080
安装proxychains4
1 | git clone https://github.com/rofl0r/proxychains-ng.git |
配置代理
/etc/proxychains.conf
socket5 192.168.2.200 1080
使用代理
1 | proxychains4 git clone https://github.com/rofl0r/proxychains-ng.git |
编译安装 privoxy
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/privoxy.sh | bash |
Yum安装 privoxy
1 | yum install -y privoxy |
配置代理
/etc/privoxy/config
forward-socks5t / 192.168.2.200:1080 .
启动代理
1 | systemctl enable privoxy.service |
使用代理
1 | cat /etc/profile.d/proxy.sh<<EOF |
1 | cat > /etc/profile.d/touchpad.sh<<EOF |
本教程默认服务器IP为
192.168.0.2
下列所有相关涉及IP地方 都需要您手动替换为你所使用的环境
Docker
DockerCompose
Swarm
集群这里可以直接执行
docker swarm init
如果你只需要单个节点的话
Swirl
DockerSwarm管理界面安装启动(简化使用 这里用bolt存储)
写入配置文件
1 | cat > docker-compose.yml << EOF |
部署服务(下列命令 二选一)
1 | docker-compose up -d |
1 | docker stack deploy -c docker-compose.yml swirl |
配置
http://DockerSwarm节点的IP:8001
(注意 可能需要打开防火墙CentOs6防火墙CentOs7防火墙)详见 NFS安装与使用
手动单独部署 详见 在Docker上部署常用的服务
不过我们这里用编排直接部署
SSH链接到服务器
新建环境基础目录(随意 只要下面和这里匹配就行了)
1 | sudo mkdir -p /yumc/volumes |
开启防火墙相关端口 这里以 CentOs7
为例 (当然你也可以只开80和443然后用Nginx反向代理出去)
1 | firewall-cmd --zone=public --add-port=80/tcp --permanent |
http://192.168.0.2:8001
打开 Swirl
yumc
(你随意 开心就好)/yumc/volumes
如果和上面不一样 需要全部替换成你自己的)1 | version: '3' |
http://192.168.0.2:8001
打开 Swirl
yumc
(你随意 开心就好)1 | version: '3' |
参考 MySQL常用配置 创建
gogs
数据库 和 一个gogs
的账户 同时授予gogs
数据库权限
http://192.168.0.2:8001
打开 Swirl
yumc_mysql
绿色的框框 进入服务页面Container ID
边上的一串 Hash 值 (PS: 单机器集群可以直接进入)1 | mysql -h localhost -u root -p |
http://192.168.0.2:3000
mysql:3306
(因为处于同一个编排下 所以 hosts
会自动写入)http://192.168.0.2:8001
打开 Swirl
yumc_jenkins
绿色的框框 进入服务页面Stderr
找到临时密码http://192.168.0.2:8080
打开 Jenkins
http://192.168.0.2:8081
打开 Nexus
admin
密码 admin123
(登录之后推荐修改默认密码或新建账号)http://192.168.0.2:8081/#admin/repository/repositories
Create repository
=> docker (hosted)
8082
Create repository
=> docker (group)
8083
Grafana
和 Prometheus
以及相关的 exporter
的编排1 | version: '3' |
Prometheus
的配置文件1 | cat >/yumc/config/prometheus/prometheus.yml<<EOF |
]]>未完待续
Volume
的 NFS
数据卷查看远端NFS挂载点(如果提示命令未找到 请安装 nfs-utils
)
1 | [root@server docker]$ showmount -e 127.0.0.1 |
创建 Volume
1 | docker volume create \ |
使用 Volume
1 | docker run -d \ |
sshfs
插件安装 sshfs
插件 如果是DockerSwarm记得每个节点都得安装
1 | docker plugin install --grant-all-permissions vieux/sshfs |
创建 Volume
1 | docker volume create --driver vieux/sshfs \ |
使用 Volume
1 | docker run -d \ |
1 | Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) |
有下列两台服务器 其中服务器可以被外网访问
现在需要开发电脑需要直连数据库(排除工具可以用SSH通道)
1 | ssh -NTf -R 3306:192.168.2.231:3306 root@localhost |
127.0.0.1
如果要服务器监听 0.0.0.0
请 开启网关端口1 | autossh -M 8081 -fCNR 3306:192.168.2.231:3306 root@localhost |
/etc/sysctl.conf
1 | # 找到下面的值并将0改成1 |
sysctl –p
生效iptables
命令转发1 | iptables -t nat -A PREROUTING -p tcp -d 192.168.2.230 --dport 3306 -j DNAT --to-destination 192.168.2.231:3306 |
service iptables save
保存转发规则netsh
完成转发1 | netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=3306 connectaddress=192.168.2.231 connectport=3306 |
1 | docker run -d \ |
1 | docker run -d \ |
1 | docker run -d \ |
1 | docker run -d \ |
System.setProperty(‘org.apache.commons.jelly.tags.fmt.timeZone’, ‘Asia/Shanghai’)
1 | docker run -d \ |
1 | docker run -d \ |
Unable to update instance pid: No locks available
NFS
挂载 并且加了 --nolock
1 | docker run -d \ |
注意: 系统参数 vm.max_map_count
必须大于等于 262144
1 | docker run -d \ |
1 | docker run -d \ |
1 | mkdir -p /home/app/grafana |
1 | docker run -d \ |
1 | docker run -d \ |
1 | docker run -d \ |
1 | docker exec -it $(docker ps -a | grep confluence | awk '{print $1}') java -jar /opt/atlassian/confluence/atlassian-agent.jar -m admin@xxxx.xx -n Admin -p conf -o https://xx.xxxx.com -s 序列号(XXXX-XXXX-XXXX-XXXX) |
MetaWebBlog API(MWA)
发布博客到多个平台http://write.blog.csdn.net/xmlrpc/index
http://www.cnblogs.com/apanly/services/metaweblog.aspx
https://my.oschina.net/action/xmlrpc
http://imguowei.blog.51cto.com/xmlrpc.php
http://upload.move.blog.sina.com.cn/blog_rebuild/blog/xmlrpc.php
http://os.blog.163.com/word/
application.yml
的配置内容 对应的服务配置丢失了1 | 2018-06-28 19:30:01.017 INFO 16602 --- [nio-8083-exec-4] .c.s.e.MultipleJGitEnvironmentRepository : Cannot pull from remote http://git.internal.sixi.com/config-center/open.git, the working tree is not clean. |
rm -rf /tmp/config-repo-1865022702875722453
(此目录请参照日志提示)基础环境
新建目录和配置文件
1 | mkdir -p /home/config/prometheus |
安装 Prometheus
1 | docker run -d \ |
安装 grafana
1 | docker run -d \ |
安装 node-exporter
1 | docker run -d \ |
安装 cadvisor
1 | docker run -d \ |
安装 mysql-exporter
1 | CREATE USER 'exporter'@'%' IDENTIFIED BY '********'; |
1 | docker run -d \ |
Windows
资源管理器里软件生成的图标regedit
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\Namespace
Windows10 可以直接输入路径
wget http://download.sonatype.com/nexus/3/latest-unix.tar.gz
tar -xvzf latest-unix.tar.gz
mv latest-unix nexus
cd nexus/nexus-xxx.xxx/bin
./nexus start
nexus-xxxx.xxx
即可Nexus
Docker
的默认路径 磁盘空间占满 导致 RabbitMQ
的队列信息丢失1 | Caused by: com.rabbitmq.client.ShutdownSignalException: connection error; protocol method: #method<connection.close>(reply-code=541, reply-text=INTERNAL_ERROR - access to vhost '/' refused for user 'root': vhost '/' is down, class-id=10, method-id=40) |
Down
状态 并且无法删除RabbitMQ
的应用注意 下列命令会导致所有配置丢失 包括用户(Users)和虚拟主机(Vhost)
1 | rabbitmqctl stop_app |
简单的说 就是把 TCP 通过 UDP 传输
用户 > 洛杉矶代理服务器 > 杭州服务器 > 内网服务器
用户 > 洛杉矶代理服务器 > KCP Client > KCP Server > 杭州服务器 > 内网服务器
./server_linux_amd64 -t "127.0.0.1:8443" -l ":8444" -mode fast2
./client_linux_amd64 -r "server.yumc.pw:8444" -l ":8443" -mode fast2
1 | zuul.sensitive-headers: |
Docker 是一个开源的应用容器引擎 基于 Go 语言 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中 然后发布到任何流行的 Linux 机器上 也可以实现虚拟化。
容器是完全使用沙箱机制 相互之间不会有任何接口 (类似 iPhone 的 app) 更重要的是容器性能开销极低。
Web 应用的自动化打包和发布。
自动化测试和持续集成 发布。
在服务型环境中部署和调整数据库或其他的后台应用。
从头编译或者扩展现有的OpenShift或Cloud Foundry平台来搭建自己的PaaS环境。
1 | [root@206 ~]# docker run --rm alpine /bin/echo "Hello Wrold" |
1 | [root@206 ~]# uname -a |
1 | OkHttpClient client = new OkHttpClient.Builder() |
1 | client.setConnectTimeout(10, TimeUnit.SECONDS); |
1 | FormBody body = new FormBody.Builder() |
1 | MediaType type = MediaType.parse("application/octet-stream"); |
1 | Map<String,String> map = new HashMap<>(); |
1 | RequestBody multipartBody = new MultipartBody.Builder() |
创建请求
1 | // 创建 Request |
同步处理
1 | Response response = client.newCall(request).execute() |
异步处理
1 | Call call = client.newCall(request); |
pom文件添加相关依赖
1 | <dependency> |
初始化请求客户端
1 | HttpLoggingInterceptor hli = new HttpLoggingInterceptor(Log::info); |
设置应用程序日志等级
1 | logging.level: |
日志效果
1 | 00:30 INFO: --> POST http://jst.dashengcloud.com/openapi/param2/1/com.alibaba.product/alibaba.product.get/4784738 http/1.1 |
1 | curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose |
1 | # 版本号 |
docker-compose up -d
docker stack deploy -c docker-compose.yml open
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/docker/machine.sh | bash |
注意: 首先要保证管理主机和各台机器之间能够SSH直连互通 同时打开Docker的管理端口
1 | firewall-cmd --zone=public --add-port=2376/tcp --permanent |
docker-machine create --driver generic --generic-ip-address=<服务器地址> <名称>
1 | [root@207 ~]# docker-machine create --driver generic --generic-ip-address=192.168.2.208 208 |
1 | [root@2-225 ~]# docker-machine |
首先 我们区分几个概念
区别 | Docker Swarm | Swarmkit | Docker Swarm Mode |
---|---|---|---|
安装 | 独立于Docker Engine并可以作为Container运行 | 需要单独编译和运行 | 集成在Docker Engine中(1.12以后的版本) |
外部存储 | 需要额外的KV存储(也可以用Token) | 需要额外的KV存储(例如consul,etcd) | 不需要额外的KV存储 |
服务功能 | 没有服务功能 | 没有服务发现 负载均衡和路由网络 | 支持服务模型以及相应的扩容缩容、服务发现、滚动升级、路由和负载均衡等 |
命令行 | 与DockerMachine集成 | 独立的CLI | 集成在Docker Engine中(1.12以后的版本) |
总之就是一句话 忘记
Docker Swarm
知道Swarmkit
用Docker Swarm Mode
详细区别 comparing-swarm-swarmkit-and-swarm-mode
1 | firewall-cmd --zone=public --add-port=2376/tcp --permanent |
需要先安装 DockerMachine 然后按照下列步骤添加 Swarm
查看已存在的机器
1 | [root@207 ~]# docker-machine ls |
通过SSH链接到某个节点
1 | [root@207 ~]# docker-machine ssh 206 |
docker-machine ssh 206 docker run swarm create
生成Token 1 | [root@207 ~]# docker-machine ssh 206 docker run swarm create |
创建并附带 swarm
的相关参数
1 | [root@207 ~]# docker-machine create --driver generic --generic-ip-address=192.168.2.206 --swarm --swarm-master --swarm-discovery token://651729865f8e56f8ddde11ff9c3499db swarm-master |
查看节点状态
1 | [root@207 ~]# docker-machine ls |
删除已经添加的非SWARM节点(没有可以忽略)
1 | [root@207 ~]# docker-machine rm 207 |
创建并附带 swarm
的相关参数
1 | [root@207 ~]# docker-machine create --driver generic --generic-ip-address=192.168.2.207 --swarm --swarm-discovery token://651729865f8e56f8ddde11ff9c3499db swarm-207 |
同理 添加 208 节点
查看节点状态
1 | [root@207 ~]# docker-machine ls |
1 | eval $(docker-machine env --swarm swarm-master) |
此处的服务是个单例
1 | docker run -d --name=alpine1 --net=alpine --net-alias=alpine alpine:edge |
此处使用了 Docker Machine 进行多机器管理和连接 新版本的可以不需要 但是推荐使用 Docker Machine 方便管理多个 Docker 节点
1 | [root@206 ~]# docker-machine ssh 206 docker swarm init |
1 | [root@206 ~]# docker swarm init |
1 | Swarm initialized: current node (4cngm238bxaq7hnryd20ef8dy) is now a manager. |
docker swarm join-token manager
这里提供的命令可以添加 Manager 节点1 | [root@206 ~]# docker swarm join-token manager |
1 | [root@206 ~]# docker-machine ssh 207 docker swarm join --token SWMTKN-1-4728gc4i30jv9cvdhdk3bguqrk83k6teuejsh272ikvy8yt59f-2fy3kxueb8xlsr0bph0tsqdv1 192.168.2.206:2377 |
1 | [root@207 ~]# docker swarm join --token SWMTKN-1-4728gc4i30jv9cvdhdk3bguqrk83k6teuejsh272ikvy8yt59f-2fy3kxueb8xlsr0bph0tsqdv1 192.168.2.206:2377 |
1 | [root@206 ~]# docker node ls |
1 | docker network create -d overlay --attachable alpine |
1 | docker service create --replicas 1 --name alpine --network alpine |
1 | [root@206 ~]# docker service ls |
Docker Swarm 模式下创建 Swarm-Master 节点时 提示 Error creating machine: Error running provisioning: Error while creating container: 409 Conflict: Conflict. The container name "/swarm-agent-master" is already in use by container "bafd70d3708ad7b0e3f6d2d554c7550608b84c3561ef358d1b6290f1f2639355". You have to remove (or rename) that container to be able to reuse that name.
Swarm-Master
节点docker rm bafd70d3708a --force
删除容器即可DockerMachine
执行 docker-machine ssh 206 docker rm bafd70d3708a
hash值(bafd70d3708a)为提示的那个的前12位即可 当然全部也可以
创建之后网络不会在子节点及时展示 只要主节点存在即可 子节点会在使用时显示(不知道是不是BUG)
1 | [root@206 maven]# docker network ls |
1 | > ulimit -n |
ulimit -HSn 4096
即设置最大句柄为 4096vi /etc/sysctl.conf
新增一行 fs.file-max=4096
即设置最大句柄为 4096RabbitMQ
使用过程中常见问题和解决方案root
的账户rabbitmqctl add_user root root
root
用户rabbitmqctl delete_user root
root
密码rabbitmqctl change_password root 123456
rabbitmqctl list_users
root
到 administrator
组 可以用空格隔开添加多个组rabbitmqctl set_user_tags root administrator
rabbitmq-plugins enable rabbitmq_management
ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.
INTERNAL_ERROR - access to vhost '/' refused for user 'root': vhost '/' is down, class-id=10, method-id=40)
down
状态 无法连接SSL connect error
几经百度找到了解决方案Github
更新了ssl的版本 导致老版本git的curl无法使用GIT
到最新版本git config --global http.sslversion tlsv1
项目中存在支付回调的金额效验代码
1 | public boolean notify(String outTradeNo, String orderNo, String account, String amount, String tradeStatus, TradeChannel channel) { |
微信回调的数据(敏感数据已屏蔽)
1 | <xml> |
微信回调处理的逻辑
1 | // 异步处理订单 |
后台日志打印的错误
1 | INFO c.s.k.k.OrderKit - 订单号 20180223143832xxxxxxxxxxxx 回调金额 299.45 和实际金额 300.0 不一致 丢弃当前通知信息! |
cash_fee
而不是 total_fee
单位: 分
total_fee
订单金额settlement_total_fee
应结订单金额=订单金额-非充值代金券金额,应结订单金额<=订单金额cash_fee
现金支付金额coupon_fee
总代金券金额单位: 元
total_fee
订单金额单位: 元
total_amount
订单金额receipt_amount
商家在交易中实际收到的金额buyer_pay_amount
用户在交易中实际支付的金额point_amount
使用集分宝支付的金额%~f0
当前文件路径%~n0
当前文件名称打开控制台 复制下列代码 回车 点击下载
1 | Object.defineProperty(Object.getPrototypeOf(navigator), 'platform', { |
/etc/ssh/sshd_config
本文基于该文件修改1 | PasswordAuthentication yes |
1 | AuthorizedKeysFile .ssh/authorized_keys # 认证公钥文件 |
1 | GatewayPorts yes |
1 | ssh -t root@192.168.2.200 ls |
1 | HOME=/home/app/wxappserver |
1 | ssh -NTf -R 8080:127.0.0.1:3200 root@v.yumc.pw |
0.0.0.0
请 开启网关端口1 | autossh -M 8081 -fCNR 8080:127.0.0.1:3200 root@server.yumc.pw |
跳一跳
据说存在漏洞可以通过接口直接发送成绩 本次就使用 Charles
抓取微信的数据Charles
Proxy => Proxy Setting
HTTP Proxy
的端口为本地未占用的 例如 9999
WIFI
确保和电脑处于同一网段iPhone6P IOS11
为例HTTP 代理 => 配置代理
手动
Charles
配置的端口HTTPS
代理HTTPS
的请求是加密的 也就是显示红色的 <UNKNOWN>
Help => SSL Proxying => Install Charles Root Certificate on a Mobile Device or Remote Browser
Charles
会有一个提示 手机根据提示的网址打开 Charles 4.2.1
提示的网址为 chls.pro/sslSafari
打开网址后会提示安装描述文件 点击 允许
安装
然后输入密码 部分系统还会弹出一个警告 继续点 安装
IOS9
则需要进行下列操作设置 => 通用 => 关于本机(滑到底) => 证书信任设置
Charles Proxy CA xxxxxx
的一行 打开后面的按钮 弹出警告 点击继续Proxy => SSL Proxying Setting
Enable SSL Proxying
ADD
*
443
OK
Ctrl + 退格
删除历史记录跳一跳
https://mp.weixin.qq.com/wxagame/wxagame_init
的请求Contents
下面选择 JSON Text
1 | { |
session_id
和 version
并且保存t1t.js
npm install crypto-js request-promise request
session_id
和 version
(约65-70行左右)score
为你要的分数 高于 100000
之后排行榜也会显示 100000
npm t1t.js
session_id
和 version
并且写上自己需要的分数 点击执行即可1 | 赋值 |
1 | 计算(用$((语句))的形式) |
1 | 字符串操作 |
1 | 数组初始化 |
操作符详见 Shell脚本内的操作符解释
test
操作1 | test -操作符 参数 |
()
操作命令
, Shell会扫描命令行,当发现$(命令)的结构时,会先执行内部的命令,得到标准输出,再将该值输出到原有的命令(())
操作[]
操作 注意 用[]的情况下 括号左边右边都要有空格1 | [ -操作符 参数 ] |
IF 条件判断
1 | if [ 表达式 ]; then |
CASE 多条件判断
1 | case 变量 in |
FOR 循环
1 | for ((i=1; i<=100; i ++)); do |
WHILE 循环(表达式为真则执行)
1 | while 表达式; do |
UNTIL 循环(表达式为假则执行)
1 | until 表达式; do |
异常退出
1 | set -e # 遇到任何命令返回值非0 则退出 |
管道命令异常退出(set -e
只能检测单条命令)
1 | set -e pipefail |
读取脚本参数
1 | $# => 当前脚本传入参数个数 |
循环读取脚本参数(参数个数大于10个的时候很有用 shift 是把参数往前移动)
1 | while [ $# -gt 0 ]; do |
1 | chcp 65001 |
PowerShell
然后执行下列命令1 | Get-AppxPackage -AllUsers | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register "$($_.InstallLocation)\AppXManifest.xml"} |
1 | location / { |
目录结构
1 | ├─api |
新建根路由 index.js
1 | import { |
新建 user/index.js
用户模块
1 | import { |
在 server.js 使用
1 | import express from 'express'; |
经测试 /api/user/login
和 /api/login/logout
均可访问
application/x-www-form-urlencoded
的格式那么没问题application/json
则用到了 @RequestBody
中的数据InputStream
只能取一次数据Controller
中取不到数据新建一个 SignHttpServletRequestWrapper
包装请求
1 | package com.sixi.enquiry.interceptor; |
添加一个 SignFilter
过滤器用来封装请求
1 | package com.sixi.enquiry.interceptor; |
在配置类内新增一个 Bean 注册过滤器
1 |
|
新增一个用到了 getInputStream
的拦截器
1 | package com.sixi.enquiry.interceptor; |
新增控制器 打印数据
1 | package com.sixi.enquiry.controller; |
使用CURL测试 可以获得数据
1 | $ curl -sX POST http://172.30.34.3:1221/test \ |
如果提示下列警告就先删除原有Docker PS:自己保存需要的数据
1 | Executing docker install script, commit: 11aa13e |
1 | curl -q https://get.docker.com | sh |
1 | curl -L https://github.com/docker/machine/releases/download/v0.14.0/docker-machine-`uname -s`-`uname -m` >/tmp/docker-machine && \ |
1 | sudo curl -L https://github.com/docker/compose/releases/download/1.19.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose |
1 | yum remove docker |
注意 如果已经配置过
daemon.json
请手动添加
1 | echo '{"registry-mirrors": ["https://registry.docker-cn.com"]}' > /etc/docker/daemon.json |
注意 如果已经配置过
daemon.json
请手动添加
1 | echo '{ "insecure-registries": ["docker.sixi.com"] }' > /etc/docker/daemon.json |
1 | docker login registry.sixi.com |
1 | mkdir -p /etc/systemd/system/docker.service.d |
修改 nano /lib/systemd/system/docker.service
文件
调整启动命令为 ExecStart=/usr/bin/dockerd --graph=/home/lib/docker
执行 systemctl daemon-reload
移动原有数据 mv /var/lib/docker /home/lib
创建软连接 ln -s /home/lib/docker /var/lib/docker
(可以不执行 但是防止配置失败 重新创建 还是连接一下)
重启 Docker service docker restart
如果是首次安装 直接创建软连接即可 (PS: 这种方式会丢失Volume的数据 小心!!!)
1 | service docker stop |
1 | docker system prune --volumes -f |
1 | docker rm $(docker ps -a |awk '{print $1}' | grep [0-9a-z]) |
1 | docker rmi $(docker images | awk '{print $3}' | grep [0-9a-z]) |
1 | docker volume rm $(docker volume ls -qf dangling=true) |
1 | for i in $(docker-machine ls | awk '{print $1}' | grep -v "NAME"); do |
1 | pkill docker |
Administrator
用户 就打开选择用户添加开启组策略
限制连接的数量
配置为已启用 => 允许的RD最大连接数
设置为 10
将远程桌面服务用户限制到单独的远程桌面服务会话
设置为 已禁用
破解 termsrv.dll
Windows 防火墙: 允许入站远程桌面例外
配置为已启用 => 允许来自这些IP地址的未经请求的传入消息
设置为 *
控制面板\网络和 Internet\网络和共享中心\高级共享设置
(直接复制到地址栏)密码保护的共享
配置为 关闭密码保护共享
重新连接即可1 | package main |
xx.exe install
xx.exe start
xx.exe stop
xx.exe restart
xx.exe remove
检查 GOPATH/bin
是否存在于 PATH
内
然后安装下列依赖
1 | go get -u -v github.com/mdempsky/gocode |
打开 Visual Studio Code 安装插件
Ctrl + P
输入 ext install ext
回车Go
查找 安装第一个打开 Visual Studio Code 的配置
1 | "go.buildOnSave": "package", |
相关问题解决
PANIC
gocode close && gocode -s &
重启服务java.security.spec.InvalidKeySpecException DerInputStream.getLength(): lengthTag=111, too big.
1 | <plugin> |
Go1.6
的编译过程需要 Go1.4
的二进来实现 bootstrap(自举) 简单来说: Go需要Go自身来编译1 | wget -O- https://blog.yumc.pw/attachment/script/shell/go.sh | bash -s -v 1.11.1 -s /opt/src -i /opt |
-v
指定安装的版本-s
指定编译的目录-i
指定安装的目录/opt/src
我习惯放在这里cd /opt/src
git clone https://github.com/golang/go.git
GOROOT_BOOTSTRAP
gcc
和 glibc-devel
yum install gcc glibc-devel
cd /opt/src/go
git checkout -b 1.4.3 go1.4.3
cd src
./all.bash
BOOTSTRAP(GO1.4)
到 /opt/go1.4
并且设置 GOROOT_BOOTSTRAP
cp /opt/src/go/ /opt/go1.4 -rf
export GOROOT_BOOTSTRAP=/opt/go1.4
cd /opt/src/go
git clean -dfx
git checkout master
OR git checkout -b 1.10.3 go1.10.3
cd src
./all.bash
cp /opt/src/go /opt/go -rf
OR cp /opt/src/go /opt/go1.10.3 -rf
GOROOT
export GOROOT=/opt/go
GOPATH
export GOPATH=/home/go
1 | var a = document.createElement("a"); |
初级
中级
高级
深入
在 O/R 映射的时候出现的概念 如果没有 O/R 映射 没有这个概念存在了 通常对应数据模型(数据库) 本身还有部分业务逻辑的处理 可以看成是与数据库中的表相映射的 Java 对象 最简单的 PO 就是对应数据库中某个表中的一条记录 多个记录可以用 PO 的集合 PO 中应该不包含任何对数据库的操作。
就是从现实世界中抽象出来的有形或无形的业务实体 一般和数据中的表结构对应。
在应用程序不同 tie(关系) 之间传输的对象
这个概念来源于J2EE的设计模式 原来的目的是为了EJB的分布式应用提供粗粒度的数据实体 以减少分布式调用的次数 从而提高分布式调用的性能和降低网络负载 但在这里 我泛指用于展示层与服务层之间的数据传输对象。
视图对象 用于展示层 它的作用是把某个指定页面(或组件)的所有数据封装起来。
从业务模型的角度看 见 UML 元件领域模型中的领域对象 封装业务逻辑的 java 对象 通过调用 DAO 方法 结合 PO,VO 进行业务操作 business object: 业务对象 主要作用是把业务逻辑封装为一个对象。这个对象可以包括一个或多个其它的对象 比如一个简历 有教育经历 工作经历 社会关系等等 我们可以把教育经历对应一个 PO 工作经历对应一个 PO 社会关系对应一个 PO 建立一个对应简历的 BO 对象处理简历,每个 BO 包含这些 PO 这样处理业务逻辑时 我们就可以针对 BO 去处理。
纯的传统意义的 java 对象 就是说在一些 Object/Relation Mapping 工具中 能够做到维护数据库表记录的 Persisent Object 完全是一个符合 Java Bean 规范的纯 Java 对象 没有增加别的属性和方法。我的理解就是最基本的 Java Bean 只有属性字段及 setter 和 getter 方法
是一个 SUN 的一个标准 J2EE 设计模式 这个模式中有个接口就是 DAO 它负持久层的操作 为业务层提供接口 此对象用于访问数据库 通常和 PO 结合使用 DAO 中包含了各种数据库的操作方法 通过它的方法 结合 PO 对数据库进行相关的操作 夹在业务逻辑与数据库资源中间 配合 VO 提供数据库的 CRUD 操作
]]>Referer:
配置 SpringBoot 自带的配置
1 |
|
配置 Tomcat 内置的请求限制 (这里的大小必须大于或等于 SpringBoot 的上传限制)
1 | private int maxUploadSizeInMb = 30 * 1024 * 1024; // 30 MB |
1 | spring: |
1 | sudo /etc/init.d/apache2 start |
d
是守护进程(daemon)的缩写。 Systemd 这个名字的含义,就是它要守护整个系统。开机自启动 systemctl enable firewalld
关闭自启动 systemctl disable firewalld
检查服务状态 systemctl status firewalld
检查发服务是否自启动 systemctl restart httpd.service
检查服务是否激活 systemctl is-active firewalld
显示所有已启动的服务 systemctl list-units --type=service
锁定服务 systemctl mask firewalld
解锁服务 systemctl unmask firewalld
重载服务 systemctl daemon-reload
1 | [Unit] |
() -> {}
(Integer x, Integer y) -> { return x + y; }
(x, y) -> { return x + y; }
可以省略类型 Lambda 支持自动推导(x, y) -> x + y
单行可以省略 return
和 ;
1 | // 原来 我们在线程执行一行代码的时候至少需要4行代码新建一个匿名类 |
1 | Map<String, Object> map = new HashMap<>(); |
@FunctionalInterface
表示这是一个函数式接口java.util.function
包下Function<T, R>
BiFunction<T, U, R>
map
flatMap
等处理函数Consumer<T>
BiConsumer<T, U>
forEach
peek
等处理函数Predicate<T>
BiPredicate<T, U>
filter
等过滤函数Supplier<T>
使用 Stream 处理一个数字列表
1 | List<Integer> nums = Arrays.asList(1, 2, 3); |
java.util.Collection
接口的集合类 可以通过 stream()
方法转换为 Stream
Map
List
Set
Queue
等java.util.Arrays#stream(T[])
方法转换为 Stream
1 | String.prototype.format = function () { |
1 | /** |
1 | /** |
1 | var deepDiffMapper = function () { |
PHPMailer
发送邮件 以 企业QQ邮箱为例Composer
安装 PHPMailer
composer require phpmailer/phpmailer
Mailer.php
1 |
|
application/extra
新建 mail.php
配置文件 或者直接添加到 根配置(自己看文档)1 |
|
1 |
|
提示 SMTP connect() failed;
请先检查下面两项
fsockopen
函数是否开启tls
或者 ssl
检查 openssl
模块是否开启如果是 QQ邮箱 之类的企业邮箱 提示 mail from address must be same as authorization user
错误代码是 501
from
和 username
是否相同KEYS <pattern>
DEL <key>
SET <KEY> <VALUE>
EX <seconds>
− 设置指定的到期时间(以秒为单位)。PX <milliseconds>
- 设置指定的到期时间(以毫秒为单位)。NX
- 仅在键不存在时设置键。XX
- 只有在键已存在时才设置。GET <key>
CONFIG SET slowlog-log-slower-than 200
当查询慢于200毫秒的时候记录CONFIG SET slowlog-max-len 25
设置 慢日志最大长度SLOWLOG GET <num>
获取指定数量的慢日志SLOWLOG RESET
重置慢日志DENIED Redis is running in protected mode because protected mode is enabled
CONFIG SET protected-mode "no"
ip a
发现服务器网卡没有分配IP 1 | root@iZ28cqmea34Z:~# ip a |
journalctl -xe
查看错误信息 关键信息如下 1 | Jul 29 11:30:58 iZ28cqmea34Z ifup[570]: Cannot find device "eth0" |
Ubuntu
的 配置文件在 /etc/network/interfaces
vi /etc/network/interfaces
eth0
为 ens3
eth1
为 ens4
service networking restart
查看网络 已经获得IP了1 | root@iZ28cqmea34Z:~# ip a |
数据库迁移目录
service mysqld stop
/etc/my.cnf
文件datadir=/var/lib/mysql
改为 datadir=/home/lib/mysql
log-error=/home/log/mysqld.log
改为 log-error=/var/log/mysqld.log
mkdir -p /home/log && touch /home/log/mysqld.log && chown mysql:mysql /home/log -R
mkdir -p /home/lib && mv /var/lib/mysql /home/lib/mysql && ln -s /home/lib/mysql /var/lib/mysql && chown mysql:mysql /home/lib/mysql
setenforce 0
service mysqld start
迁移数据库目录之后 启动报错 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
mysqld --initialize --user=mysql --datadir=/home/lib/mysql
mysqld_safe
注意 此命令会导致数据库数据丢失 记得备份
迁移数据库目录之后 提示没有权限的问题处理
[Warning] Can't create test file /data/mysql/xxxxxx.lower-test
/data/mysql
的所有者是不是 mysql:mysql
setenforce 0
命令 暂时关闭/etc/selinux/config
修改这个文件 设置 SELINUX=disabled
/etc/selinux/config
文件 但是有 /etc/apparmor.d/usr.sbin.mysqld
这个文件的1 | /var/lib/mysql/ r, |
1 | /data/mysql/ r, |
ib_logfile*
在新的数据目录下执行 rm -rf ib_logfile*
错误 Packet for query is too large (2164364 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
set GLOBAL max_allowed_packet='3M';
max_allowed_packet=3M
添加到 my.cnf
配置文件错误 Data source rejected establishment of connection, message from server: "Too many connections"
set GLOBAL max_connections=2048;
max_connections=2048
添加到 my.cnf
配置文件错误 ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
SET GLOBAL log_bin_trust_function_creators=1;
log_bin_trust_function_creators=1
添加到 my.cnf
配置文件错误 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
SET GLOBAL sql_mode='NO_ENGINE_SUBSTITUTION';
sql_mode='NO_ENGINE_SUBSTITUTION'
添加到 my.cnf
配置文件Node
略…npm install --g vue-cli
vue init webpack my-project
cd my-project && npm install
npm run dev
npm run build
组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型、自包含和通常可复用的组件构建大型应用。仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树:
1 | // 定义名为 todo-item 的新组件 |
1 | <ol> |
1 | Vue.component('todo-item', { |
1 | <div id="app-7"> |
1 | var data = { a: 1 } |
注意只有这些被代理的属性是响应的。如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。我们将在后面详细讨论响应系统。
1 | var data = { a: 1 } |
注意,不要在实例属性或者回调函数中(如 vm.$watch(‘a’, newVal => this.myMethod()))使用箭头函数。因为箭头函数绑定父级上下文,所以 this 不会像预想的一样是 Vue 实例,而是 this.myMethod 未被定义。
<span>Message: {{ msg }}</span>
<span v-once>This will never change: {{ msg }}</span>
<div v-html="rawHtml"></div>
注意防范XSS攻击渲染的模板不会进行数据绑定 如果需要请使用组件实现
v-bind
绑定 <div v-bind:id="dynamicId"></div>
boolean
类型的数据 如果结果为 false
则属性会被移除1 | <button v-bind:disabled="isButtonDisabled">Button</button> |
1 | {{ number + 1 }} |
每个绑定只能包含单个表达式
1 | <!-- 这是语句,不是表达式 --> |
模板表达式都被放在沙盒中,只能访问全局变量的一个白名单,如 Math 和 Date 。你不应该在模板表达式中试图访问用户定义的全局变量。
指令(Directives)是带有
v-
前缀的特殊属性 其预期值是单一 JavaScript 表达式
:
指定v-bind
绑定属性1 | <a v-bind:href="url"></a> |
v-on
绑定方法1 | <a v-on:click="doSomething"> |
.prevent
修饰符告诉 v-on
指令对于触发的事件调用 event.preventDefault()
1 | <form v-on:submit.prevent="onSubmit"></form> |
Vue.js 允许你自定义过滤器,可被用作一些常见的文本格式化。
1 | <!-- in mustaches --> |
Vue 2.x 中,过滤器只能在 mustache 绑定和 v-bind 表达式(从 2.1.0 开始支持)中使用,因为过滤器设计目的就是用于文本转换。为了在其他指令中实现更复杂的数据变换,你应该使用计算属性。
1 | new Vue({ |
1 | {{ message | filterA | filterB }} |
1 | // arg1 实际上为 filterA 方法的第二个参数 以此类推 |
v-bind
缩写1 | <!-- 完整语法 --> |
v-on
缩写1 | <!-- 完整语法 --> |
Computed vs Methods
Computed 属性 vs Watched 属性 (简化代码)
watch
1 | var vm = new Vue({ |
computed
1 | var vm = new Vue({ |
计算属性添加 Setter
1 | computed: { |
1 | <div id="watch-example"> |
1 | package com.sixi.ktpd.domain.form.admin; |
jdbcType=TIMESTAMP
否则转换成的字符串将无法被解析1 | <select id="list" resultType="java.util.Map"> |
<sql>
区域配置 简化 UPDATE
和 INSERT
1 | create table ktpd.user |
Set
的 <sql>
区域 1 | <sql id="Set"> |
<include refid="Set"/>
包含区域 1 | <insert id="insert" useGeneratedKeys="true" keyProperty="id" parameterType="pw.yumc.demo.entity.User"> |
本插件用于生成 POJO类 和 Mapper接口 还有 XML 的配置文件
1 | <!-- 指定数据库表 --> |
TINYINT(1)
时 得到的结果是 Boolean
类型TINYINT(1)
字段数据 返回值为Map类型 那么 TINYINT(1)
的数据默认会转化为 Boolean
类型数据.IFNULL(column, 0)
CAST(column AS SIGNED)
tinyInt1isBit=false
该值默认为 true
TINYINT
字段类型 改成 TINYINT(2)
即可AlphaSSL
原价是$149一年 通过工具可以免费申请 (PS: 目前已失效!)在Git Bash或者Linux下执行 获得 server.key 和 server.csr
1 | shell> openssl genrsa -out server.key 2048 |
请自行修改-subj的内容
C(Country Name) 国家代码 默认写CN
ST(State or Province Name) 省份或区域
L(Locality Name) 地区名称
O(Organization Name) 组织或公司名称
OU(Organizational Unit Name) 团队或者部门名称
CN(Common Name) 你个人名称或者服务器域名
下列内容摘自百度百科SSL条目
DN字段名 | 缩写 | 说明 | 填写要求 |
---|---|---|---|
Country Name | C | 证书持有者所在国家 | 要求填写国家代码,用2个字母表示 |
State or Province Name | ST | 证书持有者所在州或省份 | 填写全称,可省略不填 |
Locality Name | L | 证书持有者所在城市 | 可省略不填 |
Organization Name | O | 证书持有者所属组织或公司 | 最好还是填一下 |
Organizational Unit Name | OU | 证书持有者所属部门 | 可省略不填 |
Common Name | CN | 证书持有者的通用名 | 必填。 |
对于非应用证书,它应该在一定程度上具有惟一性; | |||
对于应用证书,一般填写服务器域名或通配符样式的域名。 | |||
Email Address | 证书持有者的通信邮箱 | 可省略不填 |
YOUR SSL CERTIFICATE
往下看把AlphaSSL的中间证书追加到证书内容的下方 不然部分浏览器会提示证书不安全
1 | -----BEGIN CERTIFICATE----- |
1 | # HTTPS server |
SpringBoot
中使用 Maven
的 resource-filter
时 配置文件内的变量应该 由 ${project.version}
改为 @project.version@
@Component
@ConfigurationProperties(prefix = "sms")
application.yml
1 | sms: |
SmsSetting.java
1 |
|
@Component
@ConfigurationProperties(prefix = "git.commit", exceptionIfInvalid = false)
@PropertySource("classpath:git.properties")
@PropertySource
配置的是文件路径1 | #Generated by Git-Commit-Id-Plugin |
1 |
|
1 | public class Demand { |
必须在验证的参数后添加一个 BindingResult 不然 Spring 会直接返回 400 错误
1 | public String add( DemandForm demandForm, BindingResult result){ |
@org.hibernate.validator.constraints.Email
@org.hibernate.validator.constraints.Length(value)
@org.hibernate.validator.constraints.NotBlank
@org.hibernate.validator.constraints.NotEmpty
@org.hibernate.validator.constraints.Range(min, max)
@org.hibernate.validator.constraints.SafeHtml
@org.hibernate.validator.constraints.ScriptAssert(script, lang)
当前注解标记于Class上
_this
代表当前类1 |
|
@org.hibernate.validator.constraints.URL
@javax.validation.constraints.DecimalMax(value)
@javax.validation.constraints.DecimalMin(value)
@javax.validation.constraints.Digits(integer, fraction)
@javax.validation.constraints.Future
@javax.validation.constraints.Past
@javax.validation.constraints.Max(value)
@javax.validation.constraints.Min(value)
@javax.validation.constraints.NotNull
@javax.validation.constraints.Null
@javax.validation.constraints.Pattern(regexp = "^(.*)$")
@javax.validation.constraints.Size(max, min)
BeanKit
1 | package com.sixi.ktpd.kits; |
WebMvcConfigurerAdapter
的配置文件内重写这个方法1 | package pw.yumc.demo.config; |
1 | public Map submit(HttpServletRequest request){ |
org.springframework.web.method.support.HandlerMethodArgumentResolver
接口1 | package pw.yumc.demo.resolver.argument; |
Spring-Boot
配置类里添加这个解析器1 | package pw.yumc.demo.config; |
1 | package pw.yumc.demo.config; |
1 | package pw.yumc.spring.core.config; |
1 | package pw.yumc.web.open.domain.entity; |
1 | package pw.yumc.web.open.domain.entity; |
1 | package pw.yumc.web.open.controller; |
1 | curl -sX POST http://127.0.0.1:8080/test/order \ |
1 | $ curl -sX POST http://172.30.34.3:1221/test/order \ |
GlobeExceptionHandler
继承 ResponseEntityExceptionHandler
添加 @ControllerAdvice
注解1 |
|
DispatcherServlet
分发器的 throwExceptionIfNoHandlerFound
为 true
相关代码如下org.springframework.web.servlet.DispatcherServlet#noHandlerFound
1 | /** |
throwExceptionIfNoHandlerFound
为 true
之后 Spring 会在找不到处理时抛出异常handleNoHandlerFoundException
父类方法中的 handleExceptionInternal
方法的第二个参数1 | package pw.yumc.demo.config; |
1 |
|
Content-Type
所以不支持1 |
|
首先,属性可用来描述同一类事物的特征,方法可描述一类事物可做的操作。封装就是把属于同一类事物的共性(包括属性与方法)归到一个类中,以方便使用。
就是个性对共性的属性与方法的接受,并加入个性特有的属性与方法
另外子类可以写自己特有的属性和方法,目的是实现功能的扩展,子类也可以复写父类的方法即方法的重写。
多态的概念发展出来,是以封装和继承为基础的。
多态就是在抽象的层面上实施一个统一的行为,到个体(具体)的层面上时,这个统一的行为会因为个体(具体)的形态特征而实施自己的特征行为。(针对一个抽象的事,对于内部个体又能找到其自身的行为去执行。)
1.概念:相同的事物,调用其相同的方法,参数也相同时,但表现的行为却不同。
2.理解:子类以父类的身份出现,但做事情时还是以自己的方法实现。子类以父类的身份出现需要向上转型(upcast),其中向上转型是由JVM自动实现的, 是安全的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现时自己特有的属性和方法将不能使用。
Single Responsibility Principle, 简称SRP。
定义:There should never be more than one reason for a class to change.
应该有且仅有一个原因引起类的变更。
职责的划分?单一的定义和级别?
应该根据实际业务情况而定。关注变化点。
实际使用时,类很难做到职责单一,但是接口的职责应该尽量单一。
Liskov Substitution Principle, 简称LSP。
定义:Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.
(所有引用基类的地方必须能透明地使用其子类的对象)
里氏替换原则为良好的继承定义了一个规范:
注:在类中调用其他类时务必要使用父类或接口,如果不能使用父类或接口,则说明类的设计已经违背了LSP原则。
Dependence Inversion Principle, 简称DIP
定义:High level modules should not depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details.Details should depend upon abstractions.
翻译过来,包含三层含义:
精简的定义: 面向接口编程。
依赖的三种写法:
最佳实践:
接口–这里指用interface关键字定义的接口。
定义:
概括:建立单一接口,不要建立臃肿庞大的接口。
保证接口的纯结性:
最佳实践:
Law of Demeter, LOD。又称最少知识原则(Least Knowledge Principle, LKP)。
通俗来讲:一个类应该对自己需要耦合或调用的类知道得最少,你(被耦合或调用的类)的内部是如何复杂都和我没有关系,那是你的事情,我就调用你提供的public方法,其他一概不关心。
低耦合要求:
朋友类:出现在成员变量、方法的输入输出参数中的类。方法体内部的类不属于朋友类。
迪米特法则要求类“羞涩”一点,尽量不要对外公布太多的public方法和非静态的public变量,尽量内敛,多使用private、package-private、protected等访问权限。
如果一个方法放在本类中,既不增加类间关系,也对本类不产生负面影响,就放置在本类中。
Software entities like classes, modules and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭)
软件实体包括以下几个部分:
变化的三种类型:
NSSM
是一个开源项目官网 可以将任意程序部署为 Windows 的服务Caddy
到系统服务 并且开机自启动 1 | nssm install caddy D:\Caddy\caddy.exe |
DisplayName
: 服务显示名称Description
: 服务描述AppDirectory
: 启动目录AppStdout
和 AppStderr
: 标准输出和错误输出AppNoConsole
: 是否显示Console 设置为 1 不显示Start
: 设置启动方式 可选下列值SERVICE_AUTO_START
开机自启动SERVICE_DELAYED_AUTO_START
延时启动SERVICE_DEMAND_START
手动启动SERVICE_DISABLED
禁用
不可计算的一定是维度,但可度量的不一定不是维度
可计算的不一定是度量,不可计算的一定不是
Shadowsocks
服务器 适用于Linux1 | wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh |
1 | wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh |
创建用户
useradd ss
su ss
cd ~
安装面板
wget https://github.com/sendya/shadowsocks-panel/archive/sspanel-v1.2.0.B.tar.gz
tar -xvzf sspanel-v1.2.0.B.tar.gz -C ./
cd shadowsocks-panel-sspanel-v1.2.0.B/
pushd Resource
wget https://github.com/sendya/shadowsocks-panel/releases/download/sspanel-v1.2.0.B/Resource.zip
unzip Resource.zip
popd
chmod -R 777 ./Data/
cp ./Data/Config.simple.php ./Data/Config.php
vi ./Data/Config.php
php -d disable_functions="" index.php install
安装后端
git clone https://github.com/Acris/shadowsocks-rm.git
cd shadowsocks-rm/shadowsocks
yum install m2crypto python-setuptools
easy_install pip
pip install cymysql
python servers.py
注意 是
servers.py
不是server.py
add: {"server_port": xxxx, "password":"xxxxxxxxx", "method":"AES-256-CFB"}
之类的就算成功了设置开机自启动
nano /etc/systemd/system/ss-rm.service
1 | [Unit] |
systemctl enable ss-rm
systemctl start ss-rm
1 | wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh |
wget -qO- bench.sh | bash
或者 curl -Lso- bench.sh | bash
Let’s Encrypt
是由互联网安全研究小组(ISRG,一个公益组织)提供的免费证书服务 旨在消除当前手动创建和安装证书的复杂过程的自动化流程,为安全网站提供免费的SSL/TLS证书。acme.sh
申请https://github.com/Neilpang/acme.sh/wiki/%E8%AF%B4%E6%98%8E
acme.sh
申请 证书curl https://get.acme.sh | sh
yum install socat
export DP_Id="88888"
export DP_Key="5xxxx2751xxxx99b910c59c839xxxxc2"
acme.sh --issue --dns dns_dp -d aa.com -d www.aa.com
acme.sh --install-cert -d aa.com --key-file /home/zs/aa.com.key --fullchain-file /home/zs/fullchain.cer --reloadcmd "nginx -s reload"
wget https://blog.yumc.pw/attachment/script/ssl/le-dns.sh
chmod +x le-dns.sh
./le-dns.sh dnspod
目前仅支持 DNSPOD
的自动申请vi ./hooks/dnspod/default.conf
./le-dns.sh dnspod
Ruby
开发环境包https://dl.bintray.com/oneclick/rubyinstaller/DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe
D:\Ruby23\devkit
你可以自己指定D:\Ruby23-x64\devkit
打开命令行ruby .\dk.rb init
在当前目录会生成一个 config.yml
1 | PS D:\Ruby23-x64\devkit> ruby .\dk.rb init |
config.yml
- D:\Ruby23
D:\Ruby23
后面的是你的 Ruby
安装目录ruby .\dk.rb install
1 | PS D:\Ruby23-x64\devkit> ruby .\dk.rb install |
注意: 使用
QQ邮箱
必须用587
端口
一开始 我一直用的是 25
和 465
这两个端口 结果无论如何都不成功
后来我看到默认端口是 587 然后就用 nmap 和 telnet 检测了一下
Nmap的结果
1 | [root@sz discourse]# nmap smtp.exmail.qq.com -p 25,465,587 |
Telnet的结果
1 | [root@sz discourse]# telnet smtp.exmail.qq.com 587 |
可以看出 这个端口也是邮件发送用的 具体什么协议还不知道
打开 containers/app.yml
配置基本信息
1 | ## TODO: The SMTP mail server used to validate new accounts and send notifications |
修改最后的 run
删除带有 notification_email
这一行开头的# 然后修改单引号内的邮箱为 DISCOURSE_SMTP_USER_NAME
所填写的值
1 | ## Any custom commands to run after building |
mkfs.xfs -n ftype=1 /dev/sdxx
后面的 /dev/sdxx
是你的分区名称service docker stop
mount -t xfs /dev/sdxx /var/lib/docker
/dev/sdxx on /var/lib/docker type xfs (rw,relatime,attr2,inode64,noquota)
service docker start
discourse_docker
的目录./launcher enter app
进入 Docker
内部1 | su postgres |
1 | \c discourse |
token
1 | id | user_id | email | token | confirmed | expired | created_at | updated_at |
http://你的论坛网址/users/activate-account/你的激活Token
MTU
可以改善网络转发效率通信术语 最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的最大数据包大小(以字节为单位)。最大传输单元这个参数通常与通信接口有关(网络接口卡、串口等)。
ping –l 1452 –f www.baidu.com
查看结果-l
指定了包的大小 -f
通知操作系统 不修改包大小1 | C:\Users\Administrator>ping -l 1452 -f www.baidu.com |
需要拆分数据包但是设置 DF。
ping -c 2 -s 1452 www.baidu.com
查看结果1 | root@LEDE:/mnt/pi/ssd/ipk/Installed# ping -c 2 -s 1452 www.baidu.com |
MTU
的值 把测量的结果 加上8(ICMP回显示请求和回显应答报文格式长度) 加上20(IP首部) 就是最终的 MTU
值1452
所以最终的结果是 1452+8+20
等于 1480
netsh interface ipv4 show subinterface
查看当前网卡的 MTU
值1 | PS C:\WINDOWS\system32> netsh interface ipv4 show subinterface |
netsh interface ipv4 set subinterface "以太网" mtu=1480 store=persistent
设置 MTU
值"以太网"
是就是上一个命令看到的接口名称ifconfig
查看网卡信息1 | [root@localhost ~]# ifconfig |
enp2s0
接口为例ifconfig enp2s0 mtu 1480 up
即可修改 MTU 值 重启后失效/etc/sysconfig/network-scripts/ifcfg-enp2s0
MTU=1480
/etc/network/interfaces
mtu 9000
LEDE
是一个基于 OpenWrt
的新项目 开发组大部分是 OpenWrt
的原有成员 并且提供稳定的更新和维护LEDE相比制造商的原厂固件更加出色,才使得人们更倾向于使用LEDE。LEDE工作起来更加稳定、提供更多的功能,并且更加安全,同时具有良好的技术支持。
luci 是 LEDE 的网页控制组件 运行于 uhttpd
luci
组件opkg install luci luci-i18n-base-zh-cn
opkg install luci-app-firewall luci-i18n-firewall-zh-cn
在
LEDE
的luci
中 大部分的组件都有luci-i18n-xxxx-zh-cn
的汉化语言包 可以提供汉化
opkg upgrade $(opkg list-upgradable | awk '{print $1}' | xargs) --force-depends --force-overwrite
opkg list-upgradable | awk '{print $1}' | xargs
可以获取所有可升级的包 转换为1行locate命令就是查询Linux中的类似的数据库(Linux会自动创建并且每天更新它) 它会很快地找到文件
locate 文件名称
chattr +i xxx
添加限制chattr -i xxx
解除限制split命令用于分割大文件
1 | split <文件名称> [分割后的文件前缀] -l 1000 |
sh split <文件名称> [分割后的文件前缀] -b 10m
/
根分区为可读写 mount -o rw,remount /
nano /etc/init.d/S90mount
1 | #ssd dev partition |
执行 opkg install block-mount kmod-usb2 kmod-sdhci kmod-usb-storage fdisk e2fsprogs
执行 opkg install kmod-fs-ext4 kmod-fs-vfat kmod-fs-nfs kmod-fs-cifs kmod-fs-autofs4
默认情况下 只需要安装
kmod-fs-ext4
就够了
nfs-utils
才能挂载mount -t nfs -o nolock 192.168.0.3:/home/app/nfs /mnt/nfs/
cifsmount
才能挂载mount -t cifs //192.168.0.3/share /mnt/pi/
ls /dev | grep sd
1 | root@LEDE:~# ls /dev | grep sd |
fdisk /dev/sda
p
查看分区1 | Command (m for help): p |
d
删除分区n
新建分区+256M
回车t
选择分区类型83
代表 Linux
类型的分区n
新建分区+512M
回车t
选择分区类型82
代表 Linux swap
类型的分区n
新建分区t
选择分区类型83
代表 Linux
类型的分区p
查看分区 此时的分区应该是这样的1 | Command (m for help): p |
w
写入分区表mkfs.ext4 /dev/sda1
mkswap /dev/sda2
mkfs.ext4 /dev/sda3
mkdir -p /mnt/sda1
mount -t ext4 /dev/sda1 /mnt/sda1
swapon /dev/sda2
mkdir -p /mnt/sda3
mount -t ext4 /dev/sda3 /mnt/sda3
df -h
1 | root@LEDE:~# df -h |
1 | mkfs.ext4 /dev/sda1 |
block detect
block detect > /etc/config/fstab
1 | config 'global' |
option target '/mnt/sda1'
改为 option target '/'
option enabled '0'
改成 option enabled '1'
1 | config 'global' |
vi /etc/banner
1 | BusyBox v1.26.2 () built-in shell (ash) |
安装必要的工具包
yum groupinstall "Development Tools"
yum install autoconf binutils bison bzip2 flex gawk gcc gcc-c++ gettext make ncurses-devel patch unzip wget zlib-devel
下载源代码 (最新的是 LEDE)
git clone https://git.lede-project.org/source.git lede
进入目录 下载扩展
cd lede
./scripts/feeds update -a
./scripts/feeds install -a
清理编译(如果是第一次编译可以忽略)
make clean
生成默认配置
make defconfig
打开配置菜单 配置编译参数
make menuconfig
make V=99
bin
目录下如果遇到
gconvert.c:61:2: error: #error GNU libiconv not in use but included iconv.h is from libiconv
iconvlib
cd build_dir/host/pkg-config-0.29.1/glib/
./configure --enable-iconv=no --with-libiconv=gnu
yum install nfs-utils
vi /ect/exports
本地目录 允许的地址(参数)
192.168.1.0/24
具体根据你所在的网段,
分割参数/home/app/nfs *(rw,sync,no_root_squash,insecure)
service rpcbind start && service nfs-server start
rpcinfo -p
1 | [root@sz ~]$ rpcinfo -p |
1
2
3
4
5
6
7
8
9
10
11
firewall-cmd --zone=public --add-port=111/tcp --permanent
firewall-cmd --zone=public --add-port=111/udp --permanent
firewall-cmd --zone=public --add-port=2049/tcp --permanent
firewall-cmd --zone=public --add-port=2049/udp --permanent
firewall-cmd --zone=public --add-port=20048/tcp --permanent
firewall-cmd --zone=public --add-port=20048/udp --permanent
firewall-cmd --zone=public --add-port=33665/udp --permanent
firewall-cmd --zone=public --add-port=40933/tcp --permanent
firewall-cmd --zone=public --add-port=51119/udp --permanent
firewall-cmd --zone=public --add-port=59459/tcp --permanent
firewall-cmd --reload
showmount -e nfs.yumc.pw
查看目录1 | C:\Users\Administrator>showmount -e nfs.yumc.pw |
mount -t nfs nfs.yumc.pw:/home/app/nfs /nfs
nfs-utils
mount -t nfs nfs.yumc.pw:/home/app/nfs N:
启用或关闭 Windows 功能
NFS 服务
注意: Windows下挂载只能用cmd不能用powershell之类的其他命令行
提示 mount: mounting nfs.yumc.pw:/home/app/nfs on /mnt failed: Permission denied
这个情况 有可能是 域名限制的问题
修改
/ect/exports
去掉域名 改为/home/app/nfs *(rw,sync,no_root_squash,insecure)
提示 mount: mounting nfs.yumc.pw:/home/app/nfs on /mnt failed: Connection refused
由于NFS有文件锁 所以导致链接被拒绝 添加
-o nolock
参数挂载 例如mount -t nfs -o nolock nfs.yumc.pw:/home/app/nfs /nfs
进入目录后 无法新建文件 提示 xxx: Permission denied
检查
/ect/exports
是不是少了no_root_squash
参数
Windows 下无法写入文件 提示 你需要权限来执行此操作
mount
1 | C:\Users\Administrator>mount |
regedit
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ClientForNFS\CurrentVersion\Default
AnonymousUid
和 AnonymousGid
yum | apt-get |
---|---|
zlib-devel | zlib1g-devel |
ncurses-devel | libncursesw5-dev |
libevent-devel | libevent-dev |
注意 不同语言环境下 yum 的组名称有可能不同
yum | yum 中文 | apt-get |
---|---|---|
“Development Tools” | “开发工具” | build-essential |
awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
awk ‘{pattern + action}’ {filenames}
awk [-F field-separator] ‘commands’ input-file(s)
#!/bin/sh
可以换成 #!/bin/awk
awk -f awk-script-file input-file(s)
将所有的awk命令插入一个单独文件
其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
nslookup sz.yumc.pw | grep Address | tail -n 1 | awk '{print $NF}'
nslookup sz.yumc.pw | grep Address | tail -n 1
(grep tail 命令请自行百度)Address 1: 120.193.59.11
部分系统为 Address: 120.193.59.11
awk '{print $x}'
的方式获取$NF
代表获取分列之后的最后一列awk '{print $NF}'
代表按照空格分列 然后获取最后一列在
Shell
中 大部分的变量最好加上"
包括起来 不然有可能返回带空格的参数 否则会导致[: too many arguments
错误
操作符 | 作用描述 |
---|---|
-b | 判断文件是否为二进制 |
-c | 判断文件是否为字符 |
-r | 判断文件是否可读 |
-w | 判断文件是否可读 |
-d | 判断是否为目录 |
-f | 判断是否为文件 |
-x | 判断文件是否存在 并且有可执行权限 |
-s | 判断文件是否为空 文件长度大于0 |
-e | 判断文件或目录是否存在 |
-z | 判断字符串为空 |
-n | 判断字符串非空 |
数值操作 | 假设A和B进行比较 |
---|---|
-eq | A=B |
-ne | A!=B |
-gt | A>B |
-lt | A<B |
-ge | A>=B |
-le | A<=B |
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/base.sh | bash |
1 | ntpdate cn.ntp.org.cn |
用于Gogs服务端的二进制升级 下载地址
用于Dnspod域名动态更新 下载地址
用于快速编译安装 Git 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/git.sh | bash
用于快速编译安装 Tmux 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/tmux.sh | bash
用于快速编译安装 Tmux 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/mysql.sh | bash
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/mysql.sh | bash |
用于快速编译安装 Tmux 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/htop.sh | bash
用于快速编译安装 Tcpping 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/tcpping.sh | bash
用于快速编译安装 Autossh 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/autossh.sh | bash
1 | wget -O- https://blog.yumc.pw/attachment/script/shell/go.sh | bash -s -v 1.11.1 -s /opt/src -i /opt |
1 | wget -qO- https://get.docker.com | sh |
1 | wget -qO- https://get.docker.com | sh -s docker --mirror Aliyun |
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/docker/machine.sh | bash |
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/docker/compose.sh | bash |
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/docker/harbor.sh | HOSTNAME=harbor.yumc.pw bash |
/var/lib/docker=>${DOCKER_HOME}
)1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/docker/move-docker-dir.sh | DOCKER_HOME="/home/lib/docker" bash |
用于快速编译安装 Redis 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/redis.sh | bash
用于快速编译安装 RabbitMQ 下载地址
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/rabbitmq.sh | bash
用于快速编译安装 Ngrok 服务端
1
2
3wget --no-check-certificate https://github.com/clangcn/ngrok-one-key-install/raw/master/install_ngrok.sh -O ./install_ngrok.sh
chmod 500 ./install_ngrok.sh
./install_ngrok.sh install
推荐使用
NVM
安装 NodeJS
1
2 wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
nvm install 8
用于快速安装NodeJS
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/nodejs.sh | bash
用于快速安装Yarn
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/yarn.sh | bash
用于快速安装JDK8
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/jdk/8.sh | bash
用于快速安装VirtualBox
1
wget -qO- https://blog.yumc.pw/attachment/script/shell/vbox.sh | bash
1 | for ((x = 0; x <= 255; x++)); do |
1 | # 获得PID的方法自己改写 |
一键安装脚本
wget -qO- https://blog.yumc.pw/attachment/script/shell/aria2c.sh | bash
yum -y install automake gettext gettext-devel libssh2 libxml2 zlib libgcrypt openssl libtool
git clone https://github.com/aria2/aria2.git
autoreconf -i
./configurate
make -j2 && make install
yum install aria2
apt-get install aria2
opkg install aria2
rc.local
文件vi /etc/rc.local
exit 0
前面加入下列内容 注意: Session路径需要和配置内的路径一致!1 | ARIA_SESSION_DIR=/opt/session/ |
提示 configure: error: no acceptable C compiler found in $PATH
安装
gcc
提示 configure: error: C compiler cannot create executables
退出重新登陆
提示 configure.ac:129: error: possibly undefined macro: AC_PROG_LIBTOOL
安装
libtool
提示 autogen.sh: 15: autogen.sh: aclocal: not found
安装
automake
安装完 automake
之后提示 WARNING: 'xxxxxx-x.xx' is missing on your system.
WARNING: 'aclocal-1.15' is missing on your system.
WARNING: 'automake-1.15' is missing on your system.
ln -s /usr/bin/aclocal /usr/bin/aclocal-1.15
ln -s /usr/bin/automake /usr/bin/automake-1.15
提示 autoreconf: autopoint is needed because this package uses Gettext
编译安装
gettext
http://ftp.gnu.org/gnu/gettext/gettext-latest.tar.gz
tar-xvzf gettext-latest.tar.gz
cd gettext-*
./configure && make && make install
xxxxx: error while loading shared libraries: xxxxx.so.0: cannot open shared object file: No such file or directory
ldconfig /usr/local/lib
Build dependency: Please install a static zlib. (Missing libz.a or zlib.h)
安装
zlib-static
result.getString("error_code").equals("gw.TimestampExpired")
"gw.TimestampExpired".equals(result.getString("error_code"))
断言的另一个重要之处在于,它是防御性编程(Defensive Coding)策略的重要组成部分。我们可以使用断言验证函数执行前后的状况,函数的执行参数和返回值,以及循环不变式(Loop-Invariant)。在完成性能关键代码的测试工作后,可将断言选择性地禁用。
id
不得表示任何业务逻辑gmt_create
创建时间 类型为 TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
1 | ALTER TABLE `table` ADD gmt_create TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间'; |
gmt_modified
修改/更新时间 类型为 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL
1 | ALTER TABLE `table` ADD gmt_modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '修改时间'; |
is_deleted
软删除标记(1:已删除, 0:未删除) 类型为 TINYINT(1) UNSIGNED DEFAULT 0 NOT NULL
1 | ALTER TABLE `table` ADD is_deleted TINYINT DEFAULT 0 NOT NULL COMMENT '软删除标记'; |
1 | ALTER TABLE `table` |
is_xxx
命名 数据类型都是 tinyint(1) UNSIGNED NOT NULL
(1:True, 0:False)decimal
禁止使用 float
和 double
count(xxx)
或 count(1)
之类来替代 count(*)
因为 count(*)
就是 SQL92
定义的标准统计行数的语法 跟数据库无关 跟 NULL
无关3 6 9
等IP
地址存成 UNSIGNED INT
尤其是当 你需要使用这样的WHERE条件 IP BETWEEN ip1 AND ip2
我们必需要使用 UNSIGNED INT
因为 IP地址会使用整个32位的无符号整形INET_ATON()
来把一个字符串IP转成一个整形 并使用 INET_NTOA()
把一个整形转成一个字符串IPyum install python-pip
pip install shadowsocks
touch /etc/ss.json
vi /etc/ss.json
1 | { |
sslocal -c /etc/ss.json
应该会看到如下内容 1 | INFO: loading config from /etc/ss.json |
-b
参数 sslocal -c /etc/ss.json -b 0.0.0.0
yum install python git
git clone https://github.com/maxsky/shadowsocksr-manyuser.git
复制配置文件 cp shadowsocksr-manyuser/config.json ~/shadowsocks.json
修改配置
1 | { |
1 | [root@server ssr]# python ./shadowsocksr-manyuser/shadowsocks/local.py -c ~/shadowsocks.json -b 0.0.0.0 |
配置 /etc/profile
添加下列代码
1 | http_proxy=http://127.0.0.1:1080/ |
配置包管理工具
/etc/yum.conf
文件1 | proxy=http://127.0.0.1:8080/ |
/etc/apt/apt.conf
文件1 | Acquire::http::Proxy "http://127.0.0.1:1080" |
配置 wget
修改 /etc/wgetrc
1 | # You can set the default proxies for Wget to use for http, https, and ftp. |
使用 proxychains
修改 /etc/proxychains.conf
1 | socks5 127.0.0.1 1080 |
System.exit()
退出的查看JUnit4的TestRunner的源码
1 | public static final int SUCCESS_EXIT = 0; |
可以看到 单元测试执行完毕之后 是用 System.exit() 退出的主线程 主线程结束了 其他线程自然被终止了
在Java的线程池中 有一个方法 awaitTermination()
可以检测所有线程是否执行完毕 可以通过循环判断来达到防止主线程退出的目的
下面提供一个工具类
1 | package pw.yumc.MiaoServer.kits; |
新建一个单元测试类 贴上下列代码 用于打印 2016 年至今的所有日期
1 |
|
经过测试 可以完整的打印所有的内容
]]>1 | { |
1 | server { |
listen 80
listen 443 ssl
listen 85 udp
1 | listen 80; |
1 | location / { |
1 | location / { |
index.php
文件测试模式
1 | try_files $uri $uri/ /index.php?$uri&$args; |
文件名称判断
1 | if (!-e $request_filename) { |
重写目录和文件
1 | if (!-d $request_filename) { |
1 | add_header Access-Control-Allow-Headers x-requested-with,content-type; |
1 | add_header P3P "CP=CAO PSA OUR"; |
1 | autoindex on; |
1 | charset utf-8,gbk; |
1 | client_max_body_size 50M; |
1 | gzip on; |
1 | location /ws/ { |
1 | upstream wsbackend { |
1 | ignore_invalid_headers off; |
root
用户启动1 | user root root; |
could not build the server_names_hash, you should increase server_names_hash_bucket_size: xx
http{...}
添加一行配置 server_names_hash_bucket_size 64;
regedit.exe
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters
BasicAuthLevel
的值改为 2 (0-禁止,1-HTTPS,2-HTTP和HTTPS)net use x: "http://disk.yumc.pw/seafdav" /persistent:yes
FastJson | PgSql | MySQL |
---|---|---|
getLong | BIGINT | BIGINT |
getBigDecimal | NUMERIC | NUMERIC |
getString | CHARACTER VARYING | VARCHAR |
getInteger | INTEGER | INTEGER |
114.114.114.114
电信DNS119.29.29.29
DNSPOD180.76.76.76
百度DNS223.5.5.5
阿里DNS1.2.4.8
CNNIC8.8.8.8
谷歌DNS载入插件的时候提示 ClassNotFound
错误 并且能在日志内搜索到 INVOKESPECIAL/STATIC on interfaces require ASM 5
类似的提示
1.12.2
推荐使用最新的 MOD 端 Evolate
下载地址1.7.10
推荐使用最新的 MOD 端 Uranium
下载地址Contigo
下载地址MilkFox2002/Thermos
下载地址CyberdyneCC/Thermos
下载地址下载压缩包 解压后即可运行
SpecialSource
类库 点击下载libraries\net\md-5\
目录SpecialSource
目录 随你怎么备份 反正不要放在 libraries
里面就行SpecialSource
目录SpecialSource
iptables -I INPUT -p tcp --dport 8325 -j ACCEPT
/etc/init.d/iptables save
iptables-save > /etc/sysconfig/iptables
高版本/etc/init.d/iptables restart
systemctl restart iptables.service
高版本/etc/init.d/iptables status
或者 iptables -L
systemctl status iptables.service
高版本md5sum 文件名称
1 | md5sum Office2013\ 4in1_2.rar |
certutil -hashfile 文件 MD5
即可获得下列结果1 | certutil -hashfile "Office2013 4in1_2.rar" MD5 |
该扩展程序未列在 Chrome 网上应用店中,并可能是在您不知情的情况下添加的
和 并非来自 Chrome 网上应用店
Win+R 输入 gpedit.msc
选择管理模版 右键 => 添加\删除模板
管理模板 => 经典管理模板(ADM) => Google => Google Chrome => 扩展程序
配置扩展程序安装白名单
然后选择 已启用 并且在下面的选项中 添加扩展的IDchrome://extensions/
看到这个页面管理模板 => 经典管理模板(ADM) => Google => Google Chrome => 扩展程序
配置扩展程序 应用和用户脚本安装源
然后选择 已启用 并且在下面的选项中 添加 <all_urls>
chrome://policy/
看到刚才配置的选项1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/tmux.sh | bash |
更新 yum update -y
安装基本库 yum install -y automake gcc git make
如果未安装 libevent
或者 版本低于 2.1.10-stable
执行下列命令安装
yum install libevent-devel
apt-get install libevent-dev
1 | wget http://iweb.dl.sourceforge.net/project/levent/release-2.0.22-stable/libevent-2.0.22-stable.tar.gz |
如果未安装 curses
yum install ncurses-devel
apt-get install libncurses5-dev
1
2
3
4
5
git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make && make install
ln -s /usr/local/bin/tmux /usr/bin/tmux
-bash: /usr/bin/tmux: No such file or directory
1 | ln -s /usr/local/bin/tmux /usr/bin/tmux |
tmux: error while loading shared libraries: libevent-*.*.so.*: cannot open shared object file: No such file or directory
1 | ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib/libevent-2.0.so.5 # 32位系统 |
1 | tmux split-window -t "${session_name}:${window_number}" -c "$dir" "$pane_creation_command" |
1 | tmux new-window -d -t "${session_name}:${window_number}" -n "$window_name" -c "$dir" "$pane_creation_command" |
prefix + d
分离当前Sessionprefix + D
或者 :attach -d
分离其他附加到当前窗口的用户1 | #修改前缀(C-a) |
prefix + !
mkdir ~/.tmux
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
~/.tmux.conf
底部添加下列内容 1 | # 插件列表 |
在配置 .tmux.conf
添加下列内容
1
2set -g @plugin 'tmux-plugins/tmux-resurrect'
set -g @plugin 'tmux-plugins/tmux-continuum'
按下 prefix + I
(如果过是上文配置 就是 Ctrl-a I(大写 记得按Shift)) 获取插件源码. 插件会自动在后台启动
mkdir ~/.tmux
git clone https://github.com/tmux-plugins/tmux-resurrect.git
git clone https://github.com/tmux-plugins/tmux-continuum.git
.tmux.conf
添加一行 run-shell ~/.tmux/tmux-continuum/resurrect.tmux
.tmux.conf
添加一行 run-shell ~/.tmux/tmux-continuum/continuum.tmux
prefix + Ctrl-s
(Ctrl-a + Ctrl-s)prefix + Ctrl-r
(Ctrl-a + Ctrl-r)set -g @continuum-restore 'on'
启用自动恢复build.sh /bin/bash^M: 坏的解释器:没有那个文件或目录
的错误按照常规操作 编写脚本 添加到 /etc/init.d
然后 chkconfig --add aria2
就可以开启服务了
但是这次 我用 WinSCP 添加的脚本 结果启动服务一直提示错误
然后用 bash aria2
提示 $'\r': 未找到命令
突然想起 Win 的换行符和 Linux 的不一样
用 sed -i 's/\r$//' aria2
替换脚本的 \r
为空字符串 即可启动
开放端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
关闭端口
firewall-cmd --zone=public --remove-port=80/tcp --permanent
命令解释
--zone
作用域--add-port=80/tcp
添加端口 格式为:端口/通讯协议--permanent
永久生效,没有此参数重启后失效重新加载
firewall-cmd --reload
设置用户名和邮箱
git config --global user.email "admin@yumc.pw"
git config --global user.name "502647092"
保存账号密码 避免每次推送输入
git config --global credential.helper store
如果 Windows
和 Linux
下协同开发 需要配置换行符转换
git config --global core.autocrlf true
(推荐)git config --global core.autocrlf input
git config --global core.autocrlf false
.gitattributes
设置单个仓库内部 不同文件类型的换行符1 | # Set the default behavior, in case people don't have core.autocrlf set. |
提示 fatal: unable to access 'https://xxxxxxxxx': SSL certificate problem: unable to get local issuer certificate
git config --global http.sslVerify false
关闭 SSL 证书验证提示 fatal: unable to access 'https://xxxxxxxxx': SSL connect error
GIT_CURL_VERBOSE=1 git push origin master
之后应该可以成功GIT_CURL_VERBOSE=1
设置为系统环境变量GIT
到最新版本git config --global http.sslversion tlsv1
提示 error: non-monotonic index .git/objects/pack/._pack-*.idx
其中 * 是一个hash值字串
rm .git/objects/pack/pack-*.idx
其中 * 是一个提示的那个git index-pack .git/objects/pack/pack-*.pack
重建索引 其中 * 是一个提示的那个提示 xxxx\mingw64\bin\sh.exe: *** Couldn't reserve space for cygwin's heap
cd /mingw64/bin
rebase.exe -b 0x50000000 msys-1.0.dll
提示 git-remote-https: error while loading shared libraries: libcurl-gnutls.so.4: cannot open shared object file: No such file or directory
yum install -y curl-devel
ln -s /usr/lib64/libcurl.so.4 /usr/lib64/libcurl-gnutls.so.4
参考资料
yum install tigervnc-server
vi /etc/systemd/system/vncserver@.service
1 | [Unit] |
systemctl daemon-reload
vncpasswd root
vncserver :1
vncserver -kill :1
systemctl enable vncserver@:1.service
几经百度之后 找到了方法 可以使用 mvn deploy命令进行上传操作
在Repositories下新建一个Hosted的仓库 或者直接用自带的仓库
找到Maven的安装目录 打开 %M2_HOME%/config/settings.xml
在 servers
内添加一个服务账户配置
1
2
3
4
5<server>
<id>id</id> <!--上传时用的ID-->
<username>user</username> <!--Maven的用户名-->
<password>pwd</password> <!--Maven的密码-->
</server>
注意: 请不要在本地Repo目录直接执行 要复制到非Repo目录才可以 不然会报错
Cannot deploy artifact from the local repository
注意: 请不要在本地Repo目录直接执行 要复制到非Repo目录才可以 不然会报错Cannot deploy artifact from the local repository
注意: 请不要在本地Repo目录直接执行 要复制到非Repo目录才可以 不然会报错Cannot deploy artifact from the local repository
1 | mvn deploy:deploy-file \ |
1 | mvn deploy:deploy-file \ |
1 | mvn deploy:deploy-file -Durl=file://C:\m2-repo \ |
groupId, artifactId, version, packaging
对应POM文件的坐标 请自行百度file
指定文件的地址url
指定服务器的地址repositoryId
配置账号密码中的ID1
2
3
4
5
6
7
8
9
10
11
12
13
14
<repositories>
<repository>
<id>local-repo</id>
<url>http://127.0.0.1:8081/repository/maven-releases/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<type>jar</type>
<version>2.2.3</version>
</dependency>
</dependencies>
]]>控制面板\所有控制面板项\程序和功能
启用或关闭Windows功能
适用于Linux的Windows子系统(Beta)
打上勾bash
系统会自动进行安装内置的Linux子系统 lsb_release 信息如下:
1
2
3
4Distributor ID: Ubuntu
Description: Ubuntu 14.04.5 LTS
Release: 14.04
Codename: trusty
nano /etc/apt/sources.list
1 | deb http://cn.archive.ubuntu.com/ubuntu/ trusty main restricted universe multiverse |
apt-get update
更新源列表由于这个系统 应该是mini的版本 很多软件包都需要安装
这里列举部分常用的软件包
执行 apt-get install make gcc autoconf libcurl3 zlib1g-dev tcl gettext
安装 (这里的包大部分是用于安装Git的)
未完待续…
]]>fdisk /dev/sda
t
输入 8e
(Linux的LVM分区类型)w
保存分区表 这个时候提示重新读取分区表错误vgextend centos /dev/sda1
添加到VG里面lvextend -l +100%FREE /dev/mapper/centos-home
xfs_growfs /dev/mapper/centos-home
Re-reading the partition table failed with error 22
百度之后 发现我忘了添加VG的时候输入vgcreate 捂脸捂脸捂脸
然后我就去减少LV的容量 lvresize -l -20G /dev/mapper/centos-home
继续移除VG vgreduce centos /dev/sda1
这个时候提示 Physical volume "/dev/sda1" still in use
一脸懵比 什么鬼 大概浪费了20分钟左右 发现分区缩小的不够多 = =
大概计算了一下 又缩减了 20G lvresize -L -20G /dev/mapper/centos-home
然后继续移除 vgreduce centos /dev/sda1
成功了
==============我是分割线===================
创建VG pvcreate /dev/sda1
扩展VG vgextend centos /dev/sda1
调整LV大小 lvextend -l +100%FREE /dev/mapper/centos-home
把剩余的都加上
重新调整文件系统 xfs_growfs /dev/mapper/centos-home
这个时候提示 文件系统未挂载 xfs_growfs: /dev/mapper/centos-home is not a mounted XFS filesystem
把LVM挂载回home mount /dev/mapper/centos-home /home
重新调整文件系统
1 | [root@localhost /]# xfs_growfs /dev/mapper/centos-home |
最后 查看容量 /dev/mapper/centos-home 89G 407M 88G 1% /home
已经扩容成功了
wget http://www.sonatype.org/downloads/nexus-latest-bundle.tar.gz
tar -xvzf nexus-latest-bundle.tar.gz
nexus-2.14.3-02
vi conf/nexus.properties
中的 nexus-webapp-context-path=/nexus
去掉/后面的内容vi bin/nexus
修改 #RUN_AS_USER=
为 RUN_AS_USER=root
即可使用 root 启动./bin/nexus start
wget https://github.com/git/git/archive/master.zip
unzip master.zip
cd git-master
yum install curl-devel zlib-devel openssl-devel expat-devel autoconf gettext-devel tcl
apt-get install libcurl3 zlib1g-dev libssl-dev libexpat1-dev autoconf gettext tcl
make configure
autoconf
库./configure
make -j4 && make install
-bash: /usr/bin/git: 没有那个文件或目录
=> 输入 ln -s /usr/local/bin/git /usr/bin/git
第一个参数为安装目录tclsh failed; using unoptimized loading
=> 安装 tcl
库/bin/sh: 1: msgfmt: not found
=> 安装 gettext
库find . -type f -exec chmod 644 {} \;
find . -type d -exec chmod 755 {} \;
find . -type f -mtime +14 -exec rm {} \;
find . -name "*.log" -mtime +5 -exec rm {} \;
/etc
下所有 passwd
文件内包含 root
的行 find /etc -name "passwd*" -exec grep "root" {} \;
SELECT * FROM pg_stat_activity;
1 | SELECT pg_terminate_backend(pg_stat_activity.pid) |
1 | //定义文件名称 |
new_
改成替换后的表名old_
改成需要替换的表名 1 | SELECT |
从GIT获取最新的代码 git clone https://git.php.net/repository/php-src.git
提前安装部分依赖 yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel
1 | ./configure \ |
Sorry, I cannot run apxs. Possible reasons follow:
1 | yum install perl |
configure: error: jpeglib.h not found.
1 | yum -y install php-gd |
configure: error: freetype-config not found.
1 | yum install freetype-devel |
configure: error: off_t undefined; check your library configuration
1 | 去掉 --enable-zip 选项 |
MySQL 快速安装脚本
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/mysql.sh | bash |
CentOs7以上服务器安装MySQL
http://dev.mysql.com/downloads/repo/yum/
sudo rpm -Uvh mysql57-community-release-el6-n.noarch.rpm
(需要修改名称为下载的文件名称)yum repolist all | grep mysql
sudo yum install mysql-community-server
sudo service mysqld start
sudo service mysqld status
MySQL 5.7 以上版本修改密码
sudo grep 'temporary password' /var/log/mysqld.log
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass4!';
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
说明密码强度不够MySQL 5.7 以上版本关闭密码强度效验
vi /etc/my.cnf
[mysqld]
下添加 validate_password=off
1 | SET global validate_password_policy=0; |
sudo service mysqld restart
用户相关操作
注意 下列操作必须在第一次改完密码之后 退出 重新登录之后才能进行 不然会一直提示
ERROR 1396 (HY000)
CREATE USER 'root'@'%' IDENTIFIED BY 'root';
ERROR 1396 (HY000): Operation CREATE USER failed for 'root'@'%'
DROP USER 'root'@'%';
删除GRANT ALL ON *.* TO 'root'@'%';
FLUSH PRIVILEGES;
修改最大链接数
max_connections=100
改为需要的值开启慢查询日志
long_query_time
设定慢查询的阀值,超出次设定值的SQL即被记录到慢查询日志,缺省值为10sslow_query_log
指定是否开启慢查询日志log_slow_queries
指定是否开启慢查询日志(该参数要被slow_query_log取代,做兼容性保留)slow_query_log_file
指定慢日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.logmin_examined_row_limit
查询检查返回少于该参数指定行的SQL不被记录到慢查询日志log_queries_not_using_indexes
不使用索引的慢查询日志是否记录到索引my.cnf
开启慢查询1 | long_query_time = 1 |
注意: 日志文件的所有者必须为
mysql:mysql
或者赋予777
权限
函数 可以返回一个结果 结果可以是一个值、一行数据、一个集合或者不返回任何值
SQL语言的函数体内有下列特性
1 | CREATE FUNCTION clean_user() RETURNS void AS |
1 | INSERT INTO user VALUES ($1); --合法 |
最简单的SQL函数可能就是没有参数且返回基本类型的函数了 例如
1 | CREATE FUNCTION one() RETURNS integer AS |
实现一个简单的加法函数
1 | CREATE FUNCTION add_num(integer, integer) RETURNS integer AS |
通过 SELECT add_num(1,2) AS result;
即可调用
1 | result |
现在我们实现一个添加积分后返回当前积分的函数 传入用户ID和添加的积分 返回当前积分
1 | CREATE FUNCTION addscore (integer, numeric) RETURNS numeric AS |
1 | CREATE TABLE emp ( |
1 | CREATE FUNCTION double_salary(emp) RETURNS integer AS |
emp.*
表示emp表的一整行数据 1 | SELECT name, double_salary(emp.*) AS dream FROM emp WHERE age > 30; |
1 | SELECT name, double_salary(ROW(name, salary*1.1, age)) AS dream FROM emp; |
1 | CREATE FUNCTION new_emp() RETURNS emp AS |
1 | SELECT new_emp(); |
1 | SELECT (new_emp()).name; |
1 | CREATE FUNCTION add_num2(x integer, y integer, OUT sum integer) AS |
add_num
完全相同1 | CREATE FUNCTION add_and_n_num(x integer, y integer, OUT sum integer, OUT n integer) AS |
SELECT add_and_n_num(1,2);
1 | result | n |
IN
用于表示该函数参数为输入参数(缺省值,可以忽略) OUT
则表示该参数为输出参数所有SQL函数都可以在查询的FROM子句里使用。该方法对于返回复合类型的函数而言特别有用,如果该函数定义为返回一个基本类型,那么该函数生成一个单字段表,如果该函数定义为返回一个复合类型,那么该函数生成一个复合类型里每个属性组成的行。
1 | CREATE TABLE rd ( |
rd
表对应 1 | CREATE FUNCTION getRd(int) RETURNS rd AS $$ |
SELECT *, upper(cname) FROM getRd(1) AS t1;
如果SQL函数的返回值为SETOF sometype
,那么在调用该函数时,将返回最后一个SELECT查询的全部数据。这个特性通常用于把函数放在FROM子句里调用。
如果不加
SETOF
默认所有函数只返回一条记录
1 | CREATE FUNCTION getRd_gt(int) RETURNS SETOF rd AS $$ |
在FROM子句中调用该函数 SELECT *, upper(cname) FROM getRd_gt(1) AS t1;
即可获得id大于1的集合
多个函数可以定义成相同的函数名,但是它们的参数一定要有所区分。换句话说,函数名可以重载,此规则有些类似于面向对象语言中的函数重载,见如下示例:
1 | CREATE FUNCTION test(int, real) RETURNS ... |
由于在PostgreSQL中函数支持重载,因此在删除函数时,也必须指定参数列表,如:
1 | DROP FUNCTION test(int, real); |
touch /etc/pki/CA/index.txt
touch /etc/pki/CA/serial
vi /etc/pki/CA/serial
写入序列号01 然后保存1
2
3
4
5
6
7
shell> openssl genrsa -des3 -out ca.key 2048
Generating RSA private key, 2048 bit long modulus
.......................+++
..+++
e is 65537 (0x10001)
Enter pass phrase for ca.key:
Verifying - Enter pass phrase for ca.key:
1
2
3
4
5
6
7
8
9
shell> openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
...................+++
................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
shell> openssl req -new -key server.key -out server.csr -subj "/C=CN/ST=China/L=HangZhou/O=CnSixi Inc./OU=Web Security/CN=JiangTianbei"
Enter pass phrase for server.key:
1
2
3
shell> openssl rsa -in ca.key -out server.key
Enter pass phrase for ca.key:
writing RSA key
1
2
3
4
shell> openssl x509 -req -days 36500 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=China/L=HangZhou/O=CnSixi Inc./OU=Web Security/CN=JiangTianbei
Getting Private key
nginx.conf
记得生成证书的目录 1 | # HTTPS server |
nginx.conf
修改如下 1 | # HTTPS server |
nginx -s stop && nginx
重启服务器1 | shell> cd /usr/local/nginx/sbin |
SqlServer | Postgresql |
---|---|
int | integer |
varchar | character varying |
nvarchar | character varying |
datetime | timestamp without time zone |
smallint | smallint |
tinyint | smallint |
nvarchar(MAX) | text |
ntext | text |
SqlServer用[]来取消关键字
PostgreSql用””来取消关键字
SqlServer: SELECT TOP 1 * FROM XXX
PostgreSql: SELECT * FROM XXX LIMIT 1
SqlServer: SELECT CONVERT(varchar(7), NOW(), 120)
PostgreSql: SELECT SUBSTR(TO_CHAR(NOW(), 'yyyy-mm-dd hh24:mi:ss'),1,7)
SqlServer: SELECT ISNULL(null,'string')
PostgreSql: SELECT COALESCE(null,'string')
注意: COALESCE 需要默认值与字段值相匹配 可以通过::进行类型类型转换 例如
SELECT COALESCE(money, 0.0::money)
CAST的用法是一样的 但是要注意字段类型 字段差异
比如 datatime
在PostgreSql是不存在的需要改成 TIMESTAMP WITHOUT TIME ZONE
SqlServer: SELECT CAST('2016-11-11 11:11:11' AS DATATIME)
PostgreSql: SELECT CAST('2016-11-11 11:11:11' AS TIMESTAMP WITHOUT TIME ZONE)
SqlServer: 在某些情况下可以自动进行转换 或者用 CAST
PostgreSql: 在某些情况下可以自动进行转换 或者用 CAST 和 :: CAST(0.0,money) 等价于 0.0::money
如果在SqlServer用到了跨库 迁移过程中可以通过下列两种方式处理
-. 使用FDW(远程数据封装)
-. 把另外一个数据库也迁移到Postgresql
安装到系统 然后打开
找到弹出时提示的应用程序名称 然后点击 remove 搞定
]]>总体学习分为 SQL语言 和 PL/pgSQL过程语言
]]>UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的。
按照开放软件基金会(OSF)制定的标准计算,用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。
由以下几部分的组合:
UUID具有以下涵义:
经由一定的算法机器生成
为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间(Namespace)、随机或伪随机数、时序等元素,以及从这些元素生成UUID的算法。UUID的复杂特性在保证了其唯一性的同时,意味着只能由计算机生成。
非人工指定,非人工识别
UUID是不能人工指定的,除非你冒着UUID重复的风险。UUID的复杂性决定了“一般人“不能直接从一个UUID知道哪个对象和它关联。
在特定的范围内重复的可能性极小
UUID的生成规范定义的算法主要目的就是要保证其唯一性。但这个唯一性是有限的,只在特定的范围内才能得到保证,这和UUID的类型有关(参见UUID的版本)。
UUID具有多个版本,每个版本的算法不同,应用范围也不同。
首先是一个特例--Nil UUID--通常我们不会用到它,它是由全为0的数字组成,如下:
00000000-0000-0000-0000-000000000000
UUID Version 1:基于时间的UUID
基于时间的UUID通过计算当前时间戳、随机数和机器MAC地址得到。由于在算法中使用了MAC地址,这个版本的UUID可以保证在全球范围的唯一性。但与此同时,使用MAC地址会带来安全性问题,这就是这个版本UUID受到批评的地方。如果应用只是在局域网中使用,也可以使用退化的算法,以IP地址来代替MAC地址--Java的UUID往往是这样实现的(当然也考虑了获取MAC的难度)。
UUID Version 2:DCE安全的UUID
DCE(Distributed Computing Environment)安全的UUID和基于时间的UUID算法相同,但会把时间戳的前4位置换为POSIX的UID或GID。这个版本的UUID在实际中较少用到。
UUID Version 3:基于名字的UUID(MD5)
基于名字的UUID通过计算名字和名字空间的MD5散列值得到。这个版本的UUID保证了:相同名字空间中不同名字生成的UUID的唯一性;不同名字空间中的UUID的唯一性;相同名字空间中相同名字的UUID重复生成是相同的。
UUID Version 4:随机UUID
根据随机数,或者伪随机数生成UUID。这种UUID产生重复的概率是可以计算出来的,但随机的东西就像是买彩票:你指望它发财是不可能的,但狗屎运通常会在不经意中到来。
UUID Version 5:基于名字的UUID(SHA1)
和版本3的UUID算法类似,只是散列值计算使用SHA1(Secure Hash Algorithm 1)算法。
MigrationToolkit是 EnterpriseDB 的 Postgres Plus Advanced Server 管理工具
这里用到了 SqlServer点击下载 和 PostgresqlJAVA7版本 或 JAVA8版本
注意: 必须选择 Java 对应版本的 Postgresql 数据库驱动
如果用到其他驱动可以查看这里 JDBC数据库驱动
把下载的文件放到 安装目录\lib\ext\ 目录下
在安装目录的etc文件夹 找到 toolkit.properties
文件
如果打不开或者出现错误 直接删掉就好了 然后新建一个
填写数据源的信息和目标数据库的信息
1 | SRC_DB_URL=jdbc:jtds:sqlserver://192.168.2.79:1433;databasename=OA20160401 |
1 | Running EnterpriseDB Migration Toolkit (Build 49.0.4) ... |
打开 runMTK.bat
添加启动参数 -Djava.ext.dirs=..\lib\ext
(这里的路径就是数据库驱动的所在目录)
修改后的文件如下
1 | @echo off |
在 runMTK.bat
同级目录下打开命令行
输入以下命令 runMTK.bat -sourcedbtype sqlserver -targetdbtype postgresql -targetSchema public dbo
命令说明:
-sourcedbtype sqlserver
数据源类型(这里是sqlserver)-targetdbtype postgresql
目标库类型(这里是postgresql)-targetSchema public
目标架构开始同步数据
1 | Running EnterpriseDB Migration Toolkit (Build 49.0.4) ... |
1 | MTK-17003:复制表时发生错误:拒绝了对对象 'columns' (数据库 'mssqlsystemresource',架构 'sys')的 SELECT 权限。 |
权限不足 请使用超级用户进行复制
1 | MTK-11009: Error Connecting Database "SQL Server" |
SqlServer驱动未找到 请下载驱动
1 | MTK-11009: Error Connecting Database "SQL Server" |
账户密码错误
1 | MTK-11009: Error Connecting Database "SQL Server" |
账户密码错误
1 | MTK-15013: Error Creating Table pj_invoice |
Postgresql 不支持
newid()
和newsequentialid()
请手动 新建函数
1 | MTK-15001: 创建约束 pk_gplist 时发生错误 |
数据表不存在 请检查表导入是否出错
1 | 正在创建视图: syncobj_0x3239433643303932 |
语法不兼容 请手动修改导入
1 | MTK-13004:对于 MySQL 和 Sybase 数据库,您不能迁移触发器、序列、过程、函数、包及同义词。 |
不支持导入 请手动修改导入
1 | MTK-15013: Error Creating Table taskdaiyunwei |
字段的默认值不匹配 修改字段默认值为 Postgresql 能够识别的
1 | MTK-15008: Error Creating View: view_daizhibiao |
]]>修改 错误视图的表名 去除架构的名称 比如这里的
view_daizhibiao
视图 把里面的表带有 dbo 的前缀都删除
当然也有可能是语句过于复杂导致的 这个时候你可以直接复制视图的Sql到Postgresql里面创建 一般都可以成功(前提是没有用到sqlserver专用函数)
点击查看语法兼容性
虽然听起来很高大上 实际上配置起来非常简单 这里用CentOs7作为演示系统
配置的目的是 172.30.16.6
172.30.16.7
两台主机 共用IP 172.30.16.10
注: 但同一时间只能有一台使用
172.30.16.6
现在需要配置一个 172.30.16.10
的虚拟IPip a
可以看到除了环回地址之外就是一个 enp2s0
注意: 不同机器这个接口名称是不同的 一般默认是 eth0
1 | [root@localhost ~]$ ip a |
17.6
网卡的虚拟IP 输入命令 ifconfig enp2s0:0 172.30.16.10 netmask 255.255.255.0 up
17.7
上 Ping 一下 172.30.16.10
可以看到很快就 Ping 通了 1 | [root@localhost ~]$ ping 172.30.16.10 |
17.7
上的配置同理 但是开启之前需要在 17.6
上输入 ifconfig enp2s0:0 down
关闭虚拟IP172.30.16.7
原有配置1 | [root@localhost ~]$ cat $PGDATA/recovery.conf |
trigger_file = '/opt/pgsql/data/upgrade'
recovery_target_timeline = latest
1 | [root@localhost ~]$ echo "trigger_file = '/opt/pgsql/data/upgrade'" >> $PGDATA/recovery.conf |
pgc restart
注意: 这里的pgc是命令别名 详见PgSql常用指令172.30.16.6
宕机 su postgresql -c "pg_ctl -D $PGDATA -l logfile stop"
172.30.16.7
上可以看到日志开始报错1 | LOG: replication terminated by primary server |
172.30.16.7
新建上面设置的恢复文件 touch /opt/pgsql/data/upgrade
172.30.16.7
已经升级为主机1 | FATAL: could not connect to the primary server: could not connect to server: 拒绝连接 |
172.30.16.7
用 pg_controldata
看一下1 | pg_control version number: 960 |
主备切换最明显的一点就是 备机
172.30.16.7
下的recovery.conf
文件变成了recovery.done
172.30.16.7
复制 recovery.conf(recovery.done)
到原主机 172.30.16.6
scp -P 22 $PGDATA/recovery.done root@172.30.16.6:$PGDATA/recovery.conf
172.30.16.6
为备份模式recovery.conf
调整 primary_conninfo
修改IP为 16.7
的地址1 | standby_mode = 'on' |
postgresql.conf
文件 启动热备份 hot_standby = on
172.30.16.6
执行 su postgresql -c "pg_ctl -D $PGDATA -l logfile start"
172.30.16.6
启动后出现以下错误就说明时间线不一致 需要复制原备机的时间线文件1 | LOG: restarted WAL streaming at 0/4000000 on timeline 1 |
172.30.16.7
执行下列命令 scp -P 22 $PGDATA/pg_xlog/00000002.history root@172.30.16.6:$PGDATA/pg_xlog/
redo starts at 0/41FF480
自动化恢复了1 | LOG: entering standby mode |
如复制了时间线文件还是不能自动恢复 请检查
recovery.conf
是不是忘了加recovery_target_timeline = latest
这一条 并且重启数据库
yum install nmap
安装nmap 172.30.16.7 -p 5432 | grep 5432 | awk '{ print $2 }'
可以得到结果 open1 | INF='enp2s0:0' |
crontab -e
打开用户任务计划表 配置为每分钟检测一次 按ESC 输入:wq 保存退出1 | * * * * * $PGDATA/upgrade.sh >/dev/null 2>&1 |
service crond restart
su postgresql -c "pg_ctl -D $PGDATA -l logfile start"
alias pgc='pg_ctl -D $PGDATA -l logfile'
pgc [start|stop|restart|reload]
就可以直接执行su postgresql -c "pgc [start|stop|restart|reload]"
1 | postgresql=# \? |
命令 pg_dump
文本备份:pg_dump -h 127.0.0.1 -U postgresql postgresql > /home/pgbak/backup.sql
归档备份:pg_dump -Fc -h 127.0.0.1 -U postgresql postgresql > /home/pgbak/backup.dump
命令 pg_restore
恢复归档备份:pg_restore -h 127.0.0.1 -U postgresql -d -C -d postgresql backup.dump
从 Standby 备份需要注意以下事项
- 备份中没有备份历史文件
- 备份过程中 Standby 被提升为主库 则备份会失败
- 要求主库打开 “full_page_writes” 参数 并且 WAL 日志不能被其他工具去除 full-page writes 信息
1 | pg_basebackup [option...] |
这个选项需要设置
postgresql.conf
的wal_keep_segments
确保日志不会被覆盖
这种方式避免了使用 -X f 时 主库上的 WAL 日志有可能被覆盖而导致失败的问题
但是这种方式需要与主库建立两个连接 因此postgresql.conf
的max_wal_senders
参数至少要设置为2或者大于2
同时也支持数据库连接的参数 -h -p -s -U -w -W 等参数
修改 $PGDATA/postgresql.conf
1 | wal_level = hot_standby #设置日志级别 |
然后重启服务器 pg_ctl -D $PGDATA -l logfile restart
1 | pg_basebackup -h 172.30.16.6 -U slony -F p -P -x -R -D $PGDATA |
由于同步的时候指定了 -R 参数 所以数据目录下会生成 recovery.conf
1 | cat $PGDATA/recovery.conf |
备份库上启动之前需要开始 hot_standby 模式 修改 $PGDATA/postgresql.conf
下的 hot_standby = on
启动服务器 pg_ctl -D $PGDATA -l logfile start
在 主机上 psql -U postgresql master
进入 msater 数据库查看表
1 | master=# \d |
可以看到只有一张之前用 Slony 同步测试时的表
现在我们新建一个表 standbytest
1 | CREATE TABLE public.standbytest |
现在我们到 备份机器上查看
1 | master=# \d |
可以看到表已经复制过来了
查询表 standbytest 的字段
1 | master=# select * from standbytest; |
现在我们在主库新增一个 time 字段
1 | ALTER TABLE "public"."standbytest" ADD COLUMN "time" timestamp; |
然后到备份机上查询表结构
1 | master=# select * from standbytest; |
可以看到字段已经添加了
流程与上面一致 测试成功
1 | master=# select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication; |
]]>和 Slony-I 一样备份库是不允许修改数据的 如果进行操作会提示操作失败
cannot excute XXXXXX in a read-only transaction
Yum 的使用要保证internet网络连通 并且
/etc/resolv.conf
文件下存在nameserver 8.8.8.8
才可正常更新。
/etc/resolv.conf
文件中添加 nameserver 8.8.8.8
当前文档仅适用于CentOs/RedHat的服务器安装
CentOS, 官方文档 EPEL repository installed 在这里主要用于安装 FreeTDS.
1 | sudo yum install epel-release |
TDS_FDW 依赖于 FreeTDS 的数据库连接接口 所以需要安装依赖,
什么是FreeTDS: FreeTDS 是一个程序库,可以实现在Linux系统下访问微软的SQL数据库!
such as FreeTDS.
1 | sudo yum install freetds freetds-devel |
注意: 需要已经完成 Postgresql 的安装以及环境变量的配置
1 | $ git clone https://github.com/GeoffMontee/tds_fdw.git |
1 | $ pg_ctl -D $PGDATA -l logfile restart |
1 | $ psql -U postgres |
servername
必选参数
默认值: 127.0.0.1
远程数据库的连接地址.
这里可以使用 DSN(Data Source Name), 在配置文件 freetds.conf. 详见 FreeTDS name lookup.
port
可选参数
远程服务器的端口.
如果过服务器使用了 DSN 则读取配置文件 freetds.conf.
database
可选参数
远程服务器的数据库名称.
dbuse
可选参数
默认值: 0
This option tells tds_fdw to connect directly to database if dbuse is 0.
If dbuse is not 0, tds_fdw will connect to the server’s default database, and
then select database by calling DB-Library’s dbuse() function.
For Azure, dbuse currently needs to be set to 0.
language
可选参数
数据消息格式化的时候使用的语言.
FreeTDS 会默认使用 us_english. 你可以在 freetds.conf 中修改.
如果远程服务器是MSSQL, see 设置 MSSQL Server 的语言.
For information related to Sybase ASE, see Sybase ASE login options
and SET LANGUAGE in Sybase ASE.
character_set
可选参数
设置客户端连接的字符集
在 TDS 7.0+, 连接将总是使用 UCS-2, 所以一般不需要指定. 详见 TDS 7.0 的本地化处理.
tds_version
可选参数
指定连接远程服务器的TDS版本. 详见 选择 TDS 协议版本 和 TDS 历史版本.
msg_handler
可选参数
默认值: blackhole
TDS 的默认消息处理. 可选值为 [“notice”, “blackhole”]. 选项 “notice” TDS 会给 PostgreSQL 发送通知. 选项 “blackhole” TDS 会忽略消息.
fdw_startup_cost
可选参数
A cost that is used to represent the overhead of using this FDW used in query planning.
fdw_tuple_cost
可选参数
A cost that is used to represent the overhead of fetching rows from this server used in query planning.
一些表的选项可以设置为服务器级别 可用选项:
- use_remote_estimate- row_estimate_method
1 | CREATE SERVER mssql_svr |
Required: Yes
The username of the account on the foreign server.
Required: Yes
The password of the account on the foreign server.
1 | CREATE USER MAPPING FOR postgresql |
query
必须参数 (或者使用 table)
用于查询远程数据表的查询串 表将会在每次查询时通过这个查询串生成.
schema_name
可选参数
The schema that the table is in. The schema name can also be included in table_name, so this is not required.
table_name
Aliases: table
必须参数 (或者使用 query)
远程服务器的表名.
match_column_names
可选参数
是否通过比较它们的表名称或是否使用它们出现在结果集中的顺序来与远程列相匹配的本地列。
use_remote_estimate
可选参数
无论我们估计表的大小由远程服务器上执行一些操作(如row_estimate_method定义) 或者我们是否只使用一个局部估计 通过定义 local_tuple_estimate。
local_tuple_estimate
可选参数
A locally set estimate of the number of tuples that is used when use_remote_estimate is disabled.
row_estimate_method
可选参数
Default: execute
This can be one of the following values:
execute
: 执行查询操作, 并且计算获得本次查询返回的结果行数.
showplan_all
: 使 Microsoft SQL Server 不执行 Transact-SQL 语句. SQL Server 返回有关语句执行情况的详细信息,并估计语句对资源的需求. 详见MSDN SHOWPLAN_ALL.
column_name
可选参数
用于设置远程数据表的字段名称 如果不设置 则使用本次创建表的名称 看例三
Using a table_name definition:
1 | CREATE FOREIGN TABLE mssql_table ( |
Or using a schema_name and table_name definition:
1 | CREATE FOREIGN TABLE mssql_table ( |
Or using a query definition:
1 | CREATE FOREIGN TABLE mssql_query ( |
Or setting a remote column name:
1 | CREATE FOREIGN TABLE mssql_table ( |
1 | curl -q https://blog.yumc.pw/attachment/script/shell/base.sh | bash |
nslookup: yum install -y bind-utils
wget: yum install -y wget
netstat: yum install -y net-tools
killall: yum install -y psmisc
自动补全: yum install -y bash-completion
这里直接用组安装: yum groups install 开发工具
或者 yum groupinstall "Development Tools"
ntpdate -d cn.ntp.org.cn
the NTP socket is in use, exiting
则先关闭 ntpd service ntpd stop
然后执行同步date -s 2017-03-22
date -s 11:11:11
tzselect
然后按下 5 9 1 1hwclock -w
输入 ip address
查看IP地址
1 | [jtb@localhost ~]$ ip address |
可以看到除去环回地址外只有一个 enp2s0
我们编辑这个网卡的配置信息: vi /etc/sysconfig/network-scripts/ifcfg-enp2s0
1 | TYPE=Ethernet |
保存配置文件 然后重启网络服务
1 | [jtb@localhost ~]$ service network restart |
1 | wget -qO- https://blog.yumc.pw/attachment/script/shell/htop.sh | bash |
下载源码: wget http://hisham.hm/htop/releases/2.0.2/htop-2.0.2.tar.gz
编译安装: ./configure && make -j4 && make install
configure: error: You may want to use --disable-unicode or install libncursesw.
yum install ncurses-devel
或 apt-get install libncursesw5-dev
安装类库下载源码: wget http://main.slony.info/downloads/2.2/source/slony1-2.2.5.tar.bz2
如果提示无法解析的主机地址 请尝试
wget -4 http://main.slony.info/downloads/2.2/source/slony1-2.2.5.tar.bz2
指定IPV4协议
解压源码:tar -xvf slony1-2.2.5.tar.bz2
切换到目录: cd slony1-2.2.5
检查安装环境: ./configure --with-perltools
参数说明:
--with-perltools
perl脚本工具--with-pgconfigdir=/usr/local/pgsql/bin
一般情况下只要配置了环境变量 这个可以不加编译并安装: make -j4 && make install
其中-j4代表CPU核心
create user slony superuser password '123456';
create database master;
alter database master owner to slony;
create database slave;
alter database slave owner to slony;
create table synctable(id int primary key, content text);
$ psql -h192.168.1.12 -Uslony -d slave
$ psql -h192.168.1.11 -Uslony -d master
$PGDATA/pg_hba.conf
文件host all all 192.168.1.0/32 md5
(具体看文件)firewall-cmd --zone=public --add-port=5432/tcp --permanent
和 firewall-cmd --reload
iptables -A IN_public_allow -p tcp --dport 5432 -j ACCEPT
或者 iptables -A INPUT -p tcp --dport 5432 -j ACCEPT
这里我们使用altperl script脚本完成Slony数据同步的配置工作
cd /usr/local/etc
su cp slon_tools.conf-simple slon_tools.conf
vi slon_tools.conf
$CLUSTER_NAME = 'slony';
#配置集群名称1 | # Include add_node lines for each node in the cluster. Be sure to |
1 | add_node(node => 2, |
1 | # This array contains a list of tables that already have primary keys. |
1 | # For tables that have unique not null keys, but no primary key, enter their names and indexes here. |
1 | # Sequences that need to be replicated should be entered here. |
1 | # "set2" => { |
1 | scp slon_tools.conf 192.168.1.11:`pwd`/. |
在 1.10 上初始化群集 执行 slonik_init_cluster | slonik
在 1.10 上启动守护进程 slon_start 1
后面的1是配置群集的 node
在 1.11 上启动守护进程 slon_start 2
后面的2是配置群集的 node
如果提示 Slon failed to start for cluster slony, node node1
并且日志显示 CST FATAL Cannot open pid_file "/var/run/slony1/slony_node1.pid"
mkdir /var/run/slony1
在 1.10 上创建数据集 slonik_create_set 1 | slonik
1 代表同步群集编号
在 1.11 上增加数据订阅者 slonik_subscribe_set 1 2 | slonik
1 代表同步群集编号 2代表节点配置中的 node
insert into synctable values(1,'同步测试');
select * from synctable;
1 | id | content |
下载源码: wget https://ftp.postgresql.org/pub/source/v9.6.0/postgresql-9.6.0.tar.gz
如果提示无法解析的主机地址 请尝试
wget -4 https://ftp.postgresql.org/pub/source/v9.6.0/postgresql-9.6.0.tar.gz
指定IPV4协议
解压源码:tar -xvzf postgresql-9.6.0.tar.gz
切换到目录: cd postgresql-9.6.0
检查安装环境: ./configure --prefix=/opt/pgsql
编译并安装: make -j4 && make install
其中-j4代表CPU核心
yum install perl-ExtUtils-Embed
yum install readline-devel
yum install python-devel
yum install zlib-devel
useradd postgresql -s /bin/bash
passwd postgresql
chown postgresql:postgresql /opt/pgsql -R
如果数据目录不在一起 数据目录也要给权限su postgresql
注意 下列需要在 postgresql 用户操作
mkdir home/postgresql/data
vi ~/.bash_profile
1 | PGHOME=/opt/pgsql #数据库安装目录 |
source ~/.bash_profile
注意 需要在 postgresql 用户操作
initdb
pg_ctl -D $PGDATA -l logfile start
psql -h 127.0.0.1
psql: FATAL: database "postgresql" does not exist
psql -d template1
create database postgresql;
alias pgc='pg_ctl -D $PGDATA -l logfile'
注意: PgSql 默认没有开启操作日志记录 需要手动开启
vi $PGDATA/postgresql.conf
找到如下节点 并修改1 | #------------------------------------------------------------------------------ |
rsync -r 源目录/ 用户名@远程地址:远程目录
1 | Usage: rsync [OPTION]... SRC [SRC]... DEST |
Tip: 当目录中包含:号时 使用2个::作为地址和目录的分割符 不然只能用一个
1 | -v, --verbose 详细模式输出 |
1 | ssh-keygen //生成公钥 |
1 | crontab -e //进入VIM设置 |
1 | yum install crontabs |
1 | service crond start //启动服务 |
1 | 用法: crontab [-u user] file |
1 | [root@locahost ~]# crontab -e |
输入后会进入VIM编辑器 写入任务重启即可
1 | [root@locahost ~]# vi /etc/crontab |
输入后会进入VIM编辑器 写入任务重启即可
1 | SHELL=/bin/bash |
Tip: 可以使用特殊字符
1 | 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。 |
1 | * * * * * command //每1分钟执行一次command |
source /etc/profile
* * * * * command >/dev/null 2>&1
1 | $ ssh-keygen |
1 | $ ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.2.200 |