Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能
Posted 孤岛上的笛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能相关的知识,希望对你有一定的参考价值。
为什么会有主从复制和读写分离?
单台mysql在安全新、高可用性和高并发方面都无法满足实际的需求
配置多台主从数据库服务器以实现读写分离可控的形式来让主从从服务器分别读写减轻服务器的压力
主从复制
- MySQL主从复制原理
- MySQL的复制类型
基于语句的复制
基于行的复制
混合类型的复制 - ★MySQL主从复制的工作过程
基于日志进行复制
master 二进制日志
slave 中继日志
★原理:
通过三个线程和两个日志文件完成
主服务器数据更新通过dump线程会写入到二进制日志中,从服务器通过I/O线程读取二进制日志的内容写入到本地的中继日志中,最后从服务器通过SQL线程把更新的数据读取出来再重新执行一遍以达到同步
- MySQL的复制类型
读写分离
读写分离要建立在主从复制的基础上
★原理:
- 只在主服务器上写,只在从服务器上读,两个从服务器还能起一个负载均衡的作用(可控)
- 主数据库处理事务性查询,从数据库处理select查询
- 数据库复制用于将事务性查询的变更同步到集群中的从数据库
- 读写分离方案
- 基于程序代码内部实现
- 基于中间代理层实现
MySQL-Proxy
Amoeba(还有一种是MyCAT)
配置
服务器要求:
至少三台MySQL服务器、一台amoeba、一台client
ip如下:
MySQL主master:192.168.150.30
MySQL从slave1:192.168.150.40
MySQL从slave2:192.168.150.50
amoeba:192.168.150.60
client:192.168.150.70
主从复制配置
- 主服务器
yum install -y ntp
ctenos7默认安装,
建议也安装一下
把master作为MySQL集群的时钟同步服务器
ntp:守护进程(ntpd)工作在后台,通过iburst用于时间同步平滑同步
chronyd:也是一种时间同步的工具类似于ntp升级版可以直接同步
ntpdate:(客户端时间效验)
第一步:配置ntp同步时间
vim /etc/ntp.conf
server 127.127.150.0
前2个127代表的是(192.168)
fudge 127.127.150.0 stratum 8
允许150网段的主机与本机同步,时间环为8个
systemctl start ntpd
第二步:安装MySQL这边使用的是5.7版本安装方法
第三步:开启二进制日志
vim /etc/my.cnf
server-id = 1
log-bin=master-bin
log-slave-updates=true
systemctl restart mysqld
ls /usr/local/mysql/data/
查看二进制日志文件是否生成
第四步:grant授权
mysql -uroot -p
grant replication slave on *.* to 'myslave'@'192.168.150.%' identified by '123456';
flush privileges;
第五步:查看位置点和使用的二进制日志文件
show master status;
可以查看到使用哪个的二进制日志文件,刚搭建的服务位置点为604每个人都有所不同
- 从服务器
第一步:同步时间到主服务器ip指向主服务器
yum install -y ntp ntpdate
/usr/sbin/ntpdate 192.168.150.30
crontab -e
*/30 * * * * /usr/sbin/ntpdate 192.168.150.30 加入到计划任务程序
第二步:安装MySQL
第三步:开启二进制日志文件及中继日志
vim /etc/my.cnf
server-id = 2
设置server id 为2 ,slave2为3
log-bin=mysql-bin
开启二进制文件
relay-log=relay-log-bin
从主服务器上同步日志文件记录到本地
relay-log-index=slave-relay-bin.index
通过索引定位到中继日志
systemctl restart mysqld
第四步:完成同步
change master to master_host='192.168.150.30',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=604;
start slave;
如果已经开启的话同步的命令会执行失败stop slave;可以关闭先再执行
show slave status\\G
主从复制验证
- master上创建库表插入内容
create database chen;
use chen
create table biao (id int(4),name varchar(20),age int(5));
insert into biao values(1,'chen',20);
select * from biao;
- slave上查看同步结果
show databases;
use chen
show tables;
select * from biao;
小结——常见问题
主从同步原理?
通过三个线程和两个日志文件完成
主服务器数据更新通过dump线程会写入到二进制日志中,从服务器通过I/O线程读取二进制日志的内容写入到本地的中继日志中,最后从服务器通过SQL线程把更新的数据读取出来再重新执行一遍以达到同步
如何查看主从同步状态是否成功?
show slave status\\G
show slave status 能看到那些信息比较重要?
last_Errno I/O状态和last_Errnr如果I/O线程和SQL线程显示不为yes能看到报错信息
如果I/O/线程和SQL线程不为yes如何排除?
可以通过last_Errnr查看错误信息
如果 Slave_IO_Running不为yes会是什么情况?
有遇到过的情况则是因为不在同一个局域网内(网络的问题);
如果 Slave_SQL_Running不为yes会是什么情况?
配置文件出错了可能是SQLid一样,或者二进制日志文件指定错误,Position位置错误等
主从复制慢(延迟)有哪些可能?
从库执行大量select请求,或业务大部分select请求被路由到从库实例上,甚至大量OLAP业务,或者从库正在备份等。
此时可能造成cpu负载过高,io利用率过高等,导致SQL Thread应用过慢
读写分离配置
- amoeba
第一步:安装环境
上传jdk-6u14-linux-x64.bin到opt中
amoeba是由jdk编写的所以需要环境
jdk-6u14-linux-x64.bin导入amoeba包
添加可执行权限
cp jdk-6u14-linux-x64.bin /usr/local/
cd /usr/local/
chmod +x jdk-6u14-linux-x64.bin
连接并安装jdk
./jdk-6u14-linux-x64.bin
一直回车然后按照提示输入yes
回车等待
mv jdk1.6.0_14/ jdk1.6
修改名称
第二步:配置环境变量
export JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba
export PATH=$PATH:$SAMOEBA_HOME/bin
source /etc/profile
立刻生效
第三步:解压到创建的amoeba目录
mkdir /usr/local/amoeba
cd /opt
上传amoeba-mysql-binary-2.2.0.tar.gz
tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
第四步:递归给予amoeba所有文件权限测试是否安装
chmod -R 755 /usr/local/amoeba/
/usr/local/amoeba/bin/amoeba
测试是否安装成功
第五步:获得MySQL的权限
三台MySQL服务器
添加权限开放给amoeba访问
第二个账户:amoeba找mysql
grant all on *.* to test@'192.168.150.%' identified by '123.com';
flush privileges;
刷新
第六步:配置主配置文件定义读写分离对象
vim /usr/local/amoeba/conf/amoeba.xml
主配置文件
30行修改账户名
<property name="user">amoeba</property>
数据库访问amoeba服务器时使用的账号(root改为amoeba)
32行修改账户密码
<property name="password">123456</property>
数据库访问amoeba服务器时使用账号时用的密码(自定义设置)
以为两条为amoeba可以识别的客户端来访问的用户身份
115行修改默认池
<property name="defaultPool">master</property>
118行修改取消注释设置写池
<property name="writePool">master</property>
119行修改取消注释设置读池
<property name="readPool">slaves</property>
第七步:配置数据库
访问数据库的密码
vim /usr/local/amoeba/conf/dbServers.xml
23行修改
<property name="schema">mysql</property>
26行修改
<property name="user">test</property>
amoeba访问三台mysql数据库的账户和密码(账户为test)
29行修改
<property name="password">123.com</property>
修改访问数据库的密码
45行修改
<dbServer name="master" parent="abstractServer">
修改数据库主服务器名/地址
48行修改
<property name="ipAddress">192.168.150.30</property>
修改master服务器ip
52行修改
<dbServer name="slave1" parent="abstractServer">
修改从服务器名
55行修改
<property name="ipAddress">192.168.150.40</property>
修改从服务器地址
复制52行到57行一共六行,添加第二台从服务器名
<dbServer name="slave2" parent="abstractServer">
修改第二台从服务器名
<property name="ipAddress">192.168.150.50</property>
修改第二台从服务器地址
65行修改
<dbServer name="slaves" virtual="true">
修改多个服务器池的名称
71行修改
<property name="poolNames">slave1,slave2</property>
添加两个从服务器的服务器名
第八步:启动查看是否启动
/usr/local/amoeba/bin/amoeba start &
netstat -natp | grep 8066
netstat -natp | grep java
jobs -l
读写分离测试
客户端
- 下载mariadb 客户端
yum install -y mariadb
- 远程登录 amoeba 服务器
mysql -u amoeba -p123456 -h 192.168.150.60 -P 8066
测试一
amoeba服务器是否关联后端mysql
客户端进入数据库创建表
show databases;
use chen;
create table biao2(id int(4),name varchar(4));
show tables;
insert into biao2 values(1,'chen');
select * from biao2;
master 查看是否关联amoeba
两个slave查看是否关联amoeba
测试二
测试mysql 读写分离
2台从服务器关闭主从同步,测试amoeba读写分离
stop slave;
show slave status\\G
然后在客户端插入数据
insert into biao2 values(2,'wang');
select * from biao2;
此时客户端读不到数据因为写是在master上进行,而客户端读的是在slave上进行的
master查看
slave读
测试三
读写分离架构,对于读的任务是怎么操作的?
测试方式
start slave;
先开启同步就会同步到之前插入的数据
分别正在slave1和slave2 chen库中插入不同数据,然后使用客户端进行select查询,查看结果
slave1
insert into biao2 values(3,'li');
在slave1中插入数据
select * from biao2;
slave2则读取不到
slave2
insert into biao2 values(4,'wu');
在slave2中插入数据
select * from biao2;
client端
select * from biao2;
- 小结
流量 被轮询读取
在slave1中插入的数据不同步给slave2同理在slave2中插入的数据不同步给slave1所以客户端查看数据的请求会经过amoeba由amoeba通过轮询的方式依次读取slave1,slave2的数据所以看到的数据有区别从而体现了主从分离读写分割
以上是关于Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能的主要内容,如果未能解决你的问题,请参考以下文章