创建MySQL主从复制设置并进行故障排除的最佳方法是什么?


14

我是数据库管理的新手。

设置mysql主从复制时,我遇到很多问题。

我还面临常规的mysql复制故障排除问题。

有人可以帮助我了解如何应对所有这些问题吗?


有两个问题:为什么需要进行复制,要达到什么目的?参与复制的每台计算机的操作系统是什么?每台计算机上的MySQL版本是什么?表是MyISAM,InnoDB,还是其他?
Craig Efrein 2011年

@CraigEfrein我需要设置复制,因为这些服务器将用于生产中。我在每台计算机上使用Debian / ubuntu。mysql5.1是vaersion。主要的表是InnoDB。
阿卜杜勒·马纳夫

好的,我将稍后发布在两个debian之间使用的配置。当然,这是假设您在所有计算机上都安装了MySQL,并且它们都使用相同的版本,并且具有足够的磁盘空间。使用MySQL复制时,您必须考虑将bin日志放在何处,取决于几个因素,bin日志可能会变得很大。我会将这些信息包含在我的帖子中
Craig Efrein 2011年

Answers:


19

我提供了教程的链接。请记住,在Ubuntu上,my.cnf文件位于/etc/mysql/my.cnf中,而不是howtoforge教程中的/etc/my.cnf中。在我的设置中,我没有使用带读锁的FLUSH TABLES。在主人身上。如果您的主服务器有很多写活动,则可能需要在备份之前通过运行该命令来锁定表。如果将FLUSH TABLES WITH READ LOCK;使用,则在备份后,您将需要运行UNLOCK TABLES。如果您遇到任何问题,请告诉我。

这是我在Howto伪造的教程上找到的,它是为Redhat / CentOS制作的:http : //www.howtoforge.com/mysql_database_replication

另一个对Ubuntu来说不错的教程 http://www.srcnix.com/2010/10/14/simple-mysql-replication-with-ubuntu-master-to-slave/

这是我使用的配置:

在主服务器上

配置主服务器:

vi /etc/mysql/my.cnf

[mysqld]

# bind-address = 127.0.0.1 (comment this out)
server_id           = 1
log_bin             = /var/log/mysql/mysql-bin.log
log_bin_index       = /var/log/mysql/mysql-bin.log.index
max_binlog_size     = 100M
expire_logs_days    = 1

重新启动MySQL:

/etc/init.d/mysql restart

连接到mysql的控制台:mysql -u root -ppassword

创建并授予复制用户权限。

GRANT REPLICATION SLAVE ON *.* TO 'replication'@'ipaddressofslave' IDENTIFIED BY 'replicationuserpassword';

确保将此信息复制到某处或使其可见

SHOW MASTER STATUS \G;
mysql> show master status \G;
            File: mysql-bin.000001
        Position: 100
    Binlog_Do_DB: 
Binlog_Ignore_DB:

mysql> quit 

将数据库转储到文件中:

mysqldump -u root -p databasename > /tmp/databasename-backup.sql

如果愿意,可使用scp将数据库转储复制到从属服务器或使用ftp:

scp /tmp/databasename-backup.sql root@ipaddressofslave:/tmp/

在从服务器上

编辑mysql配置:

vi /etc/mysql/my.cnf
[mysqld]

# slave server configuration
server_id           = 2

# this is optional, but I find it useful to specify where the relay logs go to control.  
# Don't forget to create the /var/log/mysql directory and give mysql rights to it.  
# chown mysql:mysql -R /var/log/mysql
# disk space
relay_log           = /var/log/mysql/mysql-relay-bin
relay_log_index     = /var/log/mysql/mysql-relay-bin.index
relay_log_space_limit = 2000M

重新启动MySQL: /etc/init.d/mysql restart

恢复备份:

mysql -u root -ppassword nameofthedatabase < /tmp/databasename-backup.sql

连接到MySQL:

mysql -u root -ppassword

stop slave;

# master log file and master_log_pos taken from show master status above
CHANGE MASTER TO master_host='ipaddressmaster', master_port=3306, master_user='replication', master_password='replicationuserpassword', master_log_file='mysql-bin.000001', master_log_pos=100;

