MySQL学习笔记:主从复制原理和配置

主从复制原理+实操

什么是MySQL主从复制?

​ MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来更新自己的数据,数据的更新可以在远程连接上进行,从节点可以复制主数据库中的所有数据库或者特定的数据库,或者特定的表。

为什么需要主从复制?

1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。
3、读写分离,使数据库能支撑更大的并发。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那么报表sql将不会造成前台锁,保证了前台速度。

主从复制原理

在这里插入图片描述

  1. 在slave服务器上执行start slave命令开启主从复制开关,开始主从复制
  2. 此时,slave服务器的IO线程会通过在master上已经授权的复制用户权限请求连接master服务器,并请求从执行binlog日志文件的指定位置(日志文件名和位置就是在配置主从服务时执行change master命令指定的)之后开始发送binlog日志内容
  3. master服务器接收到来自slave服务器的IO线程的请求后,其上负责复制的IO线程会根据slave服务器的IO线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给slave端的IO线程,返回的信息除了binlog日志内容外,还有在master服务器端记录的IO线程,返回的信息中有binlog中的下一个指定更新位置
  4. 当slave服务器的IO线程获取到master服务器上的dump线程发送的日志内容、日志文件及位置点后,会将binlog日志内容依次写到slave端自身的relay log中继日志文件(Mysql-relay-bin.xxx)的最末端,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取msater端新binlog日志时能告诉master服务器从新binlog日志的指定文件及位置开始读取新的binlog日志内容
  5. 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

注意:

  1. 从服务器可以不开启二进制日志
  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 [email protected]:/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线程启动失败?

可能的原因:

  1. 克隆机导致uuid冲突
  2. 防火墙没关
  3. master info配置信息打错了

9.测试主从复制的效果

  1. 主服务器建表建库插入数据,查看从服务器上数据是否仍然保持一致,一致则为成功

  2. 主服务器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
    
  3. 主服务器查看端口

    [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主从复制的搭建吧!!

猜你喜欢

转载自blog.csdn.net/qq_57629230/article/details/130394630