The best time to plant a BUG was 10 years ago, the second best time is now
好久没写博客了
爱你😘
MySQL常用工具总结
MySQL常用工具总结 - mysql -P:指定端口 [mysqld] port=端口号 -e:在终端执行SQL,不用登录,主要用于一些脚本程序 mysql -uroot -p1234 -h127.0.0.1 -P3306 -e"select * from user" db1 - mysqladmin 执行管理操作的工具 # 用法 mysqladmin [OPTIONS] command command.... # 创建库 mysqladmin -uroot -p1234 create db2 # 删除库 mysqladmin -uroot -p1234 drop db2 # 修改密码 mysqladmin -uroot -p1234 password 5678 # 查看更多用法 mysqladmin --help - mysqlshow 客户端对象查看工具 –count:统计 -i:详细信息 mysqlshow -uroot -p1234 [OPTIONS] [database [table [column]]] - mysqldump -B, –databases:备份多个数据库 -A, –all-databases:备份所有数据库 –add-drop-database:创建库之前,增加删除库语句...
PVE重建 LVM-Thin 精简池
PVE重建 LVM-Thin 精简池:缩小默认 local-lvm 存储 背景 ProxmoxVE 的默认安装会创建 local 和 local-lvm 两个存储。其中local大约磁盘容量的10%,存储类别为目录。 大部分容量都给到了 local-lvm,也就是存储类别为 lvm-thin 的LVM精简卷。 前置知识: LVM逻辑卷管理器中,lv逻辑卷中还存在thin pool精简池模式,相当于 ESXI 的精简制备(Thin provisioning); thin pool精简池就是一个存储池,可以在池子的基础再新建lv逻辑卷,也就是thin volume精简卷。 因为考虑空间回收问题,我不想像大多数网上教程一样,把全部存储空间改成目录,下面介绍如何将默认的 local-lvm 存储重建(缩小)。 一条龙命令 #假设你已经有了一个名为 pve 的 LVM 卷组 lvcreate -L 100G -T pve/thinpool lvcreate -V 99G --thin -n thinvolume pve/thinpool #剩下的空间给到目录 lvresize --extents +100%FREE --resizefs pve/root #+100%FREE也可以换成+多少G这种形式。 vim /etc/pve/storage.cfg lvmthin: thinvolume thinpool thinpool vgname pve content images,rootdir 参考我的命令历史: 一、删除默认thinpool精简池 失败操作 root@pve:~# lvremove /dev/pve/data Removing pool "data" will remove 3 dependent volume(s)....
SSH登录安全与Fail2ban加固
SSH登录安全与Fail2ban加固 查看:SSH暴力破解/爆破次数 RedHat 和 CentOS 存储在 /var/log/secure 1.查看 root 用户登录成功的IP及次数看看是否有不熟悉的 IP 地址 grep "Accepted password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more 2.查看尝试暴力破解 root 账户的IP及次数 grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more 3.查看尝试暴力破解用户名的IP及次数 grep "Failed password for invalid user" /var/log/secure | awk '{print $13}' | sort | uniq -c | sort -nr | more Debian 和 Ubuntu 存储在 /var/log/auth....
SQLAlchemy快速上手
SQLAlchemy 演示插入数据代码 import sqlalchemy from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column,Integer,String from sqlalchemy.orm import sessionmaker #创建对象的基类: Base = declarative_base() #定义User对象: class User(Base): #表的名字: __tablename__ = 'user' #表的结构: userid = Column(Integer,primary_key=True) username = Column(String(20)) age = Column(Integer) department = Column(String(20)) #初始化数据库连接 engine = create_engine("mysql+pymysql://kang:123456@10.3.152.35/test",encoding="utf-8",echo=True) #创建session类型 DBSession = sessionmaker(bind=engine) #创建session对象 session = DBSession() #创建新的user对象 new_user1 = User(username='CC',age=25,department='IT') new_user2 = User(username="LILI",age=30,department='HR') new_user3 = User(username='JOHN',age=22,department='IT') #添加单条数据(添加数据,但还没有提交,出错还可以使用rollback撤回操作) new_user = User(name='lily') #session....
重新理解AsyncIO
1.概要 python下的协程 asyncio和gevent都是基于携程来进行并发操作的。协程也被称为微线程。 协程只是在单一的线程里进行切换不同的协程,因此无法使用多CPU能力,对于CPU密集型程序还是使用多进程比较好。 协程相比较进程和线程来说占用的内容更少,同样的线程切换更多的是靠操作系统来控制,而协程的执行则由我们自己控制。 并发与异步区分 并发原理:当其中一个协程遇到io等待时,将会切换到另一个协程继续运行。 并发与异步: 并发强调的是N人干同样的事,要保证不争抢 (lock,atomic,synchronize,volatile, cas) 异步强调的是1/N人干不同的事,不该等的别等 (thread pool, future, async,reactive) 看到并发的时候经常会看到异步,原因是一般所说的并发,指的是 【每个业务活动频率很低,但是有大量同时进行的业务活动】 这样用异步代码自己维护每个业务状态,而不劳驾系统通过线程/进程的方式维护每个业务状态的方式,能把这个场景实现得性能更好,内存占用更少。 如果业务活动频率又高,又同时大量进行,那就超出异步的解决范围了。那是分布式处理的范畴。 需要协程原因 1.多线程运行过程容易被打断,有可能出现race condition的情况 2.线程切换本身存在定的消耗,若/0操作非常heavy,多线程很有可能满足不了高效率、高质量的需求。 sync和async的概念区分 sync即同步,指操作个接个地执行,下一个操作必须等上一个操作完成后才能执行。 asynd即异步,指不同的操作可以交替执行,如果其中某个操作被block了,程序并不会等待,而是会找出可执行的操作继续执行。 Asyncio的缺陷 在实际工作中,要想用好Asyncio,必须得有相应的python库支持。在之前的多线程例子中,我们用到的是requests库,而在这里使用的却是aiohttp库,原因就在于requests库与Asyncio不兼容,但aiohttp库兼容。但是兼容问题会随着版本的问题逐步减少。 此外,使用Asyncio使得我们在任务调度方面有更大的自主权,写代码时就得更加注意,否则容易出现错误。 比如,如果你需要await一系列的操作,就得使用asyncio.gather();如果只是单个的future,则用asyncio.wait()就可以了。那么,对于你的future,是想让它run_until_complete()还是run_forever()呢?此类问题都是在面对具体问题时需要去考虑的。 那么使用asyncio时 如何搭配第三方库 首先,最简单的办法就是搜一下这个库的源码里是否出现了 asyncio 或 async def 的字样,如果没有出现则几乎可以证明这个库没有对 asyncio 有做特别的支持。为了彻底证实,还应仔细阅读其代码,查看关键 I/O 部分是如何实现的。 对于暂不支持 asyncio 的第三方库,可以按以下步骤依次排查: 1. 确认其 I/O 时间比例是否占到大部分。比如用 SQLAlchemy 时,如果能基本上确保数据库操作都是瞬时的,那么[理论上](http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/)是可以任由其阻塞主线程的。而对于明显 I/O 占大多数时间且时间不可预测的,比如 requests,就不能让其成为性能瓶颈; 2. 确认其 I/O 的并发能力是否会成为瓶颈。比如说还是用到了 requests,但平均下来每 10 分钟才会发一个请求,其他时间主要都用在数据库计算上了,那么完全可以把 requests [放到线程池里](https://docs.python.org/3/library/asyncio-eventloop.html#executor)去做; 3. 确实需要异步了,首先查找其 asyncio 的扩展,有时会有单独的库做 asyncio 支持,比如 peewee_async; 4....
Python终端Debug调试:Pdb
使用Pdb模块:breakpoint()方法 程序当中,至少要有一个breakpoint() 在你需要的打断点的位置,加上: breakpoint() 查看调用栈:w | where 显示的是从上到下的 路径/文件.py(括号里是行号) (Pdb) w d:\administrator\projects\pdb_test.py(12)<module>() -> func_obj = func1() > d:\administrator\projects\pdb_test.py(4)func1() -> def inner(value): ''' > 仅右箭头:表示当前frame ''' 切换帧(调整当前帧frame):u、d u | up d | down (Pdb) u > d:\administrator\projects\pdb_test.py(12)<module>() -> func_obj = func1() (Pdb) w > d:\administrator\projects\pdb_test.py(12)<module>() -> func_obj = func1() d:\administrator\projects\pdb_test.py(4)func1() -> def inner(value): 查看断点附近代码:l、ll l | lst:默认显示附近11行 l . :回到当前行 ll | longlst:查看当前函数全部代码 (Pdb) l 1 def func1(): 2 data = [] 3 breakpoint() 4 -> def inner(value): 5 data....
PVE使用华为USB网卡
在winidow中,系统会自动读取随身wifi的window驱动并安装,同时我们可以看到,网卡自带的install_linux文件说明也有linux驱动,遗憾的是,在ubuntu系统上始终无法正确识别,因为ubuntu认为是存储设备,但是又无法检测出usb网卡,因此也无法挂载,所以需要我们自己修改ubuntu. 解决步骤: 插入随身wif,按Ctrl +Alt+t打开终端,输入lsusb,显示目前所有的usb设备 root@pve:~# lsusb Bus 002 Device 002: ID 0bc2:ab24 Seagate RSS LLC Backup Plus Portable Drive Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 004: ID 174c:55aa ASMedia Technology Inc. ASM1051E SATA 6Gb/s bridge, ASM1053E SATA 6Gb/s bridge, ASM1153 SATA 3Gb/s bridge, ASM1153E SATA 6Gb/s bridge Bus 001 Device 003: ID 040a:2814 Kodak Co. USB Composite Device Bus 001 Device 002: ID 12d1:1c20 Huawei Technologies Co....
Rclone从安装到长期挂载服务
安装 Linux Rclone官方提供了一键安装脚本: curl https://rclone.org/install.sh | bash apt install -y fuse3 Win scoop install rclone #cd C:\Users\Administrator\scoop\apps\rclone #dir 配置 第一次配置 在终端输入 rclone config 进行配置 rclone config - 进入交互式配置选项,进行添加、删除、管理网盘等操作。 详细操作参见:《Rclone 安装配置教程》 再次重复配置 备份 rclone config file - 显示配置文件的路径,一般配置文件在 ~/.config/rclone/rclone.conf rclone config show - 显示配置文件内容,复制备份 恢复 mkdir -p ~/.config/rclone cat > ~/.config/rclone/rclone.conf <<EOF 《rclone.conf配置文件内容》 EOF 指定rclone配置文件启动 默认配置:/root/.config/rclone/rclone.conf --config /root/.config/rclone/rclone.conf #例如 rclone lsd gd_share: --config=~/.config/rclone/rclone.conf 启动 rclone常用命令 ### 文件上传 rclone copy /home/backup gdrive:backup # 本地路径 配置名字:网盘文件夹路径 ### 文件下载 rclone copy gdrive:backup /home/backup # 配置名字:网盘文件夹路径 本地路径 ### 新建文件夹 rclone mkdir gdrive:backup # 配置名字:网盘文件夹路径 ### 获取文件夹大小 rclone size gdrive:backup # 配置名字:网盘文件夹路径 ### 列表 rclone ls gdrive:backup rclone lsl gdrive:backup # 比上面多一个显示上传时间 rclone lsd gdrive:backup # 只显示文件夹 ### 挂载 rclone mount gdrive:mm /root/mm & ### 卸载 fusermount -u /root/mm #### 其他 #### rclone config - 以控制会话的形式添加rclone的配置,配置保存在....
MongoDB:副本集读写分离搭建
背景知识 副本集(Replica Set,replSet,复制集)具有自动故障恢复的功能。主从集群和副本集最大的区别就是副本集没有固定的主节点,整个集群会选出一个主节点,当其挂掉后,会在剩下的副节点中选中一个作为主节点,副本集中总有一个活跃节点(primary)和多个备份节点(secondary)。 MongoDB官方已经不建议使用主从模式,代替的方案是采用副本集的模式。 主从模式 其实就是一个单副本的应用,没有很好的扩展性和容错性,而MongoDB副本集具有多个副本保证了容错性,即使一个副本挂掉了还有多个副本存在,主节点挂掉后,整个集群内会实现自动切换 副本集工作原理 客户端连接到整个MongoDB副本集,不关心具体哪一台节点是否挂掉。主节点负责整个副本集的读写,副本集定期同步数据备份,一旦主节点挂掉,副节点就会选举一个新的主节点,而这一切对于应用服务器不需要任何关心。 副本集中副节点在主节点挂掉后通过心跳机制检测到后,就会在副本集内发起主节点的选举机制,自动选举一位新的主节点。 官方推荐的MongoDB副本集机器数量为至少 3 个,即:一主两副 环境准备 因为主机数量有限,这里只用两个副本集部署演示,两台主机:Centos ip地址 主机名 角色 192.168.198.140 mongo-master 副本集主节点 192.168.198.142 mongo-slave 副本集副节点 关闭防火墙: systemctl stop firewalld systemctl disable firewalld 安装MongoDB 安装 wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz tar -zvxf mongodb-linux-x86_64-rhel70-4.2.8.tgz mv mongodb-linux-x86_64-rhel70-4.2.8 /usr/local/mongodb cd /usr/local/mongodb mkdir conf data logs touch conf/mongodb.conf touch logs/mongodb.log mkdir -p data/db 编写MongoDB配置文件mongodb.conf #数据存储路径 dbpath=/usr/local/mongodb/data/db #日志存储文件 logpath=/usr/local/mongodb/logs/mongodb.log #运行端口 port= 27017 #守护进程的方式运行MongoDB,创建服务器进程 fork=true #使用追加的方式写日志 logappend=true # 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP bind_ip= 192 .168.198. #使用此设置来配置复制副本集。指定一个副本集名称作为参数,所有主机都必须有相同的名称作为同一个副本集 replSet=repset 启动 [root@mongo-master mongodb]# ....