k8s搭建一主三从的mysql8集群---无坑
一,环境准备
1.1 k8s集群服务器
ip | 角色 | 系统 | 主机名 | cpu | mem |
192.168.40.129 | master | centos7.9 | k8smaster | 4 | 8 |
192.168.40.130 | node1 | centos7.9 | k8snode1 | 4 | 8 |
192.168.40.131 | node2 | centos7.9 | k8snode2 | 4 | 8 |
192.168.40.132 | node3 | centos7.9 | k8snode3 | 4 | 8 |
k8s集群操作请参考《K8s安装部署(v1.28)--超详细(cri-docker作为运行时)-CSDN博客》
1.2 nfs服务器器
ip | 角色 | 系统 | 主机名 | cpu | mem | 用图 |
192.168.40.129 | master | centos7.9 | k8smaster | 4 | 8 | k8s主服务器 兼 nfs服务器 |
192.168.40.130 | node1 | centos7.9 | k8snode1 | 4 | 8 | k8s的工作节点 需要装nfs软件 |
192.168.40.131 | node2 | centos7.9 | k8snode2 | 4 | 8 | k8s的工作节点 需要装nfs软件 |
192.168.40.132 | node3 | centos7.9 | k8snode3 | 4 | 8 | k8s的工作节点 需要装nfs软件 |
二,安装nfs服务
2.1 安装(所有节点)
因为需要在三个工作节点上连接nfs,所以工作节点上也要安装
yum install -y nfs-utils
2.2 暴露nfs目录(只暴露nfs主服务器)
要安装四台mysql(一主三从),所以我们要创建四个目录用于这四台服务器。
直接在nfs服务器(k8s-master:192.168.40.129)当中创建这三个目录并写入 /etc/exports 文件夹中(创建的目录可以修改):
mkdir -p /data/nfs/{mysql-master,mysql-slaver-01,mysql-slaver-02,mysql-slaver-03}
cat >> /etc/exports << EOF
/data/nfs/mysql-master *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-01 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-02 *(rw,sync,no_root_squash)
/data/nfs/mysql-slaver-03 *(rw,sync,no_root_squash)
EOF
如果目录不为空,需要清空
rm -rf /data/nfs/mysql-master/*
rm -rf /data/nfs/mysql-slaver-01/*
rm -rf /data/nfs/mysql-slaver-02/*
rm -rf /data/nfs/mysql-slaver-03/*
2.3 开启nfs服务器
直接在主服务器(192.168.40.129)上启动nfs服务器。
systemctl enable --now nfs-server
2.4 测试nfs服务
我们可以通过这行命令来检查目录是否暴露成功: 注意修改为自己的nfs服务器地址
showmount -e 192.168.40.129
三,搭建MySql集群
3.1 创建命名空间
创建一个命名空间来部署MySQL集群,当然你也可以使用默认的Default命名空间。这里就用 mysql-cluster 命名空间来搭建集群了,首先我们将这个命名空间创建出来:
创建yaml
kubectl create namespace mysql-cluster --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:creationTimestamp: nullname: mysql-cluster
spec: {}
status: {}
将上面内容 保存到mysql-ns.yaml中
执行命令
kubectl apply -f mysql-ns.yaml
查看名称空间
kubectl get ns
3.2 创建MySQL密码的Secret
创建一个存储了MySQL密码的Secret,直接使用这行命令生成这个Secret的资源清单文件:
注意修改root的密码和命名空间,我的root密码设置为的是123456
kubectl create secret generic mysql-password --namespace=mysql-cluster --from-literal=mysql_root_password=123456 --dry-run=client -o=yaml
apiVersion: v1
data:mysql_root_password: MTIzNDU2
kind: Secret
metadata:creationTimestamp: nullname: mysql-passwordnamespace: mysql-cluster
将上述yaml内容保存到 mysql-secret.yaml
kubectl apply -f mysql-secret.yaml
查看创建的密码
kubectl get secret -n mysql-cluster
3.3 编写MySQL主节点yaml
3.3.1 创建pv和pvc
我们之前安装了nfs,现在我们可以给予那些目录创建pv和pvc, 注意nfs地址和路径
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-master-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:# 注意修改IP地址和暴露的目录(如果不一样)server: 192.168.40.129path: /data/nfs/mysql-masterstorageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-master-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-master-nfs-pv
3.3.2 创建主节点mysql配置文件
我们需要为主节点准备一个 my.cnf 配置文件,文件内容如下:
[mysqld]
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
secure-file-priv = NULL
server-id = 1
log-bin = master-bin
log_bin_index = master-bin.index
binlog_do_db = test_db
binlog_ignore_db = information_schema
binlog_ignore_db = mysql
binlog_ignore_db = performance_schema
binlog_ignore_db = sys
binlog-format = ROW[client]
socket = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
有那么几个配置需要注意一下那么几个配置:
- # server id,要注意多个mysql节点唯一
server-id = 1
- # 生成的logbin的文件名
log-bin = master-bin
log_bin_index = master-bin.index
- # 同步哪个数据库,这里我们为了测试之同步test_db这个数据库
binlog_do_db = test_db
- # 排除哪个数据库,可以写多行,排除的数据库不会被主从同步,这里写上mysql自带的几个数据库
binlog_ignore_db = information_schema
... # 还有几行省略
- # binlog的格式
binlog-format = ROW
创建一个ConfigMap来存储这个配置文件。可以使用以下配置生成yaml资源清单文件内容:
kubectl create configmap mysql-master-cm -n mysql-cluster --from-file=mysql.cnf --dry-run=client -o yaml
apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir = /var/lib/mysqlsocket = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file = /var/run/mysqld/mysqld.piduser = mysqlsecure-file-priv = NULLserver-id = 1log-bin = master-binlog_bin_index = master-bin.indexbinlog_do_db = test_dbbinlog_ignore_db = information_schemabinlog_ignore_db = mysqlbinlog_ignore_db = performance_schemabinlog_ignore_db = sysbinlog-format = ROW[client]socket = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-master-cmnamespace: mysql-cluster
3.3.3 创建主节点服务Service
apiVersion: v1
kind: Service
metadata:name: mysql-master-svcnamespace: mysql-clusterlabels:app: mysql-master
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30306selector:app: mysql-mastertype: NodePortsessionAffinity: ClientIP
注意端口设置
3.3.4 创建主节点的StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-masternamespace: mysql-cluster
spec:selector:matchLabels:app: mysql-masterserviceName: "mysql-master-svc"replicas: 1template:metadata:labels:app: mysql-masterspec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-master-nfs-pvc- name: mysql-confconfigMap:name: mysql-master-cmitems:- key: my.cnfmode: 0644path: my.cnf
注意mysql的镜像,可以找其他可用镜像替换。
3.3.5 完整的主节点配置yaml
一个完整的主节点yaml 包含PersistentVolume,PersistentVolumeClaim,ConfigMap,Service,StatefulSet 如下:
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-master-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:# 注意修改IP地址和暴露的目录(如果不一样)server: 192.168.40.129path: /data/nfs/mysql-masterstorageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-master-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-master-nfs-pv---
apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir = /var/lib/mysqlsocket = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file = /var/run/mysqld/mysqld.piduser = mysqlsecure-file-priv = NULLserver-id = 1log-bin = master-binlog_bin_index = master-bin.indexbinlog_do_db = test_dbbinlog_ignore_db = information_schemabinlog_ignore_db = mysqlbinlog_ignore_db = performance_schemabinlog_ignore_db = sysbinlog-format = ROW[client]socket = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-master-cmnamespace: mysql-cluster---apiVersion: v1
kind: Service
metadata:name: mysql-master-svcnamespace: mysql-clusterlabels:app: mysql-master
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30306selector:app: mysql-mastertype: NodePortsessionAffinity: ClientIP---apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-masternamespace: mysql-cluster
spec:selector:matchLabels:app: mysql-masterserviceName: "mysql-master-svc"replicas: 1template:metadata:labels:app: mysql-masterspec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-master-nfs-pvc- name: mysql-confconfigMap:name: mysql-master-cmitems:- key: my.cnfmode: 0644path: my.cnf
将上面的yaml 保存到 mysql-master.yaml 中,为后续部署准备
3.4 编写MySQL从节点yaml
有了上面主节点的配置的yaml文件,我们可以根据它适当改下配置,作为从节点配置yaml
3.4.1 从节点共用Service配置
从节点我共用个service,保存到 mysql-slave-service.yaml ,配置如下
apiVersion: v1
kind: Service
metadata:name: mysql-slave-svcnamespace: mysql-clusterlabels:app: mysql-slave
spec:ports:- port: 3306name: mysqltargetPort: 3306nodePort: 30308selector:app: mysql-slavetype: NodePortsessionAffinity: ClientIP
3.4.2 从节点yaml配置
我们还是需要 PersistentVolume,PersistentVolumeClaim,ConfigMap,StatefulSet,只是已经把Service 独立成共用的了。无需在做配置
3.4.2.1 配置ConfigMap
从节点的ConfigMap稍微不一样
我们先编写my.cnf 如下
[mysqld]
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock
secure-file-priv = /var/lib/mysql-files
pid-file = /var/run/mysqld/mysqld.pid
user = mysql
secure-file-priv = NULL
server-id = 2
log-bin = slave-bin
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index[client]
socket = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
几个配置需要注意一下
- # server id,注意不同节点要不一样
server-id = 3
- # 从节点的logbin文件
log-bin = slave-bin
relay-log = slave-relay-bin
relay-log-index = slave-relay-bin.index
还是用 生成yaml配置文件的方式 执行下
kubectl create configmap mysql-slave-02-cm -n mysql-cluster --from-file=my.cnf --dry-run=client -o yaml
apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir = /var/lib/mysqlsocket = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file = /var/run/mysqld/mysqld.piduser = mysqlsecure-file-priv = NULLserver-id = 2log-bin = slave-binrelay-log = slave-relay-binrelay-log-index = slave-relay-bin.index[client]socket = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-slave-01-cmnamespace: mysql-cluster
3.4.2.2 从节点的完整yaml
从节点的完整yaml配置如下
apiVersion: v1
kind: PersistentVolume
metadata:name: mysql-slave-01-nfs-pvnamespace: mysql-cluster
spec:capacity:storage: 1GiaccessModes:- ReadWriteManynfs:server: 192.168.40.129path: /data/nfs/mysql-slaver-01storageClassName: "nfs"---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: mysql-slave-01-nfs-pvcnamespace: mysql-cluster
spec:accessModes:- ReadWriteManystorageClassName: "nfs"resources:requests:storage: 1GivolumeName: mysql-slave-01-nfs-pv---
apiVersion: v1
data:my.cnf: |[mysqld]skip-host-cacheskip-name-resolvedatadir = /var/lib/mysqlsocket = /var/run/mysqld/mysqld.socksecure-file-priv = /var/lib/mysql-filespid-file = /var/run/mysqld/mysqld.piduser = mysqlsecure-file-priv = NULLserver-id = 2log-bin = slave-binrelay-log = slave-relay-binrelay-log-index = slave-relay-bin.index[client]socket = /var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
kind: ConfigMap
metadata:name: mysql-slave-01-cmnamespace: mysql-cluster---apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql-slave-01namespace: mysql-cluster
spec:selector:matchLabels:app: mysql-slaveserviceName: "mysql-slave-svc"replicas: 1template:metadata:labels:app: mysql-slavespec:terminationGracePeriodSeconds: 10containers:- args:- --character-set-server=utf8mb4- --collation-server=utf8mb4_unicode_ci- --lower_case_table_names=1- --default-time_zone=+8:00name: mysql# image: docker.io/library/mysql:8.0.34image: registry.cn-shenzhen.aliyuncs.com/xiaohh-docker/mysql:8.0.34ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-confmountPath: /etc/my.cnfreadOnly: truesubPath: my.cnfenv:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:key: mysql_root_passwordname: mysql-passwordvolumes:- name: mysql-datapersistentVolumeClaim:claimName: mysql-slave-01-nfs-pvc- name: mysql-confconfigMap:name: mysql-slave-01-cmitems:- key: my.cnfmode: 0644path: my.cnf
注意:
- PersistentVolume 中的nfs地址、路径,以及pv名称
- PersistentVolumeClaim 中pv的名称要对应
- ConfigMap 中的server-id 不能一样
- StatefulSet 对应名称要一致
保存在 mysql-slave-01.yaml
3.4.2.3 复制从节点的配置
复制 mysql-slave-01.yaml 两份 分别为 mysql-slave-02.yaml 和mysql-slave-03.yaml ,改上述对应的位置的配置 (基本都是改1为2、3,或者改01为02、03)
cp mysql-slave-01.yaml mysql-slave-02.yaml
cp mysql-slave-01.yaml mysql-slave-03.yaml
以上是所有的yaml配置,如下图
3.5 启动集群服务
3.5.1 启动
kubectl apply -f .
3.5.2 k8s查看所有集群信息
kubectl get all -n mysql-cluster -o wide
3.5.3 进入主节点查看状态
kubectl exec -itn mysql-cluster pod/mysql-master-0 -- mysql -uroot -p
输入的密码123456(根据自己的配置改)
查看状态命令
show master status
还需要注意 File 的名称 master-bin.000003 ,Position 157,这个我们将在从节点加入集群时用到
这里面我们先 编写加入集群的命令,如下(暂时不执行)
change master to master_host='mysql-master-0.mysql-master-svc.mysql-cluster.svc.cluster.local', master_port=3306, master_user='root', master_password='123456', master_log_file='master-bin.000003', master_log_pos=157, master_connect_retry=30, get_master_public_key=1;
需要注意下面的几个参数:
- master_host: 这个参数是master的地址,kubernetes提供的解析规则是 pod名称.service名称.命名空间.svc.cluster.local ,所以我们master的mysql地址是 deploy-mysql-master-0.deploy-mysql-master-svc.deploy-test.svc.cluster.local
- master_port: 主节点的mysql端口,我们没改默认是3306
- master_user: 登录到主节点的mysql用户 master_password: 登录到主节点要用到的密码
- master_log_file: 我们之前查看mysql主节点状态时候的 File 字段
- master_log_pos: 我们之前查看mysql主节点状态时候的
- Position 字段 master_connect_retry: 主节点重连时间
- get_master_public_key: 连接主mysql的公钥获取方式 根据上面参数,
如果要修改那么请按照自己的环境进行修改。
3.5.4 进入从节点 加入集群
kubectl exec -itn mysql-cluster pod/mysql-slave-01-0 -- mysql -uroot -p
输入密码
输入我们上面已经备好的脚本
change master to master_host='mysql-master-0.mysql-master-svc.mysql-cluster.svc.cluster.local', master_port=3306, master_user='root', master_password='123456', master_log_file='master-bin.000003', master_log_pos=157, master_connect_retry=30, get_master_public_key=1;
启动从节点集群
start slave;
查看从节点的集群状态
show slave status\G
其他02,03两个节点也是一样
kubectl exec -itn mysql-cluster pod/mysql-slave-02-0 -- mysql -uroot -p
kubectl exec -itn mysql-cluster pod/mysql-slave-03-0 -- mysql -uroot -p
3.5.5 查看各个节点启动状态
3.5.5.1 根据nfs的目录文件判定
主节点
ll /data/nfs/mysql-master/
从节点01
从节点02
从节点03
3.5.5.2 使用管理工具登录
输入我们的服务器地址、端口、用户名、密码,检查各个节点是否都能登录
四,测试主从集群
4.1 进入主节点 建库、建表、插入数据
kubectl exec -itn mysql-cluster pod/mysql-master-0 -- mysql -uroot -p
建库、建表、插入数据 脚本如下
CREATE DATABASE `test_db`;
USE `test_db`;CREATE TABLE `user` (`user_id` BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT COMMENT '用户id',`username` VARCHAR(50) NOT NULL COMMENT '用户名',`age` TINYINT UNSIGNED DEFAULT 18 COMMENT '年龄',`gender` TINYINT UNSIGNED DEFAULT 2 COMMENT '性别;0=男,1=女,2=未知'
) COMMENT '用户表';INSERT INTO `user` (`username`, `age`, `gender`) VALUES ('oopxiajun', '18', '0');
4.2 在从库查看是否同步
4.2.1 使用工具
我们直接刷新从库看下
所有都刷新下看下
4.2.2 进入节点查看
kubectl exec -itn mysql-cluster pod/mysql-slave-01-0 -- mysql -uroot -p
查看库
show databases;
查看表
use test_db;
show tables;
查看数据
select * from user;
结果如下
我们看到库、表、数据都是同步了的。
五,总结
5.1 为什么需要Mysql的主从复制
对于构建基于MySQL的大规模、高性能应用来讲,需要使用水平扩展(集群)
的数据库架构方式。在MySQL内建的复制功能
可以实现,通过为服务器配置一个或多个备库的方式来进行数据同步。
同时复制功能
不仅有利于构建高性能的应用,也是高可用性、可扩展性、容灾、备份以及数据仓库
等工作的基础。
复制
的基本原理是让一台服务器的数据与其他服务器保持同步
。一台主库的数据可以同步到多台备库上,备库本身也可以被配置成另外一台服务器的主库。主库和备库之间可以有多种不同的组合方式。
5.2 主从同步原理
MySQL实际上是如何复制数据的。总的来说,复制有三个步骤:
- 在主库上开启记录二进制日志。在每次准备提交事务完成数据更新前,主库将数据更新的事件记录到二进制日志中。MySQL会按事务提交的顺序而非每条语句的执行顺序来记录二进制日志。在记录二进制日志后,主库会告诉存储引擎可以提交事务了。
- 备库将主库的二进制日志复制到其本地的中继日志中。首先,备库会启动一个工作线程,称为I/O线程,I/O线程跟主库建立一个普通的客户端连接,然后在主库上启动一个特殊的二进制转储(binlog dump)线程(该线程没有对应的SQL命令),这个二进制转储线程会读取主库上二进制日志中的事件。它不会对事件进行轮询。如果该线程追赶上了主库,它将进入睡眠状态,直到主库发送信号量通知其有新的事件产生时才会被唤醒,备库I/0线程会将接收到的事件记录到中继日志中。
- 备库的SQL线程执行最后一步,该线程从中继日志中读取事件并在备库执行,从而实现备库数据的更新。当SQL线程追赶上I/O线程时,中继日志通常已经在系统缓存中,所以中继日志的开销很低。SQL线程执行的事件也可以通过配置选项来决定是否写入其自己的二进制日志中,它对于我们稍后提到的场景非常有用。
在这个过程中,涉及两个角色:
- Master角色 启用 binlog 日志:开启 binlog 日志,记录所有除查询以外的 SQL 命令
- Slave角色: Slave_IO: 复制 master 主机 binlog 日志文件里的 SQL 命令到本机的 relay-log(中继日志) 文件里。从服务器上的 I/O thread(读写线程) 负责读取主服务器 binlog 日志中的 SQL 命令,并将其写入到 Relay log(中继日志中); Slave_SQL: 执行本机 relay-log(中继日志) 文件里的 SQL 语句,实现与 Master 数据一致。从服务器中的 SQL thread(SQL 线程)读取中继日志中的 SQL 命令,并将其写入到 Slave 的数据库中;
5.3 主从同步结构模式
主从的复制的结果模式设置需要注意几点:
- 一个MySQL备库实例只能有一个主库。
- 每个备库必须有一个唯一的服务器ID。
- 一个主库可以有多个备库(或者相应的,一个备库可以有多个兄弟备库)。
- 如果打开了log_slave_updates选项,一个备库可以把其主库上的数据变化传播到其他备库。
5.4 常见的结构模式
- 单向复制:一主一从
- 一主多从:从 <—— 主 ——> 从,即一个主节点,多个从节点(我们本章实现)
- 链式复制:主 <—— 从<—— 从:即链式复制,第一个主节点,最后一个为从节点,中间的为主从节点
- 互为主从:主 <——> 主:也叫双主复制或者双向复制。需要解决冲突问题。
相关文章:
k8s搭建一主三从的mysql8集群---无坑
一,环境准备 1.1 k8s集群服务器 ip角色系统主机名cpumem192.168.40.129mastercentos7.9k8smaster48192.168.40.130node1centos7.9k8snode148192.168.40.131node2centos7.9k8snode248192.168.40.132node3centos7.9k8snode348 k8s集群操作请参考《K8s安装部署&…...
Oracle架构之物理存储中各种文件详解
文章目录 1 物理存储1.1 简介1.2 数据文件(data files)1.2.1 定义1.2.2 分类1.2.2.1 系统数据文件1.2.2.2 撤销数据文件1.2.2.3 用户数据文件1.2.2.4 临时数据文件 1.3 控制文件(Control files)1.3.1 定义1.3.2 查看控制文件1.3.3…...
AR 领域的突破——微型化显示屏为主流 AR 眼镜铺平道路
概述 多年来,增强现实 (AR) 技术一直吸引着人们的想象力,有望将数字信息与我们的物理世界无缝融合。通过将计算机生成的图像叠加到现实世界的视图上,AR 有可能彻底改变我们与环境的互动方式。从增强游戏体验到协助手术室的外科医生ÿ…...
Web安全 - 构建全面的业务安全保护防御体系
文章目录 业务安全概述业务安全 vs. 基础安全业务安全的防护业务安全的防护策略1. 用户资源对抗的技术实现与优化2. IP资源对抗的技术实现与优化3. 设备资源对抗的技术实现与优化4. 操作资源对抗的技术实现与优化实际应用场景中的策略 典型场景业务场景 1:新用户注册…...
机器学习(2):机器学习的相关术语
场景示例: 你周日约了小李、老王打牌,小李先来了,老王没来。你想打电话叫老王过来。小李说:“你别打电话啦,昨天老王喜欢的球队皇马输球了,他的项目在上个礼拜也没成功上线,再加上他儿子期末考…...
Leecode热题100-75.颜色分类
给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地 对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。 必须在不使用库内置的 sort 函数的情况下解…...
408算法题leetcode--第22天
200. 岛屿数量 200. 岛屿数量时间:O(mn);空间:O(min(m, n)),队列最大入队个数,可以想象从左上到右下,第一次入队1个,第二次出队1,入队2,第三次出队2,入队3……...
dubbo微服务
一.启动nacos和redis 1.虚拟机查看是否开启nacos和redis docker ps2.查看是否安装nacos和redis docker ps -a3.启动nacos和redis docker start nacos docker start redis-6379 docker ps二.创建三个idea的maven项目 1.第一个项目dubboapidemo 2.1.1向pom.xml里添加依赖 …...
如何在 DAX 中计算多个周期的移动平均线
在 DAX 中计算移动聚合很容易。但是,计算一段时间内的移动平均值时会有一些陷阱。由于其中一些陷阱是定义问题,因此我们必须小心,不要选择错误的方法。让我们看看细节。欢迎来到雲闪世界。 添加图片注释,不超过 140 字(…...
微信小程序 图片的上传
错误示范 /*从相册中选择文件 微信小程序*/chooseImage(){wx.chooseMedia({count: 9,mediaType: [image],sourceType: [album],success(res) {wx.request({url:"发送的端口占位符",data:res.tempFiles[0].tempFilePath,method:POST,success(res){//请求成功后应该返…...
软件测试人员发现更多程序bug
软件测试人员发现更多程序bug 1. 理解需求和业务,需求评审时候发现bug 熟悉了产品的业务流程、才能迅速找出软件中存在的一些重要的缺陷,发现的软件缺陷才是有价值的。否则即使你能找到一些软件缺陷,那也是纯软件的缺陷,价值不大…...
Nagle 算法:优化 TCP 网络中小数据包的传输
1. 前言 在网络通信中,TCP(传输控制协议)是最常用的协议之一,广泛应用于各种网络应用,如网页浏览、文件传输和在线游戏等。然而,随着互联网的普及,小数据包的频繁传输成为一个不容忽视的问题。…...
C#入门教程
目录 1.if分支语句 2.面向对象 3.static简单说明 1.if分支语句 我们的这个C#里面的if语句以及这个if-else语句和C语言里面没有区别,就是打这个输出上面的方式不一样,c#里面使用的是这个console.writeline这个指令,其他的这个判断逻辑都是一…...
【MySQL报错】---Data truncated for column ‘age‘ at row...
目录 一、前言二、问题分析三、解决办法 一、前言 欢迎大家来到权权的博客~欢迎大家对我的博客进行指导,有什么不对的地方,我会及时改进哦~ 博客主页链接点这里–>:权权的博客主页链接 二、问题分析 问题一修改表结构 XXX 为 not n…...
Go基础学习08-并发安全型类型-通道(chan)深入研究
文章目录 chan基础使用和理解通道模型:单通道、双通道双向通道单向通道单向通道的作用 缓冲通道和非缓冲通道数据发送和接收过程缓冲通道非缓冲通道 通道基本特性通道何时触发panicChannel和Select结合使用Select语句和通道的关系Select语句的分支选择规则有那些Sel…...
some 蓝桥杯题
12.反异或01串 - 蓝桥云课 (lanqiao.cn) #include "bits/stdc.h" #define int long long using namespace std; char c[10000000]; char s[10000000]; int cnt,Ans,mr,mid; int maxi; int p[10000000],pre[10000000]; signed main() {ios::sync_with_stdio(0);cin.t…...
[linux 驱动]input输入子系统详解与实战
目录 1 描述 2 结构体 2.1 input_class 2.2 input_dev 2.4 input_event 2.4 input_dev_type 3 input接口 3.1 input_allocate_device 3.2 input_free_device 3.3 input_register_device 3.4 input_unregister_device 3.5 input_event 3.6 input_sync 3.7 input_se…...
2023_Spark_实验十:Centos_Spark Local模式部署
参考这篇博客:【Centos8_配置单节点伪分布式Spark环境】_centos8伪分布式环境搭建-CSDN博客...
pyecharts-快速入门
pyecharts文档:渲染图表 - pyecharts - A Python Echarts Plotting Library built with love. pyecharts-gallery文档:中文简介 - Document (pyecharts.org) 一、快速入门案例 from pyecharts.charts import Barbar Bar() bar.add_xaxis(["衬衫…...
vue3打包疯狂报错
打包的时候报错很多Cannot find name ‘xxx‘ 。 但是npm run dev 是运行正常的。 解决方法:package.json中的vue-tsc --noEmit 删掉就可以了。 例如: 这是原来的 {"scripts": {"dev": "vite","build": &quo…...
STM32 软件触发ADC采集
0.91寸OLED屏幕大小的音频频谱,炫酷! STM32另一个很少人知道的的功能——时钟监测 晶振与软件的关系(深度理解) STM32单片机一种另类的IO初始化方法 ADC是一个十分重要的功能,几乎任何一款单片机都会包含这个功能&a…...
Android SystemUI组件(08)睡眠灭屏 锁屏处理流程
该系列文章总纲链接:专题分纲目录 Android SystemUI组件 本章关键点总结 & 说明: 说明:本章节持续迭代之前章节的思维导图,主要关注左侧上方锁屏分析部分 睡眠灭屏 即可。 Power按键的处理逻辑最终是由PhoneWindowManager来完…...
C# 表达式与运算符
本课要点: 1、表达式的基本概念 2、常用的几种运算符 3、运算符的优先级 4、常见问题 一 表达式 表达式是由运算符和操作数组成的。、-、*和/等都是运算符,操作数包括文本、常量、变量和表达式等。 二 算术运算符 2.1 算术运算符的使用 三 常见错误 …...
SpringBoot--最大连接数和最大并发数
原文网址:SpringBoot--最大连接数和最大并发数-CSDN博客 简介 本文介绍SpringBoot的最大连接数和最大并发数。 配置 SpringBoot默认使用tomcat处理请求。tomcat可以指定连接数、线程数等配置。 server:tomcat:# 请求处理线程都在使用中时,新连接请求…...
CF687D Dividing Kingdom II 题解
Description 给定一个 n n n 个点、 m m m 条边的图,有 q q q 次询问,每次询问一个 [ l , r ] [l,r] [l,r] 的区间,求将 n n n 个点分为两个部分后,编号在 [ l , r ] [l,r] [l,r] 内的边中,两端点属于同一部分的…...
高空抛物AI检测算法:精准防控,技术革新守护城市安全
近年来,随着城市化进程的加速,高楼大厦如雨后春笋般涌现,但随之而来的高空抛物问题却成为城市管理的一大难题。高空抛物不仅严重威胁行人的安全,还可能引发法律纠纷和社会问题。为了有效预防和减少高空抛物事件的发生,…...
html+css+js实现Collapse 折叠面板
实现效果: HTML部分 <div class"collapse"><ul><li><div class"header"><h4>一致性 Consistency</h4><span class"iconfont icon-jiantou"></span></div><div class"…...
RM服务器研究(一)
客户端默认端口是10100: MultiPort.dll BOOL sub_10001070() { UINT v0; // esi BOOL result; // eax CHAR KeyName; // [espCh] [ebp-10Ch] DWORD flOldProtect; // [esp10h] [ebp-108h] CHAR Buffer; // [esp14h] [ebp-104h] char v5; // [esp15h] [e…...
云岚到家xxl job 配置
调度中心: 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码; 主要职责为执行器管理、任务管理、监控运维、日志管理等 任务执行器: 负责接收调度请求并执行任务逻辑; 主要职责是执行任…...
国内动态短效sk5
HTTP爬虫代理,软件测试, 动态转发IP方案,全高匿名,私密IP,固定网关将您每次请求的HTTP重定向到不同的后端IP,支持API;指路小熊IP https://www.xiaoxiongip.com?fromqkJWgD可测...
软件开发用到的软件/企业seo优化服务
Linux:ab 发送 POST、PUT 请求 ab 可以发送 GET、HEAD、POST、PUT 请求,但是不支持模拟 DELETE 等 Method 的请求。 https://stackoverflow.com/questions/10601821/apache-bench-how-to-force-put-delete-and-post-method From the manual page: -i Do…...
做网站手机端如何更新/快速网站seo效果
链接:https://www.nowcoder.com/acm/contest/135/B 来源:牛客网 题目描述 已知与均为实数,且满足: 给定A,B,求x的取值范围? 由于Apojacsleam的计算几何往往被精度卡飞,所以他痛恨精度错误&…...
万网速成网站/上海关键词推广公司
我有一个定时器运行,然后熄灭,并做了一些事情,定时器启动罚款。Android定时器崩溃取消然后我想要做的是点击一个按钮,然后创建一个电子邮件。除了在计时器运行时单击该按钮之外,一切正常,应用程序崩溃。当按…...
德州市住房和城乡建设部网站/百度上搜索关键词如何在首页
做网站肯定会要求实现这样的需要,相信对绝大部分程序员同行来说都很easy。其实只要我们对ASP.NET的内置对象的生命周期了解的话,很容易想到解决的办法。 在项目的根目录下新建global.asax文件,下面是我当年所写的代码: 代码 1 voi…...
做企业网站的步骤/a5站长网网站交易
最近新换了VS2008开发环境,在进行.NET CF 3.5下的WM Socket编程时 Bitmap bmp new Bitmap(Stream)处出现未处理异常 转载于:https://www.cnblogs.com/fsyiyun/archive/2011/03/30/1999672.html...
微信聊天记录删除了怎么恢复/手机关键词排名优化
字典对象的核心是散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每个单元叫做 bucket。每个 bucket 有两部分:一个是键对象的引用,一个是值对象的引用。 由于,所有 bucket 结构和大小一致&…...