MySQL基本的主从复制搭建过程及原理

虚拟机和安装准备

首先准备三台虚拟机,搭建一主两从架构。我这里以CentOS7为例。

服务器名分别为mysql01, mysql02, mysql03。 其中,mysql01 作为Master节点,两外两个作为Slave节点,从主节点同步数据。

在这里插入图片描述
首先要在三台虚拟机上安装mysql,安装过程见:CentOS7安装Mysql8全过程

配置主节点

安装完成后, 进入mysql01, 编辑配置文件 my.cnf

vi /etc/my.cnf

在配置文件中加入以下配置:

#server-id 服务节点唯一标识。需要给集群中每个服务分配一个单独的ID。每一个mysql都不能重复。值可以自己设置。
server-id=47 	
#开启binlog,并指定文件名
log_bin=master-bin 
log_bin-index=master-bin.index
skip-name-resolve 
#设置连接端口 
port=3306 
#设置mysql的安装目录 
basedir=/usr/local/mysql
#允许最大连接数 
max_connections=200 
#允许连接失败的次数
max_connect_errors=10 
#服务端使用的字符集默认为UTF8 
character-set-server=utf8 
#创建新表时将使用的默认存储引擎 
default-storage-engine=INNODB 
#默认使用“mysql_native_password”插件认证 
default_authentication_plugin=mysql_native_password

配置后的文件如下:

在这里插入图片描述

重启MySQL服务
service mysqld restart

登录mysql

mysql -uroot -p

为root用户分配replication slave的权限

注:在实际生产环境中,通常不会直接使用root用户,而会创建一个拥有全部权限的用户来负责主从同步。

GRANT REPLICATION SLAVE ON *.* TO 'root'@'%';
flush privileges;

通过命令show master status,可以查看master库当前正在使用的二进制日志及当前执行二进制日志位置

show master status;

在这里插入图片描述

File:当前日志的binlog文件
Position:binlog文件中的索引。
Binlog_Do_DB:需要进行数据同步的库
Binlog_Ignore_DB:数据同步所忽略的库

这个 File 和 Position 的值,我们需要记录下来,后续在从节点中需要使用。比如我这里的值是 “master-bin.000005” 和 “156”。

扩展

这里额外说下, 如果需要配置主节点中只有部分库的数据需要同步到从节点,那么可以在my.cnf文件中配置。

#需要同步的二进制数据库名, 我这里配置主节点中的test库中的数据,同步到从节点
binlog-do-db=test
#只保留7天的二进制日志,以防磁盘被日志占满(可选)
expire-logs-days = 7
#不备份的数据库
binlog-ignore-db=information_schema
binlog-ignore-db=performation_schema
binlog-ignore-db=sys

配置完成了之后,在show master status指令中,就可以看到Binlog_Do_DB和
Binlog_Ignore_DB两个参数的作用了。

至此,主节点的配置就完成了。

配置从节点

接下来进入mysql02的虚拟机, 配置从节点。

vi /etc/my.cnf

在配置文件中加入以下配置:

#server-id 服务节点唯一标识。需要给集群中每个服务分配一个单独的ID。每一个mysql都不能重复。值可以自己设置。
server-id=48 	
#打开MySQL中继日志 
relay-log-index=slave-relay-bin.index 
relay-log=slave-relay-bin 
#打开从服务二进制日志 
log-bin=mysql-bin 
#使得更新的数据写进二进制日志中 
log-slave-updates=1 
#设置3306端口 
port=3306 
#设置mysql的安装目录 
basedir=/usr/local/mysql 
#允许最大连接数 
max_connections=200 
#允许连接失败的次数
max_connect_errors=10 
#服务端使用的字符集默认为UTF8 
character-set-server=utf8
#创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
#默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password

配置后的文件如下:

在这里插入图片描述

扩展

如果主节点配置了只有部分库的数据同步,那么从节点配置文件中也需要做一些配置。

#如果salve库名称与master库名相同,使用本配置
replicate-do-db = test
#如果master库名[test]与salve库名[test01]不同,使用以下配置[需要做映射]
replicate-rewrite-db = test-> test01
#如果不是要全部同步[默认全部同步],则指定需要同步的表
replicate-wild-do-table=test.table1
replicate-wild-do-table=test.table2

