首页 Linux正文

MySQL 主从高可用架构

王昊 Linux 2019-12-10 403 0

MySQL 数据库主从复制原理:

Mysql 主从同步其实是一个异步复制的过程,要实现复制首先需要在 master上开启 bin-log 日志功能,整个过程需要开启 3 个线程,分别是 Master 开启IO 线程,slave 开启 IO 线程和 SQL 线程。

(1)在从服务器执行 slave start,从服务器上 IO 线程会通过授权的用户连接上master,并请求 master 从指定的文件和位置之后发送 bin-log 日志内容。

(2)Master 服务器接收到来自 slave 服务器的 IO 线程的请求后,master 服务器上的 IO 线程根据 slave 服务器发送的指定 bin-log 日志之后的内容,然后返回给slave 端的 IO 线程。(返回的信息中除了 bin-log 日志内容外,还有本次返回日志内容后在master服务器端的新的binlog文件名以及在binlog中的下一个指定更新位置。)

(3)Slave 的 IO 线程接收到信息后,将接收到的日志内容依次添加到 Slave 端的relay-log 文件的最末端,并将读取到的 Master 端的 bin-log 的文件名和位置记录到 master-info 文件中,以便在下一次读取的时候能够清楚的告诉 Master“我需要从某个 bin-log 的哪 个位置开始往后的日志内容,请发给我”;

(4)Slave 的 Sql 线程检测到 relay-log 中新增加了内容后,会马上解析 relay-log 的内容成为在 Master 端真实执行时候的那些可执行的内容,并在自身执行。

MySQL数据库主从配置

环境准备:

master主服务器:192.168.17.195
slave从服务器:192.168.17.197

在主和从服务器都安装MySQL

yum安装MySQL

在master修改

cp /etc/my.cnf /etc/my.cnf.bak

vim /etc/my.cnf

 [mysqld]
 datadir=/var/lib/mysql
 socket=/var/lib/mysql/mysql.sock
 user=mysql
 # Disabling symbolic-links is recommended to prevent assorted security risks
 symbolic-links=0
 log-bin=mysql-bin
 server-id = 1
 auto_increment_offset=1
 auto_increment_increment=2

 [mysqld_safe]

 log-error=/var/log/mysqld.log
 pid-file=/var/run/mysqld/mysqld.pid
 replicate-do-db =all

重启mysql

systemctl restart mysqld

然后修改 slave Mysql 数据库的配置文件

vim /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-bin=mysql-bin
server-id = 2
auto_increment_offset=2
auto_increment_increment=2
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
master-host =192.168.17.195
master-user=tongbu
master-pass=123456
master-port =3306
master-connect-retry=60
replicate-do-db =all

重启mysql

systemctl restart mysqld

在 Master 数据库服务器上设置权限

grant  replication  slave  on *.* to  'tongbu'@'%'  identified by  '123456'; 
show master status; 
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      444 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

slave 服务器指定 master IP 和同步的 pos 点

change master to master_host='192.168.17.195',master_user='tongbu',master_password='123456',master_log_file='mysql-bin.000003',master_log_pos=444; 

要注意修改master_host、master_log_file和master_log_pos的值,与 master 要一致

在 slave 启动 slave start

start slave;

查看 Mysql 主从状态

show slave status\G

找到如下两行

Slave_IO_Running: Yes
Slave_SQL_Running: Yes

两个状态为 YES,代表 slave 已经启动两个线程,一个为 IO 线程,一个为 SQL 线程

然后在 Master 服务器创建一个数据库和表

create database mysql_ab_test charset=utf8;
show databases;
use mysql_ab_test;
create table t0 (id varchar(20),name varchar(30));
show tables;

然后去 slave 服务器查看是否有 mysql_ab_test 数据库和相应 t0 的表,如果存在则代表 Mysql 主从同步搭建成功

show databases;
use mysql_ab_test;
show tables;

同样还可以测试在 master 服务器插入两条数据,在 slave 查看 insert 数据是否已同步

master 服务器

use mysql_ab_test;
insert into t0 values ("001","whaoub1");
insert into t0 values ("002","whaoub2");
select * from t0;

slave 服务器

use mysql_ab_test;
select * from t0;

在 master 插入的数据已经同步到 slave 上

自此 Mysql 主从搭建完毕

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

评论