使用Docker-Compose部署MySQL一主二从同步高可用MHA集群

文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 准备mysql一主二从同步集群
      • 一主二从同步集群规划
      • 需要安装docker和docker-compose
        • 命令形式安装
          • 安装docker
          • 安装docker-compose
        • 宝塔面板形式安装
      • 部署Master节点的docker-compose.yaml文件
      • 部署MySQL从节点1的docker-compose.yml的文件
      • 部署Slave2节点的docker-compose.yaml文件
      • 每个节点都执行启动运行
      • master节点,配置主从同步
      • slave节点1和2,配置主从同步
    • 校验主从同步是否正常
    • 节点互通无密码登录
    • 安装配置MHA
      • 下载安装
      • 配置mha.cnf文件
      • 开始校验
    • 故障备份恢复
  • 📢文章总结
  • 📥博主目标

🔊博主介绍

🌟我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文专业写手、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、🚀徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📕拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。

📙有过从0到1的项目高并发项目开发与管理经验,对JVM调优、MySQL调优、Redis调优 、ElasticSearch调优、消息中间件调优、系统架构调优都有着比较全面的实战经验。

📘有过云端搭建服务器环境,自动化部署CI/CD,弹性伸缩扩容服务器(最高200台),了解过秒级部署(阿里云的ACK和华为云的云容器引擎CCE)流程,能独立开发和部署整个后端服务,有过分库分表的实战经验。

🎥经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧,与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!


文章目录

  • 🔊博主介绍
  • 🥤本文内容
    • 准备mysql一主二从同步集群
      • 一主二从同步集群规划
      • 需要安装docker和docker-compose
        • 命令形式安装
          • 安装docker
          • 安装docker-compose
        • 宝塔面板形式安装
      • 部署Master节点的docker-compose.yaml文件
      • 部署MySQL从节点1的docker-compose.yml的文件
      • 部署Slave2节点的docker-compose.yaml文件
      • 每个节点都执行启动运行
      • master节点,配置主从同步
      • slave节点1和2,配置主从同步
    • 校验主从同步是否正常
    • 节点互通无密码登录
    • 安装配置MHA
      • 下载安装
      • 配置mha.cnf文件
      • 开始校验
    • 故障备份恢复
  • 📢文章总结
  • 📥博主目标

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。

🥤本文内容

CSDN

准备mysql一主二从同步集群

一主二从同步集群规划

mhamanager节点:ip地址:192.168.80.110
master节点:ip地址:192.168.80.111 mysql端口:33061
slave1节点:ip地址:192.168.80.112 mysql端口:33062
slave2节点:ip地址:192.168.80.113 mysql端口:33063
服务器登录的用户名密码都是root用户admin密码
master节点的mysql登录账户是root用户masterroot密码
slave1节点和slave2节点的mysql登录账户是root用户slaveroot密码

需要安装docker和docker-compose

命令形式安装
安装docker
# 更新软件包
sudo yum update -y
# 安装必要依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 添加软件源信息
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 更新 yum 缓存
sudo yum makecache fast
# 安装 Docker
sudo yum install docker-ce docker-ce-cli containerd.io
# 启动 Docker 后台服务
sudo systemctl start docker
# 新建 daemon.json 文件
sudo vim /etc/docker/daemon.json
# 将下面的配置复制进去,然后执行 service docker restart即可:
{"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
# 如果想要用阿里云的docker镜像源,可看这个网址 https://cr.console.aliyun.com/cn-qingdao/mirrors
# 安装好后使用如下命令查看安装的版本,如果正常输出说明安装成功
docker version
安装docker-compose
# 下载docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授权
sudo chmod +x /usr/local/bin/docker-compose
# 安装好后使用如下命令查看安装版本,如果正常输出说明安装成功
docker-compose version
宝塔面板形式安装

执行Centos安装脚本,命令如下:

yum install -y wget && wget -O install.sh https://download.bt.cn/install/install_6.0.sh && sh install.sh ed8484bec

官网地址:https://www.bt.cn/new/download.html

下载完成之后,执行以下命令查看宝塔面板,命令如下:

bt

查看面板地址,命令如下:

14

修改登录面板的密码,命令如下:

5

登录之后需要绑定一个账号,如果绑定不上则执行以下命令:

curl -k -sSO http://101.37.149.22:5880/new/auto_node.sh && bash auto_node.sh

输出结果如下:

[root@mhamanager app1]# curl -k -sSO http://101.37.149.22:5880/new/auto_node.sh && bash auto_node.sh______     _________            _______         _        ____  _____   ________    _____     
|_   _ \   |  _   _  |          |_   __ \       / \      |_   \|_   _| |_   __  |  |_   _|    | |_) |  |_/ | | \_|  ______    | |__) |     / _ \       |   \ | |     | |_ \_|    | |      |  __'.      | |     |______|   |  ___/     / ___ \      | |\ \| |     |  _| _     | |   _  _| |__) |    _| |_              _| |_      _/ /   \ \_   _| |_\   |_   _| |__/ |   _| |__/ | 
|_______/    |_____|            |_____|    |____| |____| |_____|\____| |________|  |________| 自动修复节点中... 
开始测试节点...请勿中断程序... 
hosts指定节点: 103.212.48.148
域名解析节点:  103.212.48.148
节点连接测试正常,修复已完成! 请登录面板查看是否正常

其他异常查看官方论坛,地址:https://www.bt.cn/bbs/thread-87257-1-1.html

登录之后在左侧找到docker点击安装即可。

需要注意的是,宝塔面板的防火墙都是开机自启动的,需要注意防火墙端口。

部署Master节点的docker-compose.yaml文件

编辑docker-compose.yaml文件,代码如下:

cd /opt
mkdir mysql
cd mysql
vi docker-compose.yaml

文件内容,代码如下:

