当前位置:首页 > 有云笔记 > RDBMS2 > 正文内容

MySQL主从同步 、 主从同步模式

小白3年前 (2022-03-21)RDBMS2155200

第一种同步结构 (一主一从同步结构)

数据库服务器 192.168.4.51  配置为master服务器

数据库服务器 192.168.4.52  配置为 slave服务器

第一步 配置master服务器 192.168.4.51

具体步骤如下:

 1) 启用binlog日志文件

vim /etc/my.cnf
[mysqld]
server_id=51
log_bin=master51   #日志默认存储在数据库目录下
:wq
]# systemctl  restart mysqld

 2)用户授权

]# mysql -uroot  -p密码
replication slave 让用户有复制命令权限
mysql> grant  replication slave on *.*  to  repluser@"%"
identified by  "123qqq...A";

3)查看日志信息

#查看到的日志名和偏移量是给 从服务器使用的

mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master51.000001 |      441 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

第二步 配置slave服务器 192.168.4.52

具体步骤如下:

1) 指定server_id 并重启mysqld服务

vim /etc/my.cnf
[mysqld]
server_id=52  #自己添加的
:wq
systemctl  restart mysqld

2)确保数据一致(如果一致的此步骤可以省略)

3)指定主服务器信息

]#mysql -uroot  -p密码

mysql> show slave status \G  #不是从数据库服务器
Empty set (0.00 sec)

mysql> change master to  master_host="192.168.4.51",
master_user="repluser" , master_password="123qqq...A",
master_log_file="master51.000001" , master_log_pos=441 ;

4)启动slave进程

mysql> start slave;


5)查看状态 (IO线程和 SQL线程必须同时是YES 状态)


mysql> show slave status \G  
  Master_Host: 192.168.4.51
                  Master_User: repluser
                  Master_Port: 3306
  Master_Log_File: master51.000001
  Slave_IO_Running: Yes    #IO线程
                  Slave_SQL_Running: Yes   #SQL线程

根据 IO线程和 SQL线程的报错信息排错

mysql> show slave status \G        
Last_IO_Error:  IO线程的报错信息 
Last_SQL_Error:  SQL线程的报错信息

测试主从同步的配置 

1)在主服务器host51 建库建表 插入记录

mysql> create database db1;
mysql> create  table db1.t1(id int);
mysql> insert into db1.t1 values(119);
mysql> insert into db1.t1 values(120);
mysql> insert into db1.t1 values(114);

2 在从服务器host52 可以查看到同样的数据

]#mysql -uroot -p123qqq...A   -e 'select * from db1.t1'

正常的排错方法: 根据 IO线程和 SQL线程的报错信息排错

mysql> show slave status \G        
Last_IO_Error:  IO线程的报错信息 
Last_SQL_Error:  SQL线程的报错信息

报错示例1  及解决办法

Last_IO_Error: Got fatal error 1236 from master

when reading data from binary log: 'Could not find first log file name in binary log index file'

在从服务器执行如下操作:

mysql> stop slave;

在主服务器查看日志名和偏移量

host51  show  master status;

在从服务器 重新指定日志名和偏移量

mysql> change  master to  master_log_file="日志名" , master_log_pos=偏移量;
mysql> start slave;
mysql> show  slave status \G

错误示例2 及解决办法

Last_IO_Error: Fatal error:

The slave I/O thread stops because

master and slave have equal MySQL server UUIDs;

these UUIDs must be different for replication to work 

在从服务器做如下操作:

vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=2dac4865-4770-11ec-9103-6462be92a06e   修改一个字母(字母个数不能少)
:wq
systemctl   restart  mysqld

错误示例3 及解决办法

Last_IO_Error: error connecting to master 'repluser@192.168.4.51:3306' retry-time: 60  retries: 2

 在从服务器做如下操作:

MySQl> stop  slave;
mysql> change master to  master_user="repluser",master_password="123qqq...A";
MySQL>  start slave;
mysql> show slave status \G

所有错误的 统一解决办法

slave角色的服务器恢复为独立的数据库服务器,重新配置为从服务器。

在从服务器执行如下操作:

