基于 MySQL 实现主从复制,MySQL 版本 5.7.25

目录

ー:为什么要使用主从复制 ?

二:到底要不要使用相关组件保证高可用 ?

三:配置主从复制


ー:为什么要使用主从复制 ?


答:在数据库主从复制中,一个主数据库有一个或者多个从数据库,我们可以对主数据库进行写入操作(insert,delete,update),对一个或者多个从数据库进行读取操作(select)。这个的操作方式,就是大量的查询请求也会分布到各个从数据库上,达到负载均衡,

主要是解决日益增长的请求数与 mysql client 连接数之间的妥协。

 

二:到底要不要使用相关组件保证高可用 ?


答:看业务,引入主从的切换一般能保证主从库的切换。但是主从之间的延迟会造成一部分主库的数据还未写入 binlog 造成一定的数据的丢失,具体情况如下。

主库 A1,A2,A3 数据已经写入了主库的 binlog ,但是因为网络的问题从库的 binlog 只读取到了 A1;发生了主从切换,则从库当主库继续提供服务。而从库之后生成的主键可能为 A1,A2,于是现在的从库(原主库)就会发生主键冲突。并结束主从同步。可能还会有其他的坑。

在我们公司业务中,只是使用了简单的主从复制。为了保证业务数据的一致性。主库宕机既停止服务。因为请求量并不是很大。并做了主从来做读写分离,还有缓存和 ES 等挡住流量。所以暂时没有发生宕机问题。

 

三:配置主从复制


主从节点配置说明:

主机名

IP地址

任务角色

数据库

node1

192.168.204.122

master1

MySQL

node2

192.168.204.133

slave1

MySQL

首先我们要在 node1、node2 上安装 MySQL 数据库,安装方式可以参考 linux-centos7 安装 mysql5.7.27 的安装 MySQL 部分,这里就不展开讲了。

安装完成之后要对数据库做一些配置,如下:

node1 的数据库是 node2 的数据库的主数据库

主库 node1 数据库的配置文件 /etc/my.cnf  如下:被 # 号包围的为主从需要配置

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql


# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0


default-character-set=utf8 # 设置编码方式

lower_case_table_names=1 # 不区分字母大小写

###############################################################

log-bin=mysql-bin # 开启二进制日志

server-id=1 # 设置server-id


# 不同步哪些数据库

binlog-ignore-db = mysql

binlog-ignore-db = test

binlog-ignore-db = information_schema


# 只同步哪些数据库,除此之外,其他不同步

# binlog-do-db = game

################################################################

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

从库 node2 数据库的配置文件 /etc/my.cnf 如下:主要是指定了一个服务 id 

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql


# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0


default-character-set=utf8


lower_case_table_names=1


server-id=2 #设置server-id,必须唯一


[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

为了方便,关闭各虚拟机的防火墙

service iptables stop

全部都修改了配置文件,所以全部都要重启 MySQL 数据库:

service mysqld restart

我们进入到 node1 数据库中,输入以下命令查看相关信息:

mysql> show master status;

+------------------+----------+--------------+-------------------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB              |

+------------------+----------+--------------+-------------------------------+

| mysql-bin.000007 | 106      |              | mysql,test,information_schema |    

+------------------+----------+--------------+-------------------------------+

1 row in set (0.00 sec)

# 当前 binlog 文件为 mysql-bin.000007 , 106 行, 忽略的 db 有 mysql,test,information_schema

 

根据 node1 这个主数据库的信息,开始配置 node2 的从数据库,进入到 node2 数据库 中,输入以下命令,注意 master_log_filemaster_log_pos 来自于上一步获取到的 node1 主数据库的信息:

在执行下一条命令之前,要保证 slave 是关闭的,如果没用关闭,使用以下命令关闭:

mysql> stop slave;
mysql> change master to master_host='192.168.204.122', master_user='root', master_password='root', master_log_file='mysql-bin.000007', master_log_pos=106;

 

配置完成之后,要启动 slave,执行下面的命令启动 slave

mysql> start slave;

其中完成之后使用以下命令查看启动的情况:

mysql> show slave status;

正常情况下输出以下内容,要保证 Slave_IO_RunningSlave_SQL_RunningYes

mysql> show slave status\G;

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.204.122

Master_User: root

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000007

Read_Master_Log_Pos: 106

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 251

Relay_Master_Log_File: mysql-bin.000007

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table:

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 106

Relay_Log_Space: 407

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: 0

Master_SSL_Verify_Server_Cert: No

Last_IO_Errno: 0

Last_IO_Error:

Last_SQL_Errno: 0

Last_SQL_Error:

1 row in set (0.00 sec)

错误情况有以下几种:

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.

查看状态
Last_IO_Errno: 0
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.

解决办法:因为服务器克隆的时候提交 UUID 产生了重复 ,解决办法,在从服务器删掉该文件

cat  /etc/my.cnf

find / -name auto.cnf

cd   /var/lib/mysql

rm -rf auto.cnf

全部正常之后可以连接主库进行插入等操作。观察从库的数据。有一定的时间延迟

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章