MySQL集群篇
集群搭建之主从复制
主从复制原理
![](https://img-blog.csdnimg.cn/img_convert/2ddc82c7672489552848c89f6d530b0e.jpeg)
![](https://img-blog.csdnimg.cn/img_convert/872ac8b710d2d313b554714693e4bf4a.png)
binlog介绍和relay日志
查看bin log和relay log日志:
mysqlbinlog --base64-output=decode-rows -v -v mysql-bin.000058 >binlog
主从复制实践
关闭主从机器的防火墙
systemctl stop iptables(需要安装iptables服务)
systemctl stop firewalld(默认)
systemctl disable firewalld.service(设置开启不启动)
主服务器配置
第一步:修改my.conf文件
在[mysqld]段下添加:
#启用二进制日志
log-bin=mysql-bin
#服务器唯一ID,一般取IP最后一段
server-id=133
第二步:重启mysql服务
systemctl restart mysqld
第三步:主机给从机授备份权限
注意:先要登录到MySQL命令客户端
mysql>GRANTREPLICATION SLAVE ON *.* TO '从机MySQL用户名'@'从机IP' identified by '从机MySQL密码';
示例:
GRANT REPLICATIONSLAVE ON *.* TO 'root'@'%' identified by 'root';
注意事项:
一般不用root帐号,“%”表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。
第四步:刷新权限
mysql> FLUSHPRIVILEGES;
第五步:查询master的状态
mysql> showmaster status;
+------------------+---------+--------------+------------------+
| File | Position| Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001| 410 | db1 | mysql |
+------------------+----------+--------------+------------------+
1 row in set
从服务器配置
第一步:修改my.conf文件
[mysqld]
server-id=135
第二步:删除UUID文件
Fatalerror: The slave I/O thread stops because master and slave have equal MySQLserver UUIDs; these UUIDs must be different for replication to work.
如果出现此错误:因为是mysql是克隆的系统所以mysql的uuid是一样的,所以需要修改。
解决方法: 删除/var/lib/mysql/auto.cnf文件,重新启动MySQL服务。
第三步:重启并登录到MySQL进行配置从服务器
mysql>change master to
master_host='192.168.211.128',
master_port=3306,
master_user='root',
master_password='root',
master_log_file='mysql-bin.000001',
master_log_pos=397
注意:
语句中间不要断开,master_port 为mysql服务器端口号(无引号), master_user 为执行同步操作的数据库账户, “410” 无单引号(此处的 410 就是show master status 中看到的 position 的值,这里的mysql-bin.000001 就是 file 对应的值)。
第四步:启动从服务器复制功能
mysql>startslave;
第五步:检查从服务器复制功能状态
mysql> showslave status \G;
……………………(省略部分)
Slave_IO_Running:Yes //此状态必须YES
Slave_SQL_Running:Yes //此状态必须YES
……………………(省略部分)
![](https://img-blog.csdnimg.cn/img_convert/0fa2740b32d13d37456018242947e0f5.jpeg)
注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。
测试以上操作过程,从服务器配置完成。
以上操作过程,从服务器配置完成。
测试
搭建成功之后,往主机中插入数据,看看从机中是否有数据
主从同步延迟的原因及解决办法
1、主从同步的延迟的原因
我们知道, 一个服务器开放N个链接给客户端来连接的, 这样有会有大并发的更新操作,但是从服务器的里面读取binlog 的线程仅有一个, 当某个SQL在从服务器上执行的时间稍长 或者由于某个SQL要进行锁表就会导致,主服务器的SQL大量积压,未被同步到从服务器里。这就导致了主从不一致,也就是主从延迟。
2、主从同步延迟的解决办法
实际上主从同步延迟根本没有什么一招制敌的办法, 因为所有的SQL必须都要在从服务器里面执行一遍,但是主服务器如果不断的有更新操作源源不断的写入, 那么一旦有延迟产生,那么延迟加重的可能性就会原来越大。 当然我们可以做一些缓解的措施。
我们知道因为主服务器要负责更新操作, 他对安全性的要求比从服务器高, 所有有些设置可以修改,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置,而slave则不需要这么高的 数 据 安 全 , 完 全 可 以 讲 sync_binlog 设 置 为 0 或 者 关 闭 binlog,innodb_flushlog, innodb_flush_log_at_trx_commit 也 可以设置为0来提高sql的执行效率 这个能很大程度上提高效率。另外就是使用比主库更好的硬件设备作为slave。
就是把一台从服务器单独作为备份使用, 而不提供查询, 那边他的负载下来了, 执行relay log 里面的SQL效率自然就高了。
增加从服务器喽,这个目的还是分散读的压力, 从而降低服务器负载。
3、判断主从延迟的方法
MySQL提供了从服务器状态命令,可以通过show slave status 进行查看, 比如可以看看Seconds_Behind_Master参数的值来判断,是否有发生主从延时。 其值有这么几种: NULL - 表示io_thread或是sql_thread有任何一个发生故障,也就是该线程的Running状态是No,而非Yes. 0 - 该值为零,是我们极为渴望看到的情况,表示主从复制状态正常。