一、主从同步的作用
1、数据分布 2、负载均衡(load balancing) 4、高可用性(high availability)和容错 二、主从同步原理 1、二进制日志
想要做主从复制必须得有这个二进制日志,那二进制日志记录的是什么呢?二进制日志中保存的只是跟服务器修改相关的操作,也叫复制日志
二进制日志为了避免日志文件过大,要进行不停地滚动,其主要有两个功能:
(1)即时点恢复
(2)复制
因为二进制日志有即时点恢复功能,所以万一某天一个不小心失误把数据库删了,只要二进制日志文件保存完好,就可以把我们的数据恢复回来。可见二进制日志是非常重要的,因此二进制日志千万不要和你的数据库目录放到一起,而要另找一个位置保存
今天我们要做的是利用他的第二个功能完成主从复制
2、中继日志
中继日志和复制相关,中继日志是从服务器从主服务器上读取主服务器上二进制日志中的事件,每读一个过来,并保存到本地。
3、主从同步原理
原理详解:
1)主服务器发生数据更改操作,数据写入到数据文件和二进制文件中,然后去唤醒从服务器的I/O线程(IO thread) 2)从服务器的IO thread来请求主服务器并把从主服务器的binlog dump线程返回结果写入到本地中继日志中
3)从服务器的SQL thread每读一条中继日志,然后写一条到本地数据文件中
4)此过程中,从服务器只是同步主服务器的数据,所以他无需开启二进制日志,而且从服务器最好设为只读模式
5)主从复制并不是一个备份的过程,它只是一个数据同步的过程,因为,如果你在主服务器上删除一个库,那你会发现从服务器上也没有了
6)从服务器并不能负载主服务器的写操作,它只可以负载主服务器的读操作;因为,不管你主服务器写多少,从服务器都会通过它的中继日志和主服务器的二进制日志同步到它本地的
主从同步配置过程总结
1、主服务器
1)修改server-id
2)启用二进制日志
3)创建有复制权限的账号
2、从服务器 1)修改server-id 2)启用中继日志 3)连接主服务器 4)启程复制线程
三、主从同步的实现 1、修改主服务器的配置文件,我这里的数据目录在/mydata/data下,为了安全,我把二进制日志放到了/mydata/binlogs下,别忘了给这几个目录设置属主和属组为mysql用户,mysql组
1
2
3
4
5
6
7
8
9
| datadir=/mydata/data 指定数据目录
# binary logging is required for replication
log-bin=/mydata/binlog/master-bin 二进制日志目录
# binary logging format - mixed recommended
binlog_format=mixed 二进制格式设为混合模型
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1 主服务id为1
|
启动服务器 service mysqld start 2、在主服务器上创建有复制权限的账号 1
2
3
4
| mysql> grant replication slave,replication client on *.* to'repluser'@'192.168.%.%' identified by 'replpass';
Query OK, 0 rows affected (0.01 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)
|
3、在从服务器上修改主配置文件,方法同上一步 [iyunv@xuxu ~]# mkdir /mydata/relaylogs 创建中继日志目录
[iyunv@xuxu ~]# chown -R mysql.mysql /mydata/relaylogs
1
2
3
4
| datadir=/mydata/data 指定数据目录
read-only = on 开启只读
server-id = 11 id改为11
relay-log = /mydata/relaylogs/relay-bin 开启中继日志
|
4、查看从服务器的中继日志是否启动成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| mysql> show global variables like '%relay%';
+-----------------------+-----------------------------+
| Variable_name | Value |
+-----------------------+-----------------------------+
| max_relay_log_size | 0 |
| relay_log | /mydata/relaylogs/relay-bin |
| relay_log_index | |
| relay_log_info_file | relay-log.info |
| relay_log_purge | ON |
| relay_log_recovery | OFF |
| relay_log_space_limit | 0 |
| sync_relay_log | 0 |
| sync_relay_log_info | 0 |
+-----------------------+-----------------------------+
|
5、在主服务器上查看其状态信息 1
2
3
4
5
6
7
| mysql> show master status;
+-------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 | 358 | | |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
|
6、查看从服务器的状态信息,检查是否连接主服务器成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.211.133 主服务器
Master_User: repluser 主机名
Master_Port: 3306 端口号
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: relay-bin.000001 还没开始写哩
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No 线程还没启动
Slave_SQL_Running: No
|
7、开启线程 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 192.168.211.133
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
Read_Master_Log_Pos: 4
Relay_Log_File: relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: Connecting 说明没有开启连接
Slave_SQL_Running: Yes
|
真对以上问题:网上文章大都只是指出了可能的三种错误: 1. 网络不通
2. 密码不对
3. pos不对
我测试网络是可以ping通的。密码也对,pos也对。
后来想了很久,突然想起来了防火墙好像没有关闭!一检查果然。
所以第四种错误是:
4. 防火墙没有关闭。
相关命令如下:
关闭命令: service iptables stop
永久关闭防火墙:chkconfig iptables off 两个命令同时运行,运行完成后查看防火墙关闭状态
service iptables status mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.211.133
Master_User: repluser
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 1218
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 254
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
|
8、在主服务器上创建一个数据库 1
2
3
4
5
6
7
8
9
10
11
12
13
14
| mysql> CREATE DATABASE xiaoxiao;
Query OK, 1 row affected (0.01 sec)
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema | |
| mydb |
| mysql |
| performance_schema |
| test |
| tests |
| xiaoxiao |
+--------------------+
|
主服务器创建一个xiaoxiao库。。
9、在从服务器上启动复制线程,测试hlbrc这个库是否同步成功
| 1
2
3
4
5
6
7
8
9
10
11
12
13
| mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| MY |
| mydb |
| mysql |
| performance_schema |
| test |
| tests |
| xiaoxiao |
+--------------------+
|
从服务器中出现xiaoxiao库,,,说明同步成功》》》》》》
|
|