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

目录标题

  • 主从复制
  • 读写分离
  • 配置
  • 主从复制配置
    • 主从复制验证
    • 小结——常见问题
  • 读写分离配置
    • 读写分离测试
      • 测试一
      • 测试二
      • 测试三

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

主从复制

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

读写分离

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

  • 只在主服务器上写,只在从服务器上读,两个从服务器还能起一个负载均衡的作用(可控)
  • 主数据库处理事务性查询,从数据库处理select查询
  • 数据库复制用于将事务性查询的变更同步到集群中的从数据库
  • 读写分离方案
    • 基于程序代码内部实现
    • 基于中间代理层实现
      MySQL-Proxy
      Amoeba(还有一种是MyCAT)
      Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第1张图片

配置

服务器要求:
至少三台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个
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第2张图片
    systemctl start ntpd
    在这里插入图片描述
    第二步:安装MySQL这边使用的是5.7版本安装方法
    第三步:开启二进制日志
    vim /etc/my.cnf
    server-id = 1
    log-bin=master-bin
    log-slave-updates=true
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第3张图片
    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每个人都有所不同
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第4张图片
  • 从服务器
    第一步:同步时间到主服务器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通过索引定位到中继日志
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第5张图片
    systemctl restart mysqld
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第6张图片
    第四步:完成同步
    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;可以关闭先再执行
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第7张图片
show slave status\G
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第8张图片

主从复制验证

  • 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;
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第9张图片
  • slave上查看同步结果
    show databases;
    use chen
    show tables;
    select * from biao;
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第10张图片

小结——常见问题

主从同步原理?
通过三个线程和两个日志文件完成
主服务器数据更新通过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包
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第11张图片
    添加可执行权限
    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
    回车等待
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第12张图片
    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/
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第13张图片
    第四步:递归给予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;刷新
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第14张图片
    第六步:配置主配置文件定义读写分离对象
    vim /usr/local/amoeba/conf/amoeba.xml主配置文件
    30行修改账户名
    amoeba数据库访问amoeba服务器时使用的账号(root改为amoeba)
    32行修改账户密码
    123456数据库访问amoeba服务器时使用账号时用的密码(自定义设置)
    以为两条为amoeba可以识别的客户端来访问的用户身份
    在这里插入图片描述
    115行修改默认池
    master
    118行修改取消注释设置写池
    master
    119行修改取消注释设置读池
    slaves
    在这里插入图片描述
    第七步:配置数据库
    访问数据库的密码
    vim /usr/local/amoeba/conf/dbServers.xml
    23行修改
    mysql
    在这里插入图片描述
    26行修改
    testamoeba访问三台mysql数据库的账户和密码(账户为test)
    29行修改
    123.com修改访问数据库的密码
    在这里插入图片描述
    45行修改
    修改数据库主服务器名/地址
    48行修改
    192.168.150.30修改master服务器ip
    52行修改
    修改从服务器名
    55行修改
    192.168.150.40修改从服务器地址
    复制52行到57行一共六行,添加第二台从服务器名
    修改第二台从服务器名
    192.168.150.50修改第二台从服务器地址
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第15张图片
    65行修改
    修改多个服务器池的名称
    71行修改
    slave1,slave2添加两个从服务器的服务器名
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第16张图片
    第八步:启动查看是否启动
    /usr/local/amoeba/bin/amoeba start &
    netstat -natp | grep 8066
    netstat -natp | grep java
    jobs -l
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第17张图片

读写分离测试

客户端

  • 下载mariadb 客户端
    yum install -y mariadb
  • 远程登录 amoeba 服务器
    mysql -u amoeba -p123456 -h 192.168.150.60 -P 8066
    Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第18张图片

测试一

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;
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第19张图片
master 查看是否关联amoeba
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第20张图片
两个slave查看是否关联amoeba
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第21张图片

测试二

测试mysql 读写分离
2台从服务器关闭主从同步,测试amoeba读写分离
stop slave;
show slave status\G
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第22张图片
然后在客户端插入数据
insert into biao2 values(2,'wang');
select * from biao2;此时客户端读不到数据因为写是在master上进行,而客户端读的是在slave上进行的
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第23张图片
master查看
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第24张图片
slave读
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第25张图片

测试三

读写分离架构,对于读的任务是怎么操作的?
测试方式
start slave;先开启同步就会同步到之前插入的数据
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第26张图片
分别正在slave1和slave2 chen库中插入不同数据,然后使用客户端进行select查询,查看结果

slave1
insert into biao2 values(3,'li');在slave1中插入数据
select * from biao2;
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第27张图片
slave2则读取不到
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第28张图片

slave2
insert into biao2 values(4,'wu');在slave2中插入数据
select * from biao2;
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第29张图片
client端
select * from biao2;
Linux——MySQL主从复制与读写分离实现高可用性,负载均衡的功能_第30张图片

  • 小结

流量 被轮询读取
在slave1中插入的数据不同步给slave2同理在slave2中插入的数据不同步给slave1所以客户端查看数据的请求会经过amoeba由amoeba通过轮询的方式依次读取slave1,slave2的数据所以看到的数据有区别从而体现了主从分离读写分割

你可能感兴趣的:(MySQL,mysql,数据库,centos,服务器,运维)