MySQL主从配置的一些总结

【独家特稿】一、做了MySQL主从也有一段时间了,这两天检查磁盘空间情况,发现放数据库的分区磁盘激增了40多G,一路查看下来,发现配置好主从复制以来到现在的binlog就有40多G,原来根源出在这里,查看了一下my.cnf,看到binlog的 size是1G就做分割,但没有看到删除的配置,在MySQL里show了一下variables:

作者个人博客:andrewyu.blog.

  1. mysql>show variables like '%log%'

查到了,

  1. | expire_logs_days | 0 | 

这个默认是0,也就是logs不过期,这个是一个global的参数,所以需要执行

  1. set global expire_logs_days=8; 

这样8天前的log就会被删除了,如果有回复的需要,请做好备份工作,但这样设置还不行,下次重启mysql了,配置又恢复默认了,所以需在my.cnf中设置,

  1. expire_logs_days = 8 

这样重启也不怕了。

现在我在生产环境下的做法是将此时间设为0,然后备份mysql日志文件,然后再手动清理此文件。

想要恢复数据库以前的资料,执行

  1. mysql>show binlog events; 

由于数据量很多,查看起来很麻烦,光打开个文件就要闪半天,所以应该适当删除部分可不用的日志。

并且如果使用的时间足够长的话,会把我的硬盘空间都给吃掉。

1、登录系统,/usr/bin/mysql

使用mysql查看日志:

  1. mysql>show binary logs; 
  2. +—————-+———–+ 
  3. | Log_name | File_size | 
  4. +—————-+———–+ 
  5. | ablelee.000001 | 150462942 | 
  6. | ablelee.000002 | 120332942 | 
  7. | ablelee.000003 | 141462942 | 
  8. +—————-+———–+ 

2、删除bin-log(删除ablelee.000003之前的而没有包含ablelee.000003):

  1. mysql> purge binary logs to ′ablelee.000003′; 
  2. Query OK, 0 rows affected (0.16 sec) 

3、查询结果(现在只有一条记录了):

  1. mysql> show binlog events\G  
  2. *************************** 1. row ***************************  
  3. Log_name: ablelee.000003  
  4. Pos: 4  
  5. Event_type: Format_desc  
  6. Server_id: 1  
  7. End_log_pos: 106  
  8. Info: Server ver: 5.1.26-rc-log, Binlog ver: 4  
  9. 1 row in set (0.01 sec)  
  10. (ablelee.000001和ablelee.000002已被删除)  
  11. mysql> show binary logs;  
  12. +—————-+———–+  
  13. | Log_name | File_size |  
  14. +—————-+———–+  
  15. | ablelee.000003 | 106 |  
  16. +—————-+———–+  
  17. 1 row in set (0.00 sec)  
  18. (删除的其它格式运用!)  
  19. PURGE {MASTER | BINARY} LOGS TO ‘log_name’  
  20. PURGE {MASTER | BINARY} LOGS BEFORE ‘date’  

用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为***个。

例如:

  1. PURGE MASTER LOGS TO 'mysql-bin.010'
  2. PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00'

二、现在手上蛮多项目的数据库用的是MySQL,由于权限等原因,暂时不方便部署Nagios监控MySQL主从复制,所以我一般在从机上配置了SHELL脚本用来监控MySQL的主从状态(设置为每十分钟运行一次),并且每次出问题时将确切日期写进错误日志,方便事后排查原因,脚本内容如下:

  1. #!/bin/bash 
  2. #check MySQL_Slave Status 
  3. #crontab time 00:10 
  4. MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{print $4}'
  5. MYSQLIP=`ifconfig eth0|grep "inet addr" | awk -F[:" "]+ '{print $4}'
  6. STATUS=$(/usr/local/webserver/mysql/bin/mysql -u yuhongchun -pyuhongchun101 -S /tmp/mysql.sock -e "show slave status\G" | grep -i "running"
  7. IO_env=`echo $STATUS | grep IO | awk ' {print $2}'
  8. SQL_env=`echo $STATUS | grep SQL | awk '{print $2}'
  9.  
  10.  
  11. if [ "$MYSQLPORT" == "3306" ] 
  12. then 
  13. echo "mysql is running" 
  14. else 
  15. mail -s "warn!server: $MYSQLIP mysql is down" [email protected] 
  16. fi 
  17.  
  18. if [ "$IO_env" = "Yes" -a "$SQL_env" = "Yes" ] 
  19. then 
  20. echo "Slave is running!" 
  21. else 
  22. echo "####### $date #########">> /data/data/check_mysql_slave.log 
  23. echo "Slave is not running!" >> /data/data/check_mysql_slave.log 
  24. mail -s "warn! $MySQLIP_replicate_error" [email protected] << /data/data/check_mysql_slave.log 
  25. fi 

建议每十分钟运行一次。

  1. */10 * * * * root /bin/sh /root/mysql_slave.sh  

记得在每台MySQL从机上分配一个yuhongchun的用户,权限大些也没关系,只限定在本地运行,如下所示:

  1. grant all privileges on *.* to "yuhongchun"@"127.0.0.1" identified by "yuhongchun101"
  2. grant all privileges on *.* to "yuhongchun"@"localhost" identified by "yuhongchun101"

脚本设计思路:

1、此脚本应该能适应各种各样不同的内外网环境,即IP不同的环境;

2、让脚本也顺便监控下MySQL是否正常运行;

三、innodb_buffer_pool_size的设置。

这个参数定义了InnodDB存储引擎的表数据和索引数据的***内存缓冲区大小。和MyISAM存储引擎不同,MyISAM的key_buffer_size只缓存索引键,而innodb_buffer_pool_size却是同时为数据块和索引块 做缓存,这个特征和Oracle是一样的,这个值设得越高,访问表中数据需求的I/O就越少。在一个专用的数据库服务器,可以设置这个参数达机器物理内存的80%,我现在一般的做法是配置成物理内存的 1/4,比如8G内存的生产数据库,我一般会配置成2G左右。

四、测试了很长一段时间的MySQL的负载均衡,***综合了老男孩和其它技术高手的意见,最终决定还是用LVS+Keepalived来作为MySQL的负载均衡,这是因为后端机器超过10台时,LVS的性能还是***的;如果在3-5台左右,HAProxy也可以很轻松的搞定工作。

五、大家都很清,磁盘I/O总会成为数据库的性能瓶颈,这时候我们应该如何在生产环境下选择合适的RAID级别呢?

1、如果数据读写都很频繁,可靠性要求也很高,***选择RAID10;

2、如果数据读很频繁,写相对较少,对可靠性有一定要求,可以选择RAID5;

3、如果数据读写都很频繁,但可靠性要求不高,可以选择RAID0。

4、对于核心业务的数据库主从同步,建议从机的备份时间往后延迟一段时间,通常的做法是延迟一天左右。

作者介绍:

余洪春(抚琴煮酒),《构建高可用Linux服务器》一书作者,一拍网系统架构师、资深项目管理工程师,ChinaUnix集群和高可用版版主。

【编辑推荐】

  1. Ubuntu MySQL热备份安装
  2. MySQL中创建及优化索引组织结构的思路
  3. 说说一些有用的MySQL语句
  4. MySQL从库集群方案之HAProxy篇
  5. MySQL安装详解(V5.5 For Windows)

 

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/273077.html<

(0)
管理的头像管理
上一篇2025-05-09 02:41
下一篇 2025-05-09 02:43

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注