start slave;

运行SHOW SLAVE STATUS\G

mysql> show slave status\G;
             Slave_IO_State: Waiting for master to send event
                Master_Host: ipaddressmaster
                Master_User: replication
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.0000001
        Read_Master_Log_Pos: 100
             Relay_Log_File: mysql-relay-bin.000001
              Relay_Log_Pos: 1
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 0
                 Last_Error: 
               Skip_Counter: 0
        Exec_Master_Log_Pos: 17324288
            Relay_Log_Space: 17324425
            Until_Condition: None
             Until_Log_File: 
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File: 
         Master_SSL_CA_Path: 
          Master_SSL_Cert: 
          Master_SSL_Cipher: 
             Master_SSL_Key: 
      Seconds_Behind_Master: 0
1 row in set (0.02 sec)

此后,请记住复制可能由于各种原因而失败。在从站上,可以通过运行命令SHOW SLAVE STATUS \ G;来监视状态。或设置cron作业以监视状态并在失败时发送电子邮件。熟悉此命令的输出。如果复制正常运行,则应该看到“ Slave_IO_State:正在等待主服务器发送事件”。

正确设置后,我可以为您提供脚本来监视该复制。

这是一个脚本,用于监视MySQL中的错误日志。如果添加行

[mysqld]

日志错误= /var/log/mysql/mysql.err

重新启动mysql:/etc/init.d/mysql重新启动

然后,您可以使用以下脚本监视日志文件。如果日志以任何方式更改,您将收到一封电子邮件,通知您从属服务器上发生了错误。如果要定期检查错误日志,则需要将此脚本添加到crontab中。

这是一个示例脚本:/somepath/monitor_mysql_log.sh

#! /bin/sh
MAIL_TO="addressemail@something.com"

# This is the log that will be monitored.
# If any changes occur to this, then take appropriate action.
MONITORED_LOG=/var/log/mysql/mysql.err

# We will need this log to see whether any changes occured to /tmp/goreb.log
TEMP_LOG=/tmp/.mysql.err.1

# This is a 1-time command i.e. create the log file if it does nto exist.
[ ! -f $TEMP_LOG ] && touch -r $MONITORED_LOG $TEMP_LOG

[ $MONITORED_LOG -nt $TEMP_LOG ] && echo "an error occurred in mysql" | mail -s "Error on MySQL" $MAILTO

# Update $TEMP_LOG with the new modified date of $MONITORED_LOG
touch -r $MONITORED_LOG $TEMP_LOG

要添加到crontab。

使脚本可执行:

chmod +x /somepath/monitor_mysql_log.sh

更新crontab:

crontab -e

* * * * * /somepath/monitor_mysql_log.sh

脚本将每分钟运行一次。

我提供的脚本是我很快组合在一起的脚本。另外,为了使服务器能够发送电子邮件,您必须安装诸如postfix或sendmail之类的东西。


非常感谢我这样做,我能够设置复制...
Abdul Manaf

您可以向我提供用于监视复制的脚本吗?
阿卜杜勒·马纳夫

简要说明一下,我刚刚添加的脚本是您要在从属服务器上安装的脚本。您可以将其安装在主服务器上,但根据您的问题,从服务器上的错误日志将是您最感兴趣的日志。
Craig Efrein 2011年

谢谢您的关注。但基本上,我对复制错误疑难解答感兴趣,我认为此脚本将监视错误日志的更改(我将对其进行设置)。
阿卜杜勒·马纳夫

由于您的从属服务器将仅接收数据而不会更新数据,因此错误日志中记录的大多数信息都与复制有关。例如,如果主服务器上的表损坏,则从服务器将不会复制该表,并且实际上将停止复制。如果您在从属服务器的错误日志中看到错误。通常,这是一个很好的指示,表明复制存在问题。
克雷格·埃夫赖恩

7

Mysqldump速度很快,但是对于大型数据库而言,恢复转储的速度可能非常慢,并且在活动站点上不能接受锁定表。设置奴隶的更好,更快的方法是使用Percona的XtraBackup。XtraBackup对主服务器的负载很小,不需要锁定,并且从属服务器的还原非常快。这种机制的确会产生整个数据库的完整克隆,包括用户表之类的东西,这会破坏一些由库存安装设置的东西,例如debian-sys-maint用户,这不一定是一件坏事。 !

