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

[经验分享] 实验——MySQL主从复制架构

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2018-10-7 08:47:26 | 显示全部楼层 |阅读模式
  Mysql实现企业级数据库主从复制架构实战
  一、 环境准备:
  centos系统服务器2台、 一台用户做Mysql主服务器, 一台用于做Mysql从服务器, 配置好yum源、 防火墙关闭、 各节点时钟服务同步、 各节点之间可以通过主机名互相通信
  二、 准备步骤:
  1、 iptables -F && setenforce 清空防火墙策略,关闭selinux
  2、 拿两台服务器都使用yum方式安装Mysql服务, 要求版本一致
  3、 分别启动两台服务器mysql服务, 确保服务正常
  三、实现步骤:
  1、配置master主服务器(172.17.252.91
  对master进行配置,包括打开二进制日志,指定唯一的servr>
  server-id=1 #配置server-id,让主服务器有唯一ID号
  log-bin=mysql-bin #打开Mysql日志,日志格式为二进制
  skip-name-resolve#关闭名称解析,(非必须)
  PS:在配置文件中,-_是同一个意思,就是说log-bin和log_bin是一样的)
  操作:
  可以先给它改一个hostname名
DSC0000.jpg

  编辑MySQL配置文件
DSC0001.jpg

  修改文件内容:
DSC0002.jpg

  启动/重启服务 发现有二进制文件生成了
DSC0003.jpg

  用命令查看一下二进制文件
DSC0004.jpg id是1,从245开始

  登录数据库再查看一下
DSC0005.jpg

  确实是position为245
  2.创建复制帐号
  在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master
  。进行复制操作的用户会授予REPLICATION SLAVE权限。
  GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO slave@'172.17.%.%'IDENTIFIED BY 'magedu';
DSC0006.jpg

  进到mysql库里,查看一下user表,可以看到授权情况
DSC0007.jpg

  3.查看主服务器状态
  在Master的数据库执行show master status,查看主服务器二进制日志状态
DSC0008.jpg

  因为刚才经过一系列的操作,position就改变了
  查看一下binlog(图中这个2.row是我误操作授权错了,不用管它)
