目录

  • MySQL主从同步机制
  • MySQL主从同步的作用
  • 实现MySQL主从复制需要进行的配置:
  • 前期准备
  • 主服务器配置
  • 从服务器配置
  • 报错处理

MySQL主从同步机制

MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的bin-log(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取bin-log日志增量信息,然后传输到Slave MySQL的relay log(中继日志)中,然后Slave MySQL的SQL线程从relay log(中继日志)中读取增量信息并翻译成SQL语言,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。

mysql主从集群 ansible搭建 mysql做主从_服务器

MySQL主从同步的作用

1、可以作为一种备份机制,相当于热备份
2、可以用来做读写分离,均衡数据库负载

实现MySQL主从复制需要进行的配置:

1.主服务器:
开启二进制日志
配置唯一的server-id
获得master二进制日志文件名及位置
创建一个用于slave和master通信的用户账号
2.从服务器:
配置唯一的server-id
使用master分配的用户账号读取master二进制日志
启用slave服务

前期准备

准备两台数据库版本一致(建议版本5.5以上)的mysql服务器

(如果是虚拟机的话可以先装好一台,然后克隆一台)

db1 192.168.64.134 主

db2 192.168.64.138 从

主服务器配置

1.修改my.cnf配置
前两行 my.cnf中默认有

[mysqld]
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id

# master开启二进制日志后默认记录所有库所有表的操作,可以通过配置来指定只记录指定的数据库甚至指定的表的操作

# 不同步哪些数据库(忽略mysql系统库复制)
# binlog-ignore-db = mysql
# binlog-ignore-db = test
# binlog-ignore-db = information_schema

# 只同步哪些数据库,除此之外,其他不同步
binlog-do-db=test

mysql主从集群 ansible搭建 mysql做主从_mysql主从集群 ansible搭建_02

修改好后,重启mysql服务

MySQL复制基于主服务器在二进制日志中跟踪所有对数据库的更改(更新、删除等等)。因此,要进行复制,必须在主服务器上启用二进制日志。

2.创建用于同步的用户账号

-- 创建用户
create user 'rep'@'192.168.64.%' identified by '12345678';

-- 授权
GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.64.%';
-- 说明: *.* 为所有的库和所有的表,可以自己定义某一个库里的某一个表。

-- 刷新权限
flush privileges;

mysql主从集群 ansible搭建 mysql做主从_MySQL_03

查看授权信息
show grants for 'rep'@'192.168.64.%';

mysql> show grants for 'rep'@'192.168.64.%';
+---------------------------------------------------------------------------------------------------------------------------+
| Grants for rep@192.168.64.%                                                                                               |
+---------------------------------------------------------------------------------------------------------------------------+
| GRANT REPLICATION SLAVE ON *.* TO 'rep'@'192.168.64.%' IDENTIFIED BY PASSWORD '*84AAC12F54AB666ECFC2A83C676908C8BBC381B1' |
+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

3.查看主数据库(master)的状态
记下File(二进制文件名 mysql-bin.000010)以及Position(位置 107)的值,在后面进行从服务器操作的时候需要使用。

mysql> show master status ;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000010 |      107 | test         |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

主从开始工作需要保证这两台服务器数据库信息一致 ,需要将master的数据库表全部备份导出,并传送到slave服务器上。有时还需要进行锁表只读的操作。但是因为我是刚创建的数据库,里面什么都没有,也就是说信息一样了。所以这一步就不用做了。

从服务器配置

1.修改my.cnf

[mysqld]
server-id=2
log-bin=mysql-bin

mysql主从集群 ansible搭建 mysql做主从_mysql主从集群 ansible搭建_04

修改完成之后,重启mysql服务

从库默认不开启bin-log日志功能,除非做下级从库级联同步,才需开启从库的bin-log日志。
从数据库里的中继日志是默认开启的,不需要单独添加。
mysql从库中需在my.cnf配置文件中加入 read-only参数,保证从库只读。

2.执行同步sql,配置同步配置
(需要主服务器IP(或主机名),登陆凭据,二进制文件的名称和位置)

CHANGE MASTER TO
MASTER_HOST='192.168.64.134',
MASTER_USER='rep',
MASTER_PASSWORD='12345678',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000010',
MASTER_LOG_POS=107;

3.开启slave(启动同步)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

4.查看同步状态

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.64.134
                  Master_User: rep
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000010
          Read_Master_Log_Pos: 107
               Relay_Log_File: db2-relay-bin.000002
                Relay_Log_Pos: 253
        Relay_Master_Log_File: mysql-bin.000010
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 107
              Relay_Log_Space: 407
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 1
1 row in set (0.00 sec)
mysql>

当Slave_IO_Running和Slave_SQL_Running都为YES的时候就表示主从同步设置成功了

mysql主从集群 ansible搭建 mysql做主从_mysql_05

Slave_IO_Running 和 slave_sql_Running 必须都是Yes,有一个是NO都不行。
这两个线程非常重要。IO线程负责接收读写主服务器发来的二进制日志,将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。而sql线程是从服务器创建用于读取中继日志并执行日志中包含的更新。

报错处理

搞不定了直接 重装mysql 或 回滚 快照。

ERROR 1665(HY000)

ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using passwor
应该是 已经创建过用户了,需要先刷新权限,然后删除重建用户。