version: '3'  # 使用docker-compose版本3
services:  # 定义服务mysql_master:  # 定义一个名为mysql_master的服务image: mysql:8.0.20  # 使用MySQL 8.0.20镜像container_name: mysql_master  # 指定容器名称为mysql_masterrestart: unless-stopped  # 在容器退出时自动重新启动command:  # 容器启动时执行的命令- --server-id=1  # 设置MySQL服务器的ID为1,用于复制- --relay_log=relay-log # 开启中继日志- --binlog-ignore-db=mysql  # 忽略在binlog中记录的数据库,这里为mysql- --skip-name-resolve  # 禁用DNS解析- --innodb_flush_log_at_trx_commit=1  # 每个事务提交时将日志写入磁盘- --sync-binlog=1  # 立即将binlog写入磁盘- --innodb_flush_method=O_DIRECT  # 使用直接IO刷新InnoDB缓冲区- --log-bin=master-log   # 开启二进制日志- --log_bin-index=master-bin.index  # 指定binlog索引文件名- --max_connections=500  # 最大的并发连接数- --max_connect_errors=100  # 连接错误的最大次数- --character-set-server=utf8  # 设置服务器的字符集为UTF-8- --default-storage-engine=INNODB  # 设置默认存储引擎为InnoDB- --default_authentication_plugin=mysql_native_password  # 设置默认身份验证插件为mysql_native_password- --expire-logs-days=7  # 设置binlog日志自动删除的天数为7天- --binlog-ignore-db=information_schema  # 忽略在binlog中记录的数据库,这里为information_schema- --binlog-ignore-db=performance_schema  # 忽略在binlog中记录的数据库,这里为performance_schema- --binlog-ignore-db=sys  # 忽略在binlog中记录的数据库,这里为sys- --gtid_mode=on  # 开启全局事务标识- --enforce_gtid_consistency=on  # 强制全局事务标识的一致性- --binlog_format=mixed  # 二进制日志的格式为混合模式- --sync_binlog=1  # 立即将binlog写入磁盘- --default_storage_engine=InnoDB  # 默认的存储引擎是InnoDB- --performance_schema_max_table_instances=400  # 性能模式中最大的表实例数- --table_definition_cache=400  # 表定义缓存的大小- --skip-external-locking  # 跳过外部锁定- --max_allowed_packet=100G  # 数据包的最大大小- --table_open_cache=512  # 表缓存的大小- --sort_buffer_size=2M  # 排序缓冲区的大小- --net_buffer_length=4K  # 网络缓冲区的长度- --read_buffer_size=2M  # 读缓冲区的大小- --read_rnd_buffer_size=256K  # 随机读缓冲区的大小- --thread_cache_size=64  # 线程缓存的大小- --tmp_table_size=64M  # 临时表的大小- --lower_case_table_names=1  # 表名是否区分大小写,1表示不区分大小写- --sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES  # SQL模式- --explicit_defaults_for_timestamp=true  # 如果设置为true,则对于TIMESTAMP列,使用显式DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP定义- --skip-name-resolve  # 跳过DNS解析- --open_files_limit=65535  # 可打开文件的数量限制- --binlog_expire_logs_seconds=600000  # 当二进制日志文件超过指定秒数时,将被自动删除- --slow_query_log=1  # 启用慢查询日志- --long_query_time=3  # 超过指定秒数的查询将被认为是慢查询- --log_queries_not_using_indexes=on  # 记录未使用索引的查询- --innodb_buffer_pool_size=512M  # InnoDB缓冲池的大小- --innodb_log_file_size=256M  # InnoDB日志文件的大小- --innodb_log_buffer_size=64M  # InnoDB日志缓冲区的大小- --innodb_flush_log_at_trx_commit=1  # 每次事务提交时,是否将日志缓冲区的内容刷新到磁盘- --innodb_lock_wait_timeout=50  # InnoDB锁等待超时时间- --innodb_max_dirty_pages_pct=90  # InnoDB脏页的最大百分比- --innodb_read_io_threads=8  # InnoDB读线程的数量- --innodb_write_io_threads=8  # InnoDB写线程的数量ports:  # 定义容器和主机之间的端口映射- "33061:3306"  # 将容器的3306端口映射到主机的33061端口environment:  # 定义环境变量MYSQL_ROOT_PASSWORD: masterroot  # 设置MySQL的root用户密码为masterrootTZ: "Asia/Shanghai" #解决时区问题volumes:  # 定义数据卷- /var/lib/mysql:/var/lib/mysql  # 将本地的master目录挂载到容器的/var/lib/mysql目录中

部署MySQL从节点1的docker-compose.yml的文件

编辑docker-compose.yaml文件,代码如下:

cd /opt
mkdir mysql
cd mysql
vi docker-compose.yaml

