主从复制解决的是:让一台服务器数据与另外的服务器数据保持一致。
主从服务器的版本最好一致。(从服务器的版本也可以高于主服务器)
主从同步的原理;
主从同步 涉及到3个 线程: 主服务器(master)I/O thread 和从服务器(slave)I/Othread 以及SQL thread
实现mysql主从复制(同步)的本质:
在主服务器上开启Mysql的binary-log(产生二进制日志文件)功能。
整个复制过程:从服务器(slave)从主服务器端(master)获取该日志,然后在(slave)从服务器上将二进制文件解析成SQL语句并完全顺序地执行SQL语句所记录的各种操作。
具体过程:
1)从服务器上的I/O线程连接上主服务器,然后请求从指定日志文件的指定位置或者从最开始的日志位置之后的日志内容。
2)从服务器在接收到来自从服务器的I/O线程请求后,,通过自身的I/O线程,根据请求信息读取指定日志位置之后的日志信息,
并返回从服务器端的I/O线程,返回的信息中除了日志所包含的信息之外,还包括此次返回的信息在主服务器端对应二进制文件
的名称以及在二进制日志中的位置。
3)从服务器的I/O线程接收到信息后,将获取到的日志内容依次写入从服务器端的中继日志文件(relay)的最后,并且讲读取到的主服务器端的二进制日志的文件名和位置记录到一个名为master-info文件中,方便在下一次读取的时候能够迅速定位从哪个位
置开始往后读取日志信息。
4)从服务器的SQL线程在检测到中继日志文件中新增加了内容后,会马上解析该中继日志文件中的内容,将日志内容解析为SQL语句,然后在自身执行这些SQL,由于是在主服务器端和从服务器端执行了同样的SQL操作,所以两端的数据是完全一样的。
实施分四步: 1.建立mysql主从服务器连接
2.master开启 binarylog 功能
3.master授权用户(用来在slave上面登录的)
4.slave获取master信息。
实验过程:
准备阶段:
master 端
ip :192.168.1.151
[root@www data]# mysqld -V # 查看mysql版本
mysqld Ver 5.5.33-log for linux2.6 on x86_64 (MySQL Community Server (GPL))
[root@www data]# uname -r
2.6.32-642.11.1.el6.x86_64
[root@www data]# cat /etc/issue
CentOS release 6.8 (Final)
slave 端
ip ;192.168.1.123
[root@jf6 data]# mysqld -V
mysqld Ver 5.5.33-log for linux2.6 on x86_64 (MySQL Community Server (GPL))
[root@jf6 data]# uname -r
2.6.32-642.11.1.el6.x86_64
[root@jf6 data]# cat /etc/issue
CentOS release 6.8 (Final)
统一数据库环境:(同步一个库文件 库名:swallow)
master端
[root@jf6 data]# service mysqld status
SUCCESS! MySQL running (16394)
进入数据库:
[root@jf6 data]# mysql -uroot -p
Enter password:
mysql>
创建一个库名:swallow 表名 test 字段 id 插入数据 1
mysql> select * from swallow.test;
+------+
| id |
+------+
| 1 |
+------+
复制这个库:
[root@jf6 data]# mysqldump -uroot -p swallow >mysql.sql
Enter password:
将创建的数据库复制到slave端下
[root@jf6 data]# scp mysql.sql [email protected]:/root/
[email protected]'s password:
mysql.sql 100% 1784 1.7KB/s 00:00
slave 端:
[root@www data]# mysql -uroot -p
mysql> create database swallow;
mysql> use swallow
Database changed
mysql> source /root/mysql.sql;
mysql> select * from swallow.test;
+------+
| id |
+------+
| 1 |
+------+
开启主从复制配置模式:
master端:
vim /etc/my.cnf
server-id = 1 #属于标识符,区别数据库
log-bin=mysql-bin #开启binarylog 功能生成 二进制文件
binlog-do-db=swallow # 指明要同步的库
重启mysql。
复制同步的第一条件:2个mysql服务器可以互通,采用授权的方式。
mysql> grant replication slave on *.* to 'slave123'@'192.168.1.123' identified by '123456';
( replication slave 赋予取得 二进制日志的权利 )
slave 端:
vim /etc/my.cnf
server-id =2
重启mysql
测试连通性:
[root@www ~]# mysql -h 192.168.1.151 -u slave123 -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.5.33-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
可以连接上master端。
开启slave服务器:目的是探知 master服务器的二进制文件的名称和开始点
首先查询 master状态:(取得二进制文件和开始点)
master端
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 107 | swallow | |
+------------------+----------+--------------+------------------+
slave端
mysql> change master to \
-> master_host='192.168.1.151', #指明master地址
-> master_user='slave123', #指明授权用户。可以连接master的用户
-> master_password='123456', #指明进入master的验证
-> master_log_file='mysql-bin.000002', # 指明二进制文件
-> master_log_pos=107; #指明获取该文件的开始点
mysql> slave start; #开启 slave
mysql> slave start;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.151 ######## master_host
Master_User: slave123 ######## master_user
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 107
Relay_Log_File: www-relay-bin.000003
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes ######### IOthread 正常
Slave_SQL_Running: Yes ######## SQLthread 正常
测试主从:
master端:
mysql> use swallow
mysql> insert into test values(2);
mysql> insert into test values(3);
mysql> insert into test values(4);
slave端:
mysql> select * from swallow.test;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
+------+
小贴士: 还有一种开启slave的方法:就是在mysql5.1 版本下 在配置文件中写入 master_host master_user master_password
这3个参数。由于后期版本采用引擎(mysql5.5的默认存储引擎是)innodb,是不是myisam引擎(mysql5.1的版本)。
所以,如果安装的版本高于5.1 不要这样做了。因为:引擎的变化。/etc/my.cnf主配置文件里面不支持上面3个参数。
加入后,会造成slave服务器的mysql无法启动。
顺手做个主主配置吧。(实质就是把刚才的配置主从交换下)
slave端(这里沿袭上面的叫法。防止弄乱了)
vim /etc/my.cnf
log-bin=mysql-bin #开启产生日志功能
binlog-do-db=swallow #定义同步库
重启mysql服务
mysql> grant replication slave on *.* to 'slave151'@'192.168.1.151' identified by '123456';
查看服务器状态:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 265 | swallow | |
+------------------+----------+--------------+------------------+
master端 (这里沿袭上面的叫法。防止弄乱了)
测试连通性:
[root@jf6 data]# mysql -h 192.168.1.123 -uslave151 -p123456
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.33-log MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
开启slave配置:
mysql> change master to \
-> master_host='192.168.1.123',
-> master_user='slave151',
-> master_password='123456',
-> master_log_file='mysql-bin.000002',
mysql> slave start;
mysql> show slave statu \G;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'statu' at line 1
ERROR:
No query specified
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.123
Master_User: slave151
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000002
Read_Master_Log_Pos: 265
Relay_Log_File: jf6-relay-bin.000002
Relay_Log_Pos: 253
Relay_Master_Log_File: mysql-bin.000002
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
测试方法:
slave端:
mysql> use swallow
mysql> insert into test values(1);
master端
mysql> use swallow
mysql> insert into test values(2);
两边交替插入数据;
结果:
mysql> select * from test;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 1 |
| 2 |
| 1 |
| 2 |
| 1 |
| 2 |
+------+
这里需要注意的关键点:
1.主服务器开启binarylog功能(log-bin=mysql-bin ),以及日志状态。
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000002 | 265 | swallow | |
+------------------+----------+--------------+------------------+
2.开启slave服务时:别忘了 开启slave。
3.slave的状态监控:(如果IO 和SQL都OK 就OK了)
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
如果是no:IO一般和权限之类有关系。因为IO负责2个服务之间通信
SQL 则是自己的原因。因为他的作用就是 从relay-log里面查看变化
转化成SQL 依照顺序写入 从服务器。
4.主配置文件: server-id 不要相同。