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

[经验分享] mysql的主从复制以及读写分离

[复制链接]

尚未签到

发表于 2018-10-9 10:33:51 | 显示全部楼层 |阅读模式
  mysql的主从复制以及读写分离
  前言:我们前面搭建过LAMP和LNMP,做过了web服务器群集和热备,web服务器坏了我们是不怕了,但是我们要知道,网站的数据有很多是存储在数据库里面的,例如注册的会员,发的文章,购物的订单等信息。当然我们可以给数据库做备份,但是如果每天00:00做一次备份,那么如果在23:59数据丢失了,那么就会丢失一天的数据,有没有一种方法能实现实时备份,就是说有数据产生就立即备份,答案当然是有,也就是今天我们要学习的mysql主从复制。有点类似于前面我们学习过的rsync,但是不同的是rsync是对磁盘文件做备份,而mysql主从复制是对数据库中的数据,语句做备份。另外读写分离主要是为了优化数据库。下面把实验给大家做一遍。
  一、mysql主从复制的工作原理
  1、mysq支持的复制类型
  1)基于语句的复制。在服务器上执行sql语句,在从服务器上执行同样的语句,mysql默认采用基于语句的复制,执行效率高。
  2)基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
  3)混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
  原理工作试图:
  通俗易懂的说法就是:
  (1)在主MySQL服务器数据修改之后数据文件记录在Binary log日志当中
  (2)从服务器的i/o线程连接到主MySQL服务器的Binary log的日志当中获取当中发生变化的数据内容
  (3)将获取到的内容写入到自己的Relay log日志当中
  (4)通过从服务器的自身sql线程读取Relay log日志当中的内容进行同步
  (5)mysql服务器之间的数据同步主要是通过日志的方式进行同步的,并非是通过命令或是复制内容
   DSC0000.png
  以下内容是官方的专业术语:
  1)在每个事务更新数据完成之前,master在二进制日志记录这些改变。写入二进制日志完成后,master通知存储引擎提交事务。
  2)Slave将master的binary log复制到其中继日志。首先slave开始一个工作线程(I/O),I/O线程在master上打开一个普通的连接,然后开始binlog  dump  process。binlog  dump  process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件,I/O线程将这些事件写入中继日志。
  3)Sql  slave  thread(sql从线程)处理该过程的最后一步,sql线程从中继日志读取事件,并重放其中的事件而更新slave数据,使其与master中的数据一致,只要该线程与I/O线程保持一致,中继日志通常会位于os缓存中,所以中继日志的开销很小。
  3、mysql读写分离原理
  读写分离就是在主服务器上修改,数据会同步到从服务器,从服务器只能提供读取数据,不能写入,实现备份的同时也实现了数据库性能的优化,以及提升了服务器安全。
  接下来进行主从复制的案例如下图:
DSC0001.png

  搭建mysql主从复制
  1.建立时间同步环境,在主节点上搭建时间同步服务器
  1)安装NTP
  [root@centos2 ~]# yum -y install ntp
DSC0002.png

  2)配置NTP
  [root@centos2 ~]# vim /etc/ntp.conf
  server 127.127.1.0                        //上游时间服务器为本机
  fudge 127.127.1.0 stratum 8//允许与上级时间服务器的时间偏移
DSC0003.png

  3)重启服务
  [root@centos2 ~]# service ntpd restart
DSC0004.png

  2.在从节点上进行时间同步(mysql从服务器两台都如此)
  [root@centos3 ~]# yum  -y  install  ntpdate
  [root@centos3 ~]# /usr/sbin/ntpdate  192.168.1.2
DSC0005.png DSC0006.png

  3.关闭每台服务器防火墙  service  iptables stop
  4.安装mysql过程略 本节内容不在讲解mysql的安装可以查看本人的mysql技术文档和LNMP;LAMP文档;里面有详细的内容
  5.启动mysql
DSC0007.png

  6.配置mysql主服务器
  1)在/etc/my.cnf中修改或增加下面内容
  server-id       = 11  //修改
  log-bin=master-bin    //修改,启用二进制日志,日志文件名称前缀
  log-slave-updates=true  //增加,允许从服务器复制
DSC0008.png DSC0009.png

  2)重启mysql服务
  [root@centos2 ~]# service mysqld restart
DSC00010.png

  3)登录mysql程序,给从服务器以授权
  [root@centos2 ~]# mysql -u root -p
  mysql> grant  replication  slave on *.*  to 'myslave'@'192.168.1.%'  identified by '123456';
  mysql> flush  privileges;
  mysql> show  master  status;
  +-------------------+----------+--------------+------------------+
  | File              | Position | Binlog_Do_DB | Binlog_Ignore_DB |
  +-------------------+----------+--------------+------------------+
  | master-bin.000007 |      337|              |                  |
  +-------------------+----------+--------------+------------------+
  1 row in set (0.00 sec)
DSC00011.png DSC00012.png

  7.配置两台从服务器
  1)在第一台从服务器/etc/my.cnf中修改或增加下面内容
  server-id       = 22  //修改
  relay-log=relay-log-bin //增加
  relay-log-index=slave-relay-bin.index  //增加
DSC00013.png

  2)重启mysql服务
  [root@centos3 ~]# service mysqld restart
DSC00014.png

  3)第二台从服务器只是server-id不同其他都和第一台一样
  server-id       = 33
DSC00015.png

  完成后重启mysql服务
DSC00016.png

  4)登录mysql,配置同步
  mysql>change  to master master_host='192.168.1.2',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=412; 可以变动
DSC00017.png

  5)启动同步
  mysql> start slave;
DSC00018.png

  6)查看slave状态,确保以下两个至为YES
  mysql> show slave status \G;
  Slave_IO_Running: Yes
  Slave_SQL_Running: Yes
