0基础学MySQL数据库—从小白到大牛(构建主从复制)

前言

  • 1.CentOS x86_64环境。

  • 2.GreatSQL 8.0.25-16。

  • 3.构建一主一从异步复制环境。

  • 4.构建一主一从半同步复制环境。

  • 5.构建双向复制(两个节点互为主从)半同步复制环境。

  • 6.均采用RBR模式。

构建一主一从异步复制模式

构建一主一从模式图

image-20220922163804155

搭建一台主机用于处理所有写请求

1.设置主机名:

[root@Master ~]# cat /etc/hostname
Master

2.虚拟机环境设为CentOS7 x86_64环境:

[root@Master ~]# cat /etc/system-release
CentOS Linux release 7.9.2009 (Core)

3.设置UUID、IP、子网掩码、网关:

vi /etc/sysconfig/network-scripts/ifcfg-ens32
UUID=27b7adea-7bca-4daa-a088-16c2667f8dcb
IPADDR=192.168.133.200
NETMASK=255.255.255.0
GATEWAY=192.168.133.2

重启服务:

systemctl restart network

4.设置MySQL Server的UUID:

vi /var/lib/mysql/auto.cnf

[auto]
server-uuid=0c9947c8-38f6-11ed-a3ba-000c2933715c

重启服务:

systemctl restart mysqld

5.设置MAC地址为:

ether 00:0c:29:33:71:5c

7.安装好GreatSQL 8.0.25-16:

mysql -uroot -p*****

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.25-16 |
+-----------+
1 row in set (0.04 sec)

搭建一台从机用于处理所有读请求

1.在VM软件上直接克隆主机

先不要开主机(master)按下面流程修改从机(slave)的① MAC地址hostnameIP 地址UUID

2.修改MAC地址

ether 00:50:56:26:da:96

3.设置主机名

[root@Slave ~]# cat /etc/hostname
Slave

4.修改IP地址、UUID

vi /etc/sysconfig/network-scripts/ifcfg-ens32
UUID=27b7adea-7bca-4daa-a077-16c2667f8dcb
IPADDR=192.168.133.201

重启服务:

systemctl restart network

5.修改MySQL Server的UUID:

vi /var/lib/mysql/auto.cnf

[auto]
server-uuid=0c9948c8-38f6-11ed-a3ba-000c2933715c

注意!如果这里不修改在有些场景会报错。比如:show slave status\G,报如下的错误:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have
equal MySQL server UUIDs; these UUIDs must be different for replication to work.

重启服务:

systemctl restart mysqld

至此,主机从机网络配置已完毕。

主机&从机配置文件且设为RBR模式

主机

  • 必选
vi /etc/my.cnf
#[必须]主服务器唯一ID
server-id= 1

#[必须]启用二进制日志,指名路径。比如:自己本地的路径/log/mysqlbin
log-bin=test-bin
  • 可选
#[可选] 0(默认)表示读写(主机), 1 表示只读(从机)
read-only= 0

#设置日志文件保留的时长,单位是秒
binlog_expire_logs_seconds= 6000

#控制单个二进制日志大小。此参数的最大和默认值是1GB
max_binlog_size=200M

#[可选]设置不要复制的数据库
binlog-ignore-db=test

#[可选]设置需要复制的数据库,默认全部记录。比如:binlog-do-db=test_master_slave
binlog-do-db=需要复制的主数据库名字

#[可选]设置binlog格式
binlog_format=STATEMENT

主机具体设置如下:

server-id=1
log-bin=test-bin
binlog-do-db=test_master_slave
#因考核需求设置为ROW即RBR模式
binlog_format=ROW

重启服务:

systemctl restart mysqld

从机

  • 必选
vim /etc/my.cnf

#[必须]从服务器唯一ID
server-id=2
  • 可选
#[可选]启用中继日志
relay-log=mysql-relay

从机具体设置如下:

server-id=2
relay-log=mysql-relay

重启服务:

systemctl restart mysqld

注意:主从机都关闭防火墙 systemctl stop firewalld.service

主机:建立账户并授权

注意:如果使用的是MySQL8,需要如下的方式建立账户,并授权slave:

因为MySQL8.0有密码强度需求

# 创建用户
mysql> CREATE USER 'slave1'@'%' IDENTIFIED BY '******';
Query OK, 0 rows affected (0.01 sec)
# 赋予权限
GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'%';
# 查看权限
mysql> show grants for 'slave1'@'%';
+------------------------------------------------+
| Grants for slave1@%                            |
+------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `slave1`@`%` |
+------------------------------------------------+
1 row in set (0.00 sec)

