mysql thread入门分析

author:skate
time:2012/12/4

 

mysql thread入门分析

 

今天下午和群里的朋友讨论mysql的thread pool,讨论的非常热闹,收获不少,借此自己也总结下thread,以备忘。下面贴上lidan的图片:

 

Mysql支持单线程和多线程两种连接线程模式,如果单线程,则在同一时刻,只能有一个connection连接到Mysql,其他的连接会被挂起。如果是多线程,则同一时刻可以支持多个connection同时连接到服务器。mysql使用哪种线程模式通过下面变量控制。

mysql> show variables like '%thread_handling%';
+-----------------+---------------------------+
| Variable_name   | Value                     |
+-----------------+---------------------------+
| thread_handling | one-thread-per-connection |
+-----------------+---------------------------+
1 row in set (0.02 sec)

客户端发起连接到mysql server,mysql server监听进程,监听到新的请求,然后mysql为其分配一个新的 thread,去处理此请求。从建立连接之开始,CPU要给它划分一定的thread stack,然后进行用户身份认证,建立上下文信息,最后请求完成,关闭连接,同时释放资源,在高并发的情况下,将给系统带来巨大的压力,不能保证性能。所以,mysql通过线程缓存来是实现线程重用,减小这部分的消耗;一个connection断开,并不销毁承载其的线程,而是将此线程放入线程缓冲区,并处于挂起状态,当下一个新的Connection到来时,首先去线程缓冲区去查找是否有空闲的线程,如果有,则使用之,如果没有则新建线程。

mysql通过 thread_cache_size这参数来设置可以重用线程的个数,他的大小可以通过状态变量Threads_cached和Threads_created来设置


mysql> show status like 'thread%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 2     |
| Threads_created   | 1065  |
| Threads_running   | 1     |
+-------------------+-------+
4 rows in set (0.13 sec)

Threads_cached:已经被线程缓存池缓存的线程个数
Threads_created:已经创建的线程个数,通过这个变化的趋势,可以判断thread_cache_size参数值

在5.5.16以前,线程处理的模式是,每个请求就对应一个线程的模式,这就意味着当有成千上万的请求时,对应的也就需要成千上万的线程来相应这些请求,那么此刻问题就很明显了,系统的资源是有限的,必须要保证thread_number*thread_stack不能超过可以使用的内存资源,还要考虑CPU的调度能力,I/O的处理能力,这是一种很粗放的资源使用方式,同时,这种不加控制的处理方式,也会带来资源使用的冲突,大量互斥锁的出现,性能的急剧下降。在5.5.16以后通过Thread Pool来控制确保不会超过服务器的最大负载能力,避免出现服务无响应,导致宕机的惨状。

 

thread pool是如何动态控制并发线程数量的?待续....

 

 

 

### MySQL 主从复制入门教程 #### 什么是主从复制? MySQL 的主从复制是一种实现高可用性和数据冗余的技术。通过这种机制,可以将一台 MySQL 数据库服务器设置为主服务器 (Master),其他的一台或多台 MySQL 数据库服务器设为从服务器 (Slave)[^1]。 在主从复制架构下,所有的写入操作都在 Master 上执行;而读取请求则可以在 Slave 上分担,从而减轻 Master 的负担。这种方式不仅提高了系统的性能,还增强了数据的安全性——即使 Master 出现故障,也可以迅速切换到其中一个 Slave 继续服务[^5]。 #### 配置步骤概述 为了成功建立 MySQL 主从复制关系,需按照如下流程进行配置: ##### 修改 Master 和 Slave 的 my.cnf 文件 确保 `server-id` 参数唯一,并开启二进制日志功能以便记录所有更改事件。对于 Master 来说,还需要指定 binlog-do-db 或者 binlog-ignore-db 控制哪些数据库应该被记录下来用于同步给 Slaves 使用。 ```ini # Example configuration on the master server (/etc/mysql/my.cnf or similar path) [mysqld] server-id=1 log-bin=mysql-bin binlog-format=row expire_logs_days=7 max_binlog_size=100M ``` 同样地,在每一个 Slave 实例上也需要修改相应的参数来匹配 Master 设置,特别是要保证各自的 `server-id` 不同且大于零。 ```ini # Example configuration on a slave server [mysqld] server-id=2 relay-log=mysql-relay-bin read-only=ON ``` ##### 创建用于复制的账户 为了让 Slave 可以连接至 Master 并拉取消息流,需要创建一个具有 REPLICATION SLAVE 特权的新用户账号。 ```sql CREATE USER 'replicator'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replicator'@'%'; FLUSH PRIVILEGES; ``` ##### 获取 Master 当前状态信息 在 Master 中锁定表结构防止任何 DDL/DML 操作发生的同时查询当前的日志文件名以及位置编号,之后解锁表格继续正常运作。 ```sql FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS; +----+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000001 | 123 | | | | +-----+ UNLOCK TABLES; ``` ##### 同步初始数据集 使用 mysqldump 工具导出 Master 上的数据并将之导入到各个 Slave 节点当中去。注意这里应当排除掉那些不需要参与复制过程中的特定模式(schema),比如 performance_schema, information_schema 等系统自带的内容。 ```bash mysqldump --all-databases --single-transaction \ --master-data=2 --routines --triggers \ --ignore-table=performance_schema.% \ --ignore-table=information_schema.% > dump.sql mysql -u root -p < dump.sql ``` ##### 开始复制进程 最后一步是在每个 Slave 上启动 IO_THREAD 和 SQL_THREAD 进程,这两个线程分别负责接收来自 Master 的更新指令并将其应用于本地实例之上。 ```sql CHANGE MASTER TO MASTER_HOST='master_host_ip', MASTER_USER='replicator', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123; START SLAVE; ``` 验证一切工作正常后可通过 SHOW SLAVE STATUS\G 查看详细的运行状况报告,确认没有错误提示即可认为整个部署顺利完成。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值