您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

配置MySQL主从复制(Replication)服务

添加时间:2014-2-13 17:40:28  添加: 思海网络 
我们一般使用 MySQL 的时候,如果数据量不大,只使用一台 MySQL 服务器,备份的时候使用 mysqldump 工具就可以了,但是随着业务不断发展,问题出现了:数据量直线上升,单独一台数据库服务器开始出现性能的瓶颈,数据访问越来越慢。备份也变得困难了,因为 mysqldump 是导出一份文本文件,而数据量特别大的时候,这样的备份往往需要很长时间。

  如果你遇到了类似上面的问题,你就可 以使用建立 MySQL 主从服务器的复制方式来解决,MySQL 的复制有以下几个优势:主服务器/从服务器设置增加了健壮性,主服务器出现问题时,你可以切换到从服务器继续提供服务。通过在从服务器上执行查询操作来降 低客户查询的负荷,可以得到更好的客户响应时间,但是不要同时在主从服务器上进行更新,这样可能引起冲突。使用复制的另一个好处是可以使用一个从服务器执 行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。

  MySQL 复制的原理:

  MySQL使用3个 线程来执行复制功能,其中1个在主服务器上,另两个在从服务器上。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让主服务器发送二进制日志。主服务器创建一个线程将二进制日志中的内容发送到从服务器。从服 务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,从服务器使用此线程读取中继日志并执行日 志中包含的更新。SHOW PROCESSLIST语句可以查询在主服务器上和从服务器上发生的关于复制的信息。

  默认中继日志使用 host_name-relay-bin.nnnnnn形式的文件名,其中host_name是从服务器主机名,nnnnnn是序列号。用连续序列号来创 建连续中继日志文件,从000001开始。从服务器跟踪中继日志索引文件来识别目前正使用的中继日志。默认中继日志索引文件名为 host_name-relay-bin.index。在默认情况,这些文件在从服务器的数据目录中被创建。中继日志与二进制日志的格式相同,并且可以用 mysqlbinlog读取。当SQL线程执行完中继日志中的所有事件后,中继日志将会被自动删除。

  设置 MySQL 主从复制:

  注意:MySQL 主从服务器最好使用相同的软件版本,以避免不不可预期的故障。

  软件环境:系统 rhel4u8,MySQL-5.1.44,

  主服务器ip:192.168.0.1  hostname:node1

  从服务器ip:192.168.0.2  hostname:node2

  设置主服务器

  1、编辑 /etc/hosts   (此步非必须)

  增加以下内容:

  192.168.0.2    node2 

  2、在主服务器上建立一个为从服务器进行复制使用的用户。该账户必须授予 REPLICATION SLAVE 权限,由于仅仅是进行复制使用所以不需要再授予任何其它权限。

mysql> GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%'192.168.0.2' IDENTIFIED BY 'slavepasswd'; 
mysql> FLUSH PRIVILEGES; 

  3、编辑主服务器的配置文件:/etc/my.cnf的[ mysqld ] 部分:

  server-id = 本机数据库 ID 标示,该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232之间的一个正整数值

  log-bin = 二进制日志的位置和名称

  binlog-do-db = 需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可

  binlog-ignore-db = 不需要备份的数据库苦命,如果备份多个数据库,重复设置这个选项即可

  我的主服务器设置为:

server-id = 1 
log-bin=/usr/local/mysql/data/mysql-bin.000001 
binlog-do-db = wapnews 
binlog-ignore-db = mysql 
binlog-ignore-db = test 
binlog-ignore-db = information_schema

  4、主服务器执行FLUSH TABLES WITH READ LOCK语句清空所有表和块写入语句:

  mysql> FLUSH TABLES WITH READ LOCK; 

  5、保持mysql客户端程序不要退出。开启另一个终端对主服务器数据目录做备份。

[root@node1 ~]# cd /usr/local/mysql/data 
[root@node1 ~]# tar -zcvf /tmp/mysql-wapnews.tar.gz ./wapnews 

  把备份完毕的数据库备份复制到从服务器上。

  6、当FLUSH TABLES WITH READ LOCK所置读锁定有效时(即mysql客户端程序不退出),读取主服务器上当前的二进制日志名和偏移量值:

