mysql主从复制&mysql+keepalived实现高可用
一、mysql主从复制
1. mysql安装
另一篇博客已经介绍mysql的安装教程,请移步:
https://blog.csdn.net/qq_28197005/article/details/120763590?spm=1001.2014.3001.5501
2. mysql主从复制配置
2.1 mysql主从复制原理概述
Mysql 中有一种日志叫做 bin 日志(二进制日志)。这个日志会记录下所有修改了数据库的SQL 语句(insert,update,delete,create/alter/drop table, grant 等等)。
主从复制的原理其实就是把主服务器上的 bin 日志复制到从服务器上执行一遍,这样从服务器上的数据就和主服务器上的数据相同了。
2.2 主从复制过程
- 主节点必须启用二进制日志,记录任何修改了数据库数据的事件。
- 从节点开启一个线程(I/O Thread)把自己扮演成 mysql 的客户端,通过 mysql 协议,请求主节点的二进制日志文件中的事件
- 主节点启动一个线程(dump Thread),检查自己二进制日志中的事件,跟对方请求的位置对比,如果不带请求位置参数,则主节点就会从第一个日志文件中的第一个事件一个一个发送给从节点。
- 从节点接收到主节点发送过来的数据把它放置到中继日志(Relay log)文件中。并记录该次请求到主节点的具体哪一个二进制日志文件内部的哪一个位置(主节点中的二进制文件会有多个,在后面详细讲解)。
- 从节点启动另外一个线程(sql Thread ),把 Relay log 中的事件读取出来,并在本地再执行一次。
2.3 配置前准备
准备的服务器列表:
- 主节点:192.168.159.129
- 从节点1: 192.168.159.128
- 从节点2: 192.168.159.130
采用一主两从的架构部署,三台服务器均为虚拟机,同样也可以在一台服务器上部署主从复制关系,但是生产中不建议;
2.4 主从节点配置
在配置文件/etc/my.cnf中加入以下配置:
log-bin = mysql-bin # 开启二进制日志,主节点必须要开启,从节点可以不开。
server-id = 129 # 服务ID号,主从节点都需要,且要唯一,一般配置为IP地址后面几位
2.5 登录数据库配置
2.5.1 主库配置
需要创建一个用户,用户需要授权,用于从库来同步数据。由于我直接用的root用户,该步骤省略;
GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456';
配置完成之后,登录主库,查看目前主库的信息show master status;:
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 2094 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
到此之后,不要再操作主库,(此处可以理解为,备份从这个位置开始,如果操作过主库,file以及position信息会有所变化,导致同步失败)。
2.5.2 从库配置
change master to master_host='192.168.159.129',master_user='root',master_password='hyg403664340',master_log_file='mysql-bin.000006',master_log_pos=2094;
注意事项:
- 填写正确的主服务器信息,账号密码用上一步配置的;
- master_log_file和master_log_pos用查询到主库里的信息;
配置完成后,启动slave服务:
start slave
查看slave信息:
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.159.129
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000006
Read_Master_Log_Pos: 2094
Relay_Log_File: localhost-relay-bin.000008
Relay_Log_Pos: 612
Relay_Master_Log_File: mysql-bin.000006
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: 2094
Relay_Log_Space: 823
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:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 129
Master_UUID: e7ff71c0-2c99-11ec-99c2-000c29c00152
Master_Info_File: /usr/local/mysql/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
看到的信息有点多,着重注意:
- 前面几项显示为主库的信息,仔细核对是否正确
- Slave_IO_Running 和 Slave_SQL_Running这两项必须要全部显示为yes才可以。
到此为止,主从复制配置完成,中间还是遇到很多问题,做了很多无用功,没有一一做记录,多看报错日志,问题不大;
一个很重要的问题,看了其他博文介绍主从复制的并没有介绍:
主从复制之前,主库已经有数据该怎么办??
因为这个问题,后续验证及部署的时候,遇到很多头疼的问题,比如会因为表不存在导致复制失败、库不存在,一开始以为配置的slave信息不对,重新配置,重启了很多次问题还是存在,最后发现问题:
主库之前已经有数据,导致同步出错
解决方案:配置同步之前,先同步数据(同步方案有很多,建议使用navicat工具,简单便捷,不再赘述)
2.5.3 同步验证
主库操作:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> create table master_slave_test_1 (`testid` longtext, `testname` longtext);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into master_slave_test_1 values('0001', 'first_test');
Query OK, 1 row affected (0.00 sec)
mysql> select * from master_slave_test_1;
+--------+------------+
| testid | testname |
+--------+------------+
| 0001 | first_test |
+--------+------------+
1 row in set (0.00 sec)
从库查看同步信息:
mysql> select * from mysql.master_slave_test_1;
+--------+------------+
| testid | testname |
+--------+------------+
| 0001 | first_test |
+--------+------------+
1 row in set (0.00 sec)
到此为止,主从同步配置完成!!!
二、keepalived安装部署
三、mysql+keepalived
参考及引用:
https://blog.csdn.net/daicooper/article/details/79905660