DSC0009.jpg

  看到目前最后的授权信息的position确实是从415-584了
  4、配置slave从服务器(172.17.254.225
  对slave进行配置,打开中继日志,指定唯一的servr>
  server-id=2 #配置server-id,让从服务器有唯一ID号
  relay_log = mysql-relay-bin #打开Mysql日志,日志格式为二进制
  read_only = 1 #设置只读权限
  log_bin = mysql-bin #开启从服务器二进制日志
  log_slave_updates = 1 #使得更新的数据写进二进制日志中
  操作:
DSC00010.jpg

  编辑文件/etc/my.cnf
DSC00011.jpg

  保存退出,启动/重启服务
  然后可以看一下,确实已经生成了二进制日志
DSC00012.jpg

  5.启动从服务器复制线程
  让slave连接master,并开始重做master二进制日志中的事件。
  CHANGE MASTER TO MASTER_HOST='172.17.252.91',#连接主IP
  MASTER_USER='slave',
  MASTER_PASSWORD='magedu',#这里要跟上面授权的信息对应
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=xxx;     #这里要跟刚才查看授权的position起点(415)对应,就是从授权开始往下都同步
DSC00013.jpg

  执行start slave;  # 启动复制线程。
DSC00014.jpg

  6、查看从服务器状态
  可使用SHOW SLAVE STATUS\G查看从服务器状态,如下所示,也可用show processlist \G查看当前复制状态:
  Slave_IO_Running: Yes #IO线程正常运行
  Slave_SQL_Running: Yes #SQL线程正常运行
DSC00015.jpg

  可以看到Read_Master_Log_Pos是584,说明已经读到Master的584位置,就是已经同步了
DSC00016.jpg

  Relay_log是它的中继日志
  我们可以查看一下
DSC00017.jpg

DSC00018.jpg

  这个授权信息我们并没有在从上执行过,但是它出现了,说明已经同步了。
  我们可以继续测试一下能否同步:
  先在主上创建一个lky库
DSC00019.jpg

  然后去从上看一下
DSC00020.jpg

  果然有lky库
  然后我们再去主的lky库中建个表:
DSC00021.jpg

  再跑去从的那边看一下:
DSC00022.jpg

  果然有刚才新建的表,说明我们的同步已经实现成功。
  四、 添加新slave服务器
  假如master已经运行很久了, 想对新安装的slave进行数据同步, 甚至它没有master的数据。
  此时, 有几种方法可以使slave从另一个服务开始, 例如, 从master拷贝数据, 从另一个slave克隆, 从最近的备份开始一个slave。 为了加快Slave与master同步, 可用以下方式先进行数据同步:
  (1)master的某个时刻的数据快照;
  (2)数据库的备份数据
  (3)master的二进制日志文件。
  
  
  
  
  MySQL复制过滤器
  仅复制某些相关的数据,而非所有
  两种实现思路:
  (1)主服务器
  主服务器仅向二进制日志中记录有关特定数据库相关的写操作;
  binlog_do_db=#只记录某个库
  binlog_ignore_db=         #只忽略记录某个库
  (2)从服务器
  从服务器的SQL THREAD仅重放关注的数据库或表相关的事件,并将其应用于本地;
  replicate_do_db=#只同步某个库
  replicate_ignore_db=    #只忽略同步某个库
  操作:
  在从上,编辑配置文件/etc/my.cnf
   DSC00023.jpg
  保存退出,重启服务
  然后我们尝试在主上的lky库中的keke表中插入数据:
DSC00024.jpg

DSC00025.jpg

  然后去从表中看一下keke表中的数据:
  同步成功
DSC00026.jpg

  然后我们去主中再创建一个其他库,
DSC00027.jpg

  去从那边看一下,没有这个库,因为我们设置的只同步lky库
DSC00028.jpg

  所以说,这个设置是成功的。
  企业常见数据库架构
  一、一主多从
  (1) 不同的slave扮演不同的作用(例如使用不同的索引,或者不同的存储引擎);
  (2) 用一个slave作为备用master,只进行复制;#主服务器挂了之后,可在从服务器执行
  1> 在备机上执行STOP SLAVE 和RESET MASTER
  2> 查看show slave status \G;
  3> 然后修改应用的连接地址。
  (3) 用一个远程的slave,用于灾难恢复;
  二、互为主从(一般用于小并发量)
  Master-Master复制的两台服务器,既是master,又是另一台服务器的slave。这
  样,任何一方所做的变更,都会通过复制应用到另外一方的数据库中。
  互为主从复制过程:
  什么是自增长ID?
  对于某些唯一性的字段,可以通过设置自增长ID来实现,自增长ID的数据,代表这个表中存在一
  条唯一的记录;而自增长id是肯定不会重复的;
  创建表叫userinfo,设置ID为自增长
  create table userinfo (
  id int PRIMARY KEY AUTO_INCREMENT,
  name varchar(50) NOT NULL);
  两边插入数据看数据增长
  insert into userinfo(name) value('xiao'),('da'),('lao');
  ※互为主从会有一个小问题,就是如果两端同时写入时,被设为主键的id会重复冲突,因此我们可以设置一个自增长ID,让一段从1开始步长为2(每次增长2个单位)的自增长,另一端从2开始步长为2的自增长,这样设置过之后,一端的id就只有奇数,另一端id只有偶数,就不会冲突了。
  互为主从:两个节点各自都要开启binlog和relay log;
  1、数据不一致;
  2、自动增长id;
  在配置文件中,
  定义一个节点使用奇数id
  auto_increment_increment=2 #表示自增长字段每次递增的量
  auto_increment_offset=1 #表示自增长字段从哪个数开始
  另一个节点使用偶数id
  auto_increment_increment=2
  auto_increment_offset=2
  配置:
  1、server_id必须要使用不同值;
  2、均启用binlog和relay log;
  3、存在自动增长id的表,为了使得id不相冲突,需要定义其自动增长方式;
  服务启动后执行如下两步:
  4、都授权有复制权限的用户账号;
  5、各把对方指定为主节点;
  注意:关闭防火墙!!
  操作:
  在刚才主从的基础上,我们来继续修改为互为主从
  修改第二台(之前的从)的配置文件:(将只读那句去掉)
DSC00029.jpg

  修改第一台(之前的主)的配置文件:(添加开启relay log那行)
DSC00030.jpg

  然后都保存退出,重启服务
  可以先看一下第二台之前配的从是否运转良好
DSC00031.jpg

  说明现在已经第二台是第一台的slave了,现在再配一下第一台让它做第二台的slave即可
  先看一下第二台的状态:
DSC00032.jpg

  看到是第三个日志,并且position号码为245
  然后去第一台上输入如下指令:(因为授权的那一步我们已经通过同步做过了,于是直接进行连接主即可)
  CHANGE MASTER TO MASTER_HOST='172.17.254.225',
  MASTER_USER='slave',
  MASTER_PASSWORD='magedu',
  MASTER_LOG_FILE='mysql-bin.000003',
  MASTER_LOG_POS=245;
DSC00033.jpg

  然后start slave;启动线程。
DSC00034.jpg

  使用show slave status\G;命令查看设置情况
DSC00035.jpg

  设置成功
  我们来测试一下是否能同步:
  我们来在lky库中新建一个id为主键且自增长的表:
DSC00036.jpg

  在一端建完了,另一端也可以看到
DSC00037.jpg

  我们可以试一下插入三个name信息,看id是否真的是自增长:
  insert into userinfo(name) value('ll'),('kk'),('yy');
DSC00038.jpg

  插入成功,确实id是自增长的,
  然后我们去配置文件中设置增长的信息将它设成奇数偶数那种形式。
  一台走奇数:
DSC00039.jpg

  另一台走偶数:
DSC00040.jpg

  两台都保存退出,重启服务
  在偶数边那台插入三个数据,发现id确实是偶数的:
DSC00041.jpg

  再去奇数边插入三个,可以看到确实是奇数的id:
DSC00042.jpg

  说明我们设置成功,这样就再也不用担心当主从同时写入时id可能会冲突了。
  异步同步半同步
DSC00043.jpg

  
  半同步复制:
DSC00044.jpg

DSC00045.jpg

  操作:
  那我们继续上面实现的互为主从情况下,接着去实现半同步复制
  1、主节点:
  INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; 安装半同步复制的库文件 DSC00046.jpg
  SHOW GLOBAL VARIABLES LIKE 'rpl_semi%'; 查看状态
DSC00047.jpg

  SET GLOBAL rpl_semi_sync_master_enabled=ON; 将半同步开启
DSC00048.jpg

  然后需要重新加载一下线程(就是先stop一下,再start一下)
DSC00049.jpg

  2、从节点:
  INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';  安装从插件
  SHOW GLOBAL VARIABLES LIKE 'rpl_semi%';  查看状态
DSC00050.jpg

  SET GLOBAL rpl_semi_sync_slave_enabled = ON; 开启半同步复制
DSC00051.jpg

  然后同样需要重新加载一下线程
DSC00052.jpg

  3、查看设置
  我们退出数据库,查看一下日志
DSC00053.jpg

  看到主的这边日志显示半同步开启了
DSC00054.jpg

  去另一边从的看日志,也显示开启成功了: DSC00055.jpg


运维网声明 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-614159-1-1.html 上篇帖子: mysql5.5 二进制安装 下篇帖子: MySQL高可用架构之MHA-Linux探索之旅
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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