systemctl  stop   mysqld 
cd  /var/lib/mysql/
rm  -rf master.info
rm -rf   *-relay-bin.*
rm -rf relay-log.info
systemctl   start  mysqld

第二种同步结构 (一主多从同步结构)

创建1台新的数据库服务器 配置地址是 192.168.4.53

实验要求:把数据库服务器192.168.4.53也配置为192.168.4.51 的从服务器

在数据库服务器host53 做如下配置:

具体步骤如下

1) 指定server_id 并重启mysqld服务

[root@host53 ~]# vim /etc/my.cnf
[mysqld]
server_id=53  #添加
:wq
[root@host53 ~]# systemctl  restart mysqld

2)确保数据一致(如果一致的此步骤可以省略)

具体操作如下:

1步:在主服务器host51 db1库做完全备份 ,然后把

备份文件拷贝给host53 主机

--master-data 做完全备份数据时 ,在备份文件里记录使用的日志名和偏移量      

[root@host51 ~]# mysqldump -uroot -pNSD2107...a --master-data -B db1 > /root/db1.sql
[root@host51 ~]# scp /root/db1.sql  192.168.4.53:/opt/

2步:host53 主机 使用备份文件恢复数据

[root@host53 ~]# mysql -uroot -p123qqq...A  <  /opt/db1.sql                          
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'show databases'
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'select count(*) from db1.t1'

3)指定主服务器信息

#在备份文件里查看日志名和偏移量

[root@host53 ~]# grep master51 /opt/db1.sql 
CHANGE MASTER TO MASTER_LOG_FILE='master51.000001', MASTER_LOG_POS=2000;

#管理员root 登录指定主服务器信息

[root@host53 ~]# mysql -uroot -p123qqq...A


mysql> change master to master_host="192.168.4.51" , master_user="repluser",
master_password="123qqq...A",master_log_file="master51.000001",
master_log_pos=2000;

4)启动slave进程  

mysql> start slave;

5)查看状态 (IO线程和 SQL线程必须同时是YES 状态)

mysql> show slave status \G
   Slave_IO_Running: Yes
    Slave_SQL_Running: Yes

6) 查看数据

mysql> select  * from  db1.t1;

 测试一主多从的配置

#在主服务器插入新数据

mysql> insert into db1.t1 values(99988);

# 两台从服务器可以看到一样的数据

[root@host52 mysql]# mysql -uroot -p123qqq...A -e 'select * from db1.t1'
[root@host53 mysql]# mysql -uroot -p123qqq...A -e 'select * from db1.t1'

mysql 主从从 同步结构实验   

  主从从结构 : 给一主一从结构中的从服务器也配置从服务器

  环境准备:

  目的1  掌握如何把从服务器恢复为独立的数据库服务器

  目的2  节省时间(用恢复为独立数据库服务器的host53 与 新的数据库服务器 host54 和  host55  配置主从从结构实验)

 把主机host53 恢复为独立的数据库服务器

cd /var/lib/mysql
rm -rf master.info 
rm -rf host53-relay-bin.*
rm -rf relay-log.info 
systemctl  restart mysqld

准备2台新的数据库服务器 ip地址分别为 192.168.4.54 和  192.168.4.55

具体配置步骤如下:

1步:配置主数据库服务器 192.168.4.53

1) 启用binlog日志

vim /etc/my.cnf
[mysqld]
server_id=53
log_bin=master53
:wq
systemctl restart  mysqld

2) 用户授权

host53~]# mysql  -uroot  -p123qqq...A
mysql> grant replication slave on *.*  to repluser@"%" identified by "123qqq...A";

3) 查看日志信息

mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master53.000001 |      441 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+

2步:配置主机192.168.4.54

说明:因为host54主机同时是2种角色,所以2种角色的配置都要有

vim /etc/my.cnf
[mysqld]
server_id=54
log_bin=master54
log_slave_updates #允许级联复制,host54主机把自己主服务器的数据

 拷贝给自己的从服务器。

:wq
[root@host54 ~]# systemctl  restart mysqld
[root@host54 ~]# mysql -uroot -p123qqq...A

