MYSQL主从同步原理解析!

大神请绕行!

一、为什么要主从同步?

我们会对数据库进行大量的读写操作,而如果数据库非常庞大的话,对我们的主机压力非常大,我们想到了一个解决的办法:两台服务器,一台只用来读取操作,一台只用来写入操作。

二、用途:

实时灾备,用于故障切换;

读写分离,提供查询服务;

备份,避免影响业务。

三、实战演练

主从部署必要条件:

  • 主库开启binlog日志(设置log-bin参数)
  • 主从server-id不同
  • 从库服务器能连通主库

1、一主一从

(1)实战环境

两台服务器(centos7):

主服务器IP:172.18.252.121

从服务器IP:172.18.252.162

两台机器上都安装了mariadb.server

(2)主服务器配置文件

主配置文件路径: /etc/my.cnf。添加两行:

vim /etc/my.cnf
[mysqld]
server_id=1
log-bin

要点讲解:

首先,一定要在[mysqld]下面添加这两条设置,否则会出现问题。

server_id=1  : 就是给我们的主机器设置一个ID号。

log-bin  :开启二进制日志功能。

说一下我在这里遇到的一个问题:我将server_id=1这一行写入配置文件,然后在数据库里面查看了一下server_id的值,居然是0,然后老师说我的配置文件fcontext不对。我在网上搜了一下,另一种情况也可能出问题:将server_id=1该设置写在了[mysqld_safe]下,重启服务(每一次修改配置文件都需要重启服务)。再登录数据库,查看一下server_id参数,server_id的值居然是0!将server_id=1写入[mysqld]下面则能生效。(我自己也试了一下,但是没有什么影响)。

(4)重启服务

[root@localhost ~]# systemctl restart mariadb.service

每次修改配置文件都需要重启服务!

(5)添加用户

[root@localhost ~]# mysql
Master [(none)]> grant replication slave on *.* to repluser@'172.18.252.%' identified by 'centos';

登录数据库,并创建repluser账户,密码centos,网段是172.18.252.%。

(6)查询当前二进制日志位置

Master [(none)]> show master status;
+-------------------+----------+--------------+------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+-------------------+----------+--------------+------------------+
| master-bin.000003 |      401 |              |                  |
+-------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

以下在从服务器上进行

(7)配合从服务器文件

[root@localhost ~]# vim /etc/my.cnf
[mysqld]
server_id=2
innodb_file_per_table

(8)重启服务

(9)设置主从关系

[root@localhost ~]# mysql
Slave [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='178.15.252.121',
    ->   MASTER_USER='repluser',
    ->   MASTER_PASSWORD='centos',
    ->   MASTER_PORT=3306,
    ->   MASTER_LOG_FILE='master-bin.000003',
    ->   MASTER_LOG_POS=401,
    ->   MASTER_CONNECT_RETRY=10;
Query OK, 0 rows affected (0.06 sec)

Slave [(none)]> CHANGE MASTER TO
    ->   MASTER_HOST='192.168.153.7',    -------主机IP
    ->   MASTER_USER='repluser',              ---------用户名
    ->   MASTER_PASSWORD='centos',     ---------密码
    ->   MASTER_PORT=3306,                    ----------端口
    ->   MASTER_LOG_FILE='master-bin.000003', ----步骤(6)查到的文件的文件名

   ->   MASTER_LOG_POS=401,             --------上面文件起始位置

    ->   MASTER_CONNECT_RETRY=10;

(10)开启从属关系

Slave [(none)]> start slave;

你肯定失败了!简单一点:清空一下防火墙,关闭一下selinux再试试吧(两台机器都要设置)。

清空防火墙 iptables -F 

关闭selinux:setenforce 0

可能你觉得这样做不太严谨,那你也可以给主服务器设置一个防火墙策略:

iptables -A INPUT -s 192.168.153.6 -p tcp --dport 3306 -j accept

iptables -A INPUT -p tcp --dport 3306 -j REJECT

(11)测试

在我们的主服务器上创建一个库,然后在我们的从服务器上一下是否有这个库!

如果要停止 stop slave; 清空 reset slave all;

猜你喜欢

转载自blog.csdn.net/qq_34208467/article/details/83041281