设为首页 收藏本站
查看: 1288|回复: 0

[经验分享] mysql5.7的主从复制+读写分离

[复制链接]

尚未签到

发表于 2018-10-9 07:52:09 | 显示全部楼层 |阅读模式
  Mysql主从复制与读写分离
  目录:
  1、mysql主从复制工作原理
  2、mysql读写分离原理,使用Amoeba中间代理层实现读写分离
  3、在vmware中实现mysql主从复制+读写分离
  一、Mysql主从复制的工作原理:
  1、mysql支持的复制类型:
  1)、基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
  2)、 基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
  3)、混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
  2、主从复制的原理
DSC0000.png

  根据上图说明mysql的主从复制原理:
  (1)、在mysql_master上更新数据,写入二进制日志(Binary log),并通知存储引擎提交事务
  (2)、mysql_slave启用I/O线程将master的binary log复制到slave的中继日志(Relay log),
  (3)、mysql_slave启用SQL线程从Relay log中读取事件,并重放其中的事件从而更新slave数据,使其与master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小。
  3、mysql读写分离原理:
  在主从复制的基础上,master更新数据同步到slave服务器中,master只负责写入数据,slave只提供读取数据,从而实现了数据库性能的优化,以及提升了服务器的安全性。
DSC0001.png

  实现mysql读写分离的方法:
  1)基于程序代码内部实现
  在代码中根据select 、insert进行路由分类,这类方法也是目前生产环境下应用最广泛的。优点是性能较好,因为程序在代码中实现,不需要增加额外的硬件开支,缺点是需要开发人员来实现,运维人员无从下手。
  2)、基于中间代理层实现
  代理一般介于应用服务器和数据库服务器之间,代理数据库服务器接收到应用服务器的请求后根据判断后转发到,后端数据库,有以下代表性的程序。
  (1)mysql_proxy。mysql_proxy是Mysql的一个开源项目,通过其自带的lua脚本进行sql判断。
  (2)Atlas。是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-proxy 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。支持事物以及存储过程。
  (3)Amoeba。由阿里巴巴集团在职员工陈思儒使用序java语言进行开发,阿里巴巴集团将其用户生产环境下,但是他并不支持事物以及存数过程。
  不是所有的应用都能够在基于程序代码中实现读写分离,像一些大型的java应用,如果在程序代码中实现读写分离对代码的改动就较大,所以,像这种应用一般会考虑使用代理层来实现,那么今天就使用Amoeba为例,完成主从复制和读写分离。
  二、实验案例
  1、实验拓扑:
DSC0002.png

  2、实验环境:
  OS:centos7
  mysql-5.7.13
  ip规划如拓扑环境
DSC0003.png

DSC0004.png

  3、实验步骤:
  首先部署主从复制架构,再实现读写分离,使用client测试读写分离;
  3-1:
  1)、主从复制:
  配置ntp,在master上搭建时间同步服务器,确保主从服务器时间同步
  配置本地yum:
DSC0005.png

  安装ntp:
  yum -y install ntp
  2)、配置NTP时间服务器:
  vim  /etc/ntp.conf
  添加如下配置:
DSC0006.png

  3)、重启ntpd服务:
DSC0007.png

  4)、防火墙添加例外:
DSC0008.png

  5)分别slave1和slave2执行时间同步:
  分别在slave1 slave2安装ntp  ntpdate
DSC0009.png

DSC00010.png

  在salve1和slave2执行命令同步时间:
DSC00011.png

  3-2:
  1)、分别在master和slave1,slave2安装Mysql,安装步骤略:
  mysql版本如下:
DSC00012.png

  2)、mysql_master配置:
  修改/etc/my.cnf配置文件:
DSC00013.png

  注释:
  server-id=1  ##注意主从server-id不可一样
  log-slave-updates=true:一般用于联机复制中,
  log-bin=master-bin:指定binlog日志名
  重启mysqld服务
DSC00014.png

  在master创建用于复制数据用户,并授权,查看master的binlog日志信息。
DSC00015.png

  4、配置从服务器(slave1和slave2配置一样)
  1)、修改/etc/my.cnf主配置文件:
DSC00016.png

  注释:
  server-id=2:  server-id修改为2
  log-bin=mysql-bin:  slave的二进制日志
  relay-log=relay-log-bin  :中继日志文件名
  relay-log-index=slave-relay-bin.index : 中继日志的索引文件名
  重启mysqld服务
  systemctl restart mysqld
  注意:
  slave2也执行以上操作
  3)、在salve1和salve2分别执行change master to操作,用于同步数据:
  在master上开启防火墙的3306端口例外:
DSC00017.png

  注意要记住在master上执行show master status的binlog的二进制名,与位置信息,下面需要指定:
DSC00018.png

  slave2也执行相同操作:
  4)、启动slave(slave1和slave2都执行此操作)
  mysql>  start slave;
  5)、查看slave状态,确保以下两个值为YES
DSC00019.png

  当前Slave_IO_Running:值为No,向下查看错误信息:
DSC00020.png

  根据上述信息,可以判断,我的环境为克隆状态,所以mysql的UUID值一样,使用以下方法解决:
