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

[经验分享] MySQL主从复制的原理及实现过程(mysql-5.5的同步、半步复制过程)

[复制链接]

尚未签到

发表于 2018-9-27 06:07:44 | 显示全部楼层 |阅读模式
  一、MySQL主从复制的原理
  1、mysql的复制过程:每执行一个写操作,它都会往自己的数据库中存一份,与此同时这个写操作也会存储在二进制日志文件中一份,并且把它们保存为事件,所以在这个数据库上,前端数据每执行一个写操作或者有可能引起修改的操作,都会保存一个事件,我们就把这个事件通过mysql服务器3306端口发送给另外一台服务器,另外一台服务器把这个事件接收下来,接受下来以后先保存在本地的日志文件中,而后从这个日志文件中一次读一个事件并且在本地执行一下,然后保存在数据库里面,这个过程就叫mysql的复制。如下图所示:
DSC0000.jpg

  2、在这样一个模型当中,我们把允许来自外部操作记录下来记录到数据库中,并保存至二进制文件中的这台服务器叫做复制架构中主服务器(master)。主服务器中的日志文件叫二进制日志。
  3、slave:从服务器中的日志文件是从主服务器中复制过来的,叫做中继日志,主要目的是复制下来,再在本地用一遍,相当于产生一个接力的过程。
  4、主服务器允许并行执行,主服务器上若有多个CPU,它允许多个服务器并行执行。但是我们写到二进制文件中,只能一条一条的写,从服务器只能一条一条的执行。从服务器默认情况下也只能是一个进程,读一条执行一个,所以从服务器慢于主服务器。
  二、MySQL主从复制实现的过程
  1、主服务器的配置过程
  1)添加系统用户并修改权限
DSC0001.jpg

  2)下载mysql软件包解压后并创建链接
  [root@node1 ~]# lftp 172.16.0.1/pub/Sources/mysql-5.5/ 下载mysql-5.5包
  cd ok, cwd=/pub/Sources/mysql-5.5
  lftp 172.16.0.1:/pub/Sources/mysql-5.5> ls
  ...
  lftp 172.16.0.1:/pub/Sources/mysql-5.5> get mysql-5.5.28-linux2.6-i686.tar.gz
  179907710 bytes transferred in 25 seconds (6.89M/s)
  lftp 172.16.0.1:/pub/Sources/mysql-5.5> bye
DSC0002.jpg

  3)初始化数据库并复制文件
DSC0003.jpg

DSC0004.jpg

  4)修改配置文件并复制到从服务器
  [root@node1 mysql]# vim /etc/my.cnf 修改配置文件内容如下:
DSC0005.jpg

DSC0006.jpg

DSC0007.jpg

  [root@node1 ~]# scp /etc/my.cnf node2:/etc/ 把配置文件复制到从服务器
  my.cnf 100% 4746
  5)启动mysql,测试能否连接到mysql
DSC0008.jpg

  [root@node1 mysql]# vim /etc/profile.d/mysql.sh 为了以下命令用起来方便,编辑配置文件
DSC0009.jpg

  [root@node1 mysql]# . /etc/profile.d/mysql.sh 执行一下脚本
DSC00010.jpg

  6)复制mysql软件包到从服务器,然后连接到mysql创建用户
DSC00011.jpg

DSC00012.jpg

  2、配置从服务器
  1)创建用户修改权限并解压软件包连接到数据库
  [root@node2 ~]# mkdir -pv /mydata/data
  mkdir: created directory `/mydata'
  mkdir: created directory `/mydata/data'
  [root@node2 ~]# useradd -r mysql
  [root@node2 ~]# chown -R mysql.mysql /mydata/data/
  [root@node2 ~]# tar xf mysql-5.5.28-linux2.6-i686.tar.gz -C /usr/local/
  [root@node2 ~]# cd /usr/local/
  [root@node2 local]# ls
  bin etc games include lib libexec mysql-5.5.28-linux2.6-i686 sbin share src
  [root@node2 local]# ln -sv mysql-5.5.28-linux2.6-i686 mysql
  create symbolic link `mysql' to `mysql-5.5.28-linux2.6-i686'
  [root@node2 local]# cd mysql
  [root@node2 mysql]# chown -R root.mysql 改变属主属组
  [root@node2 mysql]# ll
  [root@node2 mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata/data/ 初始化数据库
  2)复制脚本内容并修改所需配置文件
