Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能

Posted 孤岛上的笛

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能相关的知识,希望对你有一定的参考价值。

为什么会有主从复制和读写分离?
单台mysql在安全新、高可用性和高并发方面都无法满足实际的需求
配置多台主从数据库服务器以实现读写分离可控的形式来让主从从服务器分别读写减轻服务器的压力

主从复制

  • MySQL主从复制原理
    • MySQL的复制类型
      基于语句的复制
      基于行的复制
      混合类型的复制
    • MySQL主从复制的工作过程
      基于日志进行复制
      master 二进制日志
      slave 中继日志
      原理
      通过三个线程和两个日志文件完成
      主服务器数据更新通过dump线程会写入到二进制日志中,从服务器通过I/O线程读取二进制日志的内容写入到本地的中继日志中,最后从服务器通过SQL线程把更新的数据读取出来再重新执行一遍以达到同步

读写分离

读写分离要建立在主从复制的基础上
原理

  • 只在主服务器上写,只在从服务器上读,两个从服务器还能起一个负载均衡的作用(可控)
  • 主数据库处理事务性查询,从数据库处理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主从复制与读写分离实现高可用性,负载均衡的功能的主要内容,如果未能解决你的问题,请参考以下文章

MySQL主从复制与读写分离

MySQL 主从复制与读写分离(原理深刻,过程详细,值得一看)

搭建MySql主从复制与读写分离

MySQL主从复制与读写分离配置及实操

MySQL主从复制及读写分离实际部署与验证

MySQL主从复制及读写分离实际部署与验证