当前位置: 首页 > news >正文

Ansible Playbook快速部署一主多从MySQL集群

部署目标:

1、快速部署一套一主两从的mysql集群

2、部署过程中支持交互式定义安装目录及监听端口号

部署清单目录结构:

root@master:/opt/mysql# tree .
.
├── group_vars
│   └── all.yml
├── hosts
├── mysql.yml
└── roles└── mysql├── files│   └── mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz├── tasks│   └── main.yml└── templates├── my.cnf.j2└── mysqld.service.j26 directories, 7 files

主机清单:

定义了需要部署mysql的主机组、IP及设定mysql主机角色

# 主机清单
root@master:/opt/mysql# cat hosts 
[mysql]
192.168.16.140 slave=true
192.168.16.150 slave=true
192.168.16.129 master=true
  • 声明变量:

声明变量的好处在于用户可以按需改这一个文件,而不需要挨个儿修改部署清单,同时可以在交互式中进行个性化安装设置。

# 声明变量
root@master:/opt/mysql# cat group_vars/all.yml 
mysql_pkg: mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz
mysql_version: mysql-5.7.33-linux-glibc2.12-x86_64
mysql_install_path: /opt/soft
mysql_link: mysql
mysql_sock: /tmp/mysql.sock
mysql_port: 3306
mysql_root_passwd: Root_123^
repl_user: repl
repl_passwd: Repl_123^
user: mysql
group: mysql
master_ip: 192.168.16.129 
  • 交互式配置文件:
root@master:/opt/mysql# cat mysql.yml 
---
- hosts: mysqlgather_facts: falsevars_prompt:- name: mysql_install_pathprompt: 请输入mysql安装目录default: "/opt/soft"private: no- name: mysql_portprompt: 请输入mysql服务的端口default: 3306private: no- name: mysql_sockprompt: 请输入mysql服务的socket文件default: "/tmp/mysql.sock"private: no- name: mysql_root_passwdprompt: 请输入mysql的root密码default: Root_123^ private: yes- name: repl_userprompt: 请输入复制用户名default: replprivate: no- name: repl_passwdprompt: 请输入复制用户密码default: Repl_123^private: yes- name: userprompt: 请输入mysql服务的启动用户default: mysqlprivate: noroles:- mysql

部署清单:

其实就是把手动部署MySQL集群的步骤通过Ansible的相关模块、playbook语法及条件判断进行组合,继而实现自动化部署的过程。原理很简单,但是其中涉及的关于操作MySQL的模块需要着重研究,还有关于template模板的用法也非常重要,在通过Ansible playbook部署一些更复杂的系统时,经常会用到使用template模板语法渲染不同的配置,实现更为复杂系统的部署。比如通过Ansible playbook离线部署Kubernetes集群。

