主从复制原理+实操
什么是MySQL主从复制?
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。
为什么需要主从复制?
1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。 2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。 3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。
主从复制原理
- 在slave服务器上执行start slave命令开启主从复制开关,开始主从复制
- 此时,slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从服务时执行change master命令指定的)之后开始发送binlog日志内容
- master服务器接收到来自slave服务器的IO线程的请求后,其上负责复制的IO线程会根据slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的IO线程,返回的信息除了binlog日志内容外,还有在master服务器端记录的IO线程,返回的信息中有binlog中的下一个指定更新位置
- 当slave服务器的IO线程获取到master服务器上的dump线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到slave端自身的relay log中继日志文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取msater端新binlog日志时能告诉master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容
- slave服务器端sql线程会实时检测本地relay log中IO线程新增的日志内容,然后及时把relay log文件中的内容解析成sql语句,并在自身slave服务器上按解析sql语句的位置顺序执行应用这样的sql语句,并在relay-log.info中记录当前应用中继日志的文件名和位置点
主从复制搭建(一主一从)
1.准备两台mysql服务器
master 192.168.31.153
slave 192.168.31.111
确保两台服务器上的mysql服务是启动的
2.主服务器开启二进制日志
编辑配置文件/etc/my.cnf,mysqld中的加入(其他字段已省略)
master
[mysqld]
log_bin
server_id = 1
slave
[mysqld]
log_bin
server_id = 2
注意:
- 从服务器可以不开启二进制日志
- 主从服务器的server_id不能相同
重启mysqld服务,刷新配置文件
[root@slave mysql]# service mysqld restart
问题
[root@slave mysql]# service mysqld stop
ERROR! MySQL server PID file could not be found!
mysqld无法重启--->找不到pid文件
原因:修改主机名后,无法读取原来的以主机名为前缀的pid文件
如何解决?
杀死mysqld进程和mysqld_safe进程
[root@master backup]# ps aux|grep mysql
root 922 0.0 0.3 115540 1720 ? S 00:58 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql1.pid
mysql 1290 0.0 42.8 1544532 205672 ? Sl 00:58 0:05 /usr/local/mysq/bin/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=chen.err --open-files-limit=8192 --pid-file=/data/mysql/mysql1.pid --socket=/data/mysql/mysql.sock --port=3306
root 1634 0.0 0.2 112824 988 pts/0 R+ 03:10 0:00 grep --color=auto mysql
[root@master backup]# kill -9 922
[root@master backup]# kill -9 1290
再重启mysql服务
[root@master backup]# service mysqld start
Starting MySQL. SUCCESS!
3.统一两台服务器的基础数据
导出master所有的数据库到家目录下
[root@master ~]# mysqldump -uroot -p"Sanchuang1234#" --all-databases >all_db.sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
scp到slave服务器的家目录下
[root@master ~]# scp all_db.sql root@192.168.31.111:/root/
all_db.sql 100% 903KB 63.5MB/s 00:00
slave服务器导入sql文件
[root@slave ~]# mysql -uroot -p"Sanchuang1234#" <all_db.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
4.master服务器清空所有二进制文件
因为已经进行了全备,且没有新数据的产生了,所以不需要老的二进制日志了
root@(none) 03:27 mysql>reset master;
Query OK, 0 rows affected (0.01 sec)
root@(none) 03:27 mysql>show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 | 154 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
5.master服务器新建授权用户,给slave来复制二进制日志
root@(none) 03:27 mysql>grant replication slave on *.* to 'chenlb'@'192.168.31.%' identified by 'Sanchuang1234#';
Query OK, 0 rows affected, 1 warning (0.02 sec)
192.168.31.%--从服务器所在的网段
6.slave服务器配置master info的信息
root@(none) 03:25 mysql>change master to master_host='192.168.31.153',
-> master_user='chenlb',
-> master_password='Sanchuang1234#',
-> master_port=3306,
-> master_log_file='master-bin.000001',
-> master_log_pos=154;
Query OK, 0 rows affected, 2 warnings (0.01 sec)
参数含义
change master to master_host=‘192.168.31.153’ 指定主服务器的ip地址
master_user='chenlb' 主服务器授权的用户
master_password='Sanchuang1234#' 主服务器授权的用户密码
master_port=3306 主服务器mysql端口号
master_log_file='master-bin.000001' 主服务器正在使用的二进制日志
master_log_pos=154 二进制日志的位置号
7.查看slave是否配置成功
root@(none) 03:43 mysql>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.31.153
Master_User: chenlb
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 154
Relay_Log_File: slave-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: No
Slave_SQL_Running: No
Slave_IO_Running: No slave的IO线程还未启用 Slave_SQL_Running: No slave的sql线程还未启用
8.启动slave
root@(none) 03:43 mysql>stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
root@(none) 03:44 mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
root@(none) 03:44 mysql>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.31.153
Master_User: chenlb
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000001
Read_Master_Log_Pos: 450
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 617
Relay_Master_Log_File: master-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Slave_IO_Running: Yes slave启用成功 Slave_SQL_Running: Yes slave启用成功
IO线程和sql线程都为yes说明都启动了
IO线程和SQL线程启动失败?
可能的原因:
- 克隆机导致uuid冲突
- 防火墙没关
- master info配置信息打错了
9.测试主从复制的效果
-
主服务器建表建库插入数据,查看从服务器上数据是否仍然保持一致,一致则为成功
-
主服务器show processlist;
root@(none) 03:58 mysql>show processlist\G; *************************** 1. row *************************** Id: 6 User: chenlb Host: 192.168.31.111:51274 db: NULL Command: Binlog Dump Time: 828 State: Master has sent all binlog to slave; waiting for more updates Info: NULL
-
主服务器查看端口
[root@master ~]# netstat -anplut|grep ES tcp 0 36 192.168.31.153:22 192.168.31.68:61205 ESTABLISHED 1466/sshd: root@pts tcp6 0 0 192.168.31.153:3306 192.168.31.111:51274 ESTABLISHED 2205/mysqld
slave是一直连接到master的,传输层协议使用的是tcp,因为建立了连接,使用的账号和密码都是主服务器新建授权的用户的账号密码,用于复制二进制日志给slave的
MySQL主从复制的介绍就到这里了,快去试试mysql主从复制的搭建吧!!
标签:主从复制,slave,MySQL,详解,master,mysql,服务器,日志,root From: https://blog.51cto.com/u_16070827/6229011