mysql > SHOW MASTER STATUS; 
+-----------------------------+---------------+-------------------------+--------------------------------------------+ 
| File                 | Position   | Binlog_Do_DB    | Binlog_Ignore_DB             | 
+------------------------------+---------------+-------------------------+--------------------------------------------+ 
| mysql-bin.000001    | 73        | wapnews        | test,mysql,information_schema | 
+------------------------------+---------------+-------------------------+--------------------------------------------+ 

  File列显示日志名,而Position显示偏移量。在该例子中,二进制日志值为mysql-bin.000001,偏移量为73。记录该值。以后设置从服务器时需要使用这些值。它们表示复制坐标,从服务器应从该点开始从主服务器上进行新的更新。

  取得快照并记录日志名和偏移量后,回到前一中端重新启用写活动:

  mysql> UNLOCK TABLES; 

  设置从服务器:

  1、编辑/etc/hosts    (此步非必要)

  增加以下内容:

  192.168.0.1 node1 

  2、停止从服务器上的mysqld服务并编辑从服务器的配置文件:/etc/my.cnf 的[ mysqld ] 部分:

  server-id = 本机数据库 ID 标示,该部分还应有一个server-id=Master_id选项,其中master_id必须为1到232之间的一个正整数值

  [root@node2 ~]# service mysqld stop

  我的从服务器配置

  server-id=2

  3、将主服务器数据库备份恢复到从服务器的数据目录中。确保对这些文件和目录的权限正确。服务器 MySQL运行的用户必须能够读写文件,如同在主服务器上一样。

[root@node2 ~]# cd /usr/local/mysql/data 
[root@node2 ~]# tar -zxvf mysql-wapnews.tar.gz 
[root@node2 ~]# chown -R mysql:mysql /usr/local/mysql/data/wapnews 

  4、启动从服务器。在从服务器上执行下面的语句,用你的系统的实际值替换选项值:

mysql> CHANGE MASTER TO 
     -> MASTER_HOST='master_host_name', 
     -> MASTER_USER='replication_user_name', 
     -> MASTER_PASSWORD='replication_password', 
     -> MASTER_LOG_FILE='recorded_log_file_name', 
     -> MASTER_LOG_POS=recorded_log_position;

  我的从服务器设置:

mysql> change master to 
  -> master_host='192.168.0.1', 
  -> master_user='replication', 
  -> master_password='slavepass', 
  -> master_port=3306 
  -> master_log_file='mysql-bin.000001', 
  -> master_log_pos=73, 
  -> master_connect_retry=30; 

  5、启动从服务器线程:

  mysql> START SLAVE; 

  执行这些程序后,从服务器应连接主服务器,并补充自从快照以来发生的任何更新。

  检查主从复制是否正常运行

  在从服务器上运行 show processlist 命令,检查是否启动两个复制进程。

mysql> show processlist \G; 
*************************** 1. row *************************** 
   Id: 44 
  User: system user 
  Host: 
   db: NULL 
Command: Connect 
  Time: 490 
 State: Waiting for master to send event 
  Info: NULL 
*************************** 2. row *************************** 
   Id: 45 
  User: system user 
  Host: 
   db: NULL 
Command: Connect 
  Time: 390 
 State: Has read all relay log; waiting for the slave I/O thread to update it 
  Info: NULL 
3 rows in set (0.00 sec) 

  在从服务器上运行 show slave status 命令,检查复制进程是否正确。

mysql> show slave status \G; 
*************************** 1. row *************************** 
        Slave_IO_State: Waiting for master to send event 
         Master_Host: 192.168.0.1 
         Master_User: replication 
         Master_Port: 3306 
        Connect_Retry: 30 
       Master_Log_File: mysql-bin.000001 
     Read_Master_Log_Pos: 73 
        Relay_Log_File: localhost-relay-bin.000002 
        Relay_Log_Pos: 251 
    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: 106 
       Relay_Log_Space: 410 
       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 
Master_SSL_Verify_Server_Cert: No 
        Last_IO_Errno: 0 
        Last_IO_Error: 
        Last_SQL_Errno: 0 
        Last_SQL_Error: 
1 row in set (0.00 sec) 

   上面出现: Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 表示复制正常,如果有一个显示是NO,请检查以上的主从设置步骤是否正确。如果出现复制错误,从服务器的错误日志(HOSTNAME.err)中也会出现 错误消息。出处:http://7056824.blog.51cto.com/69854/400642

  注意:从服务器复制时,会在其数据目录中发现文件master.info和HOSTNAME-relay- log.info。状态文件保存在硬盘上,从服务器关闭时不会丢失。下次从服务器启动时,读取这些文件以确定它已经从主服务器读取了多少二进制日志,以及 处理自己的中继日志的程度。不要移除或编辑这些文件,除非你确切知你正在做什么并完全理解其意义。即使这样,最好是使用CHANGE MASTER TO语句。

关键字:服务器、MySQL、日志

分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站