CentOS 下搭建Mysql8 主从复制,读写分离配置全过程

MySQL主从复制的优点:
1、 如果主服务器出现问题, 可以快速切换到从服务器提供的服务,保证高可用性
2、 可以在从服务器上执行查询操作, 降低主服务器的访问压力
3、 可以在从服务器上执行备份, 以避免备份期间影响主服务器的服务
Centos8安装Mysql5.7,参考链接https://blog.csdn.net/yanchao963852741/article/details/105297519/?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
注意事项:
1、server-id必须唯一,一般使用ip的后三位,修改配置文件,默认没有修改权限,需要cd到 /etc/my.cnf, 使用chmod 777 my.cnf
2、从库Slave_IO_Running:NO 可能原因:帐号无权限操作或者 uuid冲突,(我的冲突由于由虚机克隆造成)
3、Can't execute the query because you have a conflicting read lock,解锁下即可 unlock tables;
4、一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询, 实时性要求高的数据仍然需要从主数据库获得
5、修改完主从服务器的配置需要重启mysql:service mysqld restart

主机A: 192.168.171.128 Master
从机B: 192.168.171.129 Slave

安装Mysql

yum install mysql mysql-server #输入y即可自动安装,直到安装完成;

2 MySQL数据库设置
  首先启动MySQL

[root@localhost ~]# systemctl start  mysqld.service
  查看MySQL运行状态,运行状态如图:

[root@localhost ~]# systemctl status mysqld.service
 

此时MySQL已经开始正常运行,不过要想进入MySQL还得先找出此时root用户的密码,通过如下命令可以在日志文件中找出密码:

[root@localhost ~]# grep "password" /var/log/mysqld.log

输入初始密码(是上面图片最后面的 no;e!5>>alfg),此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库:

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password';

3 开启mysql的远程访问
执行以下命令开启远程访问限制(注意:下面命令开启的IP是 192.168.171.128,如要开启所有的,用%代替IP):

grant all privileges on *.* to 'root'@'192.168.171.128' identified by 'password' with grant option;

注意此处如果mysql8版本报错,通过以下解决

场景,mysql8.0.17修改mysql用户权限,开启所有ip可访问
使用:GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
报错,原因是要先创建用户再进行赋权,不能同时进行,所以我使用如下方法
使用mysql
use mysql
修改密码:
ALTER USER 'root'@'localhost' IDENTIFIED BY '密码';
修改ip为所有可访问
update user set host='%' where user='root';
查看
select host,user from user;
刷新
flush privileges;

或者可以使用
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
flush privileges;


然后再输入下面两行命令

mysql> flush privileges; 
mysql> exit

4 为firewalld添加开放端口
添加mysql端口3306和Tomcat端口8080

[root@localhost ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent
[root@localhost ~]# firewall-cmd --zone=public --add-port=8080/tcp --permanent
然后再重新载入

[root@localhost ~]# firewall-cmd --reload
 

使用Navicat连接没问题,继续:

主从配置需要注意的点

主从服务器操作系统版本和位数一致;

Master 和 Slave 数据库的版本要一致;

Master 和 Slave 数据库中的数据要一致;

Master 开启二进制日志, Master 和 Slave 的 server_id 在局域网内必须唯一;

主从配置的简要步骤
Master 上的配置

安装数据库;
修改数据库配置文件, 指明 server_id, 开启二进制日志(log-bin);
启动数据库, 查看当前是哪个日志, position 号是多少;
登录数据库, 授权数据复制用户(IP 地址为从机 IP 地址, 如果是双向主从, 这里的还需要授权本机的 IP 地址, 此时自己的 IP 地址就是从 IP 地址);
备份数据库(记得加锁和解锁);
传送备份数据到 Slave 上;
启动数据库;
以下步骤, 为单向主从搭建成功, 想搭建双向主从需要的步骤:

登录数据库, 指定 Master 的地址、 用户、 密码等信息(此步仅双向主从时需要);
开启同步, 查看状态;
Slave 上的配置

安装数据库;
修改数据库配置文件, 指明 server_id(如果是搭建双向主从的话, 也要开启二进制
日志 log-bin);
启动数据库, 还原备份;
查看当前是哪个日志, position 号是多少(单向主从此步不需要, 双向主从需要);
指定 Master 的地址、 用户、 密码等信息;
开启同步, 查看状态。
1、主节(Master)点配置

修改 Master 的配置文件/etc/my.cnf

vi /etc/my.cnf
1
在my.cnf文件中加入如下配置内容

[mysqld]
log-bin=mysql-bin
server-id=1
1
2
3
2、从节点(Slave)配置

修改 Slave 的配置文件/etc/my.cnf

vi /etc/my.cnf
1
在my.cnf文件中加入如下配置内容

[mysqld]
server-id=2
1
2
3、创建用于复制操作的用户

在主节点创建一个用户root,用于从节点链接主节点时使用。

mysql> CREATE USER 'root'@'192.168.171.129' IDENTIFIED WITH mysql_native_password BY 'Ron_master_1';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.171.129';
1
2
刷新授权表信息

mysql> flush privileges;
1
4、获取主节点当前binary log文件名和位置(position)

mysql> SHOW MASTER STATUS;
 这里写图片描述


5、在从(Slave)节点上设置主节点参数

mysql> CHANGE MASTER TO
MASTER_HOST='192.168.171.129',
MASTER_USER='root',
MASTER_PASSWORD='Ron_master_1',
MASTER_LOG_FILE='binlog.000006',
MASTER_LOG_POS=856; 

6、从节点上查看主从同步状态

mysql> show slave status\G;
1
7、从节点上开启主从同步

mysql> start slave;
1
8、再查看主从同步状态

mysql> show slave status\G;
1
查看状态时,可能会出现I/O任务启动失败的情况,即如下错误:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

这是因为在MySQL主从结构中,从机上的server_id和主机上的server_id不能相同,我们可以看一下主机上的server_id和从机上的server_id是否相同。

mysql> show variables like 'server_id'; 
1
主机:

这里写图片描述

从机:

这里写图片描述

这里我们把从机的server_id改成2

mysql> set global server_id=2; #此处的数值和my.cnf里设置的一样就行 

9、重新开启同步并查看装态

mysql> start slave;
mysql> show slave status\G;
 这里写图片描述

开启主从之后,如果状态如上图所示,那么说明主从信息就已经配置好了,接下来我们测试一下在主机上创建一个数据库,然后在从机上是否能够同步创建。

首先看一下我们主机和从机除了MySQL本身自带的数据库之前目前是没有任何数据的。

 

注意如果出现以下错误:

ca201e74f2473beb3253171ac8df0edb.png

问题定位:由于uuid相同,而导致触发此异常

解决方案:

把uuid修改即可,

查询命令找此auto.cnf修改uuid即可:

find -name auto.cnf

其实这个文件就在mysql的data目录中/var/lib/mysql/auto.cnf,这是我的文件位置
启mysql服务器,再查看mysql从节点的状态,恢复正常

重启。

 


版权声明:本文为haorenwoyige原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。