从无到有实现主从复制

 

读写分离的实现需要两个步骤:

第一:读写操作分别指向不同服务器。

第二:不同服务器的数据保持同步。

 

这里面的知识含量非常的大,我要做的是将流程尽量简化进行博客记录,方便日后更加直接高效的部署数据库。

 

读写操作部分对于开发者来说最常用的方式是在项目中根据sql类型进行选择不同的数据库地址,如insert update 走主库  select走从库,还有一种方式是使用第三方开发的中间件服务。

 

这篇博客主要记录主从复制。

 

在网上找了一张图,虽然丑了点,但意思就是这样

 

如图所示,完成主从复制的整个流程需要三个进程:

(为了思路清晰,我特意按照顺序进行阐述)

 

前提:开启二进制日志记录后,主库每次提交事务完成数据更新前,会将数据更新的事件记录到二进制日志中,然后才会进行事务提交。

 

1.从库I/O线程:此线程会跟主库建立一个客户端连接,连接建立完成后,主库上会启动一个二进制转储线程。

2.主库二进制转储线程:负责读取主库上的二进制日志中的事件,读取到后,从库I/O线程会将事件记录到从库的中继日志中。

3.从库的SQL线程:该线程从中继日志中读取事件并在从库中执行,从而实现数据更新。

 

接下来,我将根据标准流程部署主从复制。

 

我这里开了两台虚拟机,centos1为主库,centos2为从库。

 

创建复制账号:
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO qq000@'192.168.31.%' IDENTIFIED BY 'ZZZxxx/123456'
此sql主从都需执行一遍,至于主从都赋予这两个权限是因为从库需要有随时变成主库的准备。

 

主库配置:
vim /etc/my.cnf

log_bin = mysql-bin
server_id = 1

(log_bin为二进制日志指定名称可自定义,server_id需要唯一,我的centos1设为1,centos2设为2)

 

配置好后重启MySQL: 

systemctl restart mysqld

 

在MySQL中执行:

show master status;

会看到MySQL已经创建了二进制日志文件

从库配置:
vim /etc/my.cnf

log_bin = mysql-bin
server_id = 2
relay_log = /var/lib/mysql/mysql-relay-bin
log_slave_updates = 1
read_only = 1

(

relay_id指定中继日志的路径,

log_slave_update允许从库将其重放的事件也记录到自身的二进制日志中,

read_only是设置从库只读状态 但不会影响slave同步复制的功能。

)

 

重启MySQL:

systemctl restart mysqld

 

在从库中执行sql进行复制目标的配置:

CHANGE MASTER TO 
MASTER_HOST='192.168.31.244',
MASTER_USER='qq000',
MASTER_PASSWORD='ZZZxxx/123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;

 

开始复制:

START SLAVE

 

查看状态:

SHOW SLAVE STATUS

 

接下来很大几率就是解决各种报错的问题了

 

这两个字段 必须为yes

如果不对,那么下面这个字段会有报错信息:

 

或者配置信息有误,或者防火墙不通(firewalld selinux),或者从库本身的数据和主库有比较大的差异。

 

如果出现表存在库存在的错误 可以用如下两条三条sql搞定:

stop slave;
set global sql_slave_skip_counter=1;
start slave;

 

错误处理完成后 在主库创建一张表test_a

 

从库自动同步

 

posted @ 2017-12-16 00:02  不该相遇在秋天  阅读(324)  评论(0编辑  收藏  举报