今天搞Mysql主从复制,遇到了很多坑,在此记录相关操作。
今天用tp5.1进行mysql 的主从复制,数据库配置如下:
// 数据库类型
'type' => 'mysql',
// 服务器地址
'hostname' => 'localhost,60.205.204.160',
// 数据库名
'database' => 'database',
// 用户名
'username' => 'username',
// 密码
'password' => '111111',
// 端口
'hostport' => '3306',
// 数据库调试模式
'debug' => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 1,
// 数据库读写是否分离 主从式有效
'rw_separate' => true,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '0',
两台服务器都是CENTOS
ip1,ip2
首先要开启二进制
在mysql配置文件中
log-bin=mysql-bin
开始构建主从复制
第一步:
在主服务器配置如下:
在ip1中创建一个ip2主机中可以登录的MySQL用户
用户:ip2_user
密码:ip2_pwd
mysql>GRANT REPLICATION SLAVE ON *.* TO ‘ip2_user’@’ip2' IDENTIFIED BY ‘ip2_pwd’;
mysql>FLUSH PRIVILEGES;
第二步:
查看ip1MySQL服务器二进制文件名与位置
mysql>SHOW MASTER STATUS;
或
mysql>show master status \G;
第三步:
告知二进制文件名与位置
在从服务器中配置如下:
在ip2中执行:
mysql>CHANGE MASTER TO
>MASTER_HOST=’ip1’,
>MASTER_USER=’ip2_user’,
>MASTER_PASSWORD=’ip2_pwd’,
>MASTER_LOG_FILE=’mysql-bin.000004’,
>MASTER_LOG_POS=2015812;
测试主从复制
在ip2(从服务器)中开启主从复制:
mysql>start slave; #开启复制
mysql>SHOW SLAVE STATUS\G #查看主从复制是否配置成功
Slave_IO_State:
Master_Host: 118.24.2.153
Master_User: tp_gcan_top
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 2015812
Relay_Log_File: iz2ze4j3dpfuv8vtlac7ymz-relay-bin.000002
Relay_Log_Pos: 4
Relay_Master_Log_File:
Slave_IO_Running: No
Slave_SQL_Running: No
由上可以发现下面两个出现异常:
Slave_IO_Running: No
Slave_SQL_Running: No
如果这两个都是Yes,说明主从复制已经配置成功了。
解决方法如下:
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
mysql>SHOW SLAVE STATUS\G
Slave_SQL_Running: Yes
Slave_SQL_Running已经变成Yes,那么就剩下Slave_IO_Running: No要解决了
导致lave_IO_Running 为connecting 的原因主要有以下 3 个方面:
1、网络不通
2、密码不对
3、pos不对
# telnet ip1 3306
Trying ip1...
telnet: connect to address ip1: No route to host
测试ip1 3306端口是否连通,发现 No route to host
说明ip1没有放行3306端口。
将ip1的3306端口放行即可。
放行端口后已经可以连通,但是Slave_IO_Running: No还是NO
mysql同步的数据中是包含server-id的,用于标识该语句最初是从哪个server写入的,因此server-id一定要有的
每一个同步中的slave在master上都对应一个master线程,该线程就是通过slave的server-id来标识的;
每个slave在master端最多有一个master线程,如果两个slave的server-id 相同,则后一个连接成功时,前一个将被踢掉。
这里至少有这么一种考虑 slave主动连接master之后,如果slave上面执行了slave stop;
则连接断开,但是master上对应的线程并没有退出;
当slave start之后,master不能再创建一个线程而保留原来的线程,那样同步就可能有问题
因为我的两台服务器的mysql配置文件中
server-id = 1
这个配置是相同的,所以我将从服务器的server-id值更改如下:
server-id = 2
然后我将从服务器的mysql重启发现:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
好了,这时主从复制已经配置成功。