一、主从复制原理:
1、过程
1)<master>将数据写入数据文件,将sql语句写入binlog
2)<slave>通过IO 线程带着用户名、密码、读取的binlog日志名、位置连接到<master>。并取走所需的sql语句和binlog的位置信息。
3)IO Thread 将binlog的位置信息存入master info,将sql语句写入 relay log。
4)SQL Thread 从relaylog中取出sql语句,有mysql写入数据库文件。
2、作用:
1)便于实现读写分离。
* 实时性高的数据在主服务器上查询
2)备份可在从服务器上执行。
二、配置
(一)配置my.cof
1. <master>
#vim /etc/my.cnf
[mysqld]
server-id=150 #起个独有名字防止服务器混乱。
log-bin=mysql-bin #/开启binlog日志,起个名字
binlog-format=mixed #定义binlog日志格式
2.<slave>
打开relay log日志 。(必须)
打开binlog日志。(建议打开) 为以后数据丢失做准备。
# vim /etc/my.cnf
sever-id=132
log-bin=mysql-bin
relay-log=mysql-relay
log-slave-updates #让从服务器把更新的内容写到自己sql日志里
3、中继服务器
此处仅为示例,本实验中没有中继
# vim /etc/my.cnf
[mysqld]
sever-id=132
log-bin=mysql-bin
relay-log=mysql-relay
log-slave-updates
default-storage-engine=blackhole #使用黑洞引擎只记录binlog日志,不写入数据库。
4、删除两台服务器以前的binlog日志(可选),重启服务。
(二)建立复制用户
主从上分别创建用户
> grant replication slave on *.* to rep@'%' identified by '123';
(三)建立连接:
1.查看master状态:
> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 319 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
说明:取到日志位置为mysql-bin.000001 文件的319 位置
2、从库启动slave
1)配置master的地址、用户、密码、binlog位置
>change master to
master_host='192.168.71.150',
master_user='rep',
master_password='123',
master_log_file='mysql-bin.000001',
master_log_pos=319;
2)启动slave
> start slave;
Query OK, 0 rows affected (0.00 sec)
3)验证主从状态
Slave_IO_Running、Slave_SQL_Running两个地方都是yes,表示IO线程和SQL线程都开启了。
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.71.150
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 319
Relay_Log_File: mysql-relay.000002
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000001
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: 319
Relay_Log_Space: 402
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)
【FAQ】
1、启动slave时报错
> start salve
Slave failed to initialize relay log info structure from the repository
【分析】
relay_log名被该server上的另一个mysql slave占用了。
【解决】
重置slave,原来幽灵slave被干掉了。
> reset slave;
2、IO x线程一直 Connecting
>show slave status;
.......
Slave_IO_Running: Connecting
Slave_SQL_Running: Connecting
.......
【分析】
链接master出错,无非网络、账号、密码三个原因
经检测,在从库容器访问主库没有问题。应该从库中配置的主库信息有误。
【解决】
以k8s兑付系统测试环境为例:
[master]
>show master status;
[slave]
>stop slave;
>reset slave;
>change master to;
master_host='10.254.20.93',
master_user='root',
master_password='40010355',
master_log_file='mysql-master-nfc1t-bin.000003',
master_log_pos=28259463;
>start slave;
来源:oschina
链接:https://my.oschina.net/u/3942433/blog/2936955