MySQL主从同步配置

MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。(这与同步复制可以进行对比,同步复 制是MySQL簇的一个特征)。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个 从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通 知新的更新。
单向复制有利于健壮性、速度和系统管理:
·          主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器。
·          通过在主服务器和从服务器之间切分处理客户查询的负载,可以得到 更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器 保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
·          使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
MYSQL复制需要理解注意的地方:
MySQL复制基于主服务器在二进制日志中记录所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。
二进制日志只是一个从启用二进制日志的固定时间点开始的数据库操作记录。所以设置任何从服务器时,首先要把从服务器的数据库与主服务器开启二进制时的数据库同步。如果启动从服务器时,其数据库与主服务器数据库启动二进制日志时的状态不相同,从服务器很可能失败。
MYSQL复制设置步骤:
1.同步主从数据库
登录数据库管理命令行,执行FLUSH TABLES WITH READ LOCK语句清空所有表和块的写入语句。
mysql> FLUSH TABLES WITH READ LOCK;
进入MYSQL的数据库存放路径,使用tar对要设备主从复制的数据库进行压缩归档:
shell> tar -cvf /tmp/mysql-snapshot.tar ./this_db
确认MYSQL当前是否开启了二进制日志,如果当前已经开启了二进制日志请执行:SHOW MASTER     STATUS;命令,记录当前二进志日志文件名和日志的偏移量,这在设置从服务器时用来确定要读取    二进制日志的位置。
mysql > SHOW MASTER STATUS;
+—————+———-+————–+——————+
| File         | Position | Binlog_Do_DB        | Binlog_Ignore_DB |
+—————+———-+————–+——————+
| mysql-bin.003 | 73            | test                    | manual,mysql |
+—————+———-+————–+——————+
如果当前没有开启二进制日志请设置MYSQL配置文件,开启MYSQL的二进制功能,然后重新启动 MYSQL,登录到MYSQL命令行,重新启用MYSQL写操作。
mysql> UNLOCK TABLES;
接下来把刚才压缩备份的数据库复制到从服务器的数据库存放目录,解压,更改这些文件的权限, 确保对这些文件和目录的权限正确,MySQL的运行用户必须能够读写这些文件。
2.设置MYSQL配置文件
确保主服务器的mysql配置文件my.cnf文件的[mysqld]部分包括一个log-bin选项,如果需要只   对某一个数据库进行复制,在log-bin下加入binlog-do-db=XXX和一个server-id=Master_id选项,其中server-id的值必须为1到232–1之间的一个正整数值。
[mysqld]
log-bin=mysql-bin
server-id=1
登录到MYSQL命令行,为从服务器创建一个同步帐户:
mysql> GRANT REPLICATION SLAVE ON *.* TO ‘repl’@’slave_ip’ IDENTIFIED BY ‘pass’;
编辑从服务器的MYSQL配置文件,确保从服务器的server-id与主服务器的server-id不冲突。
[mysqld]
server-id=2
3.开始主从同步
在从服务器上执行下面的语句,用你的系统的实际值替换选项值:
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;
master_host_name:主服务器的计算机名或IP地址
replication_user_name:主服务器为从服务器设置的复制帐号
replication_password:复制帐号密码
recofded_log_file_name:主从服务器数据库同步时所记录的二进制文件名
recorded_log_position:主从服务器数据库同步时所记录的二进制偏移量,也就是要读取数据库          日志的位置。
启动从服务器线程:mysql> START SLAVE;
执行这些程序后,从服务器应连接主服务器,并执行自从数据库同步以来发生的任何更新。
从服务器复制时,会在其数据目录中生成dmaster.info和relay-log.info两个 文件。从服务器使用这两个文件记录已经处理了多少主服务器的二进制日志。不要移除或编辑这些文件,除非你清楚你正在做什么并完全理解其含义。即使这样,最 好是使用CHANGE MASTER To语句来修改。

CHANGE MASTER TOmaster_def[,master_def] …

 
master_def:
       MASTER_HOST = 'host_name'
     | MASTER_USER = 'user_name'
     | MASTER_PASSWORD = 'password'
     | MASTER_PORT =port_num
     | MASTER_CONNECT_RETRY =count
     | MASTER_LOG_FILE = 'master_log_name'
     | MASTER_LOG_POS =master_log_pos
     | RELAY_LOG_FILE = 'relay_log_name'
     | RELAY_LOG_POS =relay_log_pos
     | MASTER_SSL = {0|1}
     | MASTER_SSL_CA = 'ca_file_name'
     | MASTER_SSL_CAPATH = 'ca_directory_name'
     | MASTER_SSL_CERT = 'cert_file_name'
     | MASTER_SSL_KEY = 'key_file_name'
     | MASTER_SSL_CIPHER = 'cipher_list'

可以更改从属服务器用于与主服务器进行连接和通讯的参数。

MASTER_USER,MASTER_PASSWORD,MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,MASTER_SSL_CERT,MASTER_SSL_KEYMASTER_SSL_CIPHER用于向从属服务器提供有关如何与主服务器连接的信息。