mysql> grant  replication slave on *.*  to repluser@"%" identified by "123qqq...A";
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master54.000001 |      441 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

#指定主服务器信息,日志名偏移量要做host53主机查看后填写  

[root@host54 ~]# mysql -uroot -p123qqq...A

mysql> change master to master_host="192.168.4.53",master_user="repluser",master_password="123qqq...A",
    -> master_log_file="master53.000001",master_log_pos=441;
mysql> start slave;
mysql> show slave status \G
 Master_Host: 192.168.4.53
 Slave_IO_Running: Yes
 Slave_SQL_Running: Yes

3步:配置主机192.168.4.55 (host54主机的从服务器)

1) 指定server_id  并重启mysqld服务

2)指定主服务器信息(binlog日志名和偏移量要做host54主机查看后填写)

3)启动slave进程

4)查看进程状态

]# vim /etc/my.cnf
[mysqld]
server_id=55
:wq
systemctl restart  mysqld
]# mysql  -uroot  -p123qqq...A

mysql> change master to master_host="192.168.4.54",master_user="repluser",master_password="123qqq...A",
    -> master_log_file="master54.000001",master_log_pos=441;
mysql> start slave;
mysql> show slave status \G
Master_Host: 192.168.4.54
Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

4步:验证主从从结构的配置

#在主服务器Host53主机创建的数据 在主机host54 host55 都能看到

[root@host53 ~]# mysql -uroot -p123qqq...A -e 'create database  gamedb'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'create table  gamedb.a(id int)'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@host53 ~]# 
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'insert into gamedb.a values(888)'
mysql: [Warning] Using a password on the command line interface can be insecure.
[root@host53 ~]# mysql -uroot -p123qqq...A -e 'select * from gamedb.a'

mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id   |
+------+
|  888 |
+------+
[root@host53 ~]#
[root@host54 ~]# mysql -uroot -p123qqq...A -e 'select * from gamedb.a'
mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id   |
+------+
|  888 |
+------+
[root@host55 ~]#
[root@host55 ~]# mysql -uroot -p123qqq...A -e 'select * from gamedb.a'

mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id   |
+------+
|  888 |
+------+
[root@host55 ~]#

第四种同步结构 主主结构

主主结构也叫互为主从。

准备2台新数据库服务器,IP地址192.168.4.68  和  192.168.4.69  

2台数据库服务器分别做彼此的从服务器和主服务器,

2台服务器2种角色的配置都要有

1: 配置数据库服务 host68

vim /etc/my.cnf
[mysqld]
server_id=68
log_bin=master68
:wq
systemctl  restart  mysqld


]# mysql  -uroot  -p123qqq...A  
mysql> grant  replication slave on *.*  to  repluser@"%" identified by "123qqq...A";
Query OK, 0 rows affected, 1 warning (0.02 sec)
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master68.000001 |      441 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec) 
mysql>

2: 配置数据库服务 host69

[root@host69 ~]# vim /etc/my.cnf
[mysqld]
server_id=69
log_bin=master69
:wq
systemctl  restart  mysqld

mysql> grant replication slave on *.*  to repluser@"%"  identified by "123qqq...A";
Query OK, 0 rows affected, 1 warning (0.04 sec)
 
mysql> show master status;
+-----------------+----------+--------------+------------------+-------------------+
| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------+----------+--------------+------------------+-------------------+
| master69.000001 |      441 |              |                  |                   |
+-----------------+----------+--------------+------------------+-------------------+
1 row in set (0.01 sec)

mysql>
#把自己配置为host68的slave服务器,日志名和偏移量要在host68主机查看后填写
mysql> change master to  master_host="192.168.4.68",master_user="repluser",master_password="123qqq...A",
    -> master_log_file="master68.000001",master_log_pos=441;
mysql> start slave;
mysql> show slave status \G
Master_Host: 192.168.4.68
Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

3步:在host68  主机数据库管理员登录服务后

#把自己指定为host69 主机的slave 服务器

[root@host68 ~]# mysql -uroot -p123qqq...A

