最近准备研究一些实战型的可以承担中型流量的系统架构知识,记录于此。
Centos7 mysql 主从复制
1 Mysql 读写分离主从复制模式概述
- 主(master)从(slave)复制,就是一台机器的mysql充当主服务器,其他充当从服务器。
- 更新操作(insert、update、delete)在主(master)服务器
- 读取在从服务器(select)
1.1 mysql 支持的复制类型
- 基于语句复制,MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时, 会自动选着基于行的复制。
- 在主服务器上执行的SQL语句,
- 在从服务器上执行同样的语句。
- 基于行复制,把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
- 混合类型复制,默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
1.2 复制解决的问题
MySQL复制技术有以下一些特点:
- 数据分布 (Data distribution )
- 负载平衡(load balancing)
- 备份(Backups)
- 高可用性和容错行 High availability and failover
1.3 复制如何工作
分3个步骤
- master 将改变记录到二进制(binary log)中。
- slave 将 master 的binary log events 拷贝到他的中继日志(relay log)
- slave 重做中继日志中的事件,将改变反映他自己的数据。
2 复制配置
两天 centos
- 主(master)192.168.0.112
- 从(slave)192.168.0.113
2.1 master 建立账号赋权
在 Master 中创建账号 backup,并允许每个 slave 节点有 PEPLICATION SLAVE 权限。用户名的密码都会存储在文本文件 master.info 中
‘backup’@’%’ 表示用还可以从远程登录
CREATE USER ‘backup’@’%’ IDENTIFIED BY ‘password’;
授权
mysql > GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO backup@’%’ IDENTIFIED BY ‘1234’;
2.2 拷贝数据
新安装服务器不需要
2.3 配置 master 节点
查找 my.cnf 文件
find / -name 'my.cnf'
现在在 /etc/my.cnf
编辑
vi /etc/my.cnf
在文本后增加
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
保存文件后
systemctl restart mysqld
进入mysql
show master status
2.4 配置 slave 节点
配置 my.cnf 文件如下:
og_bin= mysql-bin
server_id = 2
relay_log= mysql-relay-bin
log_slave_updates = 1
read_only= 1
2.5 启动 slave
接下来就是让slave连接master,并开始重做master二进制日志中的事件。你不应该用配置文件进行该操作,而应该使用CHANGE MASTER TO语句,该语句可以完全取代对配置文件的修改,而且它可以为slave指定不同的master,而不需要停止服务器。如下:
mysql> CHANGE MASTER TO MASTER_HOST='server1',
-> MASTER_USER='repl',
-> MASTER_PASSWORD='p4ssword',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=0;
测试
mysql> start slave;
显示,注意命令是大写的G,查看输出结果 在这里主要是看: Slave_IO_Running=Yes Slave_SQL_Running=Yes
msyql> show slave status G
在 master 端输入 show processlistG
msyql> show processlist G
2.6 停止 slave
stop slave
只有再停止了 slave 后才能修改配置文件。
2.7 问题
:The slave I/O thread stops because master and slave have equal MySQL server UUIDs
最后检查发现他们的auto.cnf中的server-uuid是一样的。。。
[root@localhost ~]# vim /var/lib/mysql/auto.cnf
[auto]
server-uuid=4f37a731-9b79-11e8-8013-000c29f0700f
问题解决
停止从库的mysqld服务,删除他的auto.cnf文件,再启动数据库服务即可:
[root@localhost mysql]# systemctl stop mysqld.service
[root@localhost mysql]# mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
[root@localhost mysql]# systemctl start mysqld.service
2.8 测试
在主库创建一个demo库
create database demo;
在从库也能快速看到。