---
- name: "1、创建{{ user }}用户"user:name: "{{ user }}"shell: /bin/bash- name: "2、创建安装目录"file:path: "{{ mysql_install_path }}"state: directoryowner: "{{ user }}"group: "{{ group }}"recurse: yes- name:  "3、解压mysql二进制包"unarchive:src:  "{{ mysql_pkg }}"dest: "{{ mysql_install_path }}"owner: "{{ user }}"group: "{{ group }}"- name: "4、创建数据目录"file:path: "{{ item }}"state: directoryowner: "{{ user }}"group: "{{ group }}"recurse: yeswith_items:- "{{ mysql_install_path }}/{{ mysql_version }}/data"- "{{ mysql_install_path }}/{{ mysql_version }}/undolog"- name: "5、修改权限"command: chown -R "{{ user }}:{{ group }}" "{{ mysql_install_path }}"- name: "6、创建链接文件"file:src: "{{ mysql_install_path }}/{{ mysql_version }}"dest: "{{ mysql_install_path }}/{{ mysql_link }}"owner: "{{ user }}"group: "{{ group }}"state: link- name: "7、生成配置文件"template:src: my.cnf.j2dest: /etc/my.cnf- name: "8、数据库初始化"shell: ./mysqld --initialize --user={{ user }} --basedir={{ mysql_install_path }}/{{ mysql_link }} --datadir={{ mysql_install_path }}/{{ mysql_link }}/dataargs:chdir: "{{ mysql_install_path }}/{{ mysql_link }}/bin"- name: "9、注册初始密码"shell: cat error.log |grep localhost|grep "temporary password"|awk '{print $NF}'register: mysql_init_passwdargs:  chdir: "{{ mysql_install_path }}/{{ mysql_link }}/data"- name: "10、打印初始密码"debug: msg: "{{ mysql_init_passwd.stdout }}"- name: "11、配置systemd守护进程"template:src: mysqld.service.j2dest: /usr/lib/systemd/system/mysqld.service- name: "12、启动mysqld服务"systemd:name: mysqldstate: starteddaemon_reload: yesenabled: yes- name: "13、修改初始密码"shell: ./mysqladmin -u root -p"{{ mysql_init_passwd.stdout }}" password "{{ mysql_root_passwd }}"args:chdir: "{{ mysql_install_path }}/{{ mysql_link }}/bin"- name: "14、创建{{ repl_user }}同步用户"mysql_user: login_host: localhostlogin_port: "{{ mysql_port }}"login_user: rootlogin_unix_socket: "{{ mysql_sock }}" login_password: "{{ mysql_root_passwd }}"name: "{{ repl_user }}"password: "{{ repl_passwd }}"priv: "*.*:ALL"state: present host: "%"when: master is defined- name: "15、从库配置从主库同步"mysql_replication:login_unix_socket: "{{ mysql_sock }}"login_host: localhostlogin_port: "{{ mysql_port }}"login_user: root     login_password: "{{ mysql_root_passwd }}"master_host: "{{ master_ip }}" master_user: "{{ repl_user }}" master_password: "{{ repl_passwd }}"master_port: "{{ mysql_port }}"master_auto_position: 1mode: changemasterwhen: slave is defined- name: "16、Start Slave"mysql_replication: login_unix_socket: "{{ mysql_sock }}"login_user: root login_host: localhostlogin_port: "{{ mysql_port }}"login_password: "{{ mysql_root_passwd }}"mode: startslavewhen: slave is defined- name: "17、注册复制状态"mysql_replication:login_host: localhostlogin_user: rootlogin_port: "{{ mysql_port }}"login_password: "{{ mysql_root_passwd }}"login_unix_socket: "{{ mysql_sock }}"mode: getslavewhen: slave is definedregister: info- name: "18、打印复制状态信息"debug:msg: "Slave_IO_Running={{ info.Slave_IO_Running }}       Slave_SQL_Running={{ info.Slave_SQL_Running }}"when: slave is defined

MySQL配置文件:

MySQL配置文件中的系统参数可以根据实际按需修改,以下配置只供参考,着重看一下文件中有标注的地方。

root@master:/opt/mysql# cat roles/mysql/templates/my.cnf.j2
[client]
port = {{ mysql_port }}
socket = {{ mysql_sock }}
default-character-set=utf8mb4[mysqldump]
single-transaction[mysqld]
port = {{ mysql_port }}
socket = {{ mysql_sock }}
character-set-server=utf8mb4
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
log_bin_trust_function_creators=1
innodb_flush_log_at_trx_commit=1
sync_binlog=1gtid-mode = on
enforce_gtid_consistency
log-bin = on
log-slave-updates = on#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=1000
#rpl_semi_sync_slave_enabled=1master_info_repository = TABLE
relay_log_info_repository = TABLEreplicate-ignore-table=mysql.failover_consoledatadir={{ mysql_install_path }}/{{ mysql_link }}/data# 设置主节点server-id=1,模式为读写;从节点server-id=2,模式为只读
{% if master is defined %}
server-id=1
#read-only=0                             
{% else %}
server-id=2
#read-only=1
{% endif %}#relay_log_purge=0
log_timestamps=SYSTEM
lower_case_table_names=1
log_slave_updates=onskip-name-resolve
#skip-networking
back_log = 600slave_parallel_workers = 16
slave-parallel-type = LOGICAL_CLOCK
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
slave_preserve_commit_order = 1innodb_undo_directory={{ mysql_install_path }}/{{ mysql_link }}/undolog
innodb_undo_tablespaces=4
innodb_undo_logs=128
innodb_max_undo_log_size=512M
innodb_purge_rseg_truncate_frequency
innodb_undo_log_truncate=1max_connections = 4000
max_connect_errors = 6000
open_files_limit = 1024
table_open_cache = 4096
table_open_cache_instances = 64
max_allowed_packet = 128M
binlog_cache_size = 32M
max_heap_table_size = 128M
tmp_table_size = 32M
read_buffer_size = 8M  
read_rnd_buffer_size = 8M  
sort_buffer_size = 8M  
join_buffer_size = 8M  
key_buffer_size = 8M  
thread_cache_size = 64
query_cache_type = 0
query_cache_size = 0
#query_cache_size = 16M  
#query_cache_limit = 8M
ft_min_word_len = 4
log_bin = mysql-bin
binlog_format = row
expire_logs_days = 15
log_error ={{ mysql_install_path }}/{{ mysql_link }}/data/error.log
slow_query_log = 1
long_query_time = 3
performance_schema = 0
explicit_defaults_for_timestamp
#lower_case_table_names = 1
skip-external-locking
default_storage_engine = InnoDB
innodb_flush_method = O_DIRECT
innodb_file_per_table = 1
innodb_stats_persistent_sample_pages = 64
innodb_open_files = 10000
innodb_buffer_pool_size = 2G
innodb_write_io_threads = 24
innodb_read_io_threads = 24
innodb_thread_concurrency = 0
innodb_purge_threads = 1
innodb_log_buffer_size = 64M
innodb_sort_buffer_size = 64M
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 75
innodb_lock_wait_timeout = 120
#log_warnings=1
log_error_verbosity=1
#local-infile=0
#connection-control-failed-connections-threshold=10
#connection-control-min-connection-delay=10800
wait_timeout = 3600
interactive_timeout = 3600
innodb_temp_data_file_path = ibtmp1:200M:autoextend:max:5G

