主从复制功能通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间,SELECT查询可以发送到从服务器,以降低主服务器 的查询处理速度,修改数据的语句发送到主服务器,使主从服务器保持同步。
一、工作原理
主从复制通过3个过程实现,其中一个发生在主服务器,其他两个发生在从服务器。
- 1. 主服务器将用户对数据库的更新操作以二进制格式保存到Binary Log日志文件中,然后通过Binlog Dump线程将Binary Log日志文件传输给从服务器。
- 2. 从服务器通过一个I/O线程将主服务器 的Binary Log日志文件中的更新操作复制到一个叫Relay Log的中继日志文件中。
- 3. 从服务器通过另一个SQL线程将Relay Log中继日志文件中的操作依次在本地执行,从而实现主从同步复制。
二、如何配置
假定有两台服务器,方案如下
master: 192.168.1.1 service-id:1
slave : 192.168.1.2 service-id:2 同步账号:sync 同步密码:sync
1. 确定主从服务器的MySQL版本
不同版本的binlog格式可能不一样,最好用同版本,最起码确保主服务器版本不高于从服务器版本。
2. 在主服务器上创建从服务器连接账户,授予REPLICATION SLAVE权限
每个从服务器使用标准的MySQL用户名和密码连接主服务器。创建一个用户名为"sync"的账户,从服务器使用该账户从域内任何主机使用密码"sync"访问主服务器。使用GRANT创建账户复制:
mysql> CREATE USER 'sync'@'%' IDENTIFIED BY 'sync';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'sync'@'192.168.1.2' IDENTIFIED BY 'sync';
mysql> exit
3. 配置主服务器
打开二进制日志,指定唯一Server ID。例如在my.conf配置文件加入如下值,如果已经有就不用添加了:
[mysqld]
log-bin = mysql-bin
server-id = 1
4. 重启主服务器
进入mysql命令行运行show master status语句查看是否成功,复制File列的mysql-bin.000007备用。
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000007 | 3151 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
5. 配置从服务器
与主服务器配置类似,配置唯一的Server ID:
[mysqld]
log-bin = mysql-bin
server-id = 2
6. 重启从服务器
准备让从服务器连接到主服务器,并开始重做主服务器binlog文件中的事件。
7. 指定主服务器信息
使用CHANGE MASTER TO语句指定主服务器信息,不要在配置文件中设置。下述语句可以替代在配置文件中提供主服务器的信息,此外,不需要停止服务器,就直接为从服务器指定不同的主服务器,语句如下:
mysql> CHANGE MASTER TO MASTER_HOST = '192.168.1.1',
-> MASTER_USER = 'sync',
-> MASTER_PASSWORD = 'sync',
-> MASTER_LOG_FILE = 'mysql-bin.000007',
-> MASTER_LOG_POS = 3151;
指定MASTER_LOG_POS为0是希望从日志的开始位置开始读。
三、连接主从服务器
1. 执行START SLAVE语句开始复制:
mysql> START SLAVE;
2. 查看同步结果
主要查看Slave_IO_State、Slave_IO_Running和Slave_SQL_Running
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.1
Master_User: sync
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000007
Read_Master_Log_Pos: 3151
Relay_Log_File: hecs-222032-relay-bin.000002
Relay_Log_Pos: 1079
Relay_Master_Log_File: mysql-bin.000007
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: 3151
Relay_Log_Space: 1292
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:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 33a67c62-7ac3-11ed-b035-fa163e7dd5de
Master_Info_File: /www/server/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
如上Slave_IO_Running和Slave_SQL_Running都为Yes就代表成功了。
3. 查看主服务器的I/O线程创建的连接
第2行的2.row就是处理从服务器的I/O线程的连接。
mysql> SHOW PROCESSLIST\G
4. 查看从服务器的I/O线程创建的连接
第1行为I/O线程状态,第二行为SQL线程状态。
mysql> SHOW PROCESSLIST\G
注意:从服务器是通过读取主服务器的二进制日志文件实现自我更新,对数据库进行的修改操作都应该放在主服务器上执行,从服务器只用来查询,这也是所谓的读写分离。
错误2:
Last_IO_Errno: 1130
Last_IO_Error: error connecting to master 'sync@192.168.1.1:3306' - retry-time: 60 retries: 1
解决方案:查看3306端口是否放通,查看sync账号是否正确创建,查看是否授权本机IP访问等等。
错误2:
Last_IO_Errno: 1045
Last_IO_Error: error connecting to master 'sync@192.168.1.1:3306' - retry-time: 60 retries: 1
解决方案:使用 show slave status\G 命令查看,确保MASTER_LOG_FILE和MASTER_LOG_POS 与master保持一致,查看master机器中指定账户的授权
mysql> show grants for 'sync'@'192.168.1.2';
+-----------------------------------------------------------+
| Grants for sync@192.168.1.2 |
+-----------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'sync'@'192.168.1.2' |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
如果不是跟上面的输出有出入,建议回到本人第二步正确配置授权。
PS:主主部署、双机热备只需要按照上述步骤,将server1作为从机,server2作为主机再操作一遍即可。