MySQL复制篇之---主从复制
MySQL复制:
综合来讲就是对于数据库服务器,为了扩展其性能,但是又不消耗太多资金的实现数据库性能提升的一个机制;
复制其目的就是将一台服务器上的数据拷贝到另外一台服务器上,以达到两台服务器数据相同的效果,对于用户请求的数据,可以通过一台服务器写,一台服务器读来提升服务器整体性能,以达到可以处理多并发请求的效果;
MySQL复制的工作模式:
对于MySQL服务器,任何影响其数据改变的请求都会被记录在其二进制日志文件中,从服务器可以监控主服务器的二进制日志文件中产生的每个二进制日志事件,并向主服务器发出复制请求,主服务器接收到从服务器的请求,会通过一个dump thread将新的事件读取并发送至从服务器,从服务器接收,将主服务器中的所改变的事件复制到本地的中继日志中来,并在本地拿来应用,以使自己的数据和主服务器数据保持同步;
复制过程中启用的三个线程:
dump thread:是主服务器上的线程,用来接收从服务器发起的复制请求;
I/O thread:位于从服务器,用于向主服务器发起复制请求,并接收主服务器发送的新的事件,将其存放到本地的中继日志中;
sql thread:位于从服务器,它负责将中继日志中的事件读取,并在本地数据库中一一执行;
下面演示下简单的mysql主从复制(主服务器中没有任何数据文件)
环境:
Red Hat Enterprise Linux Server release 5.8
主服务器:IP:172.16.9.1
从服务器:IP:172.16.9.2
mysql版本:mysql-5.5.28
mysql的安装过程这里不再提供
主服务器配置:
- vim /etc/my.cnf
- datadir = /data/mydata #数据所在目录
- server-id = 1 #用于唯一标示自己
- log-bin=/binlog/mysql-bin #二进制日志所在目录,将其和数据分开存放
- sync_binlog=1 #同步二进制日志
启动mysqld
- service mysqld start
进入数据库,给从服务器复制权限
- mysql> grant replication client,replication slave on *.* to 'reuser'@'172.16.9.2' identified by 'reuser';
- mysql> flush privileges;
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000001 | 354 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
- ##记录二进制日志事件发生所在位置
从服务器配置:
- vim /etc/my.cnf
- datadir = /data/mydata
- #log-bin=mysql-bin #二进制日志开启功能注释掉
- server-id = 2 #自己的ID号
- relay-log = /relaylog/mysql-relay #开启中继日志
- relay-log-index = mysql-relay.index #中继日志索引
- read-only=1 #从服务器只提供读的功能,设定为只读
启动服务
- service mysqld start
进入数据库,设定主服务器
- mysql>change master to master_host='172.16.9.1', master_user='reuser', master_password='reuser', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=354;
- ######################################################################
- master_log_file='mysql-bin.000001' #指定从哪个二进制日志文件开始复制
- master_log_pos=354 #从二进制日志复制的位置
- 这两项是根据主服务器中'show master status'中获取的
启动从服务器
- mysql> start slave; #(默认是两个线程都启动的,如果想要启动一个线程,可以手动指定)
查看从服务器是否启动成功;
上面2项显示yes,说明已经启动成功,如果显示为No,就需要你排错了。。
查看各服务器中变量是否成功启用
Maser
Slave
验证效果:
在主服务器中新建一个数据库
查看主服务器状态
查看从服务器是否同步
显示数据一致并且从服务器中有新建的数据库,说明主从复制构建成功!!
以上是主服务器中没有数据的情况,假如说从服务器同步主服务器中数据时主服务器中已经存在有数据:
则在同步之前要将主服务器中之前的数据导入到从服务器
Master
- mysqldump --all-databases --lock-all-tables --flush-logs --master-data=2 >/tmp/data.sql
- scp /tmp/data.sql node2:/tmp
并记录下主服务器现在的二进制日志及所在位置
- mysql> flush tables with read lock;
- Query OK, 0 rows affected (0.06 sec)
- mysql> show master status;
- +------------------+----------+--------------+------------------+
- | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
- +------------------+----------+--------------+------------------+
- | mysql-bin.000003 | 107 | | |
- +------------------+----------+--------------+------------------+
- 1 row in set (0.00 sec)
- mysql> unlock tables;
- Query OK, 0 rows affected (0.00 sec)
Slave
导入主服务器中原有数据
- mysql < /tmp/data.sql
- mysql>change master to master_host='172.16.9.1', master_user='reuser', master_password='reuser', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=107;
启动从服务器即可
- mysql>start slave;
- mysql> show slave status\G;
- *************************** 1. row ***************************
- Slave_IO_State: Waiting for master to send event
- Master_Host: 172.16.9.1
- Master_User: reuser
- Master_Port: 3306
- Connect_Retry: 60
- Master_Log_File: mysql-bin.000003
- Read_Master_Log_Pos: 107
- Relay_Log_File: mysql-relay.000007
- Relay_Log_Pos: 253
- Relay_Master_Log_File: mysql-bin.000003
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
到此,主从复制完成!!
转载于:https://blog.51cto.com/90112526/1079574