主从配置介绍
主从配置又叫做Replication、AB复制。是指一台服务器充当主数据库服务器,另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。默认情况下,复制是异步的, 从站不需要永久连接以接收来自主站的更新。根据配置,可以复制数据库中的所有数据库,所选数据库甚至选定的表。
各种方式
- 一主一从 (本次主要以该方式配置)
- 主主复制 --扩展系统读取的性能,因为读是在从库读取的
- 一主多从
- 多主一从 – 5.7 开始支持
- 联级复制
优点
- 横向扩展解决方案 - 在多个从站之间分配负载以提高性能。在此环境中,所有写入和更新都必须在主服务器上进行。但是,读取可能发生在一个或多个从站上。该模型可以提高写入性能(因为主设备专用于更新),同时显着提高了越来越多的从设备的读取速度。
- 数据安全性 - 因为数据被复制到从站,并且从站可以暂停复制过程,所以可以在从站上运行备份服务而不会破坏相应的主数据。
- 分析 - 可以在主服务器上创建实时数据,而信息的分析可以在从服务器上进行,而不会影响主服务器的性能。
- 远程数据分发 - 您可以使用复制为远程站点创建数据的本地副本,而无需永久访问主服务器。
主从复制原理
- 主库将更改操作记录到binlog里, 需开启binlog日志
- 主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog
- 从库生成两个线程,一个I/O线程,一个SQL线程
- I/O线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中
- SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致
准备工作
- 主从数据库版本最好一致
- 主从数据库内数据保持一致
- 从库服务器能连通主库
mysql 5.7 安装
root登录
查看mysql的安装情况
rpm -qa | grep -i mysql
将显示的删除
rpm -e --noscripts 包名
查看之前的mysql目录并删除
find / -name mysql
rm -rf /var/lib/mysql
...
最后删除 my.cnf 文件
rm -rf /etc/my.cnf
最后再查看是否还有已安装的mysql
rpm -qa | grep -i mysql
无结果就可进行 wget 安装了
用 wget 下载mysql源安装包
安装 yum install 安装包
安装mysql
yum install mysql-community-server
启动mysql
systemctl start mysqld
查看启动状态
systemctl status mysqld
设置为开机启动
systemctl enable mysqld
systemctl daemon-reload
查看密码
grep 'temporary password' /var/log/mysqld.log
修改密码
set password for 'root'@'localhost'=password('新密码');
打开3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
重启防火墙
firewall-cmd --reload
查看以开放端口
firewall-cmd --list-ports
准备工作
用VM 克隆当前虚拟机
启动后查看该克隆虚拟机IP
发现与被克隆的IP地址一致,修改该虚拟机的IP,上面显示的是ens33
vim /etc/sysconfig/network-scripts/ifcfg-ens33
将IPADDR改为 192.168.23.111
重启网卡
/etc/init.d/network restart
查看IP发现已更改为所设置IP
查看二台虚拟机是否都已启动mysql
配置主从
修改 /etc/my.cnf
添加server-id ,定义binlog的前缀与其他配置
重启动mysql
systemctl restart mysqld
连接mysql创建账号 account
grant replication slave on *.* to 'account'@'192.168.23.111' identified by '密码';
更新数据库权限
flush privileges;
查看主服务器状态
show master status\G;
配置从服务器
修改my.cnf 文件
重启mysql
登录mysql执行同步命令, 设置主服务器ip,同步账号密码,同步位置
change master to master_host='192.168.23.110',master_user='account',master_password='密码',master_loaster_log_file='mysql-bin.000001',master_log_pos=605;
开启同步功能
start slave;
最后查看服务器状态,Slave_IO_Running, Slave_SQL_Running 需都为yes
验证是否成功
主服务器创建test库
查看从服务器发现也新建了test库
新建一张测试表
查看从服务器是否也有
主服务器创建 user表
从服务器忽略了该表
取消主从
一般从服务器执行
stop slave;
reset slave;
查看 show slave status\G; 显示的 Slave_IO_Running 和 Slave_SQL_Running为No则成功取消
主服务器数据库已有数据
主服务器先配置好,使用mysqldump创建数据快照
flush tables with read lock; //锁库
mysqldump -u账号 -p密码 --databases 数据库 > 名称.sql
unlock tables; //解锁
//从服务器
//source 文件位置
//设置
change master to master_host='192.168.23.110',master_user='account',master_password='密码*',master_loaster_log_file='mysql-bin.000002',master_log_pos=436;
start slave; //启动
show slave status\G; //查看是否成功
安装过程中出现的问题
发现是之前安装的mysql没有卸载干净导致冲突,解决方案完全卸载后重新安装即可
配置好从服务器启动mysql报错
查看日志 cat /var/log/mysqld.log 发现是配置项slave-net-timeout 写错了,改好后重启成功
查看从服务器状态发现Slave_IO_Running 为No,正确状态应该为yes
查看日志发现是UUID重复,因为是克隆过来的,所以需要修改一下UUID
删除从服务器 /var/lib/mysql/auto.cnf 文件后重启mysql后问题解决
master和slave后续改动my.cnf配置文件后重启后发现从服务器 Slave_IO_Running为yes, Slave_SQL_Running 为No,查看日志发现是test数据库已存在. 不能再次创建该数据库.原因是master已经把创建的语句存入二进制日志文件中,slave重置后再次执行该二进制日志文件,也就是二者的初始化数据不一致.解决方法将该数据库删除后重启问题解决.所有数据都为已同步状态