DSC00013.jpg

  [root@node2 mysql]# vim /etc/my.cnf 修改配置文件内容如下:
DSC00014.jpg

DSC00015.jpg

  3)启动mysql
  [root@node2 mysql]# service mysqld start
  Starting MySQL.... [ OK ]
  [root@node2 mysql]# vim /etc/profile.d/mysql.sh 编辑配置文件的内容如下:
DSC00016.jpg

  [root@node2 mysql]# . !$ 读一下上面的脚本
  . /etc/profile.d/mysql.sh
  4)在主节点上即HA1上查看从哪个节点开始复制
  [root@node1 ~]# mysql
DSC00017.jpg

  5)修改主服务器的一些属性
DSC00018.jpg

  6)查看从服务器启动前后的状态
DSC00019.jpg

  mysql> start slave; 启动从服务器
  Query OK, 0 rows affected (0.00 sec)
DSC00020.jpg

  到这里主从复制架构依然完成。
  3、主服务器上创建数据,从服务器上是否会出现
  1)在主服务器连接到数据库并创建数据库
DSC00021.jpg

  2)查看从服务器的状态,并查看数据库
DSC00022.jpg

DSC00023.jpg

  4)让从服务器变成只读的
DSC00024.jpg

  [root@node2 mysql]# vim /etc/my.cnf 修改配置文件,让read_only = ON永久有效
DSC00025.jpg

  5)重启服务器,查看read_only是否启动