DSC00021.png

  修改auto.cnf中的UUID值,随意更改一个值即可。(slave2也一样)
  重启mysqld服务:
  systemctl restart mysqld
  再次登录mysql,查看主从复制的状态:
  根据Slave_SQL_Running  和Slave_IO_Running值是否为Yes状态
  salve1:
DSC00022.png

  slave2:
DSC00023.png

  5、验证从是否同步数据:
  1)、在主服务器上新建数据库”IT“
DSC00024.png

  创建test表,并插入数据:
DSC00025.png

  在slave1和slave2上查看是否更新数据:
  slave1:
DSC00026.png

  slave2:
DSC00027.png

  主从复制配置完毕,接下来配置读写分离:
  四、读写分离:
  1、在Amoeba上安装java环境:
  因为Amoeba基于是jdk1.5开发的,所以官方推荐使用jdk1.5或1.6版本,高版本不建议使用
  1)、下载jdk的执行程序:
DSC00028.png

  2)、添加x权限,并执行
  chmod +x  jdk-6u14-linux-x64.bin
  cp  jdk-6u14-linux-x64.bin  /usr/local/
  ./jdk-6u14-linux-x64.bin  ##执行此程序
  安装过程中提示(yes/no),选择yes安装即可,
  mv  jdk1.6.0_14/  /usr/local/jdk1.6
  3)、修改/etc/profile配置文件,增加以下配置:
  export JAVA_HOME=/usr/local/jdk1.6  //设置jdk的根目录

  export>  export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME
  /bin  //将jdk的程序文件赋予PATH变量
  export AMOEBA_HOME=/usr/local/amoeba //定义AMOEBA的根目录
  export PATH=$PATH:$AMOEBA_HOME/bin  将amoeba的程序文件复制给PATH变量
  如:
DSC00029.png

  4)、立即生效
DSC00030.png

  2、安装并配置Amoeba软件:
  #mkdir  /usr/local/amoeba    //创建amoeba目录
  #tar zxf  amoeba-mysql-binary-2.2.0.tar.gz -C  /usr/local/amoeba/
  #chmod -R 755 /usr/local/amoeba/
  #/usr/local/amoeba/bin/amoeba
DSC00031.png

  显示以上内容说明amoeba安装成功。
  3、配置amoeba,实现读写分离,master负责写,slave负责读,负载均衡
  1)、在主从三台服务器上登录mysql,创建amoeba用户并授权
  用户amoeba,密码amoeba(因为之前配置了主从复制,所以在slave1 slave2也会存在授权用户,可以查看)
DSC00032.png

  2)、修改amoeba.xml文件:
  定义两个配置,第一是应用程序使用什么用户连接amoeba访问到后端的mysql数据库,第二个是定义默认写池以及读池。
  在Amoeba上操作:
  vim  /usr/local/conf/amoeba.xml
  1)、修改连接amoeba的用户和密码
DSC00033.png

  2)、定义读写池
DSC00034.png

  3)、编辑dbServers.xml配置文件
DSC00035.png

  1)、修改连接mysql的用户和密码:
  用户amoeba 密码amoeba    ###注意删除注释   -->
DSC00036.png

  指定master slave1 slave2主机地址:
DSC00037.png

  定义slave的负载均衡:
DSC00038.png

  4)、启动amoeba:
DSC00039.png

  4、测试读写分离:
  1)、在client上安装mysql,用于远程连接数据库测试  (安装过程略,可以使用yum -y install mysql)
  2)、在master salve1 slave2分别开启3306端口,防火墙添加例外
DSC00040.png

  在Amoeba上开启8066端口:
  firewall-cmd  --permanent  --add-port=8066/tcp;
  firewall-cmd  --reload
  3)、在client上执行mysql命令登录amoeba
DSC00041.png

  1)、创建数据库test
DSC00042.png

  2)、创建表student;
DSC00043.png

  查看主从同步情况:
  master:
DSC00044.png

  slave1:
DSC00045.png

  slave2:
DSC00046.png

  在client上插入数据到student表中,查看从是否同步:
DSC00047.png

  slave1:
DSC00048.png

  slave2
DSC00049.png

  2)、将slave1 slave2执行 stop slave,停止主从复制
  分别在slave1 和salve2 向student表中插入不同的数据,用于在client上测试读的负载均衡:
  slave1:
DSC00050.png

  slave2:
DSC00051.png

  在client上进行查询:
DSC00052.png

  可以看到,第一次查询的数据是slave2的数据库,第二次查询是slave1的数据库,实现了轮询算法的负载均衡
  3)、在client上写入数据,测试写数据只有在master上会写入:
DSC00053.png

  从上面可以看出,在client上向student表写入数据,查询时,没有此数据,因为写操作只在master上生效,读是在slave上
  在master上查看是否有刚写入的数据:
DSC00054.png

  通过以上测试,mysql的主从复制与读写分离部署已完成。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-618812-1-1.html 上篇帖子: MySQL里的wait_timeout 下篇帖子: lampapache+mysql+php-12362297
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表