mysql> change master to  master_host="192.168.4.69" , master_user="repluser" , master_password="123qqq...A",
    -> master_log_file="master69.000001",master_log_pos=441;
mysql> start slave;
mysql> show slave status \G
Master_Host: 192.168.4.69
Slave_IO_Running: Yes
            Slave_SQL_Running: Yes

4步:测试主主结构的配置

先在host68主机健库表插入记录 , 在host69 主机可以看到同样的数据

[root@host68 ~]# mysql -uroot -p123qqq...A -e 'create database db1'
[root@host68 ~]# mysql -uroot -p123qqq...A -e 'create table db1.a(id int)'
[root@host68 ~]# mysql -uroot -p123qqq...A -e 'insert into db1.a values(666)'
[root@host69 ~]# mysql -uroot -p123qqq...A -e 'select * from db1.a'

mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id   |
+------+
|  666 |
+------+
[root@host69 ~]#

然后再在host69 库下的表插入新记录,在host68主机可以看到同样的数据

[root@host69 ~]# mysql -uroot -p123qqq...A -e 'insert into db1.a values(777)' 
[root@host68 ~]# mysql -uroot -p123qqq...A -e 'select * from db1.a'

mysql: [Warning] Using a password on the command line interface can be insecure.
+------+
| id   |
+------+
|  666 |
|  777 |
+------+
[root@host68 ~]#

mysql 主从同步复制数据工作模式

1)主从同步复制模式 可以在任意数据库服务器启用半同步服务模式

支持的工作方式:

1种 异步复制模式(默认)

主服务器执行完一次事务后,立即将结果返给客户端,

不关心从服务器是否已经同步数据。

2种 半同步复制模式

主服务器在执行完一次事务后,等待至少一台从服务器同步数据完成,

才将结果返回给客户端。

统一在 192.168.4.50  主机 做实验

方法1  命令行设置

好处:不用重启服务马上生效

安装模块

#安装master模块

MySQL> INSTALL  PLUGIN  rpl_semi_sync_master   SONAME  "semisync_master.so";

#安装slave模块

MySQL> INSTALL  PLUGIN  rpl_semi_sync_slave   SONAME  "semisync_slave.so";

查看模块是否安装

mysql> SELECT  plugin_name, plugin_status FROM  information_schema.plugins  
WHERE plugin_name LIKE "%semi%"; 
+----------------------+---------------+
| plugin_name          | plugin_status |
+----------------------+---------------+
| rpl_semi_sync_master | ACTIVE        |
| rpl_semi_sync_slave  | ACTIVE        |
+----------------------+---------------+

启用模块

#启用master模块
mysql> SET  GLOBAL rpl_semi_sync_master_enabled=1;
         
#启用slave模块
mysql> SET  GLOBAL rpl_semi_sync_slave_enabled=1;

查看模块是否启用

MySQL> SHOW  VARIABLES  LIKE  "rpl_semi_sync_%_enabled";         
+------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON    |
| rpl_semi_sync_slave_enabled  | ON    |
+------------------------------+-------+

方法2  永久配置 编辑主配置文件

vim  /etc/my.cnf
[mysqld]
#安装模块   plugin-load="rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

#启用模块

rpl_semi_sync_slave_enabled=1
rpl_semi_sync_master_enabled=1
:wq

重启服务 模块依然是启用状态

systemctl   restart mysqld


MySQL> SHOW  VARIABLES  LIKE  "rpl_semi_sync_%_enabled";       +------------------------------+-------+
| Variable_name                | Value |
+------------------------------+-------+
| rpl_semi_sync_master_enabled | ON    |
| rpl_semi_sync_slave_enabled  | ON    |


 MySQL主从同步 、 主从同步模式  您阅读本篇文章共花了: 

分享到:

    扫描二维码推送至手机访问。

    版权声明:本文由有云转晴发布,如需转载请注明出处。

    本文链接:https://yyzq.cf/?id=147

    分享给朋友:
    返回列表

    没有更早的文章了...

    下一篇: 数据读写分离 、 MySQL多实例

    发表评论

    访客

    ◎欢迎参与讨论,请在这里发表您的看法和观点。