文件内容,代码如下:

  version: '3'services:mysql_slave1:image: mysql:8.0.20container_name: mysql_slave1restart: unless-stoppedcommand:- --server-id=2  # 设置MySQL服务器的唯一标识- --relay-log-index=slave-relay-bin.index  # 设置中继日志索引的文件名- --relay-log=relay-log  # 开启中继日志- --log-bin=master-log  # 开启二进制日志- --read_only=ON # 启用只读属性- --relay_log_purge=0 # 是否自动清空不再需要中继日志- --log-slave-updates=1  # 开启从服务器记录二进制日志更新的功能- --max_connections=200  # 设置最大连接数- --max_connect_errors=10  # 设置最大连接错误数- --character-set-server=utf8  # 设置服务器默认字符集为utf8- --default-storage-engine=INNODB  # 设置默认的存储引擎为InnoDB- --default_authentication_plugin=mysql_native_password  # 设置默认的身份验证插件为mysql_native_password- --log_slave_updates=1  # 开启从服务器记录二进制日志更新的功能- --binlog-ignore-db=information_schema  # 忽略复制的数据库- --binlog-ignore-db=performance_schema  # 忽略复制的数据库- --binlog-ignore-db=sys  # 忽略复制的数据库- --binlog-ignore-db=mysql  # 忽略复制的数据库- --skip-name-resolve  # 禁用主机名解析- --innodb_flush_log_at_trx_commit=1  # 每次事务提交时刷新日志缓冲区内容到磁盘- --sync-binlog=1  # 立即将binlog写入磁盘- --innodb_flush_method=O_DIRECT  # 设置InnoDB的日志刷新方式为直接刷新- --gtid_mode=on  # 开启全局事务标识- --enforce_gtid_consistency=on  # 强制全局事务标识的一致性- --binlog_format=mixed  # 设置二进制日志的格式为混合模式- --sync_binlog=1  # 立即将binlog写入磁盘- --default_storage_engine=InnoDB  # 设置默认的存储引擎为InnoDB- --performance_schema_max_table_instances=400  # 设置性能模式中最大的表实例数- --table_definition_cache=400  # 设置表定义缓存的大小- --skip-external-locking  # 跳过外部锁定- --max_allowed_packet=100G  # 设置数据包的最大大小- --table_open_cache=512  # 设置表缓存的大小- --sort_buffer_size=2M  # 设置排序缓冲区的大小- --net_buffer_length=4K  # 设置网络缓冲区的长度- --read_buffer_size=2M  # 设置读缓冲区的大小- --read_rnd_buffer_size=256K  # 设置随机读缓冲区的大小- --thread_cache_size=64  # 设置线程缓存的大小- --tmp_table_size=64M  # 设置临时表的大小- --lower_case_table_names=1  # 设置表名是否区分大小写,1表示不区分大小写- --sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES  # 设置SQL模式- --explicit_defaults_for_timestamp=true  # 如果设置为true,则对于TIMESTAMP列,使用显式DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP定义- --skip-name-resolve  # 跳过DNS解析- --open_files_limit=65535  # 设置可打开文件的数量限制- --binlog_expire_logs_seconds=600000  # 当二进制日志文件超过指定秒数时,将被自动删除- --slow_query_log=1  # 启用慢查询日志- --long_query_time=3  # 设置超过指定秒数的查询将被认为是慢查询- --log_queries_not_using_indexes=on  # 记录未使用索引的查询- --innodb_buffer_pool_size=512M  # 设置InnoDB缓冲池的大小- --innodb_log_file_size=256M  # 设置InnoDB日志文件的大小- --innodb_log_buffer_size=64M  # 设置InnoDB日志缓冲区的大小- --innodb_flush_log_at_trx_commit=1  # 每次事务提交时,是否将日志缓冲区的内容刷新到磁盘- --innodb_lock_wait_timeout=50  # 设置InnoDB锁等待超时时间- --innodb_max_dirty_pages_pct=90  # 设置InnoDB脏页的最大百分比- --innodb_read_io_threads=8  # 设置InnoDB读线程的数量- --innodb_write_io_threads=8  # 设置InnoDB写线程的数量- --master_info_repository=TABLE #指定存储主服务器信息的文件的类型- --relay_log_info_repository=FILEports:- "33062:3306"  # 将容器的3306端口映射到主机的33062端口environment:MYSQL_ROOT_PASSWORD: slaveroot # root用户密码MYSQL_MASTER_HOST: 198.168.80.111 # 指定主服务器的地址MYSQL_MASTER_PORT: 33061 # 指定主服务器的端口MYSQL_MASTER_USER: root # 主服务器的root用户MYSQL_MASTER_PASSWORD: masterroot # 主服务器的root密码TZ: "Asia/Shanghai"  # 设置时区volumes:- /var/lib/mysql:/var/lib/mysql  # 将本地的slave1目录挂载到容器的/var/lib/mysql目录中

部署Slave2节点的docker-compose.yaml文件

编辑docker-compose.yaml文件,代码如下:

cd /opt
mkdir mysql
cd mysql
vi docker-compose.yaml

文件内容,代码如下:

version: '3'
services:mysql_slave2:image: mysql:8.0.20container_name: mysql_slave2restart: unless-stoppedcommand:- --server-id=3  # 设置MySQL服务器的唯一标识- --relay-log-index=slave-relay-bin.index  # 设置中继日志索引的文件名- --relay-log=relay-log  # 开启中继日志- --log-bin=master-log  # 开启二进制日志- --read_only=ON # 启用只读属性- --relay_log_purge=0 # 是否自动清空不再需要中继日志- --log-slave-updates=1  # 开启从服务器记录二进制日志更新的功能- --max_connections=200  # 设置最大连接数- --max_connect_errors=10  # 设置最大连接错误数- --character-set-server=utf8  # 设置服务器默认字符集为utf8- --default-storage-engine=INNODB  # 设置默认的存储引擎为InnoDB- --default_authentication_plugin=mysql_native_password  # 设置默认的身份验证插件为mysql_native_password- --log_slave_updates=1  # 开启从服务器记录二进制日志更新的功能- --binlog-ignore-db=information_schema  # 忽略复制的数据库- --binlog-ignore-db=performance_schema  # 忽略复制的数据库- --binlog-ignore-db=sys  # 忽略复制的数据库- --binlog-ignore-db=mysql  # 忽略复制的数据库- --skip-name-resolve  # 禁用主机名解析- --innodb_flush_log_at_trx_commit=1  # 每次事务提交时刷新日志缓冲区内容到磁盘- --sync-binlog=1  # 立即将binlog写入磁盘- --innodb_flush_method=O_DIRECT  # 设置InnoDB的日志刷新方式为直接刷新- --gtid_mode=on  # 开启全局事务标识- --enforce_gtid_consistency=on  # 强制全局事务标识的一致性- --binlog_format=mixed  # 设置二进制日志的格式为混合模式- --sync_binlog=1  # 立即将binlog写入磁盘- --default_storage_engine=InnoDB  # 设置默认的存储引擎为InnoDB- --performance_schema_max_table_instances=400  # 设置性能模式中最大的表实例数- --table_definition_cache=400  # 设置表定义缓存的大小- --skip-external-locking  # 跳过外部锁定- --max_allowed_packet=100G  # 设置数据包的最大大小- --table_open_cache=512  # 设置表缓存的大小- --sort_buffer_size=2M  # 设置排序缓冲区的大小- --net_buffer_length=4K  # 设置网络缓冲区的长度- --read_buffer_size=2M  # 设置读缓冲区的大小- --read_rnd_buffer_size=256K  # 设置随机读缓冲区的大小- --thread_cache_size=64  # 设置线程缓存的大小- --tmp_table_size=64M  # 设置临时表的大小- --lower_case_table_names=1  # 设置表名是否区分大小写,1表示不区分大小写- --sql-mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES  # 设置SQL模式- --explicit_defaults_for_timestamp=true  # 如果设置为true,则对于TIMESTAMP列,使用显式DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP定义- --skip-name-resolve  # 跳过DNS解析- --open_files_limit=65535  # 设置可打开文件的数量限制- --binlog_expire_logs_seconds=600000  # 当二进制日志文件超过指定秒数时,将被自动删除- --slow_query_log=1  # 启用慢查询日志- --long_query_time=3  # 设置超过指定秒数的查询将被认为是慢查询- --log_queries_not_using_indexes=on  # 记录未使用索引的查询- --innodb_buffer_pool_size=512M  # 设置InnoDB缓冲池的大小- --innodb_log_file_size=256M  # 设置InnoDB日志文件的大小- --innodb_log_buffer_size=64M  # 设置InnoDB日志缓冲区的大小- --innodb_flush_log_at_trx_commit=1  # 每次事务提交时,是否将日志缓冲区的内容刷新到磁盘- --innodb_lock_wait_timeout=50  # 设置InnoDB锁等待超时时间- --innodb_max_dirty_pages_pct=90  # 设置InnoDB脏页的最大百分比- --innodb_read_io_threads=8  # 设置InnoDB读线程的数量- --innodb_write_io_threads=8  # 设置InnoDB写线程的数量- --master_info_repository=TABLE #指定存储主服务器信息的文件的类型- --relay_log_info_repository=FILEports:- "33063:3306"  # 将容器的3306端口映射到主机的33062端口environment:MYSQL_ROOT_PASSWORD: slaveroot # root用户密码MYSQL_MASTER_HOST: 198.168.80.111 # 指定主服务器的地址MYSQL_MASTER_PORT: 33061 # 指定主服务器的端口MYSQL_MASTER_USER: root # 主服务器的root用户MYSQL_MASTER_PASSWORD: masterroot # 主服务器的root密码TZ: "Asia/Shanghai"  # 设置时区volumes:- /var/lib/mysql:/var/lib/mysql  # 将本地的slave1目录挂载到容器的/var/lib/mysql目录中

