一、简介
在实际生产中,数据的重要性不言而喻,因此考虑到数据的重要性比如单点故障导致后端数据库奔溃,或者后端数据库访问压力过大等,mysql数据库做主从非常有必要,减轻后端数据库压力,主服务器负责读写,从服务器只负责读,这样一来即保证了数据的可靠性,同时提高服务器的高可用。
MySQL主从复制架构如图:
<a href="http://s1.51cto.com/wyfs02/M01/8A/9F/wKioL1g1rdzRcxtBAAGH4yjl32g556.png" target="_blank"></a>
MySQL主从复制原理:master服务器将数据的改变记录二进制日志,当master上的数据发生改变时,则将其改变写入二进制日志中,salve服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
二、主从复制配置实现
要求:
1、双方mysql版本需一致,如不一致,只要主节点低于从节点
2、两节点间时间需同步
配置:
主服务器配置如下:
1、修改/etc/my.cnf配置文件
log-bin=/mydata/data/binlogs/master-bin
2、创建此目录并修改属组属主为mysql
mkdir /mydata/binlogs/
chown -R mysql.mysql /mydata/binlogs/
3、授权用户
grant replication slave,replication client on *.* to 'repluser'@'10.1.10.%' identified by 'pass';
flush privileges;
从服务器配置如下:
1、修改/etc/my.cnf配置文件,注释二进制日志,开启中继日志,修改server-id和主节点不一致
server-id=11
relay-log=/mydata/relaylogs/relay-bin
2、创建其目录并授予此目录的属主、属组为mysql
mkdir /mydata/relaylogs/
chown -R mysql.mysql /mydata/relaylogs/
3、连接主服务器
change master to master_host='10.1.10.1',master_user='repluser',master_password='pass';
完成上诉配置过程即可各自启动mysql服务器,且在从服务器上启动I/O,SQL线程,例如:start slave
测试两数据可数据是否能同步,则可在主库上插入数据在从库上查看是否存在,注意:从库只能读,而不能写
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
<code>[root@centos6 ~]</code><code># mysql</code>
<code>Welcome to the MariaDB monitor. Commands end with ; or \g.</code>
<code>Your MariaDB connection </code><code>id</code> <code>is 13</code>
<code>Server version: 5.5.32-MariaDB MariaDB Server</code>
<code>Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.</code>
<code>Type </code><code>'help;'</code> <code>or </code><code>'\h'</code> <code>for</code> <code>help. Type </code><code>'\c'</code> <code>to </code><code>clear</code> <code>the current input statement.</code>
<code>MariaDB [(none)]> show slave status\G;</code>
<code>*************************** 1. row ***************************</code>
<code> </code><code>Slave_IO_State: Waiting </code><code>for</code> <code>master to send event</code>
<code> </code><code>Master_Host: 10.1.10.1</code>
<code> </code><code>Master_User: repluser</code>
<code> </code><code>Master_Port: 3306</code>
<code> </code><code>Connect_Retry: 60</code>
<code> </code><code>Master_Log_File: master-bin.000003</code>
<code> </code><code>Read_Master_Log_Pos: 326</code>
<code> </code><code>Relay_Log_File: relay-bin.000007</code>
<code> </code><code>Relay_Log_Pos: 611</code>
<code> </code><code>Relay_Master_Log_File: master-bin.000003</code>
<code> </code><code>Slave_IO_Running: Yes </code><code>#确保I/O和SQL线程开启,即可实现数据同步</code>
<code> </code><code>Slave_SQL_Running: Yes </code><code>#确保I/O和SQL线程开启,即可实现数据同步</code>
<code> </code><code>Replicate_Do_DB:</code>
<code> </code><code>Replicate_Ignore_DB:</code>
<code> </code><code>Replicate_Do_Table:</code>
<code> </code><code>Replicate_Ignore_Table:</code>
<code> </code><code>Replicate_Wild_Do_Table:</code>
<code> </code><code>Replicate_Wild_Ignore_Table:</code>
<code> </code><code>Last_Errno: 0</code>
<code> </code><code>Last_Error:</code>
<code> </code><code>Skip_Counter: 0</code>
<code> </code><code>Exec_Master_Log_Pos: 326</code>
<code> </code><code>Relay_Log_Space: 1184</code>
<code> </code><code>Until_Condition: None</code>
<code> </code><code>Until_Log_File:</code>
<code> </code><code>Until_Log_Pos: 0</code>
<code> </code><code>Master_SSL_Allowed: No</code>
<code> </code><code>Master_SSL_CA_File:</code>
<code> </code><code>Master_SSL_CA_Path:</code>
<code> </code><code>Master_SSL_Cert:</code>
<code> </code><code>Master_SSL_Cipher:</code>
<code> </code><code>Master_SSL_Key:</code>
<code> </code><code>Seconds_Behind_Master: 0</code>
<code>Master_SSL_Verify_Server_Cert: No</code>
<code> </code><code>Last_IO_Errno: 0</code>
<code> </code><code>Last_IO_Error:</code>
<code> </code><code>Last_SQL_Errno: 0</code>
<code> </code><code>Last_SQL_Error:</code>
<code> </code><code>Replicate_Ignore_Server_Ids:</code>
<code> </code><code>Master_Server_Id: 1</code>
<code>1 row </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
<code>ERROR: No query specified</code>
<code>MariaDB [(none)]> </code><code>#测试在主库上删除dbs,验证从库是否存在dbs数据库,结果如下:</code>
<code>MariaDB [(none)]> show databases;</code>
<code>+--------------------+</code>
<code>| Database |</code>
<code>| information_schema |</code>
<code>| dbs |</code>
<code>| hellodb |</code>
<code>| mydbs |</code>
<code>| mysql |</code>
<code>| performance_schema |</code>
<code>| </code><code>test</code> <code>|</code>
<code>7 rows </code><code>in</code> <code>set</code> <code>(0.01 sec)</code>
<code>6 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
<code>MariaDB [(none)]></code>
<code>Your MariaDB connection </code><code>id</code> <code>is 14</code>
<code>Server version: 5.5.32-MariaDB-log MariaDB Server</code>
<code>7 rows </code><code>in</code> <code>set</code> <code>(0.02 sec)</code>
<code>MariaDB [(none)]> drop database dbs;</code>
<code>Query OK, 0 rows affected (0.04 sec)</code>
三、实战:主从不同步时,如何进行数据同步至一致
描述:当主服务器已经运行一段时间,并且存在不小的数据时,则需把主服务器备份,然后在从服务器恢复,从备份时所在的位置开始复制。
1、将主服务器上的数据做完全备份
<code>[root@centos6 ~]</code><code># mysqldump --lock-all-tables --all-databases --flush-logs --master-data=2 >/root/all.sql</code>
2、在从服务器上导入主服务上的完全备份,在导入时关闭I/O和SQL线程
<code>Your MariaDB connection </code><code>id</code> <code>is 34</code>
<code>MariaDB [(none)]> </code><code>source</code> <code>/root/alren</code><code>.sql</code>
<code>MariaDB [testdbs]> change master to master_host=</code><code>'10.1.10.1'</code><code>,master_user=</code><code>'repluser'</code><code>,master_password=</code><code>'pass'</code><code>,MASTER_LOG_FILE=</code><code>'master-bin.000007'</code><code>,MASTER_LOG_POS=245;</code>
<code>Query OK, 0 rows affected (0.02 sec)</code>
<code>MariaDB [testdbs]> start slave;</code>
<code>MariaDB [testdbs]> show slave status\G</code>
<code> </code><code>Master_Log_File: master-bin.000007 </code><code>#已经恢复到主节点的二进制的位置</code>
<code> </code><code>Read_Master_Log_Pos: 245</code>
<code> </code><code>Relay_Log_File: relay-bin.000002</code>
<code> </code><code>Relay_Log_Pos: 530</code>
<code> </code><code>Relay_Master_Log_File: master-bin.000007</code>
<code> </code><code>Slave_IO_Running: Yes</code>
<code> </code><code>Slave_SQL_Running: Yes</code>
<code> </code><code>Exec_Master_Log_Pos: 245</code>
<code> </code><code>Relay_Log_Space: 818</code>
<code>MariaDB [testdbs]> show tables;</code>
<code>+-------------------+</code>
<code>| Tables_in_testdbs |</code>
<code>| tbl |</code>
<code>MariaDB [testdbs]> </code><code>select</code> <code>* from tbl;</code>
<code>+-------+</code>
<code>| name |</code>
<code>| tom |</code>
<code>| jerry |</code>
<code>| lucy |</code>
<code>3 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
<code>MariaDB [testdbs]> use mydbs;</code>
<code>Database changed</code>
<code>MariaDB [mydbs]> show tables; </code><code>#测试数据是否和主节点一致</code>
<code>+-----------------+</code>
<code>| Tables_in_mydbs |</code>
<code>| students |</code>
<code>MariaDB [mydbs]> </code><code>select</code> <code>* from students;</code>
<code>+------+-------+</code>
<code>| </code><code>id</code> <code>| name |</code>
<code>| 1 | tom |</code>
<code>| 2 | jerry |</code>
<code>2 rows </code><code>in</code> <code>set</code> <code>(0.00 sec)</code>
<code>MariaDB [mydbs]></code>
总结:此实战中最为关键主要有两步①主服务器上锁表做完全备份,并滚动日志,②从服务器上进行半道恢复.
本文转自chengong1013 51CTO博客,原文链接:http://blog.51cto.com/purify/1876048,如需转载请自行联系原作者