为什么要做mysql的主从复制?
数据库作为我们在生产中最重要的模块之一其重要性不言而喻,而数据库不同于web服务相对易于实现负载均衡和高可用集群,所以冗余成为了数据库做主从复制的重要原因之一。
在实际生产中随着我们的业务越来越大,那么单台mysql服务器显然是心有余而力不足的,主从复制在这里可以转移一部分的读请求达到负载均衡的目的。
数据固然是最重要的,如果有了从节点那么在备份数据上安全性就更为可靠。
实现
环境
本着以最易理解的实验原则,既然是主从复制,那么我就准备两台CentOS7.3分别做主和从。
之前的实验我是直接用的虚拟机分配的ip来做的所以ip地址不连贯在识别上有点麻烦,所以这次我把这两台CentOS7.3的地址都改为了静态地址,之后的实验不出意外也都是这些地址了。
主节点ip:172.16.2.101,hostname:master
从节点ip:172.16.2.102,hostname:slave
具体操作
主从复制的原理是通过主节点和从节点传递二进制日志实现的。主节点生成的二进制日志传到从节点上的中继日志中然后从中继日志中重放二进制日志实现数据同步,所以在主节点上必须开启二进制日志,在从节点上必须开启中继日志。
#主节点配置 [root@master ~]# yum install mariadb-server -y #主节点安装包,这里只需要安装mariadb-server包就行了,因为安装mariadb-server包的时候会因依赖关系安装上mariadb客户端 [root@master ~]# vim /etc/my.cnf.d/server.cnf #打开配置文件写入 server_id = 1 #服务id这里任意指定,但不能重复 log-bin = master-log #开启二进制日志并指定日志文件名和路径 skip_name_resolve = ON #开启忽略名字解析 [root@master ~]# systemctl start mariadb #启动主节点服务 #从节点配置 [root@slave ~]# yum install mariadb-server -y #从节点安装包 [root@slave ~]# vim /etc/my.cnf.d/server.cnf #打开配置文件写入 server_id = 2 #设置于主节点不同的id relay-log = relay-log #开启中继日志并指定路径 skip_name_resolve #开启忽略名字解析 [root@slave ~]# systemctl start mariadb #启动从节点
现在主从节点都已经启动,但是现在有个问题:从节点如何复制主节点的数据到从节点上呢?
解决这个问题就可以在主节点上创建一个拥有复制权限的账号,但是这个账号在从节点上是不能存在的。
[root@master ~]# mysql #登陆主节点mariadb服务 MariaDB [(none)]> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'test'@'%' IDENTIFIED BY 'test'; #创建test账号并赋予REPLICATION CLIENT和REPLICATION SLAVE权限 MariaDB [(none)]> SHOW MASTER STATUS; #查看二进制日志目前的文件和日志位置(position),这个很重要,在之后配置从节点的时候要用到 +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-log.000003 | 404 | | | +-------------------+----------+--------------+------------------+ 1 row in set (0.00 sec) MariaDB [(none)]>
那么主节点的配置已经完成,从上面我们也可以看到目前主节点的二进制日志的文件为master-log.000003,pos为404,现在可以开始配置从节点了。
[root@slave ~]# mysql #从节点登陆mariadb MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.16.2.101',MASTER_USER='test',MASTER_PASSWORD='test',MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=404; #这里是指定主节点的地址,用于复制的用户和密码,目前主节点的二进制文件名字和pos,这里注意pos是数值不是字符串,所以不能加引号 MariaDB [(none)]> START SLAVE; #启动主从复制
测试
到上面为止,配置部分就已经完成了,那么现在开始测试一下主从复制是否成功吧。
MariaDB [(none)]> SHOW DATABASES; #首先看看主节点上都有什么库 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | +--------------------+ 4 rows in set (0.00 sec) MariaDB [(none)]> CREATE DATABASE test2; #创建一个为名test2的数据库 Query OK, 1 row affected (0.00 sec) MariaDB [(none)]> SHOW DATABASES; #查看一下数据库是否创建成功 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test2 | +--------------------+ 5 rows in set (0.00 sec) MariaDB [(none)]> #接下来去从节点上查看一下新创建的数据库是否创建成功 [root@slave ~]# mysql -e "SHOW DATABASES;" #为了区分主从节点,从节点我就在命令行用mysql -e来执行sql语句了 +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | test | | test2 | #可以看到数据库成功同步过来了 +--------------------+ [root@slave ~]#
实验完毕,转载的朋友请注明来源出处,谢谢。