每个节点都执行启动运行

启动运行,命令如下:

docker-compose up -d

如果需要暂停容器并删除mysql文件,命令如下:

docker-compose down
rm -rf /var/lib/mysql

master节点,配置主从同步

进入主节点容器,命令如下:

docker exec -it mysql_master bash;

登录mysql,命令如下:

mysql -u root -pmasterroot

安装semisync_master模块,通过扩展库来安装半同步复制模块,需要指定扩展库的文件名,命令如下:

install plugin rpl_semi_sync_master soname 'semisync_master.so';

查看系统全局参数,命令如下:

show global variables like 'rpl_semi%';

输出结果如下:

mysql> show global variables like 'rpl_semi%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| rpl_semi_sync_master_timeout              | 10000      |
| rpl_semi_sync_master_trace_level          | 32         |
| rpl_semi_sync_master_wait_for_slave_count | 1          |
| rpl_semi_sync_master_wait_no_slave        | ON         |
| rpl_semi_sync_master_wait_point           | AFTER_SYNC |
+-------------------------------------------+------------+
6 rows in set (0.00 sec)

rpl_semi_sync_master_timeout就是半同步复制时等待应答的最长等待时间,默认是10秒,可以根据情况自行调整。rpl_semi_sync_master_wait_point其实表示一种半同步复制的方式。半同步复制有两种方式,一种是我们现在看到的这种默认的AFTER_SYNC方式。这种方式下,主库把日志写入binlog,并且复制给从库,然后开始等待从库的响应。从库返回成功后,主库再提交事务,接着给客户端返回一个成功响应。而另一种方式是叫做AFTER_COMMIT方式。他不是默认的。这种方式,在主库写入binlog后,等待binlog复制到从库,主库就提交自己的本地事务,再等待从库返回给自己一个成功响应,然后主库再给客户端返回响应。

打开半同步复制的开关,命令如下:

set global rpl_semi_sync_master_enabled=ON;

授权,命令如下:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'masterroot';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'masterroot';
CREATE USER 'mhaadmin'@'192.168.%.%' IDENTIFIED BY 'mhapass';
GRANT ALL PRIVILEGES ON *.* TO 'mhaadmin'@'192.168.%.%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

查看主节点状态,命令如下:

SHOW MASTER STATUS;

输出结果如下:

mysql> SHOW MASTER STATUS;
+-------------------+----------+--------------+-------------------------------------------------+------------------------------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB                                | Executed_Gtid_Set                        |
+-------------------+----------+--------------+-------------------------------------------------+------------------------------------------+
| master-log.000004 |      381 |              | mysql,information_schema,performance_schema,sys | fc36c204-acfb-11ee-9fcd-0242ac120002:1-6 |
+-------------------+----------+--------------+-------------------------------------------------+------------------------------------------+
1 row in set (0.00 sec)

需要注意的是File和Position的值,在配置从节点时需要对应上。

slave节点1和2,配置主从同步

进入从节点1容器,命令如下:

docker exec -it mysql_slave1 bash

进入从节点2容器,命令如下:

docker exec -it mysql_slave2 bash

登录mysql,命令如下:

mysql -u root -pslaveroot

安装smeisync_slave模块,命令如下:

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
set global rpl_semi_sync_slave_enabled = on;

查看效果,命令如下:

show global variables like 'rpl_semi%';

输出结果:

mysql> show global variables like 'rpl_semi%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| rpl_semi_sync_slave_enabled     | ON    |
| rpl_semi_sync_slave_trace_level | 32    |
+---------------------------------+-------+
2 rows in set (0.01 sec)

rpl_semi_sync_slave_enabled为ON表示设置成功。

