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

[经验分享] 轻松构建Mysql高可用集群系统

[复制链接]

尚未签到

发表于 2018-9-27 12:44:34 | 显示全部楼层 |阅读模式
  一、 MySQL复制的实现原理
  MySQL支持单向、双向复制、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入一个二进制日志文件中,并创建一个索引文件以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,日志文件会通知主服务器,从服务器在日志中读取的最后一次成功更新的位置。接着,从服务器在上次成功更新的位置处开始进入更新操作。更新完成后从服务器开始进入等待状态,等待主服务器后续的更新。
  需要注意的是:在进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,可能发生对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
  单向复制有利于健壮性、速度和系统管理.
  主服务器/从服务器设置增加了健壮性。主服务器出现问题时,可以切换到从服务器。
  通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。
  MySQL提供了数据库的同步功能,这对实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的。
  一般情况下,在Mysql复制中,主服务器也称为master,二从服务器称为slave,因此,想要启用同步机制,在master上就必须启用二进制日志。每个slave接受来自master上在二进制日志中记录的更新操作,而在slave上相当于执行了这个操作的一个拷贝。
  二、 MySQL同步细节
  MySQL同步功能由3个线程(master上1个binlog dump,slave上2个,分别是Sql进程和IO进程)来实现。执行“START SLAVE”语句后,slave就创建一个I/O线程。I/O线程连接到master上,并请求master发送二进制日志中的语句。master创建一个线程来把日志的内容发送到slave上。
  slave上的I/O线程读取master的Binlog Dump线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relay logs)中。第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。
  slave上使用2个线程的优点是,把读日志和执行分开成2个独立的任务。执行任务如果慢的话,读日志任务不会跟着慢下来。例如,如果slave停止了一段时间,那么I/O线程可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几的小时。如果slave在SQL线程没全部执行完就停止了,但I/O线程却已经把所有的更新日志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。
  本文讲解的环境为:一个mysql的master主节点node1,三个Mysql的Slave节点,三个Slave节点都从primary节点进行实时的同步数据,Mysql高可用集群主机信息如图1所示:
DSC0000.png

  图1
  三、在node1、slave1、slave2、slave3上安装MYSQL
  安装MySQL有多种方法,这里仅以rpm安装为列说明。
  [root@node1~]#yum -y install mysql-server mysql-devel mysql mysql-bench mysql-test
  安装完成后,使用如下命令启动mysql服务:
  [root@node1 ~]# /etc/init.d/mysqld start
  为了保障数据安全,建议把数据放到专业的存储设备或者磁盘阵列分区,这里假定磁盘阵列的分区为/data目录,接着把数据文件放到/data目录下:
  [root@node1 ~]# cp -R /var/lib/mysql /data/mysql
  [root@node1 ~]# chown –R mysql:mysql /data/mysql
  修改/etc/my.cnf文件,在[mysqld]组增加如下配置:
  datadir = /data/mysql
  最后,重启MySQL服务即可。
  四、在Mysql主节点node1上编辑配置文件my.cnf
  编辑主服务器的配置文件/etc/my.cnf,在[mysqld]中添加如下内容即可:
  server-id = 1   #服务器ID。服务器之间不能有重复ID,一般master是1
  log-bin=mysql-bin   #打开mysql的binlog功能,后面的名字可以自己指定,如果不改名字的话,默认是以主机名字命名
  binlog-do-db=ixdba #ixdba是需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可
  binlog-ignore-db=mysql #不需要备份的数据库名称,如果需要忽略备份多个数据库,重复设置这个选项即可。
  五、在master节点node1上建立复制用

  mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl_user'@'%'>  这里一定将repl_user用户设置为远程任意节点可以登录。
  六、备份Master数据
  备份Master上的数据,首先执行如下SQL语句:
  mysql>FLUSH TABLES WITH READ LOCK;
  Query OK, 0 rows affected (0.00 sec)
  mysql> reset master;
  Query OK, 0 rows affected (0.00 sec)
  不要退出这个终端,否则这个锁就失效了;在不退出终端的情况,再开一个终端直接打包压缩数据文件或使用mysqldump工具来导出数据。
  [root@node1 ~]# cd /var/lib/    #进入mysql的数据目录,根据自己情况而定。
  [root@node1 lib]# tar zcvf mysql.tar.gz mysql
  [root@node1 lib]# scp mysql.tar.gz  192.168.12.231/232/233:/var/lib/
  用scp命令把打包的数据传到其他几台Slave机器上。
  数据传输完成之后,在上面的命令终端上执行:
  mysql>UNLOCK TABLES;
  七、设置Slave主机
  编辑/etc/my.cnf文件,在[mysqld]中添加如下内容即可:
  server-id = 2
  log-bin=mysql-bin
  binlog-do-db=ixdba
  binlog-ignore-db=mysql
  其他的Slave以此类推,保证server-id全局唯一即可。
  八、 在slave上执行如下命令
  mysql> CHANGE MASTER TO MASTER_HOST='192.168.12.135',
  -> MASTER_USER='repl_user',
  -> MASTER_PASSWORD='repl_password',
  -> MASTER_LOG_FILE='mysql-bin.000001',
  -> MASTER_LOG_POS=98;
  执行完之后执行:
  mysql> slave start;
  Query OK, 0 rows affected (0.00 sec)
  mysql> show slave status\G
  从输出可以看到:Slave_IO_Running和Slave_SQL_Running如果都为Yes时,表示配置成功。
  九、需要注意的几个问题
  (1)如果在my.cnf里面定义了log-bin、relay-log参数,那么要保证定义与hostname无关,因为如果这两类log的文件名与主机名有关,切换过程会导致slave主机不能继续同步的问题。例如可以做下设置:
  log-bin = mysql-bin
  relay-log = mysql-relay-bin
  保证在两台主机上两种文件的名字一样。
  (2)最好把my.cnf文件也放入磁盘阵列所在分区的数据目录。


运维网声明 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-602828-1-1.html 上篇帖子: Mysql数据库Innodb与MyISAM的性能对比测试 下篇帖子: MySQL 优化(三)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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