即使对于在编译时没有SSL支持的从属服务器,SSL选项(MASTER_SSL,MASTER_SSL_CA,MASTER_SSL_CAPATH,MASTER_SSL_CERT,MASTER_SSL_KEYMASTER_SSL_CIPHER)也可以被更改。它们被保存到master.info文件中,但是会被忽略,直到您使用一个SSL支持已启用的服务器。

如果您不指定一个给定的参数,则它会保持其原有的值。例外情况在后面的讨论中进行了说明。举例说明,如果用于连接到您的MySQL主服务器的 密码被更改了,您只需发布这些语句,就可以告知从属服务器新的密码:

mysql>STOP SLAVE; -- if replication was running
mysql>CHANGE MASTER TO MASTER_PASSWORD='new3cret';
mysql>START SLAVE; -- if you want to restart replication

没有必要指定没有改变的参数(主机、接口、用户等)。

MASTER_HOSTMASTER_PORT是主服务器主机和其TCP/IP接口的主机名(或IP地址)。注意,如果MASTER_HOSTlocalhost相等,那么,和MySQL的其它部分一样,接口可以被忽略(例如,如果可以使用Unix插槽文件)。

如果您指定了MASTER_HOSTMASTER_PORT,则从属服务器会假定主服务器与以前不一样(即使您指定的主机或接口值与当前值是一样的。)在此情况下,主服务器二进制日志的名称和位置的原有值不再适用,因此,如果您不指定语句中的MASTER_LOG_FILEMASTER_LOG_POSMASTER_LOG_FILE=”MASTER_LOG_POS=4会被静默地添加。

MASTER_LOG_FILEMASTER_LOG_POS坐标点,从属服务器I/O线程在启动之后从主服务器读取。如果您只指定了其中一个,则从属服务器不能指定RELAY_LOG_FILERELAY_LOG_POS。如果MSATER_LOG_FILEMASTER_LOG_POS都没有被指定,则从属服务器会使用在CHANGE MASTER被发布前的最后一个slave SQL thread坐标。当您只想改变要使用的 密码时,这可以确保复制的连续性。即使从属服务器SQL线程落后于从属服务器I/O线程,也可以确保复制的连续性。

CHANGE MASTER会删除所有的中继日志文件并启动一个新的日志,除非您指定了RELAY_LOG_FILERELAY_LOG_POS。在此情况下,中继日志被保持;relay_log_purge全局变量被静默地设置为0

CHANGE MASTER TO可以更新master.inforelay-log.info文件的内容。

当您拥有主服务器快照并拥有日志和对应的偏移量时,CHANGE MASTER对于设置从属服务器是有用的。在把快照载入从属服务器之后,您可以在从属服务器上运行CHANGE MASTER TO MASTER_LOG_FILE=’log_name_on_master‘, MASTER_LOG_POS=log_offset_on_master

举例说明:

mysql>CHANGE MASTER TO
     ->    MASTER_HOST='master2.mycompany.com',
     ->    MASTER_USER='replication',
     ->    MASTER_PASSWORD='bigs3cret',
     ->    MASTER_PORT=3306,
     ->    MASTER_LOG_FILE='master2-bin.001',
     ->    MASTER_LOG_POS=4,
     ->    MASTER_CONNECT_RETRY=10;
 
mysql>CHANGE MASTER TO
     ->    RELAY_LOG_FILE='slave-relay-bin.006',
     ->    RELAY_LOG_POS=4025;

第一个例子可以更改主服务器及其二进制日志坐标。当想要设置从属服务器来复制主服务器时使用。

第二个例子显示了较少被使用的一个操作。当从属服务器含有中继日志,并且您出于某种原因想要执行此日志时使用。要这么做时,不需要连接主服务器。您只需要使用CHANGE MASTER TO并启动SQL线程(START SLAVE SQL_THREAD)。

您甚至可以在一个用于独立非从属服务器的非复制型设置中使用第二种操作,在崩溃之后进行复原。假设您的服务器已崩溃,同时您已恢复了备份。您想要重新播放服务器自己的二进制日志(不是中继日志,而是正规的二进制文件),例如名为myhost-bin.*。首先,应在安全的地方制作这些二进制日志的备份,以防您没有完全遵守以下步骤,意外地让服务器清理了二进制文件。使用SET GLOBAL relay_log_purge=0,进一步增加安全性。然后启动不含–log-bin选项的服务器。使用–replicate-same-server-id,–relay-log=myhost-bin(让服务器相信,这些正规的二进制日志是中继日志)和–skip-slave-startoptions选项。当服务器启动后,发布以下语句:

mysql>CHANGE MASTER TO
     ->    RELAY_LOG_FILE='myhost-bin.153',
     ->    RELAY_LOG_POS=410,
     ->    MASTER_HOST='some_dummy_string';
mysql>START SLAVE SQL_THREAD;

服务器会读取并执行自己的二进制日志,完成崩溃复原。当复原完成后,运行STOP SLAVE,关闭服务器,删除master.inforelay-log.info,并使用原来的选项重新启动服务器。

要让服务器认为它是一个从属服务器,需要指定MASTER_HOST(甚至使用假值)。

发表评论