授权,命令如下:

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'slaveroot';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'slaveroot';
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
FLUSH PRIVILEGES;

配置主从同步,命令如下:

CHANGE MASTER TO
MASTER_HOST='192.168.80.111',
MASTER_PORT=33061,
MASTER_USER='root',
MASTER_PASSWORD='masterroot',
MASTER_LOG_FILE='master-log.000004',
MASTER_LOG_POS=381;

MASTER_HOST是master节点的ip地址,MASTER_PORT是master节点对外暴露的端口,MASTER_USER是master节点的root用户,MASTER_PASSWORD是root用户对应的密码,MASTER_LOG_FILE和MASTER_LOG_POS的值是在master节点登录mysql后执行SHOW MASTER STATUS;命令输出结果File和Position的值。

开启主从配置,查看从节点状态,命令如下:

START SLAVE;
show slave status\G;

输出的结果如下:

mysql> show slave status\G;\
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.80.111Master_User: rootMaster_Port: 33061Connect_Retry: 60Master_Log_File: master-log.000004Read_Master_Log_Pos: 196Relay_Log_File: relay-log.000005Relay_Log_Pos: 373Relay_Master_Log_File: master-log.000004Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 196Relay_Log_Space: 1499Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1Master_UUID: fc36c204-acfb-11ee-9fcd-0242ac120002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: 01058c88-acfc-11ee-9104-0242ac120002:1-5Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set (0.00 sec)ERROR: 
No query specified

只要Slave_IO_Running: Yes和Slave_SQL_Running: Yes主从同步配置就好了。

重启从节点1的mysql服务,命令如下:

docker restart mysql_slave1

重启从节点2的mysql服务,命令如下:

docker restart mysql_slave2

如果上述步骤,有些操作还是不知道怎么做,这里提供我操作的一个步骤视频:

校验主从同步是否正常

在master节点查看数据库,命令如下:

show databases;

输出结果如下:

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

在master节点上创建一个test数据库,命令如下:

create database test;

去二个slave1和slave2节点上查看数据库是否同步过去。

节点互通无密码登录

在每个节点都执行以下命令,代码如下:

ssh-keygen -t rsa

按三次回车,然后推送到mhamanager节点上,代码如下:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.80.110

在mhamanager节点上查看authorized_keys文件,代码如下:

cd /root/.ssh
cat authorized_keys 

输出如下:
authorized_keys
在mhamanager节点上推送authorized_keys文件到master节点上,代码如下:

scp authorized_keys root@192.168.80.111:/root/.ssh/

在mhamanager节点上推送authorized_keys文件到slave1节点上,代码如下:

scp authorized_keys root@192.168.80.112:/root/.ssh/

在mhamanager节点上推送authorized_keys文件到slave2节点上,代码如下:

scp authorized_keys root@192.168.80.113:/root/.ssh/

安装配置MHA

下载安装

想要安装MHA,需要准备mha4mysql-node-0.56-0.el6.noarch.rpm和mha4mysql-manager-0.56-0.el6.noarch.rpm安装包,这里提供下载地址:
链接:https://pan.baidu.com/s/17j_cJ5ukdp95RnfGWEM8gQ?pwd=2024
提取码:2024
–来自百度网盘超级会员V1的分享

在mhamanager节点将二个安装包上传,然后执行以下命令安装,代码如下:

yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm
yum install -y mha4mysql-manager-0.56-0.el6.noarch.rpm

在master节点、slave1节点、slave2节点将一个安装包上传,然后执行以下命令安装,代码如下:

yum install -y mha4mysql-node-0.56-0.el6.noarch.rpm

配置mha.cnf文件

编辑mhamanager节点的/etc/mha_master/mha.cnf配置文件,代码如下:

vi /etc/mha_master/mha.cnf

mha.cnf文件内容,代码如下:

[server default]
# 设置manager的日志
manager_log=/var/log/mha/manager/manager.log
# 设置manager的工作目录
manager_workdir=/var/log/mha/manager/workdir
# 设置master保存binlog的位置
master_binlog_dir=/var/lib/mysql
# 每个远程主机的工作目录在何处
remote_workdir=/opt/mha/mha_master/work
# mha管理用户
user=mhaadmin
# mha密码
password=mhapass
# 基于ssh的密钥认证
ssh_user=root
# slave的复制密码
repl_password=123456
# slave的复制用户
repl_user=slave
# 检查节点状态的间隔时间,默认为1秒
ping_interval=1
[server1]
# 服务器节点1
# 主机ip地址
hostname=192.168.80.111
# mysql对外暴露端口
port=33061
# 设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库
candidate_master=1
# 默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0
[server2]
# 服务器节点2
# 主机ip地址
hostname=192.168.80.112
# mysql对外暴露端口
port=33062
# 设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库
candidate_master=1
# 默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0
[server3]
# 服务器节点3
# 主机ip地址
hostname=192.168.80.113
# mysql对外暴露端口
port=33063
# 设置为候选master,如果设置该参数以后,发生主从切换以后将会将此从库提升为主库
candidate_master=1
# 默认情况下如果一个slave落后master 100M的relay logs的话,MHA将不会选择该slave作为一个新的master,因为对于这个slave的恢复需要花费很长时间,通过设置check_repl_delay=0,MHA触发切换在选择一个新的master的时候将会忽略复制延时,这个参数对于设置了candidate_master=1的主机非常有用,因为这个候选主在切换的过程中一定是新的master
check_repl_delay=0

开始校验

测试节点之间是否互通,命令如下:

masterha_check_ssh -conf=/etc/mha_master/mha.cnf

输出结果如下:

