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

网站建设公司专业/宁波seo行者seo09

网站建设公司专业,宁波seo行者seo09,怎么用ps做网站幻灯片,桂林疫情最新消息情况作者:莫善 某互联网公司高级 DBA。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 文章目录背景一、环境介绍1、主库配置2、从库配置二、测试演示1、安全关闭的场景2、暴力关闭…

作者:莫善

某互联网公司高级 DBA。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


文章目录

      • 背景
      • 一、环境介绍
        • 1、主库配置
        • 2、从库配置
      • 二、测试演示
        • 1、安全关闭的场景
        • 2、暴力关闭的场景
      • 三、停服流程介绍
        • 1、停止接受新连接
        • 2、处理已经建立的连接
        • 3、关闭存储引擎
        • 4、服务器关闭
      • 四、写在最后

背景

这两天看到一个 MySQL 群里在讨论一个有趣的话题,大家平时都是怎么关闭 MySQL 的,一个大佬还发起了一个投票。投票如下:

你是如何关闭 MySQL 数据库的?

  • A、mysqladmin shutdown
  • B、service mysqld stop(systemctl)
  • C、kill mysqld_pid
  • D、kill -9 mysqld_pid

投票结果如下:

选项人数占比
A14133.9%
B24358.4%
C153.6%
D174.1%

生产环境中基本都是多实例部署,所以用A的方式关闭比较多,偶尔也会贪方便直接采用C的关闭方式,如果是单机单实例,用B也没毛病,但是为什么会有人选D选项呢,发起投票的大佬逐一问过后得知,都是因为当时 MySQL 已经不可用了,迫不得已才采用暴力关闭。

最后,大佬最终公布答案说,生产环境有且只有一种正确的关闭 MySQL 的方式,那就是D方式,所以在大佬看来,几乎团灭。

对这个公布结果我是持怀疑态度的,所以我带着怀疑做了下面的测试。

仅对5.7的半同步场景做了测试,对于异步场景感觉没什么意义,所以没测。

一、环境介绍

环境架构采用 MySQL 5.7 增强半同步,搭建的一主一从,信息如下:

角色ip端口版本
master192.168.168.1166665.7.26
slave192.168.168.1266665.7.26

1、主库配置

mysql> show variables like 'rpl%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | ON         |
| rpl_semi_sync_master_timeout              | 1000000    |
| 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 |
| rpl_semi_sync_slave_enabled               | OFF        |
| rpl_semi_sync_slave_trace_level           | 32         |
| rpl_stop_slave_timeout                    | 31536000   |
+-------------------------------------------+------------+
9 rows in set (0.00 sec)mysql> 

rpl_semi_sync_master_timeout = 1000000 是为了避免半同步降级为异步。

2、从库配置

mysql> show variables like 'rpl%';
+-------------------------------------------+------------+
| Variable_name                             | Value      |
+-------------------------------------------+------------+
| rpl_semi_sync_master_enabled              | OFF        |
| rpl_semi_sync_master_timeout              | 1000000    |
| 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 |
| rpl_semi_sync_slave_enabled               | ON         |
| rpl_semi_sync_slave_trace_level           | 32         |
| rpl_stop_slave_timeout                    | 31536000   |
+-------------------------------------------+------------+
9 rows in set (0.00 sec)mysql> 

二、测试演示

  • 测试准备

登录主库准备测试数据

# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.11 -P6666 -p123456mysql> create database if not exists dbatest;
Query OK, 1 row affected, 1 warning (0.00 sec)mysql> use dbatest
Database changed
mysql> create table t(id int not null auto_increment primary key,name varchar(10) default '') ;
Query OK, 0 rows affected (0.01 sec)mysql> insert into t select 0,'mysql';
Query OK, 1 row affected (0.00 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> insert into t select 0,'redis';
Query OK, 1 row affected (0.01 sec)
Records: 1  Duplicates: 0  Warnings: 0mysql> select * from t;
+----+-------+
| id | name  |
+----+-------+
|  1 | mysql |
|  2 | redis |
+----+-------+
2 rows in set (0.00 sec)mysql> 

登录从库检查测试数据

# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.12 -P6666 -p123456mysql> use dbatest
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t;
+----+-------+
| id | name  |
+----+-------+
|  1 | mysql |
|  2 | redis |
+----+-------+
2 rows in set (0.00 sec)mysql> 

1、安全关闭的场景

(1)停掉从库的复制

# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.12 -P6666 -p123456mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)mysql> 

模拟半同步故障,为了更直观查阅测试结果。

(2)模拟业务更新

这个流程涉及两个操作,一是在主库发起一个更新请求,二是查看主库的processlist状态。

  • 操作一
# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.11 -P6666 -p123456 dbatest -e "update t set name = 'tidb' where id = 1"

这个操作回车后会卡着,因为这个请求会等从库的ACK。具体可以看【操作二】的查询结果。

  • 操作二
# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.11 -P6666 -p123456mysql> show processlist;
+----+------+----------------------+---------+---------+------+--------------------------------------+-----------------------------------------+
| Id | User | Host                 | db      | Command | Time | State                                | Info                                    |
+----+------+----------------------+---------+---------+------+--------------------------------------+-----------------------------------------+
|  8 | dba  | 192.168.168.13:49584 | dbatest | Query   |   49 | Waiting for semi-sync ACK from slave | update t set name = 'tidb' where id = 1 |
|  9 | root | localhost            | NULL    | Query   |    0 | starting                             | show processlist                        |
+----+------+----------------------+---------+---------+------+--------------------------------------+-----------------------------------------+
2 rows in set (0.00 sec)mysql> 

(3)关闭主库的 MySQL

这个流程向主库提交 shutdown 命令来安全关闭 MySQL 。

# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.11 -P6666 -p123456mysql> shutdown;
Query OK, 0 rows affected (0.00 sec)mysql> 

提交完 shutdown 操作后,【操作一】的更新请求会被提交。

  • 在业务端看来,id=1 这行数据已经被修改,但是从库的id=1这行数据未改变。如果这个时候触发主从切换,那就丢数据了。由此看来,在特殊场景下,安全关闭MySQL可能导致数据丢失。
  • 这时候将主库重新拉起来,修好主从的半同步,被提交的事务还是会同步到从库的。

2、暴力关闭的场景

(1)停掉从库的复制

# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.12 -P6666 -p123456mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)mysql> 

模拟半同步故障,为了更直观查阅测试结果。

(2)模拟业务更新

这个流程涉及两个操作,一是在主库发起一个更新请求,二是查看主库的 processlist 状态。

  • 操作一
# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.11 -P6666 -p123456 dbatest -e "update t set name = 'codis' where id = 2"

这个操作回车后会卡着,因为这个请求会等从库的ACK。具体可以看【操作二】的查询结果。

  • 操作二
# /opt/soft/mysql57/bin/mysql -u dba -h 192.168.168.11 -P6666 -p123456mysql> show processlist;
+----+------+----------------------+---------+---------+------+--------------------------------------+-----------------------------------------+
| Id | User | Host                 | db      | Command | Time | State                                | Info                                    |
+----+------+----------------------+---------+---------+------+--------------------------------------+-----------------------------------------+
|  2 | dba  | 192.168.168.13:34698 | dbatest | Query   |   13 | Waiting for semi-sync ACK from slave | update t set name = 'codis' where id = 2 |
|  3 | root | localhost            | NULL    | Query   |    0 | starting                             | show processlist                        |
+----+------+----------------------+---------+---------+------+--------------------------------------+-----------------------------------------+
2 rows in set (0.00 sec)mysql> 

(3)暴力关闭主库的 MySQL

这个操作向主库所在服务器的 MySQL 进程发送 kill -9 信号,来暴力关闭 MySQL 。

# ps -ef|grep mysql|grep 6666
root     123194      1  0 15:45 pts/9    00:00:00 /bin/sh /opt/soft/mysql57/bin/mysqld_safe --defaults-file=//work/mysql6666/etc/my6666.cnf
mysql    124539 123194  4 15:45 pts/9    00:00:02 /opt/soft/mysql57/bin/mysqld --defaults-file=//work/mysql6666/etc/my6666.cnf --basedir=/opt/soft/mysql57 --datadir=/work/mysql6666/var --plugin-dir=/opt/soft/mysql57/lib/plugin --user=mysql --log-error=/work/mysql6666/log/mysql.err --open-files-limit=65535 --pid-file=/work/mysql6666/var/mysql.pid --socket=/work/mysql6666/tmp/mysql.sock --port=6666
# kill -9 124539 123194
# 

kill -9 操作后,【操作一】所在的会话会被终止,并提示【ERROR 2013 (HY000) at line 1: Lost connection to MySQL server during query】

  • 在业务端看来,id=2这行数据没有被修改,所以数据是一致的。

三、停服流程介绍

本小节是通过阅读了 MySQL 官方文档后,简单介绍一下 MySQL 在接收了 SIGINT 信号后会做哪些事情,仅供参考。

该部分文档连接 https://dev.mysql.com/doc/refman/5.7/en/server-shutdown.html

1、停止接受新连接

为了预防在关闭系统过程再接收新任务,MySQL 会关闭 TCP/IP 端口、socket 等通道来阻止接受新的客户端连接。

2、处理已经建立的连接

这个过程会处理已经建立的连接, 对于空闲连接会马上杀掉。对于当前正在处理任务的线程(会定期检查它们的状态),如果是正在执行的未完成的事务,会回滚(非事务的引擎会导致部分失败部分成功),所以这个过程需要更长的时间。

针对这个我有一个疑问。在【安全关闭的测试场景】中,正在等待ACK的任务会被提交,那么跟这个流程就有出入,所以我猜测这个流程之前会先关闭【等待ACK的线程】,然后再处理已经建立的连接,这样就能说的通,在【安全关闭的测试场景】中正在等待ACK的事务被提交了。当然这个思路仅是通过 MySQL 错误日志(如下展示)记录得出的猜测,仅供参考。

2022-03-25T17:17:58.165016+08:00 0 [Note] Giving 1 client threads a chance to die gracefully
2022-03-25T17:17:58.165059+08:00 0 [Note] Shutting down slave threads
2022-03-25T17:17:58.165070+08:00 3 [Warning] SEMISYNC: Forced shutdown. Some updates might not be replicated.
2022-03-25T17:17:58.165092+08:00 3 [Note] Semi-sync replication switched OFF.
2022-03-25T17:17:58.165654+08:00 0 [Note] Forcefully disconnecting 0 remaining clients
2022-03-25T17:17:58.165680+08:00 0 [Note] Event Scheduler: Purging the queue. 0 events
2022-03-25T17:17:58.165919+08:00 0 [Note] Binlog end
2022-03-25T17:17:58.167688+08:00 0 [Note] Shutting down plugin 'rpl_semi_sync_slave'
2022-03-25T17:17:58.167719+08:00 0 [Note] Shutting down plugin 'rpl_semi_sync_master'
2022-03-25T17:17:58.167745+08:00 0 [Note] Stopping ack receiver thread
2022-03-25T17:17:58.167831+08:00 0 [Note] unregister_replicator OK
2022-03-25T17:17:58.167843+08:00 0 [Note] Shutting down plugin 'ngram'省略shutting down plugin2022-03-25T17:17:58.167985+08:00 0 [Note] Shutting down plugin 'InnoDB'
2022-03-25T17:17:58.168053+08:00 0 [Note] InnoDB: FTS optimize thread exiting.
2022-03-25T17:17:58.168140+08:00 0 [Note] InnoDB: Starting shutdown...
2022-03-25T17:18:00.704250+08:00 0 [Note] InnoDB: Shutdown completed; log sequence number 63089498676
2022-03-25T17:18:00.705160+08:00 0 [Note] InnoDB: Removed temporary tablespace data file: "ibtmp1"
2022-03-25T17:18:00.705183+08:00 0 [Note] Shutting down plugin 'MEMORY'省略shutting down plugin2022-03-25T17:18:00.705547+08:00 0 [Note] Shutting down plugin 'binlog'
2022-03-25T17:18:00.706904+08:00 0 [Note] /opt/soft/mysql57/bin/mysqld: Shutdown complete

可以看到 shutdown 的整个过程,其中有一个【Stopping ack receiver thread】

3、关闭存储引擎

在这个阶段,服务器会刷新表缓存并关闭所有打开的表。

InnoDB 将其缓冲池刷新到磁盘(除非 innodb_fast_shutdown = 2),将当前 LSN 写入表空间,并终止其自己的内部线程。

4、服务器关闭

进程退出,端口关闭。

四、写在最后

测试结果有点惊讶,曾经认为危险的操作命令却是安全的,曾经认为安全的操作命令反而会导致数据异常。即便如此,我觉得也不用太过纠结了,毕竟丢数据的场景还是很苛刻的。

最后需要提醒一下,在5.7版本以前,要慎用 kill -9 。生产环境十分复杂,请时刻保持敬畏之心,任何操作请充分测试。

http://www.lbrq.cn/news/1310797.html

相关文章:

  • 网站委托建设运营协议/东莞百度seo电话
  • 产品设计大师作品/天津百度seo推广
  • 美国小卖家做deal网站/青岛网站seo优化
  • 建筑网格布搭接/seo优化工具有哪些
  • 合肥网站建设电话咨询/seo优化怎么做
  • 做网站的技术门槛高吗/出售外链
  • 网站备案审核流程图/长沙岳麓区
  • 做网站用的字体/竞价推广账户托管费用
  • WordPress 爬取插件/贵州快速整站优化
  • 深圳福田华丰大厦网站建设/姓名查询
  • 自己如何做网站推广/资源
  • 做石材的一般用什么网站/怎么自己注册网站
  • 网站建设案例展示/营销型网站建设托管
  • 更换网站需要怎么做/长尾关键词挖掘网站
  • 上海公司转让/seo短视频网页入口引流
  • 网站在谷歌怎么做排名/宁波seo博客
  • 宁夏做网站公司/知名网络软文推广平台
  • 企业网站设计文档/seo排名关键词搜索结果
  • 巴中网站建设/百度关键词优化企业
  • 怎么把网站的标题做的炫酷/推广公众号
  • 深圳互联网网页设计招聘/丁的老头seo博客
  • 资阳做网站/识图搜索在线 照片识别
  • 青岛产品设计公司/洛阳seo网络推广
  • vue响应式网站开发/色盲色弱测试
  • 州网站建设要找嘉艺网络/引流推广的句子
  • 帝国做的网站打开速度/百度快速排名平台
  • 网站开发网页制作薪资/百度账号注册
  • 企业网站制作的软件/网络营销好找工作吗
  • 灵犀科技网站建设/夸克搜索网页版
  • 购物网站宣传方案/建一个企业网站多少钱
  • React事件处理
  • Java学习--JVM(2)
  • 学习C++、QT---27(QT中实现记事本项目实现行列显示、优化保存文件的功能的讲解)
  • 如何轻松玩转多线程高并发?
  • 数字IC后端培训教程之数字后端项目典型项目案例解析
  • OFDM系统中关于信号同步的STO估计与CFO估计的MATLAB仿真