部署:

# 部署命令root@master:/opt/mysql# ansible-playbook -i hosts mysql.yml

交互式配置,不输入即保持默认配置,如默认端口为3306,我自定义为33306,部署路径我自定义为/opt/software,其他的保持默认直接按回车

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wRyz2v1a-1691561951824)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYOXmSox8HMOgQicUVgsE8mhBAS7hLk8CGYkFNVKfnYiaaCbReen0zlp9w/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

获取到的初始密码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H4r3p3Dl-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYMIEIuH4FUd1gIxDVtke0E73cNaBpCXfKtW0iaY3ljPqaSp0iceK6icm8A/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

部署完成后的截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nNBzbZPd-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYElAuHj1DE71QOjzLxIibMv4YIbm6LIiaqiadiaNBmMqrRiaE8JThmvt2lew/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

可以看到,一主两从已成功部署完成,获取到的复制状态信息正常。

**验证:

**

  • 登录节点查看状态
# 主节点
root@ubuntu:/opt/software# mysql -u root -pRoot_123^ -e "show master status;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+----------+--------------+------------------+------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000002 |      852 |              |                  | 07c31ccf-208c-11ee-abc5-000c29e5c1ce:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+# 从节点1
root@work-01:/opt/software# mysql -u root -pRoot_123^ -e "show slave status\G;"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.16.129Master_User: replMaster_Port: 33306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 852Relay_Log_File: work-01-relay-bin.000002Relay_Log_Pos: 1065Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: Yes# 从节点2
root@work-02:/opt/software#  mysql -u root -pRoot_123^ -e "show slave status\G;"
mysql: [Warning] Using a password on the command line interface can be insecure.
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.16.129Master_User: replMaster_Port: 33306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 852Relay_Log_File: work-02-relay-bin.000002Relay_Log_Pos: 1065Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: Yes

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5FA5yIX2-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAYBf6Nwuic1uKyHF2Gd31mCX7Vs5EwGNjsjsF0Kfpt4ibFu3Fq04A1HpEQ/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sefepukW-1691561951825)(https://mmbiz.qpic.cn/sz_mmbiz_png/MHMvTZWZSB8eia70OMf87WfLvkgC8wqAY9WPwL0lT4ibnx6Lt61g9UpAeMGKRxQnXdoqbLQABSm3ia0sdRfwESuzA/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1)]

在这里插入图片描述

  • 主节点建库,从节点查看同步正常
# 主节点建库
root@ubuntu:/opt/software# mysql -u root -pRoot_123^ -e "create database db_demo;"
mysql: [Warning] Using a password on the command line interface can be insecure.
# 从节点1查看
root@work-01:/opt/software# mysql -u root -pRoot_123^ -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_demo            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
# 从节点2查看
root@work-02:/opt/software# mysql -u root -pRoot_123^ -e "show databases;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_demo            |
| mysql              |
| performance_schema |
| sys                |
+--------------------+

以上便是这篇文章的全部内容。文章内容仅供参考,如有纰漏,欢迎大家留言指正。

-

相关文章:

Ansible Playbook快速部署一主多从MySQL集群

部署目标: 1、快速部署一套一主两从的mysql集群 2、部署过程中支持交互式定义安装目录及监听端口号 部署清单目录结构: rootmaster:/opt/mysql# tree . . ├── group_vars │ └── all.yml ├── hosts ├── mysql.yml └── roles└── mys…...

27.Netty源码之FastThreadLocal

highlight: arduino-light FastThreadLocal FastThreadLocal 的实现与 ThreadLocal 非常类似,Netty 为 FastThreadLocal 量身打造了 FastThreadLocalThread 和 InternalThreadLocalMap 两个重要的类。下面我们看下这两个类是如何实现的。 FastThreadLocalThread 是对…...

linux下离线安装docker

linux下离线安装docker 一、安装docker Docker 官网离线安装文档 https://docs.docker.com/engine/install/binaries/ 整理步骤如下: 官网下载 docker 安装包,地址为 https://download.docker.com/linux/static/stable/,如果是x86就选择x…...

SQL server 异地备份数据库

异地备份数据库 1.备份服务器中设置共享文件夹 2.源服务器数据库中添加异地备份代理作业 EXEC sp_configure show advanced options, 1;RECONFIGURE; EXEC sp_configure xp_cmdshell, 1;RECONFIGURE; declare machine nvarchar(50) 192.168.11.10 --服务器IP declare pa…...

高并发系统设计要点

在系统设计时,如果能预先看到一些问题,并在设计层面提前解决,就会给后期的开发带来很大的便捷。相反,有缺陷的架构设计可能会导致后期的开发工作十分艰难,甚至会造成“推倒重来”的情形。因此,在系统设计阶…...

Redis 拒绝服务漏洞(CVE-2023-28856)修复处理

一、漏洞描述 Redis Labs Redis是美国Redis Labs公司的一套开源的使用ANSI C编写、支持网络、可基于内存亦可持久化的日志型、键值(Key-Value)存储数据库,并提供多种语言的API。 Redis 7.0.0 到 7.0.10版本、6.2.0 到 6.2.11版本、6.0.0 到 …...

Android保存网页的方法

首先要使用js交互就需要懂原理: 感谢大佬:js中document节点获取页面元素的六种方式 1.querySelector()方法 描述:本方法用于根据给定的选择器选中页面元素 如果有多个元素满足条件,则返回第一个满足条件的元素节点 语法&#xff…...

P2P 网络,PING程序。

没有废话,直接上版本号和代码,以及讲解。 crate版本号libp2p0.52.1tokio1.30.0依赖配置: [dependencies] tokio = { version="1.30.0", features=["full"] } libp2p = { version="0.52.1", features=["tokio","dns", &q…...

OPENCV C++(十二)模板匹配

正常模板匹配函数 matchTemplate(img, templatee, resultMat, 0);//模板匹配 这里0代表的是方法,一般默认为0就ok img是输入图像 templatee是模板 resultmat是输出 1、cv::TM_SQDIFF:该方法使用平方差进行匹配,因此最佳的匹配结果在结果为…...

【配置环境】Linux下安装MySQL

目录 一,环境 二,安装步骤 1.使用包管理器安装MySQL 2.配置MySQL的安全选项 3.设置root用户使用密码进行身份验证(可选) 三,拓展知识 1.如何修改MySQL的密码策略? 一,环境 VMware Workst…...

【100天精通python】Day30:使用python操作数据库_数据库基础入门

专栏导读 专栏订阅地址:https://blog.csdn.net/qq_35831906/category_12375510.html 1 数据库基础知识介绍 1.1 什么是数据库? 数据库是一个结构化存储和组织数据的集合,它可以被有效地访问、管理和更新。数据库的目的是为了提供一种可靠的…...

android 如何分析应用的内存(十八)终章——使用Perfetto查看内存与调用栈之间的泄露

android 如何分析应用的内存(十八) 在前面两篇文章中,先是介绍了如何用AS查看Android的堆内存,然后介绍了使用MAT查看 Android的堆内存。AS能够满足基本的内存分析需求,但是无法进行多个堆的综合比较,因此…...

arcpy实现kml批量转出为shp 包括shp合并

参考文章 arcpy实现 kml批量转出为shp_kml批量合并转shp_A873054267的博客-CSDN博客 参考帮助是arcgis里边自带的KMLToLayer_conversion函数 应用场景: 两步路产生的多个轨迹文件KML,批量转换成arcgis 的gdb数据库 最后合并成一个shp 第一步&#…...

高等数学:泰勒公式

注:第三条 e x e^x ex的展开式,在 1 1 1和 1 2 x 2 \frac{1}{2}x^2 21​x2之间添上一个 x x x。 1 1 − x ∑ n 0 ∞ x n 1 x x 2 x 3 ο ( x 3 ) , x ∈ ( − 1 , 1 ) . \begin{aligned}\frac{1}{1-x}\sum_{n0}^\infty x^n1xx^2x^3\omicron(x^…...

JZ32 从上往下打印二叉树(Java)

题目地址:从上往下打印二叉树_牛客题霸_牛客网 题目回顾: 不分行从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如输入{8,6,10,#,#,2,1},如以下图中的示例二叉树,则依次打印8,6,10,2,1(空节点不打印&…...

hackNos靶机

靶机训练1 - hackNos: Os-hackNos 靶机平台 Vulnhub 是一个提供各种漏洞环境的靶场平台,供安全爱好者学习使用,大部分环境是做好的虚拟机镜像文件,镜像预先设计了多种漏洞,需要使用VMware或者VirtualBox运行。每个镜像会有破解的目…...

取地址及 const取地址操作符重载

取地址及 const取地址操作符重载 #include <iostream> using namespace std;class A { public:A(int year, int month, int day){_year year;_month month;_day day;}//它们是默认成员函数&#xff0c;我们不写编译器会自动生成&#xff0c;自动生成就够用了&#xff…...

【Linux初阶】进程间通信介绍 管道

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【Linux初阶】 ✒️✒️本篇内容&#xff1a;进程间通信介绍&#xff0c;管道概述&#xff0c;匿名管道应用&#xff0c;命名管道应用 &#x1f6a2;&#…...

App 在macOS Catalina下提示已损坏无法打开解决办法:

App 在macOS Catalina下提示已损坏无法打开解决办法&#xff1a; 打开终端&#xff1b; 输入以下命令&#xff0c;回车&#xff1b; sudo xattr -d com.apple.quarantine /Applications/xxxx.app注意&#xff1a;/Applications/xxxx.app 换成你的App路径&#xff08;推荐直接…...

ad+硬件每日学习十个知识点(26)23.8.6 (DCDC的降压电路、升压电路、降压-升压电路,同步整流,选型考虑同步、隔离)

文章目录 1.DCDC的降压原理2.DCDC的升压原理3.DCDC的升压和降压原理4.什么是肖特基二极管造成的死区电压&#xff1f;5.MOS管有死区电压么&#xff1f;6.DCDC的同步整流&#xff08;用MOS管取代整流二极管&#xff0c;避免死区电压的影响&#xff09;7.DCDC选型——同步与非同步…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统&#xff0c;支持多语言对话&#xff08;如 中文&#xff0c;英文&#xff0c;日语&#xff09;&#xff0c;语音情感&#xff08;如 开心&#xff0c;悲伤&#xff09;&#x…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了&#xff0c;要么要会员、要么写的乱七八糟。这里我整理一下&#xff0c;把问题说清楚并且给出代码&#xff0c;拿去用就行&#xff0c;照着葫芦画瓢。 问题 在继承QWebEngineView后&#xff0c;重写mousePressEvent或event函数无法捕获鼠标按下事…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露&#xff0c;数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据&#xff0c;严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能&#xff0c;但SEMR…...

2025年低延迟业务DDoS防护全攻略:高可用架构与实战方案

一、延迟敏感行业面临的DDoS攻击新挑战 2025年&#xff0c;金融交易、实时竞技游戏、工业物联网等低延迟业务成为DDoS攻击的首要目标。攻击呈现三大特征&#xff1a; AI驱动的自适应攻击&#xff1a;攻击流量模拟真实用户行为&#xff0c;差异率低至0.5%&#xff0c;传统规则引…...

ArcGIS Pro+ArcGIS给你的地图加上北回归线!

今天来看ArcGIS Pro和ArcGIS中如何给制作的中国地图或者其他大范围地图加上北回归线。 我们将在ArcGIS Pro和ArcGIS中一同介绍。 1 ArcGIS Pro中设置北回归线 1、在ArcGIS Pro中初步设置好经纬格网等&#xff0c;设置经线、纬线都以10间隔显示。 2、需要插入背会归线&#xf…...

Linux基础开发工具——vim工具

文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...