[root@mhamanager mysql]# masterha_check_ssh -conf=/etc/mha_master/mha.cnf
Fri Jan  5 14:46:35 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan  5 14:46:35 2024 - [info] Reading application default configuration from /etc/mha_master/mha.cnf..
Fri Jan  5 14:46:35 2024 - [info] Reading server configuration from /etc/mha_master/mha.cnf..
Fri Jan  5 14:46:35 2024 - [info] Starting SSH connection tests..
Fri Jan  5 14:47:16 2024 - [debug] 
Fri Jan  5 14:46:35 2024 - [debug]  Connecting via SSH from root@192.168.80.111(192.168.80.111:22) to root@192.168.80.112(192.168.80.112:22)..
Fri Jan  5 14:46:55 2024 - [debug]   ok.
Fri Jan  5 14:46:55 2024 - [debug]  Connecting via SSH from root@192.168.80.111(192.168.80.111:22) to root@192.168.80.113(192.168.80.113:22)..
Fri Jan  5 14:47:15 2024 - [debug]   ok.
Fri Jan  5 14:47:16 2024 - [debug] 
Fri Jan  5 14:46:35 2024 - [debug]  Connecting via SSH from root@192.168.80.112(192.168.80.112:22) to root@192.168.80.111(192.168.80.111:22)..
Fri Jan  5 14:46:55 2024 - [debug]   ok.
Fri Jan  5 14:46:55 2024 - [debug]  Connecting via SSH from root@192.168.80.112(192.168.80.112:22) to root@192.168.80.113(192.168.80.113:22)..
Fri Jan  5 14:47:16 2024 - [debug]   ok.
Fri Jan  5 14:47:17 2024 - [debug] 
Fri Jan  5 14:46:36 2024 - [debug]  Connecting via SSH from root@192.168.80.113(192.168.80.113:22) to root@192.168.80.111(192.168.80.111:22)..
Fri Jan  5 14:46:56 2024 - [debug]   ok.
Fri Jan  5 14:46:56 2024 - [debug]  Connecting via SSH from root@192.168.80.113(192.168.80.113:22) to root@192.168.80.112(192.168.80.112:22)..
Fri Jan  5 14:47:16 2024 - [debug]   ok.
Fri Jan  5 14:47:17 2024 - [info] All SSH connection tests passed successfully.

测试主从复制是否正常,命令如下:

masterha_check_repl -conf=/etc/mha_master/mha.cnf

输出结果如下:

[root@mhamanager mysql]# masterha_check_repl -conf=/etc/mha_master/mha.cnf
Fri Jan  5 15:12:10 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan  5 15:12:10 2024 - [info] Reading application default configuration from /etc/mha_master/mha.cnf..
Fri Jan  5 15:12:10 2024 - [info] Reading server configuration from /etc/mha_master/mha.cnf..
Fri Jan  5 15:12:10 2024 - [info] MHA::MasterMonitor version 0.56.
Fri Jan  5 15:12:11 2024 - [info] GTID failover mode = 1
Fri Jan  5 15:12:11 2024 - [info] Dead Servers:
Fri Jan  5 15:12:11 2024 - [info] Alive Servers:
Fri Jan  5 15:12:11 2024 - [info]   192.168.80.111(192.168.80.111:33061)
Fri Jan  5 15:12:11 2024 - [info]   192.168.80.112(192.168.80.112:33062)
Fri Jan  5 15:12:11 2024 - [info]   192.168.80.113(192.168.80.113:33063)
Fri Jan  5 15:12:11 2024 - [info] Alive Slaves:
Fri Jan  5 15:12:11 2024 - [info]   192.168.80.112(192.168.80.112:33062)  Version=8.0.20 (oldest major version between slaves) log-bin:enabled
Fri Jan  5 15:12:11 2024 - [info]     GTID ON
Fri Jan  5 15:12:11 2024 - [info]     Replicating from 192.168.80.111(192.168.80.111:33061)
Fri Jan  5 15:12:11 2024 - [info]     Primary candidate for the new Master (candidate_master is set)
Fri Jan  5 15:12:11 2024 - [info]   192.168.80.113(192.168.80.113:33063)  Version=8.0.20 (oldest major version between slaves) log-bin:enabled
Fri Jan  5 15:12:11 2024 - [info]     GTID ON
Fri Jan  5 15:12:11 2024 - [info]     Replicating from 192.168.80.111(192.168.80.111:33061)
Fri Jan  5 15:12:11 2024 - [info] Current Alive Master: 192.168.80.111(192.168.80.111:33061)
Fri Jan  5 15:12:11 2024 - [info] Checking slave configurations..
Fri Jan  5 15:12:11 2024 - [info] Checking replication filtering settings..
Fri Jan  5 15:12:11 2024 - [info]  binlog_do_db= , binlog_ignore_db= information_schema,mysql,performance_schema,sys
Fri Jan  5 15:12:11 2024 - [info]  Replication filtering check ok.
Fri Jan  5 15:12:11 2024 - [info] GTID (with auto-pos) is supported. Skipping all SSH and Node package checking.
Fri Jan  5 15:12:11 2024 - [info] Checking SSH publickey authentication settings on the current master..
Fri Jan  5 15:12:16 2024 - [warning] HealthCheck: Got timeout on checking SSH connection to 192.168.80.111! at /usr/share/perl5/vendor_perl/MHA/HealthCheck.pm line 342.
Fri Jan  5 15:12:16 2024 - [info] 
192.168.80.111(192.168.80.111:33061) (current master)+--192.168.80.112(192.168.80.112:33062)+--192.168.80.113(192.168.80.113:33063)Fri Jan  5 15:12:16 2024 - [info] Checking replication health on 192.168.80.112..
Fri Jan  5 15:12:16 2024 - [info]  ok.
Fri Jan  5 15:12:16 2024 - [info] Checking replication health on 192.168.80.113..
Fri Jan  5 15:12:16 2024 - [info]  ok.
Fri Jan  5 15:12:16 2024 - [info] Checking master_ip_failover_script status:
Fri Jan  5 15:12:16 2024 - [info]   /etc/mha/scripts/master_ip_failover    #设置自动failover时候的切换脚本 --command=status --ssh_user=root --orig_master_host=192.168.80.111 --orig_master_ip=192.168.80.111 --orig_master_port=33061 IN SCRIPT TEST====/sbin/ifconfig eth1:1 down==/sbin/ifconfig eth1:1 192.168.80.110/24===Checking the Status of the script.. OK 
Fri Jan  5 15:12:16 2024 - [info]  OK.
Fri Jan  5 15:12:16 2024 - [warning] shutdown_script is not defined.
Fri Jan  5 15:12:16 2024 - [info] Got exit code 0 (Not master dead).MySQL Replication Health is OK.

