赞
踩
(mysql官网复制原理图 )
MySQL之间数据复制的基础是二进制日志文件(binary log file)。一台MySQL数据库一旦启用二进制日志后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。
安装mysql服务
主节点master: 192.168.81.134:3310 (root/root)
主节点master_back: 192.168.81.134:3311 (root/root)
master和master_back互为主从关系
- #主从复制配置
- server-id =1
- log-bin = mysql-bin
- binlog-ignore-db = mysql
- binlog-ignore-db = information_schema
- binlog-ignore-db = performance-schema
- binlog-do-db = canteen_db
- #binlog_format=mixed
- #主-主热备主库配置
- #log-slave-updates
- #sync_binlog = 1
- auto-increment-offset = 1
- auto-increment-increment = 2
- slave-skip-errors = all
- replicate-do-db = canteen_db
- replicate-ignore-db = mysql,information-schema,performance-schema
-

-
- #主从复制从库配置
- #binlog_format=mixed
- server-id = 6
- log-bin = mysql-bin
- replicate-do-db = canteen_db
- replicate-ignore-db = mysql
- replicate-ignore-db = information_schema
- replicate-ignore-db = performance_schema
- #双主热备从库配置
- #sync_binlog = 1
- auto-increment-increment = 2
- auto-increment-offset = 1
- slave-skip-errors = all
- binlog-do-db = canteen_db
- binlog-ignore-db = mysql,information_schema,performance_schema

- grant replication slave,reload,super on *.* to 'root'@'192.168.81.134' identified by 'root';
-
- flush privileges;
-
- show master status;
-
- change master to master_host='192.168.81.134', master_user='root',master_password='root',master_port=3311,
- master_log_file='mysql-bin.000003',master_log_pos=619;
-
- flush privileges;
-
- start slave;
-
- show slave STATUS;
- change master to master_host='192.168.81.134', master_user='root',master_password='root',master_port=3311,
- master_log_file='mysql-bin.000003',master_log_pos=619;
-
- flush privileges;
-
- start slave;
-
- show slave STATUS;
Row模式下日志中会记录成每一行数据被修改的形式,日志内容会非常清楚地记录下每一行数据修改的细节。但是Row 格式有一个很大的问题,那就是日志量太大了,特别是批量 update、整表 delete、alter 表等操作,由于要记录每一行数据的变化,此时会产生大量的日志,大量的日志也会带来 IO 性能问题。
Statement模式下只记录执行的 SQL,每一条会修改数据的 SQL 都会记录到 master 的 bin-log 中。slave 在复制的时候 SQL 进程会解析成和原来 master 端执行过的相同的 SQL 再次执行。
优点:首先就是解决了 row 模式的缺点,不需要记录每一行数据的变化,减少了 bin-log 日志量,节省 I/O 以及存储资源,提高性能。因为他只需要记录在 master 上所执行的语句的细节,以及执行语句时候的上下文的信息。
缺点:在 statement 模式下,由于他是记录的执行语句,在修改改数据的时候使用了某些特定的函数或者功能的时候会出现,比如:sleep() 函数在有些版本中就不能被正确复制,在存储过程中使用了 last_insert_id() 函数,可能会使 slave 和 master 上得到不一致的 id 等等。由于 row 是基于每一行来记录的变化,所以不会出现类似的问题。
Mixed 模式下系统会自动判断该用 Statement 还是 Row,一般的语句修改使用 Statement 格式保存 binlog,对于一些 Statement 无法准确完成主从复制的操作,则采用 Row保存binlog。Mixed 模式中,MySQL 会根据执行的每一条具体的 SQL 语句来区别对待记录的日志格式,也就是在 Statement 和 Row 之间选择一种。
双主热备的目的是为了实现故障转移,一旦master节点挂了,master_back还能继续充当主节点工作,保证集群的高可用。在msyql集群中接入keepalived,实现主节点自动切换。
准备92.168.81.81.134、192.168.81.135两个主机,分别安装好数据库服务。依据上述步骤配置双主复制。
在192.168.81.81.134、192.168.81.135主机分别安装keepalived服务,以192.168.81.81.134为主机,192.168.81.135为备机:
- yum install -y curl gcc openssl-devel libnl3-devel net-snmp-devel
- yum install -y keepalived
切换至 /etc/keepalived/目录下,编辑keepalived.conf文件。
- global_defs {
- default_interface eth0
- router_id LVS_DEVEL
- }
-
- vrrp_instance VI_1 {
- #网卡配置要与所在物理机一直有eth0 或者ens33
- interface eth0
- #主机MASTER 从机BACKUP
- state MASTER
- #keepalive集群id
- virtual_router_id 51
- advert_int 1
- #优先级
- priority 150
- #不抢占
- nopreempt
- #本机实际ip
- mcast_src_ip 192.168.81.134
-
- #虚拟化ip,可以有多个
- virtual_ipaddress {
- 192.168.81.205
- }
-
- #集群节点通信授权
- authentication {
- auth_type PASS
- auth_pass 11111
- }
-
-
- notify "/home/master/shell/notify.sh"
- }

其中notify.sh用来检测134机器上的mysql,一旦134的mysql挂了,134的keepalived调用次脚本停止服务,这时外部访问自动切换到135的keepalived上,这样就可以实现故障转移。
#notify.sh
- #!/bin/bash
- cname=master1-mysql
- upStatus=Up
- echo "keepalived开始执行$cname健康检查"
- while(true)
- do
- conStatus=`docker ps -a| grep $cname | awk '{print $7}'`
- if [[ "$upStatus" == "$conStatus" ]]; then
- echo "$cname容器状态$conStatus健康运行"
- sleep 5
- else
- echo "$cname容器状态$conStatus异常运行,停止本机keepalived运行切换至BACKUP"
- systemctl stop keepalived.service
- if [ $? -eq 0 ]; then
- echo "关闭keepalived成功"
- else
- cho "关闭keepalived失败"
- fi
- break
- fi
- done

- global_defs {
- default_interface eth0
- router_id LVS_DEVEL
- }
-
- vrrp_instance VI_1 {
- #网卡配置要与所在物理机一直有eth0 或者ens33
- interface eth0
- #主机MASTER 从机BACKUP
- state BACKUP
- #keepalive集群id
- virtual_router_id 51
- advert_int 1
- #优先级
- priority 150
- #不抢占
- nopreempt
- #本机实际ip
- mcast_src_ip 192.168.81.135
-
- #虚拟化ip,可以有多个
- virtual_ipaddress {
- 192.168.81.205
- }
-
- #集群节点通信授权
- authentication {
- auth_type PASS
- auth_pass 11111
- }
-
- }

- #启动keepalived
- systemctl start keepalived
-
- #加入开机启动keepalive
- systemctl enable keepalived
-
- #关闭keepalived
- systemctl stop keepalived
-
- #查看keepalived状态
- systemctl status keepalived
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。