随着系统应用访问量逐渐增大,单台数据库读写访问压力也随之增大,当读写访问达到一定瓶颈时, 将数据库的读写效率骤然下降,甚至不可用;为了解决此类问题,通常会采用mysql集群,当主库宕机后,集群会自动将一个从库升级为主库,继续对外提供服务;那么主库和从库之间的数据是如何同步的呢?
结合上边的这张图来进行讲解。首先我们称呼主节点为Master,从节点为Slave。
首先Slave 上面的IO线程发起请求,连接上 Master,并从指定日志文件的指定位置(或者从最开始的日志)之后的日志内容。然后Master 接收到来自 Slave 的 IO 线程的请求后,通过负责复制的 IO 线程根据请求信息读取指定日志指定位置之后的日志信息,返回给 Slave 端的 IO 线程。Slave 的 IO 线程接收到信息后,将接收到的日志内容依次写入到 Slave 端的Relay Log文件(mysql-relay-bin.xxxxxx)的最末端,并将读取到的Master端的bin-log的文件名和位置记录到master- info文件中。
当IO线程处理完毕之后,Slave 的 SQL 线程检测到 Relay Log 中新增加了内容后,会马上解析该 Log 文件中的内容成为在 Master 端真实执行时候的那些可执行的SQL语句,并在自身执行这些 SQL。这样,实际上就是在 Master 端和 Slave 端执行了同样的SQL,所以两端的数据就达成了数据的一致性。
关于mysql的主从配置超详细笔记:
实验环境:两台centos7虚拟机之间进行主从配置
主机:192.168.43.138
从机:192.168.43.135
首先是需要在主机上边安装mysql数据库。
[root@localhost ~]# wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 复制代码
使用上面的命令就直接下载了安装用的Yum Repository。
[root@localhost ~]# yum -y install mysql57-community-release-el7-10.noarch.rpm 复制代码
接着就可以开始安装MySQL服务器。
[root@localhost ~]# yum -y install mysql-community-server 复制代码
这些基本的安装步骤都比较简单,按着命令巧就好了。装好之后大概如下图所示:
到这里,主机的mysql就已经安装完成了。
安装完毕数据库之后,通过服务命令来进行启动:
[root@localhost ~]# systemctl start mysqld.service 复制代码
然后查看一下状态:
[root@localhost ~]# systemctl status mysqld.service 复制代码
此时的mysql已经启动了,但是初始化的密码值需要通过日志来查看:
[root@localhost ~]# grep "password" /var/log/mysqld.log yourpassword 复制代码
输入密码,登录mysql:
重置一次密码,方便后边使用。
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password'; 复制代码
(注意过于简单的密码可能会有提示)
原因是因为MySQL有密码设置的规范,具体是与validate_password_policy的值有关:
最后是刷新一遍配置文件:
mysql> flush privileges; 复制代码
移除原来的yum文件:
[root@localhost ~]# yum -y remove mysql57-community-release-el7-10.noarch 复制代码
同样在从机上边也进行一次相同的操作,保证主机和从机的mysql版本属性完全一致。
为了方便后边的操作,小编使用navicat来进行客户端的操作:
为了能让外部机器进行连接,因此需要开通mysql的连接访问权限:
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'youpassword' WITH GRANT OPTION; 复制代码
记得刷新一遍配置文件:
mysql> flush privileges; 复制代码
这样我们的基本环境就已经搭建完毕了:
接下来就是主从配置的核心部分了:
主节点的配置
vi /etc/my.cnf log-bin = mysql-bin server-id =1 innodb-file-per-table =ON skip_name_resolve=ON 复制代码
然后重启mysql:
[root@idea-centos /]# service mysqld restart 复制代码
然后登录mysql,查看二进制日志的开启情况:
mysql> show global variables like '%log_bin%'; 复制代码
查看主节点的二进制日志信息:
mysql> show master logs;
查看主节点的server id
mysql> SHOW GLOBAL VARIABLES LIKE '%server%'; 复制代码
接着,需要在主mysql上创建一个拥有复制权限的用户:
这里的ip是指从节点的ip
mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'192.168.43.135' IDENTIFIED BY 'yourpassword'; 复制代码
记得刷新一遍配置文件:
mysql> flush privileges; 复制代码
然后就是从节点的配置信息了:
[root@idea-centos mysql]# vi /etc/my.cnf 复制代码
从节点的配置
relay-log=relay-log relay-log-index=relay-log.index server-id=2 innodb_file_per_table=ON skip_name_resolve=ON 复制代码
重启mysql
[root@idea-centos /]# service mysqld restart 复制代码
同样登录从节点的mysql之后,查看相应的server信息和日志信息:
mysql> show global variables like "%relay_log%"; 复制代码
mysql> show global variables like "%log_bin%"; 复制代码
mysql> show global variables like "%server%"; 复制代码
然后需要在从节点上配置访问主节点的参数信息:
注意这里的master logs信息需要在主机上边进行访问,然后MASTER_LOG_FILE和MASTER_LOG_POS要和最新的日志信息做匹配
mysql> CHANGE MASTER TO MASTER_HOST='192.168.43.138',MASTER_USER='repluser',MASTER_PASSWORD='yourpassword', MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=626; 复制代码
这个时候,我们可以查看从节点的状态信息。
mysql> show slave status\G 复制代码
这个时候,从节点上边的IO线程和SQL线程都是出于no状态,并未开启。
启动从节点的io和sql线程:
mysql> start slave; 复制代码
再次查看状态,io,sql线程均启动成功。
mysql> show slave status\G 复制代码
接下来就可以进行测试来验证是否同步了:
首先是在主节点上创建数据库:
再去从节点那边查看数据库信息:
这个时候会发现,主从之间的数据进行了同步化操作。
再去查看一下相应的主从日志信息:
会发现两者之间的log_pos数值一致。
主从复制架构虽然能够保证从节点自动复制主节点的数据,能够自动保证两者之间的数据一致性。为了防止让从节点的数据库被外界进行写操作,从而导致篡改了主数据库的数据,我们需要对从节点的数据库进行权限控制。
mysql> flush tables with read lock;