启动mha服务,命令如下:

nohup masterha_manager -conf=/etc/mha_master/mha.cnf &> /etc/mha_master/manager.log &

查看日志,命令如下:

tail -200 /etc/mha_master/manager.log

输出结果如下:

[root@mhamanager mysql]# tail -200 /etc/mha_master/manager.log
nohup: ignoring input
Fri Jan  5 15:30:23 2024 - [warning] Global configuration file /etc/masterha_default.cnf not found. Skipping.
Fri Jan  5 15:30:23 2024 - [info] Reading application default configuration from /etc/mha_master/mha.cnf..
Fri Jan  5 15:30:23 2024 - [info] Reading server configuration from /etc/mha_master/mha.cnf..

查看mha主节点是否正常,命令如下:

masterha_check_status -conf=/etc/mha_master/mha.cnf

输出结果如下:

[root@mhamanager mysql]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha (pid:5236) is running(0:PING_OK), master:192.168.80.111

上面的信息中“mha (pid:5236) is running(0:PING_OK)”表示MHA服务运行OK,否则,会显示为类似“mha is stopped(1:NOT_RUNNING).”停止 MHA,则需要使用 stop,命令如下:

masterha_stop -conf=/etc/mha_master/mha.cnf

在 master 节点关闭 mysql服务,模拟主节点数据崩溃,命令如下:

docker stop mysql_master

再次查看mhamanger节点日志,命令如下:

tail -200 /etc/mha_master/manager.log

输出结果如下:

[root@manager ~]# tail -200 /etc/mha_master/manager.log
……
Sunday Jan 7 11:17:19 2024 - [info] Master failover to
192.168.80.112(192.168.80.112:33062) completed successfully.

表示 manager 检测到192.168.80.111节点故障, 而后自动执行故障转移, 将192.168.80.112提升为主节点。

故障转移完成后, manager将会自动停止, 此时使用masterha_check_status 命令检测将会遇到错误提示,输出结果如下:

[root@mhamanager mysql]# masterha_check_status -conf=/etc/mha_master/mha.cnf
mha is stopped(2:NOT_RUNNING).

故障备份恢复

如果原来的主数据库出现故障,需要设置一个新的 MySQL 节点,并将其配置为新的从节点。如果新节点是新增加的,需要将其IP地址配置为原来主节点的IP地址。如果IP地址不同,还需要修改mha.cnf文件中对应的IP地址。然后再次启动管理器,并检查其状态。

备份命令如下:

mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql

以刚刚关闭的那台主节点作为新添加的机器,来进行数据库的恢复。原本的 slave1 已经成为了新的主机器,对其进行完全备份,然后把备份的数据发送到新添加的机器上,输出结果如下:

[root@slave1 ~]# mkdir /backup
[root@slave1 ~]# mysqldump --all-database > /backup/mysql-backup-`date +%F-%T`-all.sql
[root@slave1 ~]# scp /backup/mysql-backup-2024-01-07-12\:57\:09-all.sql root@192.168.80.112:/backup

在新加的机器上进行数据恢复,这里还使用原来那台主节点(因为把容器关停了,经过MHA选举,slave1节点现在是主节点,master节点哪怕重新启动也还是作为从节点加入到集群中),输出结果如下:

[root@master ~]# mysql < mysql-backup-2024-01-07-12\:57\:09-all.sql

备份完成后,还是和前面的从节点操作一样,登录mysql,配置主从关系,然后执行show slave status\G;命令查看主节点状态。

最后再去mhamanager节点上,观察新节点提供后,执行检查操作是否正常。

总结一下,就是在生产环境中, 当你的主节点挂了后, 一定要在从节点上做一个备份, 拿着备份文件把主节点手动提升为从节点, 并指明从哪一个日志文件的位置开始复制。每一次自动完成转换后, 每一次的(replication health )检测不ok始终都是启动不了必须手动修复主节点, 除非你改配置文件。手动修复主节点提升为从节点后, 再次运行检测命令。再次运行起来就恢复成功了。
CSDN

📢文章总结

对本篇文章进行总结: 如果觉得我给的操作步骤太费事,也可以别家的:https://gitee.com/IceHL/mysql-mha/blob/master/README.md

🔔以上就是今天要讲的内容,阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

以梦为马,不负韶华

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

🚀🎉希望各位读者大大多多支持用心写文章的博主,现在时代变了,🚀🎉 信息爆炸,酒香也怕巷子深🔥,博主真的需要大家的帮助才能在这片海洋中继续发光发热🎨,所以,🏃💨赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD
  • 🎉微信号二维码SeniorRD

📥博主目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本是一个很普通的程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我们必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

🔔有需要对自己进行综合性评估,进行职业方向规划,我可以让技术大牛帮你模拟面试、针对性的指导、传授面试技巧、简历优化、进行技术问题答疑等服务。

可访问:https://java_wxid.gitee.io/tojson/

开发人员简历优化、面试突击指导、技术问题解答

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/603202.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QOS(Quality of Service)基本原理及配置示例

个人认为&#xff0c;理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息&#xff0c;更加便于理解协议。 由于QOS&#xff08;Quality of Service&#xff09;在报文上主要是更改特定字段进行流量的差异化服务&#xff0c;因此此处重点介绍各种服…

使用 C# Winfrom编写倒计时功能

在日常生活中&#xff0c;我们经常需要倒计时来提醒自己重要的时间节点&#xff0c;比如倒计时到达一个特定的日期和时间。介绍一个使用 C# 编写的倒计时应用程序的实现。 步骤一&#xff1a;应用程序的功能 它具有以下几个主要特点&#xff1a; 用户输入目标日期和时间&…

从零实现CLIP模型

