文章目录
前言
-
1.CentOS x86_64环境。
-
2.GreatSQL 8.0.25-16。
-
3.构建一主一从异步复制环境。
-
4.构建一主一从半同步复制环境。
-
5.构建双向复制(两个节点互为主从)半同步复制环境。
-
6.均采用RBR模式。
构建一主一从异步复制模式
构建一主一从模式图
搭建一台主机用于处理所有写请求
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地址
② hostname
③ IP 地址
④ 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;
图中两值为yes则为成功!
若不成功:
可能原因有:
- 网络不通
- 账户密码错误
- 防火墙
- mysql配置文件问题
- 连接服务器时语法
- 主服务器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,'李四');
主机和从机都已同步
构建一主一从半同步复制环境
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%';
构建双向复制(两个节点互为主从)半同步复制环境
基于上述操作后,已经建立单向半同步复制环境,此时若要构建双向复制,需要建立主节点向从节点复制
在从节点上:
# 创建用户
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;
测试一下:
从机上插入王五,主机上也查询出来了!