另外,一旦您知道该怎么做,便可以使用完全相同的机制进行日常备份。备份比mysqldump慢,但是还原要快得多,如果您处于紧急状态并且需要还原备份,这正是您所需要的!如果您遇到严重的复制错误,只需使用以下步骤将从属设备丢弃并重建即可;确实不需要很长时间。

您将需要为您的发行版设置Percona的apt / yum存储库,然后将xtrabackup软件包安装在主服务器和从服务器上。我也强烈建议使用Pigz压缩实用程序(并行gzip,在大多数标准存储库中可用),因为它对备份速度有很大的不同。

这个过程是这样的(在Ubuntu上,其他发行版可能会略有不同),并假定您已经在从属服务器上安装了MySQL:

  1. 首先,在主服务器上进行备份:(mkdir -p /var/xtrabackup; /usr/bin/innobackupex --slave-info --stream=tar --throttle=1500 /var/xtrabackup 2> /tmp/xtrabackup.out | /usr/bin/pigz -p 4 -c --best -q > /var/backups/mysql.tgz调整油门值以限制备份对实时服务的影响)
  2. 将备份文件复制到从属服务器(用于scp -l 400000避免主服务器占用实时客户端的网络带宽)
  3. 在slave上停止mysql: service mysql stop
  4. 移开旧的MySQL数据目录:(mv /var/lib/mysql /var/lib/mysql2或在磁盘空间不足的情况下将其压缩)
  5. 新建一个数据目录并移至其中: mkdir /var/lib/mysql; cd /var/lib/mysql
  6. 将备份文件解压缩到新文件夹:中tar xvzif /path/to/backup/mysql.tgz注意itar操作上的选项-没有该选项将无法使用。如果您的数据库很大,这将需要一段时间。
  7. 在提取的文件上运行Innobackupex工具/usr/bin/innobackupex --apply-log --use-memory=6G --ibbackup=xtrabackup /var/lib/mysql。这样可以有效地对二进制日志中的文件运行崩溃恢复。这只需要几秒钟;如果在较小的服务器上,则使用较小的内存量。
  8. 假设成功完成,请删除备份并设置文件所有权: rm /path/to/backup/mysql.tgz; chown -R mysql:mysql /var/lib/mysql
  9. 启动mysql: service mysql start
  10. 获取主日志文件名和备份(注意不是在xtrabackup_slave_info的信息)的位置:cat xtrabackup_binlog_info。它会说类似mysql-bin.000916 13889427
  11. 连接到MySQL并检查是否有东西。
  12. 使用关于日志的详细信息重置复制设置:(CHANGE MASTER TO MASTER_HOST='192.168.0.1', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000916', MASTER_LOG_POS=13889427;更改为与实际的数据库服务器详细信息匹配)
  13. 重新启动从站: START SLAVE;
  14. 在slave跟上master之前检查slave的状态,直到“ seconds_behind_master”为0: SHOW SLAVE STATUS\G

现在您的奴隶已全部设置好。如果需要,您现在可以设置循环复制:

  1. 在从服务器上:FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;注意日志文件的名称和位置(类似于mysql-bin.000031和17244785)。
  2. 在master:上CHANGE MASTER TO MASTER_HOST='192.168.0.2', MASTER_USER='replica', MASTER_PASSWORD='r3plica', MASTER_LOG_FILE='mysql-bin.000031', MASTER_LOG_POS=17244785;,从刚刚看过的slave中插入值。
  3. 在高手: START SLAVE;
  4. 在奴隶上: UNLOCK TABLES;

现在,您应该已经全部准备好循环复制。

就故障排除而言,Percona的工具包提供了各种帮助,例如校验和以发现无声损坏,滞后测量等等。通过binlog_format = MIXED在my.cnf中进行设置,可以避免最常见的复制损坏形式。就是说,以我的经验,复制通常并不麻烦。


你的忠诚度是多少?
Pacerier

没有,除了作为满意的用户。
同步
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.