#此语句必须执行。否则会报错。
ALTER USER 'slave1'@'%' IDENTIFIED WITH mysql_native_password BY '*******';

# 刷新权限
flush privileges;

查询Master的状态,并记录下File和Position的值。

mysql> show master status;
+-----------------+----------+-------------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB      | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+-------------------+------------------+-------------------+
| test-bin.000001 |     1136 | test_master_slave |                  |                   |
+-----------------+----------+-------------------+------------------+-------------------+
1 row in set (0.01 sec)

至此,不要再动主机,以免服务器状态变化

从机:配置需要复制的主机

1.从机上复制主机的命令

CHANGE MASTER TO
MASTER_HOST='主机的IP地址',
MASTER_USER='主机用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',
MASTER_LOG_POS=具体值;

修改如下:

mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.133.200',
    -> MASTER_USER='slave1',
    -> MASTER_PASSWORD='********',
    -> MASTER_LOG_FILE='test-bin.000001',
    -> MASTER_LOG_POS=1136;
Query OK, 0 rows affected, 8 warnings (0.02 sec)

2.启动同步:

#启动slave同步
mysql> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.00 sec)

如果报错Slave failed to initialize relay Log info structure from the repository

可以执行如下操作,删除之前的relay_log信息。然后重新执行 CHANGE MASTER TO …语句即可。
mysql> reset slave; #删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件

3.查看同步状态:

show slave status\G;

image-20220922010612110

图中两值为yes则为成功!

若不成功:

image-20220922010659297

可能原因有:

  1. 网络不通
  2. 账户密码错误
  3. 防火墙
  4. mysql配置文件问题
  5. 连接服务器时语法
  6. 主服务器mysql权限

测试

主机新建库、新建表、insert记录,从机复制:

CREATE DATABASE test_master_slave;

use test_master_slave;

CREATE TABLE test(id INT,NAME VARCHAR(16));
		
INSERT INTO test VALUES(1,'张三');
INSERT INTO test VALUES(2,'李四');

image-20220922011106823

主机和从机都已同步

构建一主一从半同步复制环境

1.主机操作:

#1.登陆
mysql -uroot -p
 
#2.下载插件
install plugin rpl_semi_sync_master soname 'semisync_master.so';
 
#3.检查是否安装插件
show plugins;
#3.1有如下就算成功
rpl_semi_sync_master  | ACTIVE   | REPLICATION  | semisync_master.so | GPL  |

#4.打开设置
set global rpl_semi_sync_master_enabled=on;

2.从机操作:

install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
 
show plugins;
 
set global rpl_semi_sync_slave_enabled=on;
 
#重启从库的IO线程
stop slave io_thread;
start slave io_thread;

3.检查:

#master上运行, 如果Rpl_semi_sync_master_status状态为ON, 那么就可以了。
show global status like '%semi%';

image-20220922011738323

构建双向复制(两个节点互为主从)半同步复制环境

基于上述操作后,已经建立单向半同步复制环境,此时若要构建双向复制,需要建立主节点向从节点复制

在从节点上:

# 创建用户
mysql> CREATE USER 'master1'@'%' IDENTIFIED BY '******';
Query OK, 0 rows affected (0.01 sec)
# 赋予权限
GRANT REPLICATION SLAVE ON *.* TO 'master1'@'%';
# 查看权限
mysql> show grants for 'master1'@'%';
+-------------------------------------------------+
| Grants for master1@%                            |
+-------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO `master1`@`%` |
+-------------------------------------------------+
1 row in set (0.00 sec)

#此语句必须执行。否则会报错。
ALTER USER 'master1'@'%' IDENTIFIED WITH mysql_native_password BY '******';

# 刷新权限
flush privileges;

查询Master的状态,并记录下File和Position的值。

mysql> show master status;
+-----------------+----------+-------------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB      | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+-------------------+------------------+-------------------+
| test-bin.000001 |     1136 | test_master_slave |                  |                   |
+-----------------+----------+-------------------+------------------+-------------------+
1 row in set (0.01 sec)

至此,不要再动从机,以免服务器状态变化

建立连接:

mysql> CHANGE MASTER TO
    -> MASTER_HOST='192.168.133.201',
    -> MASTER_USER='master1',
    -> MASTER_PASSWORD='******',
    -> MASTER_LOG_FILE='binlog.000007',
    -> MASTER_LOG_POS=2315;
Query OK, 0 rows affected, 8 warnings (0.01 sec)

启动同步:

mysql> START SLAVE;
Query OK, 0 rows affected, 1 warning (0.01 sec)

查看同步状态:

show slave status\G;

image-20220922013437872

测试一下:

image-20220922013546983

从机上插入王五,主机上也查询出来了!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白努力学数据库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值