DSC00019.png

  7)验证主从复制效果
  ①在主、从服务器上登录mysql
  [root@centos2 ~]# mysql -u root -p
  ②在主服务器上新建数据库db_test
  mysql> create database db_tese;
DSC00020.png

  ③在两台从服务器上查看数据库
  mysql> show databases;
  +--------------------+
  | Database           |
  +--------------------+
  | information_schema |
  | db_test           |
  | mysql              |
  | performance_schema |
  | test               |
  +--------------------+
  5 rows in set (0.02 sec)
DSC00021.png

  实验二、构建mysql读写分离,此内容为读写分离:
  1.在主机amoeba上安装java环境
  [root@centos1 ~]# cp /mnt/jdk-6u14-linux-x64.bin /usr/local/
DSC00022.png

  [root@centos1 ~]# chmod +x /usr/local/jdk-6u14-linux-x64.bin
DSC00023.png

  [root@centos1 local]# cd /usr/local/
DSC00024.png

  [root@centos1 local]# ./jdk-6u14-linux-x64.bin  //根据提示按回车和yes即可
DSC00025.png

  [root@centos1 local]# vim  /etc/profile
DSC00026.png

DSC00027.png

  export  JAVA_HOME=/usr/local/jdk1.6

  export>  export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
  export AMOEBA_HOME=/usr/local/amoeba/
  export PATH=$PATH:$AMOEBA_HOME/bin
  [root@centos1 local]# mv jdk1.6.0_14/  /usr/local/jdk1.6
DSC00028.png

  [root@centos1 local]# java -version
  java version "1.6.0_14
  OpenJDK Runtime Environment (rhel-2.4.3.3.el6-x86_64 u45-b15)
  OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)
  java环境已经成功
DSC00029.png

  安装并配置amoeba软件
  [root@centos1 local]# mkdir /usr/local/amoeba
DSC00030.png

  [root@centos1 local]# tar zxf  /mnt/amoeba-mysql-binary-2.2.0.tar.gz  -C  /usr/local/amoeba
DSC00031.png

  [root@centos1 local]# chmod -R 755 /usr/local/amoeba/
  [root@centos1 local]# /usr/local/amoeba/bin/amoeba
DSC00032.png

  3.配置amoeba读写分离,两个slave读负载均衡
  ①master、slave1和slave2中开放权限给amoeba访问

  mysql> grant all on *.* to 'test'@'192.168.1.%'>
DSC00033.png

  ②编辑amoeba.xml配置文件.注意修改红色下划线处
  28 amoeba
  30 123456
DSC00034.png

  113 master
  115 master
  116 slaves
DSC00035.png

  ③编辑dbServer.xml配置文件
  26test
  29123.com
DSC00036.png

  45
DSC00037.png

  46
  47
  48 192.168.1.2
DSC00038.png

  49
  50
  52
  53
  54
  55192.168.1.3
  56
DSC00039.png

  57
  58
  59
  60
  61192.168.1.4
  62
DSC00040.png

  63
  65
DSC00041.png

  66
  67
  68 1
  70
  71slave1,slave2
DSC00042.png

  72
  73
  ④配置无误后,可以启动amoeba软件,默认端口为tcp8066
DSC00043.png

  [root@centos1 amoeba]# bin/amoeba start &
  4.测试
  ①在client主机上
  l #yum  -y  install  mysql
  l 然后通过代理访问mysql  本机如果已安装可不用安装
  l [root@centos1 ~]# mysql -u amoeba -p123456 -h 192.168.1.1 -P8066  (-P为大写)
DSC00044.png

  ②在master上创建一个表,同步到各个从服务器上,然后关掉各从服务器的slave功能,再插入区别语句
  mysql> use db_lxf
  mysql> create table zang(id int(10),name varchar(10),address varchar(20));
DSC00045.png

  ③分别在两台从服务器上
  mysql>stop slave;
DSC00046.png

  ④然后在主服务器上插入数据
  mysql> insert inot zang values('1','zhang','this_is_master');
DSC00047.png

  ⑤从服务器同步了表,手动插入其他内容
  slave1:
  mysql> use db_lxf
  mysql> insert into zang values('2','zhang','this_is_slave1');
DSC00048.png

  slave2:
  mysql> use db_lxf
  mysql> insert into zang values('2','zhang','this_is_slave2');
DSC00049.png

  ⑥测试读操作
  在client主机上第一次查询的结果如下:
  mysql> use db_lxf
  mysql> select * from zang;
  +------+-------+----------------+

  |>  +------+-------+----------------+
  |    3 | zhang | this_is_slave1 |
  +------+-------+----------------+
  1 row in set (0.03 sec)
  第二次查询结果如下:
  mysql> select * from zang;
  +------+-------+----------------+

  |>  +------+-------+----------------+
  |    2 | zhang | this_is_slave2 |
DSC00050.png

  测试写操作在客户端:
  mysql> insert into zang values('4','zhang','write_test');
  但是在客户机上查询不到
  最终只能在主服务器上才能看到这条语句内容,说明写操作在master服务器上
  mysql> select * from zang;
  +------+-------+----------------+

  |>  +------+-------+----------------+
  |    1 | zhang | this_is_master |
  |    4 | zhang | write_test     |
  +------+-------+----------------+
  2 rows in set (0.03 sec)
DSC00051.png

  在主服务器mysql上进行验证:
DSC00052.png

  其他两个从服务器上查看:
   DSC00053.png
   DSC00054.png
  http://xiaorenwutest.blog.51cto.com/12754924/1920259


运维网声明 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-619482-1-1.html 上篇帖子: Mysql试题 下篇帖子: 将SpringCloud ConfigServer持久化存储改为MySQL
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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