从无到有实现主从复制
读写分离的实现需要两个步骤:
第一:读写操作分别指向不同服务器。
第二:不同服务器的数据保持同步。
这里面的知识含量非常的大,我要做的是将流程尽量简化进行博客记录,方便日后更加直接高效的部署数据库。
读写操作部分对于开发者来说最常用的方式是在项目中根据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
从库自动同步