配置完成后,登录mysql

mysql -uroot -p

登录mysql后,需要使用命令,在从节点上配置主节点的信息。这样,从节点才可以从主节点进行数据的同步。

CHANGE MASTER TO 
MASTER_HOST='192.168.164.138',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='master-bin.000007',
MASTER_LOG_POS=718,
GET_MASTER_PUBLIC_KEY=1;

在这里插入图片描述
解释:

MASTER_HOST: 主节点IP地址
MASTER_PORT: 主节点端口
MASTER_USER: 用于数据同步的用户
MASTER_PASSWORD: 用于数据同步的用户的密码
MASTER_LOG_FILE: 指定Slave从哪个日志文件开始复制数据,即上文搭建Master时所记录的 File 字段的值
MASTER_LOG_POS: 指从文件的哪个位置开始读,即上文搭建Master时所记录的 Position 字段的值
GET_MASTER_PUBLIC_KEY: 用户加密Password

        之所以设置GET_MASTER_PUBLIC_KEY=1,是因为开启主从复制的时候可能会报出下方的异常。原因是mysql8默认使用插件caching_sha2_password,有些client连接报这个错误,需要拿到server的public key来加密password

ERROR 2061 (HY000): Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection.

到此配置就完成了,然后start slave。

start slave;

在这里插入图片描述
如果在执行start slave时,报如下错误:

ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

则可以先执行,reset slave, 然后再重新start slave 就可以了。

在这里插入图片描述
reset slave 执行的时候做了这样几件事:

删除slave_master_info ,slave_relay_log_info两个表中数据
删除所有relay log文件,并重新创建新的relay log文件;
不会改变gtid_executed 或者 gtid_purged的值

到此, 一主一从就搭建好了,另外一个从机,只需要仿照上方,mysql02的搭建方式即可。

需要注意的是,在搭建mysql03时,my.cnf配置文件中的server-id 的值需要改一下,不能与mysql02中的相同。

完成后,可以使用命令查看从节点信息。包括主节点的IP,端口,从节点当前状态等。

show slave status \G;

效果如下:

mysql> 
mysql> 
mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.164.138	// 主节点IP
                  Master_User: root				// 主节点用于数据同步的账号
                  Master_Port: 3306				// 主节点端口
                Connect_Retry: 60				
              Master_Log_File: master-bin.000006	
          Read_Master_Log_Pos: 156					
               Relay_Log_File: slave-relay-bin.000011
                Relay_Log_Pos: 325
        Relay_Master_Log_File: master-bin.000005
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1008
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 156
              Relay_Log_Space: 1341
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1008
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 47
                  Master_UUID: 6eddc1cf-b720-11eb-8d5e-000c29cf3dd3
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 210524 22:52:25
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
       Master_public_key_path: 
        Get_master_public_key: 1
            Network_Namespace: 
1 row in set, 1 warning (0.00 sec)
搭建效果验证

搭建完成后,验证以下。

首先在主节点,创建一个test库。

CREATE DATABASE test;

在这里插入图片描述

然后在从节点mysql02和mysql03,查看有无该库。

在这里插入图片描述
该库存在,说明搭建成功。

如果还想进一步验证,则可以在主库中创建表并添加一些数据,在从库中进行查询。这里不在说明。

主从复制具体步骤
  1. 从库通过手动执行CHANGE MASTER TO 语句连接主库。语句中包含了建立连接的一切必要条件(host, port, ip, user, password 等),同时提供二进制日志的起点位置(file,position)
  2. 从库执行start slave启动。从节点的IO线程与主节点的dump线程建立连接
  3. 从节点根据上面语句中提供的file和position的值,IO线程向主库发起binlog请求
  4. 主节点dump线程收到从节点的请求,将本地binlog以events的方式发给从节点IO线程
  5. 从节点IO线程接收到binlog events,存放到本地relay-log中,传送过来的信息,会记录到master.info中
  6. 从节点SQL线程应用relay-log,并将应用过的记录到relay-log-info中。默认情况下,已经应用过的relay会自动被清理(purge)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值