「Redis」- 安全相关
通用安全模型
旨在由“受信任环境”中的“受信任客户端”访问。Redis不因该由未受信的客户端直接访问,要通过中间层进行ACL控制。
一般而言,Redis没有进行最大的安全性优化,而是为了获得最佳性能和简单性。
网络安全
通过防火墙过滤;
修改配置文件监听指定的IP地址;
认证功能 | 密码 | AUTH
虽然没有提供访问控制,但是Redis提供了认证功能。
启用认证之后,它会拒绝响应未认证的客户端。客户端使用AUTH命令进行认证。
认证密码以明文的方式保存在redis.conf配置文件中。密码应该足够长:
由于Redis的响应非常快,短密码及其容易暴力破解;
密码不需要被记住,它以明文存储子啊redis.conf中;
认证功能是冗余层。在防火墙或者其他系统保护时效时,密码认证能够提供而外一个保存。
密码认证过程中密码是明文发送的,这无法阻止网络窃听。
使用命令设置密码
redis: set a password for redis
连接Redis之后,执行如下命令设置密码:config set requirepass “password”
!!!注意,在服务重启后,密码会时效。
获取当前密码
连接Redis之后,可以使用如下命令查看密码:
> config get requirepass
当然,前提是你已经通过了认证。否则是服务查看密码的
持久化设置密码
redis 安装启动及设置密码<windows>
修改redis.conf文件,加入如下行:
requirepass yourpassword
然后,重启Redis服务。(注意配置文件前不能由空行)
禁用特殊命令
没有访问控制导致客户端可以执行任何命令,有些命令应该被重命名。
在redis.conf中,使用rename-command来覆盖危险指令:
重命名指令:rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52
或删除指令:rename-command CONFIG “”
诸如此类的命令还有FLUSHALL、DEBUG等等。
保护模式
从3.2.0以后,如果绑定到所有的地址,并且没有设置密码,Redis会进入“保护模式”。
在这种模式下,Redis只会相应回环接口的查询,响应其他地址的其他客户端连接错误,并解释发生了什么,如何修复这个问题。
通过这种方式来避免由错误管理导[……]
「MyCat」- 场景及方案
技术实践
https://blog.csdn.net/u013898617/article/details/80402956 http://www.cnblogs.com/zzsdream/articles/6650690.html
mycat 垂直和水平切割 https://www.cnblogs.com/tqtl911/p/9117854.html
mycat_web https://www.jianshu.com/p/66851461cadf
常用操作
mycat 后端管理命令9066端口: https://blog.csdn.net/zhouchang3/article/details/54382550
查看后端物理数据库链接:Show @@backend
查看前端客户端l连接:Show @@connection
技术限制
mycat 不支持的语句 https://blog.csdn.net/liupeifeng3514/article/details/78988371
其他方面
怎么评价mycat 发起人之一的Leader-us?[……]
「MySQL」- 优化与索引
内容: MySQL优化与索引。
Version 5.7
提高SELECT操作性能的最佳方法是在查询中一个或多个列上创建索引。索引类似于行的指针,允许查询快速确定哪些行与WHERE子句中的条件匹配,并检索这些行的其他列值。所有MySQL数据类型都可以创建索引。
尽管可以为每个列创建索引,但是不必要的索引即浪费空间,又浪费时间来确定要使用的索引,索引还会增加插入、更新、删除的成本(因为必须更新每个索引)。所以盲目的使用索引也不是一个好的做法。
关于索引的创建,参考:《CREATE INDEX Syntax》
引用文章及文献:
Doc: https://dev.mysql.com/doc/refman/5.7/en/optimization-indexes.html
B-tree: https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_b_tree
hash index: https://dev.mysql.com/doc/refman/5.7/en/glossary.html#glos_hash_index
create index: https://dev.mysql.com/doc/refman/5.7/en/create-index.html
MySQL是如何使用索引的
索引用于快速查找具有特定列值的行。没有索引,MySQL必须从第一行开始,然后全表扫描,表越大,成本越高。如果该表具有相关列的索引,MySQL可以快速确定数据的位置,而无需全表扫描,这要块很多。
大多数索引(PRIMARY KEY,UNIQUE,INDEX,FULLTEXT)存储在B-tree中。有几个例外:空间数据类型的索引使用R-tree; MEMORY表还支持hash索引; InnoDB对FULLTEXT索引使用反向列表。
MySQL对如下操作使用索引:
快速找到与WHERE子句匹配的行。 从考虑中的消除行。如果存在多个可选择的索引,MySQL通常会使用查找最小行数(最有选择性(selectivity)的索引)的索引。关于selectivity: 数据分布的属性,列中不同值的数量(其基数)除以表中的记录数。高选择性意味着列值相对唯一,并且可以通过索引有效检索。如果(查询优化器)可以预测WHERE子句中的测试仅匹配表中少量(或比例)的行,如果先使用索引评估该测试,会使整体查询将趋于有效。 如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行。例如,如果(col1,col2,col3)上有一个三列索引,则可以在(col1),(col1,col2)和(col1,col2,col3)上搜索索引索引。有关详细信息,参见“多列索引”部[……]
「Rancher」- 部署 | 升级 | with Helm | on Kubernetes
部署 Rancher 2.6.12 版本(Helm)
Support matrix | SUSE Install/Upgrade Rancher on a Kubernetes Cluster | Rancher Manager
该笔记将记录:通过 Helm 将 Rancher 部署到 Kubernetes Cluster 的方法以及相关问题的解决办法。
第一步、版本选择
当前为 1.22.15 版本集群,查阅 Support matrix/All other Distros 获取支持该集群版本的 Ranhcer 版本;
这里,我们将部署 Rancher 2.6.9 版本,通过 Helm 部署;
第二步、服务部署
helm repo add rancher-stable https://releases.rancher.com/server-charts/stable
helm repo update
helm search repo rancher-stable/
helm pull rancher-stable/rancher –version 2.6.12
helm show values ./rancher-2.6.12.tgz > rancher.helm-values.yaml
vim rancher-2.6.13.helm-values.yaml
… bootstrapPassword:
… hostname:
… ingress:
helm upgrade –install –namespace cattle-system –create-namespace \
rancher ./rancher-2.6.12.tgz -f rancher.helm-values.yaml
…
kubectl get secret –namespace cattle-system bootstrap-secret -o go-template='{{.data.bootstrapPassword|base64decode}}{{ “\n” }}’
…
常见安装错误
[Sol.] … The target cluster does not have the PodSecurityPolicy API resource …
Helm 安装 rancher 提示:The target cluster does not have the PodSecurityPolicy API resource. Please disable PSPs in this chart before proce[……]
「MySQL」- 备份 | 恢复 | 迁移 | 同步 | 数据同步 | 数据复制
备份 and 恢复
备份方式
备份工具
是否影响业务
热备,Hot Backup
1)XtraBackup 2)mysqlbackup
几乎无影响
温备,Warm Backup
部分影响
冷备,Cold Backup
1)cp 2)rsync
逻辑备份,Logical Backup
1)mysqldump
备份特征: 1)无需停止数据库服务,无需中断业务,最大限度减少对操作干扰; 2)同时生成一致执性快照;
备份特征: 1)需要停止数据库服务,需要中断业务; 2)直接备份数据库物理文件;
备份特征: 1)无需停止数据库服务,但是会限制数据库操作,比如使数据库只读。
备份特征: 1)使用 mysqldump 备份,备份内容为语句;
特殊的数据库
Need for backing up MySQL databases information_schema, performance_schema, mysql and phpmyadmin?
information_schema – 不需要备份 performance_schema – 不需要备份 mysql – 需要,但是要小心。只能同版本恢复数据。尤其是 mysql.user 表,不保证兼容性。
备份工具
Percona Xtrabackup
MyLVMBackup
http://www.lenzg.net/mylvmbackup
MySQL Enterprise Backup (commercial)
-「MySQL Enterprise Backup」 -「MySQL Enterprise Backup User’s Guide」
数据库备份
-「Copying Data Files (Cold Backup Method)」
数据库备份
xtraback 数据规模较大 mysqldump 数据规模较小 使用 LVM 快照做 MySQL 数据备份 – http://frodo.looijaard.name/article/mysql-backups-file-system-snapshots
参考文献
MySQL Enterprise Backup Glossary
场景 | 表结构同步
5.7 mysqldiff — Identify Differ[……]
「Linux下,mysqldump命令」
mysqldump,数据库备份程序。mysqldump 执行逻辑备份,生成一组可以执行的用于重现原始数据库对象定义和表数据的SQL 语句。 所以本质上讲是通过生成 SQL 语句进行备份。
它可以 dump 一个或多个 MySQL 数据库,进行备份或传输到另一个 SQL 服务器。
mysqldump 命令还可以生成 CSV,其他分隔文本或 XML 格式的输出。
命令行语法格式
mysqldump [options] [db_name [tbl_name …]]
Note If you have tables that contain generated columns, use the mysqldump utility provided with MySQL 5.7.9 or higher to create your dump files. The mysqldump utility provided in earlier releases uses incorrect syntax for generated column definitions (Bug #20769542). You can use the INFORMATION_SCHEMA.COLUMNS table to identify tables with generated columns.
mysqldump requires at least the SELECT privilege for dumped tables, SHOW VIEW for
dumped views, TRIGGER for dumped triggers, and LOCK TABLES if the –single-transaction
option is not used. Certain options might require other privileges as noted in the
option descriptions.
To reload a dump file, you must have the privileges required to execute the statements
that it contains, such as the appropriate CREATE privileges for objects created by
those statements.
mysqldump output can include ALTER DATABASE statements that chan[……]
「Rancher」- 管理 Kubernetes 集群 | Enterprise Kubernetes Management
认识
官网:https://www.rancher.com/ 文档:https://ranchermanager.docs.rancher.com/ 仓库:https://github.com/rancher/rancher
Rancher 是一个开源的容器管理平台,可以帮助企业和开发人员在多云、多集群和多应用环境中轻松地管理和部署容器。Rancher,开源的、多集群的编排平台,能让运营团队部署、管理和保护企业 Kubernetes 集群。它解决管理多个 Kubernetes 集群的操作和安全挑战,同时为 DevOps 团队提供用于运行容器化工作负载的集成工具。2020 年 7 月,Rancher Labs 宣布最终协议,将被 SUSE 收购。简而言之,通过 Rancher 我们能够完成多个 Kubernetes Cluster 管理(Developing,Testing,Staging,Production),并利用 Rancher 提供的扩展(组件),加速 DevOps 实践;
组成
Rancher 提供直观的 Web 界面,支持管理各种容器编排引擎(如 Kubernetes、Docker Swarm 和 Mesos),可以集中管理多个集群的容器应用程序,并提供了丰富的监控和日志功能,方便用户对容器应用程序进行实时监控和故障排查;
Rancher Server:这是 Rancher 平台的核心,负责所有的管理和操作任务,如创建、启动和监控容器。
Rancher Agent:这是在每个被 Rancher 管理的主机上运行的一个小型服务。它负责与 Rancher Server 通信并执行其指令。
Rancher UI:这是 Rancher 的用户界面,你可以通过它来管理你的容器和集群。
Rancher Catalog:Rancher 提供了一个称为 Catalog 的应用市场,你可以从中选择和部署各种预先配置的应用。
Rancher CLI:Rancher 的命令行接口,可以通过命令行来 Rancher 管理。 https://github.com/rancher/cli
Rancher Kubernetes Engine (RKE):这是 Rancher 的 Kubernetes 安装器,它可以帮助你在任何主机上快速轻松地设置 Kubernetes 集群。
构建
通过 Helm Chart 部署到 Kubernetes 集群,是我们首选的部署方式。通过 Docker、Docker Compose 方式,将会遇到一些需要特殊处理的问题。
性质
多云商支持:Rancher 支持多种云平台,如 AWS、Azure、GCP 等,并提供了一种通用的容器编排方式,可以在不[……]
「REGISTRY-MIRROR」- 镜像缓存服务
认识
Docker Hub 是一个公共的镜像仓库,全球用户都可以访问,因此在高峰期或者网络状况不佳的情况下,下载 Docker 镜像可能会非常缓慢,甚至会失败。
Registry Mirror 是种私有或公共的容器镜像仓库,可以将容器镜像缓存在本地网络内,从而提高镜像的下载速度和稳定性。
补充说明:我们这里提到 Registry Mirror 泛指能够提供容器镜像缓存以提高镜像下载速度的服务,并不拘泥于某些特定的实现或某个特定的软件服务。
组成
WIP
构建
Registry
Registry,是 Docker 官方实现的 Registry 服务,但是其支持作为 Registry Mirror 运行,以提供镜像缓存功能;
但是,单个 Registry 服务无法同时缓存多个仓库:在部署 registry 服务时,当配置文件指定 proxy.remoteurl 参数后,registry 将作为 Registry Mirror 运行,但是该 Registry Mirror 仅能代理 proxy.remoteurl 所指定的仓库。
该特性在很多地方得以证实(然而,在 registry 的官方文档中,没有明确说明这一点):
1)
Launch the Caching Docker Registry Proxies,通过多个 registry mirror 实例来缓存不同仓库镜像;
2)我们也经过测试,近当仓库地址与 proxy.remoteurl 相同时,镜像才会通过 registry mirror 拉取并缓存;
3)我们一直以为 registry mirror 能够缓存所有镜像,类似于 HTTP Cache 服务。很显然,我们的理解是错误的;
Harbor
Harbor,提供镜像缓存,但其原理与 Registry Mirror 不同,无法在 daemon.json 中配置使用;
Nexus
Nexus,支持作为 Registry Mirror 服务来提供镜像缓存功能;
腾讯云 | 镜像加速
mirror.ccs.tencentyun.com
注意:
mirror.ccs.tencentyun.com 只支持内网访问,不支持外网域名访问加速。
阿里云 | 镜像加速器
https://help.aliyun.com/zh/acr/product-overview/product-change-acr-mirror-accelerator-function-adjustment-announcement
为进一步规范镜像加速器工具的使用,容器镜像服务ACR将于2024[……]
「MariaDB」- 部署 | 升级| 观测 | 调优 | ……
MariaDB
官方提供了一个工具,用于生成源的配置 MariaDB APT and YUM Repository Configuration Generator 如此,就不用到处去找仓库源的配置。
服务部署
MariaDB 10 on CentOS 7.x
How to Install and Secure MariaDB 10 in CentOS 7
由于在 CentOS 7.4 中自带 MySQL 5.5.60-MariaDB 不满足能要求,需要安装 MariaDB 10 数据库:
#!/bin/sh
#1 安装包组
yum groups install -y “MariaDb Database Server”
#2 启动服务
systemctl start mariadb.service
systemctl enable mariadb.service
#3 安全初始化
mysql_secure_installation
#4 测试连接,验证数据库是否连接正常
mysql -u root -p
CentOS 7 将「MariaDB 5.5」升级到「MariaDB 10.0」
How to Upgrade MariaDB 5.5 to MariaDB 10.0 on CentOS 7
#1 添加源
#!/bin/sh
cat <<EOF > /etc/yum.repos.d/MariaDB10.repo
# MariaDB 10.0 CentOS repository list – created 2014-10-13 13:04 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb-10.0]
name = MariaDB 10.0
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
#2 数据备份
!!!备份原数据!!! !!!备份原数据!!! !!!备份原数据!!!
#3 停止并卸载旧服务
#!/bin/sh
# 停止服务
systemctl stop mariadb
# 删除旧的软件包
#(该步骤不会清除数据,不用担心)
yum remove mariadb-server mariadb mariadb-libs
# 清除仓库缓存
yum clean all
#4 安装并启动新服务
#!/bin/sh
yum -y insta[……]
「JWT」- JSON Web Token
认识
JWT (JSON Web Token) 是一种开放标准 (RFC 7519),用于在网络应用环境间安全地传递声明(claims)。它是一种紧凑的、URL 安全的表示方式,用于在双方之间传输信息。JWT 是现代 Web 开发中广泛使用的身份验证和授权机制,特别适合 RESTful API 和无状态服务架构。简而言之,JWT 是个字符串,形如`xxxxx.yyyyy.zzzzz`格式,其中包含用户信息,三个部分可分别通过 base64 解码来查看内容,类似于 Cookie 的功能。
定位:身份验证;授权;
组成
结构成分
JWT 由三部分组成,用点号(.)分隔。完整的 JWT 看起来像 `xxxxx.yyyyy.zzzzz` 形式。
Header (头部)
包含令牌类型和使用的哈希算法
例如:`{“alg”: “HS256”, “typ”: “JWT”}`
Payload (负载)
包含声明(claims),即要传递的数据
有三种类型的声明:
– 注册声明(预定义):例如 iss(签发者)、exp(过期时间)、sub(主题)、……
– 公共声明
– 私有声明
例如:`{“sub”: “1234567890”, “name”: “John Doe”, “admin”: true}`
Signature (签名)
对前两部分的签名,用于验证消息未被篡改
例如:`HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret)`
工作原理
用户登录,Server 验证凭证
Server 创建 JWT 并返回给 Client
Client 存储 JWT(通常在 localStorage 或 cookie 中)
Client 在后续请求的 Authorization 头中携带 JWT
Server 验证 JWT 并处理请求
构建
按照组成部分,来构建 JWT 即可。
const jwt = require(‘jsonwebtoken’);
// 创建JWT
const token = jwt.sign(
{ userId: 123, role: ‘admin’ },
‘your-secret-key’,
{ expiresIn: ‘1h’ }
);
// 验证JWT
jwt.verify(token, ‘your-secret-key’, (err, decoded) => {[……]
「MariaDB」- MariaDB Galera Cluster
WIP MariaDB Galera Cluster
参考文献
浅谈MariaDB Galera Cluster架构 MySQL MGR 集群搭建(单主模式&多主模式)[……]
「LAPTOP」- 学习指南
学习指南
研究对象
笔记本电脑(笔电);
研究结果
掌握笔记本的各个零部件;
根据自己的需求来定制笔记本电脑;
研究方法
我们决定采用 T2D(Top to Down)的学习方法,究其原因:我们并未找到介绍笔电的完整知识体系,所以我们从笔电本身入手,逐步拆解。
体系结构 | The History and The System
发展历史
WIP
体系结构
WIP
请为我推荐几本介绍笔记本制造的书籍 – ChatGPT
以下是一些关于电脑硬件制造、电脑工程和笔记本电脑设计的相关书籍。虽然没有特别专注于笔记本电脑制造的书籍,但这些书籍都可以帮助你了解电脑制造和设计的基本知识和原理:
“Upgrading and Repairing Laptops” 作者:Scott Mueller
“Mobile Unleashed: The Origin and Evolution of ARM Processors in Our Devices” 作者:Don Dingee、Sophia Khan
“Computer Organization and Design: The Hardware/Software Interface” 作者:David A. Patterson, John L. Hennessy
“PCs All-in-One For Dummies” 作者:Mark L. Chambers
“The Essential Guide to Computer Hardware” 作者:Jim Keogh
请根据自己的需求选购适合自己水平和兴趣的书籍。
请为我推荐几本介绍笔记本电脑制造的书籍 – ChatGPT
很抱歉,到我知识库最后更新的日期(2023年6月1日)为止,我并没有找到专门介绍笔记本电脑制造的书籍。相关信息通常散布在各种电子工程、计算机硬件设计和制造的教科书或参考书中,或者在互联网上的相关文章和论文中。
然而,以下的一些书籍可能对你有用,它们介绍了计算机硬件、电子工程和电脑科学的基本知识:
1.《计算机组成与设计》 – David A. Patterson & John L. Hennessy:这本书详细地介绍了计算机硬件的基本组成和设计原理。 2.《现代操作系统》 – Andrew S. Tanenbaum:虽然这本书主要关注操作系统,但它对于理解计算机硬件如何与软件交互也非常有用。 3.《电子设备与电路理论》 – Robert L. Boylestad & Louis Nashelsky:这本书提供了对电子设备和电路设计的深入理解,这对于[……]
「DBLE」- 基于 MyCat 的数据库中间件
认识
DBLE,企业级开源分布式中间件,基于 MyCat 中间件,江湖人送外号 “MyCat Plus”;以其简单稳定,持续维护,良好的社区环境和广大的群众基础得到了社区的大力支持。
DBLE,基于 MyCat 的数据库中间件,专注于 MySQL 数据库,江湖人称「MyCat Plus」。
本文将介绍与 DBLE 有关的内容。
参考
MyCat 看了这篇什么都会了 开源分布式中间件 DBLE 快速入门指南 在 GitHub 上的项目主页[……]
「MySQL」- 杂记
SELECT 结果的顺序 在一般情况下,SELECT 显示的数据顺序是插入的顺序,但实际上受到 MySQL 重用存储空间的影响。《MySQL 必知必会》
NULL 与不匹配 当筛选某些不符合特定值的行时,NULL 值具有特殊含义,数据库不知道是否匹配,所以在匹配过滤或不匹配过滤时不返回它们; 同样的,通配符也不能匹配 NULL;
COUNT(*)与 COUNT(column) 如果 column 列中包含空值,则会被忽略。而 COUNT(*)会统计所有的行,不管是否为 NULL 值;
创建唯一索引时,如何快速删除重复的数据?
Removing duplicates with unique index
Identifying cause of high I/O – Database
「Identifying cause of high I/O」 「Diagnosing high disk utilization in MySQL」
WIP ! MySQL High I/O
Faster/more reliable way to delete millions of rows?
https://forums.mysql.com/read.php?152,658187,658211#msg-658211 「MySQL Big DELETEs」
WIP MySQL 索引优化;
查看数据库最后访问日期
When was the last time a mysql table was accessed? – Stack Overflow
SELECT update_time FROM information_schema.tables WHERE table_name=’tablename'[……]
「XtraBackup」- 增量备份及恢复
问题描述
使用 XtraBackup 进行增量备份(仅仅备份自上次备份后变更的数据),并使用备份数据进行恢复。
增量备份原理: 1)每个 InnoDB Page 都包含 LSN,LSN 是整个数据库的系统版本号,每个 InnoDB Page 的 LSN 都展示 InnoDB Page 是如何变化的 2)在增量备份时,对比 InnoDB Page 的 LSN 与 全量备份的 LSN,如果 InnoDB Page 的 LSN 较新,则复制该 InnoDB Page 3)更进一步,如果你知道 LSN,则无需基础的全量备份,可以使用 –incremental-lsn 直接指定(但是恢复的时候依旧需要基础的全量备份)
注意事项: 1)该增量备份只能针对 MySQL 实例,而不能针对特定数据库或者特定数据表;
第一步、创建增量备份
#1 首先,创建全量备份
增量备份是在全量备份的基础之上,因此需要先创建全量备份:
xtrabackup –backup –target-dir=/data/backups/base
查看 xtrabackup_checkpoints 文件可以获取 LSN 相关信息。
#2 然后,创建增量备份
在全量备份的基础之上,执行如下命令创建增量备份:
xtrabackup –backup –target-dir=/data/backups/inc1 \
–incremental-basedir=/data/backups/base
在 /data/backups/inc1 中保存相关增量备份的文件以及信息。
查看 xtrabackup_checkpoints 文件可以获取 LSN 相关信息。
#3 再次创建增量备份(基于上次增量备份)
基于上一次增量备份,我们创建新的增量备份:
xtrabackup –backup –target-dir=/data/backups/inc2 \
–incremental-basedir=/data/backups/inc1
查看 xtrabackup_checkpoints 文件可以获取 LSN 相关信息。
注意事项及补充说明
基于此,我们可以使用 xtracbackup 创建差异备份。即“永远”在 /data/backups/base 的基础上创建增量备份。
第二步、准备增量备份(重要步骤)
增量备份的准备阶段不同与全量备份的准备阶段:
对于全量备份,在准备阶段中,需要:将已提交事务从日志文件写入数据文件;回滚未提交的事务;
对于增量备份,在准备阶段中,不能回滚未提交的[……]
「OpenSSH」- 安装
on Linux | with Source Code
参考 BLFS/OpenSSH-7.3p1 说明
on Linux | with Package Manager
on Debian
# Server 端,提供 sshd 等命令。
apt-get install openssh-server
# Client 端,提供 ssh 等连接 SSH 服务、创建证书的命令。
apt-get install openssh-client
on Windows (2019/02/04)
实际上有两种办法: 1)旧系统可以下载二进制安装包,参考 Install Win32 OpenSSH 笔记; 2)对于 Windows Server 2019 or Windows 10+ 可以直接安装,参考官方文档 Installing OpenSSH from the Settings UI on Windows Server 2019 or Windows 10 1809 中的说明;
补充说明:若仅需要客户端工具,则可以考虑 XShell、SecureCRT 等等工具,或 Windows 系统自带的 SSH 命令,细节这里不再赘述。
on Kubernetes
某个网络是隔离的(出于安全原因),所以其中的主机、服务(MySQL Redis)都是对外隔离的,无法直接访问。
通过 SSH Server 来作为跳板机,通过 SSH Tunnel 来访问,所以我们才会在 Kubernetes 中部署 SSH 服务。
该笔记将记录:在 Kubernetes 中,如何部署 OpenSSH 服务,以及相关问题的解决方法。
通过 OpenSSH Server 镜像
镜像:linuxserver/openssh-server – Docker Image | Docker Hub
with Helm | by djjudas21/charts
仓库:https://artifacthub.io/packages/helm/djjudas21/openssh-server
helm repo add djjudas21 https://djjudas21.github.io/charts/
helm repo update djjudas21
helm pull djjudas21/openssh-server
helm show values ./openssh-server-0.1.14.tgz > openssh-server-0.1.14.tgz.helm-values.yaml
vim openssh-server-0.1.14.tgz.helm-va[……]
「MySQL」- 高可用性
集群方案
数据库复制:集群至少要支持故障转移,而数据库复制并不具备该特性。因此我们说数据库复制并不是高可用方案,而属于负载均衡方案。鉴于此,本部分不讨论与数据库复制相关的内容。
MySQL Group Replication
MySQL MGR 集群搭建(单主模式&多主模式) MySQL 5.7 Reference Manual/Group Replication
MariaDB Galera Cluster
MariaDB Galera Cluster
MariaDB MaxScale + Replication Manager
GitHub/mariadb-corporation/MaxScale # 03/24/2020 / Star 985 / Latest commit 80a8fd5 5 days ago
GitHub/signal18/replication-manager # 03/24/2020 / Star 368 / Latest commit f813465 15 days ago
MaxScale + MRM – MySQL Replication Failover – Maxscale vs MHA: Part Two
MySQL Master HA (aka MHA)
GitHub/yoshinorim/mha4mysql-manager # 03/24/2020 / Star 966 / Latest commit abe11f9 on Mar 23, 2018
MHA – MySQL Replication Failover – Maxscale vs MHA: Part One
Orchestrator
GitHub/outbrain/orchestrator # 03/24/2020 / Star 786 / Latest commit 2a6e4b7 on Dec 9, 2016
ClusterControl
Wikipedia/MySQL/User interfaces/ClusterControl
是由 Somenines 开发,端到端的 MySQL 管理系统,具有图形化界面,它具有部署、监控、管理、扩展 MySQL 实例的能力。
社区版本可免费使用,并允许用户部署、监视 MySQL 实例。诸如负载平衡、备份和还原、故障转移(1.4+)等高级功能是付费产品的一部分。
中间件 | Middleware
ProxySQL
https://proxysql.com https://github.com/sysown/proxysql ProxySQL is a high perfo[……]
「MySQL」- 配置 Zabbix 监控
本笔记记录如何使用 Zabbix 监控 MySQL 数据库,虽然 Zabbix 内置开箱即用的 MySQL 监控模板,但是“开箱”本身也是有些困难的。
我们没有记录 Zabbix 添加及使用模板的方法,内容多为使用 MySQL 监控模板需要的准备工作。
CentOS Linux release 7.5.1804 (Core) with Zabbix 4.0.1
操作步骤
1)为主机添加 Teamplate DB MySQL 监控模板; 2)在被监控主机中创建 /var/lib/zabbix/.my.cnf 配置文件以用于连接数据库获取信息:
[client]
user=’username’
password=’password’
注意事项
1)参考 /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf 文件; 2)对于用于监控的 MySQL 用户,文档也没有说明,需要自行分析 userparameter_mysql.conf 文件。我们直接使用 root 帐号,但是不推荐如此。在 Zabbix 4.0 中,稳定具有详细描述,但也存在其他问题。
CentOS release 6.5 (Final) with Zabbix 4.4.3
参考官方 Zabbix Documentation 4.4/Requirements for MySQL by Zabbix agent template 文档。
常见问题汇总
#1 sh: mysql: command not found
当执行 zabbix_get -s 127.0.0.1 -k ‘mysql.get_status_variables[“localhost”,”3306″]’ 命令时,提示:
sh: mysql: command not found
这是因为 zabbix agent 默认环境变量为 PATH=/sbin:/usr/sbin:/bin:/usr/bin,而 mysql 命令没有在该路径中。
创建 /etc/sysconfig/zabbix-agent 文件,追加 PATH=$PATH:/path/to/mysql/bin
#2 ERROR 1045 (28000): Access denied for user ‘zabbix’@’x.x.x.x’ (using password: NO)
Preprocessing failed for: ERROR 1045 (28000): Access denied for user ‘zabbix’@’10.10.50.188’ (using passwor[……]
「REDIS」- 备份 | 恢复 | 迁移
(迁移)通过 Huawei Cloud DCS 实现
我们需要完成 Alibaba Cloud Redis 到 Huawei Cloud Redis 的迁移,该任务的关键是保留 Redis 中的数据。
在华为云中, 1)进入 DCS(分布式缓存服务)产品,创建「数据迁移/创建在线迁移任务」任务。 2)……
# 01/15/2024 当使用该工具时,我们遇到一些问题,但并不关键,所以我们放弃使用 DCS 迁移任务进行迁移。
# 06/12/2024 华为云 ⇒ 天翼云
根据工单反馈,如果是跨云迁移,则需要部署云专线,然后通过内网地址进行迁移。否则,如果目的地址使用公网地址,则连接测试将失败。
https://support.huaweicloud.com/usermanual-dcs/dcs-migration-0312003.html
我们的解决方案是在华为云 VPC 创建云服务器,然后 Nginx 反向代理转发到天翼云 Redis 服务。如此,在目的地址即可填写云服务器的内网地址。
(迁移)通过 Alibaba Cloud DTS 实现
我们需要完成 Alibaba Cloud Redis 到 Huawei Cloud Redis 的迁移,该任务的关键是保留 Redis 中的数据。
阿里云的 DTS 服务提供数据迁移,能够将阿里云的 Redis 迁移到其他环境中。
在我们的场景中,鉴于是通过公网进行迁移,所以需要使用「数据迁移」服务,而无法使用「数据同步」服务。[……]
「Valkey」- 高性能的键值存储系统
认识
官网:https://valkey.io/ 文档:https://valkey.io/docs/ 仓库:https://github.com/valkey-io/valkey
This project was forked from the open source Redis project right before the transition to their new source available licenses. Valkey is a high-performance data structure server that primarily serves key/value workloads. It supports a wide range of native structures and an extensible plugin system for adding new data structures and access patterns. Valkey 是一个高性能的键值存储系统,专为现代应用程序设计,提供低延迟、高吞吐量的数据访问。它通常用于缓存、会话存储和实时数据处理等场景。简而言之,Valkey 是个处理 K/V 存储的高性能服务。
组成
WIP
构造
Documentation: Installation | https://lldap-adm.devops.cube-health.com/users
on Kubernetes with Helm Chary by Bitnami | https://artifacthub.io/packages/helm/bitnami/valkey
性质
高性能
低延迟:Valkey 通过内存存储和优化的数据结构实现快速数据访问。
高吞吐量:支持每秒数百万次操作,适合高并发场景。
数据结构丰富
支持多种数据结构,如字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)和有序集合(Sorted Sets)。
提供高级操作,如范围查询、排序和原子操作。
持久化选项
快照(Snapshotting):定期将内存数据保存到磁盘。
追加文件(AOF):记录所有写操作,确保数据安全。
分布式支持
支持主从复制(Replication)和集群模式(Cluster),实现高可用性和横向扩展。
提供自动分片(Sharding)功能,分散数据负载。
扩展性
支持模块化扩展,允许开发者通过插件添加新功能。
提供 Lua 脚本支持,实现复杂操作。[……]
「VIDEOS」- 常见问题处理
NAME_YEAR_SUBTITLE_RESULATION.FORMAT
搞笑
# 骑手正在攻击你的外卖 # 共享单车找回名场面
电影
《通缉令》,《刺客联盟》,《杀神特工》,2008,提莫·贝克曼贝托夫执导,詹姆斯·麦卡沃伊、摩根·弗里曼、安吉丽娜·朱莉 《忍者刺客》,2009,詹姆斯·麦克提格执导,郑智薰(Rain)、娜奥米·哈里斯、兰德尔·杜克·金 速度与激情
变形金刚 生化危机 黑客帝国 007 碟中谍
老友记 生活大爆炸
《海底两万里》、《神秘岛》
DC
漫威 | https://editorial.rottentomatoes.com/guide/marvel-movies-in-order/
The Infinity Saga: Phase One (2008-2012)
Iron Man (May 2, 2008)
The Incredible Hulk (June 13, 2008)
Iron Man 2 (May 7, 2010)
Thor (May 6, 2011)
Captain America: The First Avenger (July 22, 2011)
Marvel’s The First Avengers (May 4, 2012)
Phase Two (2013-2015)
Iron Man 3 (May 3, 2013)
Thor: The Dark World (November 8, 2013)
Captain America: The Winter Soldier (April 4, 2014)
Guardians of the Galaxy (August 1, 2014)
Avengers: Age of Ultron (May 1, 2015)
Ant-Man (July 17, 2015)
Phase Three (2016-2019)
Captain America: Civil War (May 6, 2016)
Doctor Strange (November 4, 2016)
Guardians of the Galaxy Vol. 2 (May 5, 2017)
Spider-Man: Homecoming (July 7, 2017)
Thor: Ragnarok (November 3, 2017)
Black Panther (February 16, 2018)[……]
「ZeroOmega」- 浏览器代理切换工具
认识
官网:https://github.com/zero-peak/ZeroOmega 文档:https://github.com/zero-peak/ZeroOmega 仓库:https://github.com/zero-peak/ZeroOmega | https://github.com/suziwen/ZeroOmega
SwitchyOmega 项目不再维护。Chrome 最近决定禁用所有未升级到 Manifest V3 的扩展,并将其从 Chrome 应用商店下架,因此导致此扩展无法在 Chrome 上正常使用。—— https://github.com/FelisCatus/SwitchyOmega/issues/2513 —— 所以,就目前 05/22/2025 而言,ZeroOmega by suziwen 与 SwitchyOmega 功能相仿。简而言之,ZeroOmega 的主要作用就是配置浏览器里的请求哪些使用代理、哪些不使用代理以及使用哪个代理、不使用哪个代理。
构建
on Googole Chrome
https://chromewebstore.google.com/detail/proxy-switchyomega-3-zero/pfnededegaaopdmhkdmcofjmoldfiped[……]
「Replication with Global Transaction Identifiers」-
使用 GTID 的基于事务的复制。当时使用 GTID 时,事务可以在提交到原始服务器及应用到任何从库时进行标识与追踪;就是说在使用 GTID 时,在启用新从库或故障转移到新主库时,没有必要制定日志文件或日志文件位置,极大简化这些任务。因为基于 GTID 复制完全基于事务,很容易确定主从之间是否一致;只要提交到主库的使用也提交到从库,就可以保证二者的一致性。可以使用基于语句或者基于行的复制,但是推荐使用基于行的 binlog 格式。
在主从间,总是保留 GTID。通过检查从库的 binlog 可以确定应用到从库的任何事务的来源。在给定 GTID 提交到给定服务器后,任何具有相同 GTID 的后续事务将被忽略。因此提交到主库的事务只能在从库中应用一次。
GTID Format and Storage
链接:MySQL 5.7 Reference Manual / GTID Format and Storage 内容:GTID 是如何定义与创建的,以及如何在 MySQL 中表现的。
GTID 是唯一标识符,创建并关联到在原库中提交的事务。这种唯一不但是在原库中,在整个复制集群中也是唯一的。
GTID 分配 区分 客户端事务(在主库上提交的)与复制的事务(在从库上重放的):
当客户端事务提交到主库时,被分配新的 GTID,前提时该事务已经写入事务已经写入 binlog 文件。保证客户端事务具有单调递增的 GTID,并且生成的数字之间没有空隙。如果客户端没有写入 binlog 文件(比如事务被过滤或者事务只读),则不会在原库上分配 GTID。
复制的事务将保留分配到原服务器的 GTID 值。该 GTID 在复制的事务开始执行前就存在,并且即使
复制的事务没有写入从库 binlog 或者
被过滤 也会保留。MySQL 系统表 mysql.gtid_executed 用于保存
应用到 MySQL 服务的所有事务分配的 GTID 值,但是排除那些保存在当前活动 binlog 文件中的。
GTID 的 自动跳过功能:在主库上提交的事务不能在从库上应用多次,这保证数据一致性。当具有相同 GTID 的事务已经提交到服务,后续具有相同 GTID 的事务将被忽略。不会产生错误,也不会执行任何语句。
如果具有给定 GTID 的事务已经在执行,但是还没有提交或回滚,此时该服务器上任何尝试启动的具有相同 GTID 的并发事务将被阻塞。此时服务器既不会开始执行并发事务,也不会将控制权返回给客户端。当那个事务首次提交或者回滚后,具有相同 GTID 被阻塞的并行会话才会被处理。当首次尝试被回滚,某个并行会话接着尝试事务,其他所有并行会话(因 GTID 相同导致阻塞[……]
「MySQL」- 系统变量 | System Variables
环境概述
MySQL 8.0
系统变量(System Variables)是什么?
系统变量,由 MySQL 维护,用于控制 MySQL 行为。
某些系统变量是由组件与插件安装的变量,当插件或组件安装后才可使用。这些变量具有“组件名前缀”(或“插件名前缀”),但是他们依旧属于系统变量。
系统变量的作用范围
全局与 会话
系统变量具有两个作用范围:全局,影响服务的整个操作;会话,影响当前客户端连接的操作;
给定的某个系统变量,可以同时具有全局值与会话值。
两者之间的关系
在服务启动时,所有全局变量初始化为默认值,或者在选项中配置的值。
在客户端连接时,使用全局变量值初始化会话变量值。注意,某些特殊变量,会话参数值不会被全局参数值初始化,在文档描述中会有说明
如何设置系统变量?
每个系统变量都有默认值。
在启动时,可以通过命令行选项设置;或者通过配置文件(my.cnf)设置;
在运行时,多数变量可以通过 SET 语句设置,这无需重启或停止数据库。
命令行选项
1)与普通命令行选项无异 2)使用横线、下划线皆可:–general_log=ON、–general-log=ON 3)可以使用单位(K、M、G),大小写皆可:–innodb-log-file-size=16M –max-allowed-packet=1G
通过命令行选项 –maximum-var_name=value 形式,可以限制 SET 可设置的参数最大值。
配置文件(my.cnf)
1)与命令行选项类似,只需去除前缀:
[mysqld]
innodb_log_file_size=16M
max_allowed_packet=1G
使用 SET 语句
多数变量可以使用 SET 语句修改: 1)通过名称引用; 2)并前缀修饰符(可选); 3)只能使用下划线,不能使用横线;
使用 SET 语句
设置全局变量(临时)
SET GLOBAL max_connections = 1000;
SET @@GLOBAL.max_connections = 1000;
设置全局变量(并持久化到 mysqld-auto.cnf 文件)
SET PERSIST max_connections = 1000;
SET @@PERSIST.max_connections = 1000;
设置全局变量(仅持久化到 mysqld-auto.cnf 文件)
SET PERSIST_ONLY max_connections = 1000;
SET @@PERSIST_ONLY.max_c[……]
「MySQL」- 访问授权
内容:MySQL 中授权语法及相关内容。
授权访问数据库
How To Create a New User and Grant Permissions in MySQL MySQL :: MySQL 5.7 Reference Manual :: 13.7.1.4 GRANT Statement
— MySQL 5.7, MySQL 8.0
GRANT ALL PRIVILEGES ON `test_db`.* TO ‘testuser’@’%’;
允许用户建库,但是仅能访问自己的数据库
Let MySQL users create databases, but allow access to only their own databases
通过前缀匹配的方式进行权限限制:
GRANT ALL PRIVILEGES ON `testuser_%`.* TO ‘testuser’@’%’;
授予只读权限:
GRANT SELECT ON *.* TO ‘k4nzdroid-ro’@’%’;
FLUSH PRIVILEGES;
授权操作(MySQL 5.7)
MySQL :: MySQL 5.7 Reference Manual :: 13.7.5.21 SHOW GRANTS Statement how to add super privileges to mysql database? – Stack Overflow
SHOW GRANTS [FOR user]
— 授予 SUPER 权限
mysql> GRANT SUPER ON *.* TO user@’localhost’ IDENTIFIED BY ‘password’;
mysql> FLUSH PRIVILEGES;[……]
「KUBERNETES」- Operator 模式 | Operator Pattern
描述
文档:https://kubernetes.io/docs/concepts/extend-kubernetes/operator/
Kubernetes Operator 是为了解决有状态应用(Stateful Applications)和复杂应用在 Kubernetes 上的自动化管理问题而设计的。它扩展了 Kubernetes 的原生能力,使运维人员能够以声明式的方式管理应用的全生命周期,而不仅仅是部署和扩缩容。总结来说,Operator 是 Kubernetes 中“运维自动化”的高级模式,特别适合管理需要复杂运维逻辑的有状态服务。简而言之,我们仅需通过 YAML 声明服务状态,Operator 将负责实现该状态。
核心解决的问题
有状态应用的管理。Kubernetes 适合无状态应用,但对于数据库、消息队列、分布式存储等有状态应用,管理起来非常复杂,涉及:数据持久化、主从配置、备份与恢复、集群拓扑变更(如扩容 / 缩容时的数据再平衡)。而 Operator 能封装这些逻辑,实现自动化管理。
复杂应用的运维逻辑。某些应用需要特定的运维操作,例如:数据库的版本升级(需按顺序滚动更新)、配置热加载(如 Prometheus 重载配置)、故障自愈(如自动重建崩溃的 Pod)。而 Operator 能将这些手动操作编码为自动化流程。
跨资源协调。某个应用可能涉及多个 Kubernetes 资源(如 `Deployment`、`Service`、`ConfigMap`、`Ingress`),Operator 可以确保它们按正确顺序创建和更新。
领域知识(Domain Knowledge)的封装。将运维专家的经验(如“Elasticsearch 集群扩容前需先调整分片”)编码到 Operator 中,降低使用门槛。
其优势
减少人工干预:自动化运维操作,降低人为错误。
声明式 API:用户只需关心“想要什么”,而非“如何实现”。
可复用性:社区提供大量现成 Operator(例如 https://operatorhub.io 站点)
原理
– Custom Resource Definition (CRD):定义自定义资源(如 `RedisCluster`、`PostgresDB`),用户通过 YAML 声明期望状态。 – Controller:监听 CRD 的变更,对比实际状态与期望状态,执行调谐(Reconcile)逻辑。 – 自动化操作:通过调用 Kubernetes API 或外部工具(如备份到 S3)实现运维任务。
应用
场景
原生 Kubernetes 的不足
Ope[……]
「MySQL」- InnoDB: Assertion failure in thread … in file btr0pcur.cc line 432
问题描述
数据库所在主机磁盘发生损坏。在修复后重新启动数据库服务,在启动时产生如下错误:
2019-12-16 05:16:43 7f21f7360700 InnoDB: Assertion failure in thread 139783858161408 in file btr0pcur.cc line 432
InnoDB: Failing assertion: btr_page_get_prev(next_page, mtr) == buf_block_get_page_no(btr_pcur_get_block(cursor))
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. Please refer to
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
InnoDB: about forcing recovery.
21:16:43 UTC – mysqld got signal 6 ;
This could be because you hit a bug. It is also possible that this binary
or one of the libraries it was linked against is corrupt, improperly built,
or misconfigured. This error can also be caused by malfunctioning hardware.
We will try our best to scrape up some info that will hopefully help
diagnose the problem, but since we have already crashed,
something is definitely wrong and this may fail.
key_buffer_size=8388608
read_buffer_size=131072
max_used_connections=1
m[……]
「MyCat」- 安装
安装依赖
安装文档「2.0 Mycat安装与使用」里也没有标明依赖。
反正是 Java 写的,用 JDK 1.8 好了。
安装服务
#!/bi/sh
cd /usr/local/src
# 下载
# https://github.com/MyCATApache/Mycat-download
# http://www.mycat.io/
wget http://dl.mycat.io/1.6.7.1/Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
# 解压
tar -xf Mycat-server-1.6.7.1-release-20190627191042-linux.tar.gz
mv mycat /usr/local/
# 配置
# ….
# 启动
/usr/local/mycat start
# 查看状态
/usr/local/mycat status
参考文献
Mycat数据库分库分表中间件 GitHub/MyCATApache/Mycat-Server/Wiki/2.0 Mycat安装与使用[……]
「MySQL」- 语法 | Statement
参考 | SQL Statement Syntax
Originally based upon relational algebra and tuple relational calculus, SQL consists of many types of statements, which may be informally classed as sublanguages, commonly: Data query Language (DQL), Data Definition Language (DDL), Data Control Language (DCL), and Data Manipulation Language (DML).
DQL | Data Query Language
Data query language – Wikipedia
DCL | Data Control Language
DDL | Data Definition Statements
ALTER DATABASE Syntax ALTER EVENT Syntax ALTER FUNCTION Syntax ALTER INSTANCE Syntax ALTER LOGFILE GROUP Syntax ALTER PROCEDURE Syntax ALTER SERVER Syntax
ALTER TABLE Syntax
ALTER TABLE Persons ADD PRIMARY KEY (ID);
SQL PRIMARY KEY Constraint
ALTER TABLESPACE Syntax ALTER VIEW Syntax
Database (Schema)
TRUNCATE TABLE Syntax(清空表)
MySQL :: MySQL 8.0 Reference Manual :: 13.1.37 TRUNCATE TABLE Statement
TRUNCATE [TABLE] tbl_name
DML | Data Manipulation Statements
CALL Syntax DELETE Syntax DO Syntax HANDLER Syntax LOAD DATA INFILE Syntax LOAD XML Syntax
INSERT and REPLACE
REPLACE works exactly like INSERT, except that if an old row in the table has the same value as a new[……]
「KUBERNETES」- 存储 | 数据持久化 | Volume | 学习笔记
该笔记将记录:在 Kubernetes 中,容器使用存储的各种方法,以及常见问题的处理方法;
描述
我们需要在容器中挂载存储,以写入数据或者访问数据、在多个 Pod 之间共享数据;
Volumes,是指映射(挂载)到容器中的磁盘、存储空间、文件系统;
Volume 在 Pod 上运行的所有容器都可以访问的目录。Volume 可以保证个别容器重启的时候,数据能够保存下来;
Volume 分为以下几类: 1)本地节点卷:emptyDir 或者 hostPath 2)通用网络卷:nfs,glusterfs,cephfs 3)云商提供的卷:awsElasticBlickStore,azureDisk,gcePersistentDisk 4)特殊用途的卷:secret、gitRepo
使用那种卷根据实际情况确定;
常用示例:仓库 examples/staging/volumes at master 包含**多种不同类型存储**的使用示例;
PV + PVC: PersistentVolume, PersistentVolumeClaim Storage + PVC: Dynamic Volume Provisioning
应用
subPath | 将存储的子目录挂载到容器中
Volumes | Kubernetes Shared NFS and SubPaths in Kubernetes | by Joseph Bironas | Medium What is the difference between subPath and mountPath in Kubernetes – Stack Overflow
通过 subPath 参数,将在存储目录中的子目录挂在到 Pod 中,从而限制容器访问存储的根目录。如下 YAML 实例:
apiVersion: v1
kind: Pod
metadata:
name: pod-subpath
spec:
containers:
– name: pod-subpath
image: busybox
command: [ “sh”, “-c”, “while [ true ]; do echo ‘Hello’; sleep 10; done | tee -a /var/log/hello.txt” ]
volumeMounts:
– name: workdir1
subPath: pod-subpath # 在 workdir1 中的子目录(将会自动创建);
mountPath: /var/log/ # 挂载到容器的 /var/log/[……]