目录
ー:为什么要使用主从复制 ?
答:在数据库主从复制中,一个主数据库有一个或者多个从数据库,我们可以对主数据库进行写入操作(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_file 和 master_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_Running 和 Slave_SQL_Running 是Yes:
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
全部正常之后可以连接主库进行插入等操作。观察从库的数据。有一定的时间延迟