1. 引言 CLIP代表语言图像对比预训练模型&#xff0c;是OpenAI于2021年开发的一个深度学习模型。CLIP模型中图像和文本嵌入共享相同的潜在特征空间&#xff0c;从而能够在两种模式之间直接进行对比学习。这是通过训练模型使相关的图像和文本更紧密地结合在一起&#xff0c;同时…

浅谈 JVM 类加载过程

&#x1f697;&#x1f697;&#x1f697;今天给大家分享的是HTTPS加密的工作过程。 清风的CSDN博客 &#x1f6e9;️&#x1f6e9;️&#x1f6e9;️希望我的文章能对你有所帮助&#xff0c;有不足的地方还请各位看官多多指教&#xff0c;大家一起学习交流&#xff01; ✈️✈…

四. 基于环视Camera的BEV感知算法-BEVDistill

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…

Transformer架构和对照代码详解

1、英文架构图 下面图中展示了Transformer的英文架构&#xff0c;英文架构中的模块名称和具体代码一一对应&#xff0c;方便大家对照代码、理解和使用。 2、编码器 2.1 编码器介绍 从宏观⻆度来看&#xff0c;Transformer的编码器是由多个相同的层叠加⽽ 成的&#xff0c;每个…

Auto tokenizer和Bert tokenizer的区别

"AutoTokenizer" 和 "BERT Tokenizer" 是两个不同概念&#xff0c;而不是两种不同的tokenizer。让我为您解释它们的含义&#xff1a; AutoTokenizer: "AutoTokenizer" 不是一个具体的tokenizer&#xff0c;而是 Hugging Face Transformers 库中提…

10款有趣的前端源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 自毁按钮动画特效 自毁按钮动画特效 点击打开盒子可以点击自毁按钮 进而会出现自毁…

【网络层】网际控制报文协议ICMP(湖科大慕课自学笔记)

网际控制报文协议ICMP 1&#xff1a;网际控制报文协议ICMP基本概述 ICMP报文被封装在IP数据报中发送 1&#xff1a;ICMP报文格式 ICMP报文作为IP数据报的数据载荷&#xff0c;IP协议为其添加一个首部使之成为IP数据报 2&#xff1a;ICMP报文类型 ICMP报文分为两大类&#x…

NGUI基础-三大基础组件之Event System(Uicameras)

目录 主要作用 相关参数 (建议&#xff1a;红色是重点&#xff0c;黑色的了解即可&#xff09; Event Type Events go to Process Events in Event Mask​编辑 Debug Command Click Allow Multi Touch Auto Hide Cursor Sticky ToolTip/Long press ToolTip/ToolTip…

vue实现点击复制功能方法封装demo。

源码如下 copyTextToClipboard(text, that) { const textArea document.createElement("textarea"); textArea.value text; document.body.appendChild(textArea); 在子节点末尾添加元素 textArea.select(); select方法讲解可以了解一下 JavaScri…

工业协议转换网关:打破通信壁垒,实现设备互联

在工业自动化领域&#xff0c;各种设备和系统间的通信协议不尽相同&#xff0c;这给不同设备间的集成和数据交互带来了挑战。工业协议转换网关作为一种解决这一问题的关键设备&#xff0c;能够实现不同协议间的转换和数据传输&#xff0c;打破通信壁垒&#xff0c;提高设备的协…

【PostgreSQL】模式Schema

PostgreSQL 数据库集群包含一个或多个命名数据库。角色和一些其他对象类型在整个集群中共享。与服务器的客户端连接只能访问单个数据库中的数据&#xff0c;该数据库在连接请求中指定。 数据库包含一个或多个命名schema&#xff0c;而这些schema又包含表。schema还包含其他类型…

Java 基础知识点1 (含面试题)

本次Java 知识点主要是关于SE的相关基础&#xff0c;同时也包含了数据结构中的一些API&#xff0c;例如Set,List,Map等&#xff0c;最后也附上了相关重要的面试题&#xff0c;可供大家学习与参考&#xff01; 目录 重要知识点数据结构API面试题 重要知识点 Java 是一门面向对象…

税法相关的基础知识

文章目录 税法原则1.税法基本原则2.税法适用原则3.税收收入划分 来和大家聊聊税法相关的基础知识 税法原则 1.税法基本原则 2.税法适用原则 3.税收收入划分

Flume基础知识(十):Flume 聚合实战

1&#xff09;案例需求&#xff1a; hadoop100上的 Flume-1 监控文件/opt/module/group.log&#xff0c; hadoop101上的 Flume-2 监控某一个端口的数据流&#xff0c; Flume-1 与 Flume-2 将数据发送给 hadoop102 上的 Flume-3&#xff0c;Flume-3 将最终数据打印 到控制台。…

数据库事务的特性

数据库事务具有 ACID 特性&#xff0c;其中 ACID 是指原子性&#xff08;Atomicity&#xff09;、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。这些特性是为了确保数据库在事务处理中的可…

Android 13.0修改recovery 菜单项字体大小

1.概述 在13.0的系统rom定制化开发中,在系统进入recovery模式后,界面会g_menu_actions 菜单选项和 提示文字,而这些文字的大小不像上层一样是通过设置属性来表示大小的 而它确是通过字体png图片的大小来计算文字的宽和高的,然后可以修改字体大小,接下来就实现菜单项字体大…

RocketMQ详细介绍及核心问题解释(很全)

1. RocketMq是什么 一个纯Java、分布式队列模型的消息中间件&#xff0c;具有高可用、高可靠、高实时、低延迟的特点。&#xff08;记住这句就行了&#xff09; 2. RocketMq有什么功能 1、业务解耦&#xff1a;这也是发布订阅的消息模型。生产者发送指令到MQ中&#xff0c;然…

python中parsel模块的css解析

一、爬虫页面分类 1.想要爬取的内容全部在标签中&#xff0c;可以使用xpath去进行解析如下图 2.想要爬取的内容呈现json的数据特征&#xff0c;用.json()转换为字典格式 3.页面不规则&#xff0c;标签中包含大括号&#xff0c;如下面想要获取键值内容怎么做&#xff0c;先用re正…