DSC00026.jpg

  (read-only = YES 对具有SUPER权限的用户不生效)
  mysql> show slave status\G 查看复制线程能否自动运行
  *************************** 1. row ***************************
  Slave_IO_State: Waiting for master to send event
  Master_Host: 172.16.66.6
  Master_User: repluser
  Master_Port: 3306
  Connect_Retry: 60
  Master_Log_File: master-bin.000001
  Read_Master_Log_Pos: 430
  Relay_Log_File: relay-log.000004
  Relay_Log_Pos: 254
  Relay_Master_Log_File: master-bin.000001
  Slave_IO_Running: Yes 当使用change master to之后
  Slave_SQL_Running: Yes 就算重启服务器复制线程也会自动启动
  Replicate_Do_DB:
  Replicate_Ignore_DB:
  Replicate_Do_Table:
  Replicate_Ignore_Table:
  Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
  Last_Errno: 0
  Last_Error:
  Skip_Counter: 0
  Exec_Master_Log_Pos: 430
  Relay_Log_Space: 404
  Until_Condition: None
  Until_Log_File:
  Until_Log_Pos: 0
  Master_SSL_Allowed: No
  Master_SSL_CA_File:
  Master_SSL_CA_Path:
  Master_SSL_Cert:
  Master_SSL_Cipher:
  Master_SSL_Key:
  Seconds_Behind_Master: 0
  Master_SSL_Verify_Server_Cert: No
  Last_IO_Errno: 0
  Last_IO_Error:
  Last_SQL_Errno: 0
  Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
  Master_Server_Id: 1
  1 row in set (0.00 sec)
  6)查看/mydata/data/下的文件
  [root@node2 mysql]# cd /mydata/data/ 切换到/mydata/data目录下
  [root@node2 data]# ls 查看文件
  ibdata1 master-bin.000001 master-bin.index node2.magedu.com.pid relay-log.index
  ib_logfile0 master-bin.000002 master.info performance_schema relay-log.info
  ib_logfile1 master-bin.000003 mysql relay-log.000003 test
  magedudb master-bin.000004 node2.magedu.com.err relay-log.000004
  [root@node2 data]# file master.info 查看master.info
  master.info: ASCII text 纯ASCII码的文件
  [root@node2 data]# file relay-log.info
  relay-log.info: ASCII text 纯ASCII码的文件
  [root@node2 data]# cat relay-log.info 查看一下relay-log.info里面的内容
  ./relay-log.000004 当前使用的relay-log文件事件位置
  254
  master-bin.000001 正在读取的主服务器上的二进制文件事件位置
  430
  【read-only = YES 只读,在从服务器上,但对具有SUPER权限的用户不生效;所以管理员照样能写;
  sync-binlog = ON 在主服务器上设定,用于事务安全; 】
  7、有没有这样一个问题呢?在主服务器上某个事物已经提交了,而有些事务仍然在缓冲区内,万一这个时候主服务器崩溃了,从服务器上能否得到复件?如何降低主从不一致的可能性呢?应该配置主服务器同步二进制日志。
  配置主服务器同步二进制日志
  mysql> show global variables like '%log%'; 查看跟日志相关的内容
  8、我们的从服务器启动起来后会自动连接主服务器,如果主服务器崩溃了,从服务器启动后还会自动连接到主服务器复制二进制日志,一般来讲不应该让从服务器从复制线程自动启动,怎么让从服务器不会自动启动?
  1)首先连接到mysql查看从服务器相关的内容
  mysql>show global variables like '%slave%';
  2)如果想彻底的重新定义mysql从服务器的话,执行mysql服务器线程了可以手动停掉;具体过程如下:
  mysql> stop slave IO_THREAD; 停掉线程服务
  mysql> show slave status/G 查看状态
  补充:也可以一个一个的停掉线程服务
  mysql> start slave IO_THREAD;
  mysql> show slave status/G
  mysql> start slave SQL_THREAD;
  mysql> show slave status/G
  mysql> \q
  所有跟从服务器相关的内容都会保存在数据库服务的错误日志当中
  [root@node2 mysql]# tail /mydata/data/node2.magedu.com.err
  三、如何实现mysql的半同步复制
  1、在主服务器和从服务器上各自安装一个插件,这个插件是google提供的。
  [root@node2 data]# cd /usr/local/mysql 切换到mysql路径下
  [root@node2 mysql]# ls
  [root@node2 mysql]# cd lib/plugin
  (semisync_master.so是半同步的主服务器上安装的插件,semisync_slave.so是半同步的从服务器上安装的插件)
  1)主服务器上的配置:
  mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so'; 装载模块
  rpl_semi_sync_master是模块(插件)名称、semisync_master.so是模块文件名
  mysql> show global variables like '%rpl%';
  2)从服务器上的配置:
  mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so'; 装载模块
  mysql> show variables like 'rpl%'; 查看rpl开头的
  2、启用rpl_semi_sync_master_enabled模块
  1)主服务器上:
  mysql> set global rpl_semi_sync_master_enabled=1; 启用rpl_semi_sync_master_enabled
  mysql> show global varitables like '%rpl%'; rpl_semi_sync_master_enabled 显示为ON了
  2)从服务器上:
  mysql> set global rpl_semi_sync_master_enabled=1; 启用rpl_semi_sync_master_enabled
  mysql> show global varitables like '%rpl%'; rpl_semi_sync_master_enabled 显示为ON了
  mysql> show global status like 'rpl%'; 查看全局状态变量
  mysql> stop slave IO_THREAD; 停掉IO线程
  mysql> start slave IO_THREAD; 启用IO线程
  mysql> show global status like 'rpl%';
  到此,半同步复制就结束了。


运维网声明 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-602458-1-1.html 上篇帖子: Heartbeat+Drbd+MySQL 安装部署 下篇帖子: MySQL 基于时间点与位置恢复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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