mysql主从复制的实现

1、MySQL复制的实现原理

MySQL支持单向、双向复制、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入一个二进制日志文件中,并创建一个索引文件以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,日志文件会通知主服务器,从服务器在日志中读取的最后一次成功更新的位置。接着,从服务器在上次成功更新的位置处开始进入更新操作。更新完成后从服务器开始进入等待状态,等待主服务器后续的更新。需要注意的是:在进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,可能发生对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。

2、MySQL同步细节

MySQL同步功能由3个线程(master上1个binlogdump,slave上2个,分别是Sql进程和IO进程)来实现。执行“STARTSLAVE”语句后,slave就创建一个I/O线程。I/O线程连接到master上,并请求master发送二进制日志中的语句。master创建一个线程来把日志的内容发送到slave上。slave上的I/O线程读取master的BinlogDump线程发送的语句,并且把它们拷贝到其数据目录下的中继日志(relaylogs)中。第三个是SQL线程,salve用它来读取中继日志,然后执行它们来更新数据。

slave上使用2个线程的优点是,把读日志和执行分开成2个独立的任务。执行任务如果慢的话,读日志任务不会跟着慢下来。

例如,如果slave停止了一段时间,那么I/O线程可以在slave启动后很快地从master上读取全部日志,尽管SQL线程可能落后I/O线程好几的小时。如果slave在SQL线程没全部执行完就停止了,但I/O线程却已经把所有的更新日志都读取并且保存在本地的中继日志中了,因此在slave再次启动后就会继续执行它们了。这就允许在master上清除二进制日志,因为slave已经无需去master读取更新日志了。

3、在test1,test2上安装MYSQL

test1的ip:192.168.46.131test2的ip:192.168.46.130

test1为mastertest2为slave

安装MySQL有多种方法,这里仅以源码安装test1为列说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@test1 ~]# yum install libtermcap  libtermcap-devel imake  autoconf   automake libtool  m4
[root@test1 ~]# useradd -M  -s /sbin/nologin  mysql
[root@test1 ~]# mkdir /usr/local/mysql
[root@test1 ~]# tar zxvf mysql-5.1.70.tar.gz
[root@test1 ~]# cd  mysql-5.1.70
[root@test1 mysql-5.1.70]# ./configure --prefix=/usr/local/mysql   --enable-assembler  --with-client-ldflags=-all-static --with-unix-socket-path=/tmp --with-charset=utf8   --enable-thread-safe-client --with-pthread   --without-debug  --with-big-tables  --enable-community-features   --enable-profiling   --enable-local-infile  --with-fast-mutexes   --with-plugins=partition,federated,ndbcluster,innobase,csv,blackhole,myisam,innodb_plugin
[root@test1 mysql-5.1.70]#make
[root@test1 mysql-5.1.70]#strip sql/mysqld
[root@test1 mysql-5.1.70]#makeinstall
[root@test1 mysql-5.1.70]# cp support-files/my-medium.cnf    /etc/my.cnf
[root@test1 mysql-5.1.70]# /usr/local/mysql/bin/mysql_install_db --user=mysql
[root@test1 mysql-5.1.70]# echo "PATH=\"/usr/local/mysql/bin:\$PATH\"">> /etc/profile
[root@test1 mysql-5.1.70]# export PATH="/usr/local/mysql/bin:$PATH"

4、在主服务器test1上编辑配置文件my.cnf

编辑主服务器的配置文件/etc/my.cnf,在[mysqld]中添加如下内容即可:

server-id=1

#服务器ID。服务器之间不能有重复ID,一般master是1

log-bin=mysql-bin
#打开mysql的binlog功能,后面的名字可以自己指定,如果不改名字的话,默认是以主机名字命名

binlog-do-db=test

#test是需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可

binlog-ignore-db=mysql

#不需要备份的数据库名称,如果需要忽略备份多个数据库,重复设置这个选项即可。

5.在主服务器test1上建立复制用户mysql>GRANTREPLICATIONSLAVEON*.*TO'chenzhongyang'@'%'IDENTIFIEDBY'chenzhongyang';

这里一定将chenzhongyang用户设置为远程任意节点可以登录。

备份Master数据备份Master上的数据,首先执行如下SQL语句:

mysql>FLUSHTABLESWITHREADLOCK;QueryOK,0rowsaffected(0.00sec)

mysql>resetmaster;QueryOK,0rowsaffected(0.00sec)

不要退出这个终端,否则这个锁就失效了;在不退出终端的情况,再开一个终端直接打包压缩数据文件或使用mysqldump工具来导出数据。

[root@test1~]#cd/var/lib/#进入mysql的数据目录,根据自己情况而定。

[root@test1lib]#tarzcvfmysql.tar.gzmysql

[root@test1lib]#scpmysql.tar.gz192.168.46.130:/var/lib/

用scp命令把打包的数据传到其他几台Slave机器上。数据传输完成之后,在上面的命令终端上执行:

mysql>UNLOCKTABLES;

6.设置辅服务器test2

编辑/etc/my.cnf文件,在[mysqld]中添加如下内容即可:

server-id=2

log-bin=mysql-bin

binlog-do-db=test

binlog-ignore-db=mysql

其他的Slave以此类推,保证server-id全局唯一即可。

在slave上执行如下命令:

mysql>CHANGEMASTERTOMASTER_HOST='192.168.46.131',

->MASTER_USER='chenzhongyang',

->MASTER_PASSWORD='chenzhongyang',

->MASTER_LOG_FILE='mysql-bin.000001',

->MASTER_LOG_POS=98;

执行完之后执行:mysql>slavestart;

QueryOK,0rowsaffected(0.00sec)

mysql>showslavestatus\G

从输出可以看到:Slave_IO_Running和Slave_SQL_Running如果都为Yes时,表示配置成功。

7.需要注意

如果在my.cnf里面定义了log-bin、relay-log参数,那么要保证定义与hostname无关,因为如果这两类log的文件名与主机名有关,切换过程会导致slave主机不能继续同步的问题。例如可以做下设置:log-bin=mysql-binrelay-log=mysql-relay-bin保证在两台主机上两种文件的名字一样。

8,排错Slave_IO_Running:No

mysql>showslavestatus\G;-----察看从数据库服务器的状态

***************************1.row***************************

Slave_IO_State:

Master_Host:192.168.10.129

Master_User:qing

Master_Port:3306

Connect_Retry:10

Master_Log_File:mysql_bin.000006

Read_Master_Log_Pos:106

Relay_Log_File:mysqld-relay-bin.000001

Relay_Log_Pos:4

Relay_Master_Log_File:mysql_bin.000006

Slave_IO_Running:No------------显示为no,证明没有成功,

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:106

Relay_Log_Space:106

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:NULL

Master_SSL_Verify_Server_Cert:No

Last_IO_Errno:1236

last_IO_Error:Gotfatalerror1236frommasterwhenreadingdatafrombinarylog:'Couldnotfindfirstlogfilenameinbinarylogindexfile'----无法同步的原因

Last_SQL_Errno:0

Last_SQL_Error:

1rowinset(0.00sec)

ERROR:

Noqueryspecified

Slave_IO_Running:No证明同步没有成功,上面一行的

红色字体显示了错误的原因,一般出现这种情况,使用如下方法解决:

先进入slave中执行:slavestop来停止从库同步;

再去master中执行:flushlogs来清空日志;

然后在master中执行:showmasterstatus查看下主库的状态,主要是日志的文件和position;

然后回到slave中,执行:changemastertomaster_log_file='mysql-bin.000008',master_log_pos=106,文件和位置对应master中的;

最后在slave中执行:slavestart来启动同步。

9,排错Slave_SQL_Running:No

mysql>showslavestatus\G
Slave_IO_Running:Yes
Slave_SQL_Running:No
Last_Errno:1062
....
Seconds_Behind_Master:NULL
原因:
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.

解决办法I:
1.首先停掉Slave服务:slavestop
2.到主服务器上查看主机状态:
记录File和Position对应的值。
mysql>showmasterstatus;
+------------------+-----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+-----------+--------------+------------------+
|mysql-bin.000020|135617781|||
+------------------+-----------+--------------+------------------+
1rowinset(0.00sec)
3.到slave服务器上执行手动同步:
mysql>changemasterto
>master_host='192.168.46.131',
>master_user='chenzhongyang',
>master_password='chenzhongyang',
>master_port=3306,
>master_log_file='mysql-bin.000020',
>master_log_pos=135617781;
1rowinset(0.00sec)
mysql>slavestart;
1rowinset(0.00sec)
再次查看slave状态发现:
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
...
Seconds_Behind_Master:0

配置mysql+lvs+keeplived实现Mysql读操作的负载均衡

环境:

test1192.168.46.131master

test2192.168.46.130slave备份test库

test3调度器

1、安装与配置Keepalived

首先在节点test1、test2上安装Keepalived软件,软件安装非常简单。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@test1 ]# yum install -y openssl-devel
[root@test1 ~]# wget  http://www.keepalived.org/software/keepalived-1.2.1.tar.gz
[root@test1 ~]# tar zxvf keepalived-1.2.1.tar.gz
[root@test1 ~]# cd keepalived-1.2.1
[root@test1 keepalived-1.2.1]# ./configure --prefix=/usr/local/keepalived
[root@test1 keepalived-1.2.1]# make && make install
[root@test1 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived  /etc/sysconfig/
[root@test1 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived  /etc/init.d/
[root@test1 ~]# mkdir  /etc/keepalived
[root@test1 ~]# cp  /usr/local/keepalived/etc/keepalived  /keepalived.conf  /etc/keepalived/
[root@test1 ~]# ln -s  /usr/local/keepalived/sbin/keepalived  /usr/sbin/
[root@test1 ~]# service keepalived start
Starting keepalived:                                       [  OK  ]

Keepalived的配置也非常简单,仅仅需要一个配置文件即可完成HAcluster和lvs服务节点监控功能,在通过Keepalived搭建高可用的LVS集群实例中,主、备DirectorServer都需要安装Keepalived软件,安装成功后,默认的配置文件路径为/etc/Keepalived/Keepalived.conf。

一个完整的keepalived配置文件,有三个部分组成,分别是全局定义部分、vrrp实例定义部分以及虚拟服务器定义部分,配置好的文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
! Configuration File for keepalived
global_defs {
notification_email {
root@localhost
}
notification_email_from  root@localhost
smtp_server 192.168.46.131
smtp_connect_timeout 30
router_id LVS_MASTER
}
vrrp_instance VI_1 {
state MASTER      //备库为BACKUP
interface eth2     //通过的网卡
virtual_router_id 51
priority 100      //备库为99
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.46.100
}
}
virtual_server 192.168.46.100 3306 {
delay_loop 30
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.46.131 3306 {
weight 1
MISC_CHECK{
misc_path "/etc/keepalived/check_slave.pl 192.168.46.131"
misc_dynamic
}
}
real_server 192.168.46.130 3306 {
weight 1
MISC_CHECK{
misc_path "/etc/keepalived/check_slave.pl 192.168.46.130"
misc_dynamic
}
}
}
}

2,check_slave.pl检测mysql

check_slave.pl是用perl写的一个检测脚本,定时在slave机器上执行showslavestatus\G命令,检查Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master三个值。Slave_IO_Running和Slave_SQL_Running有一个值为No就自动从LVS的realserver列表去掉,不再对外提供服务,如果这两个值为Yes,检查Seconds_Behind_Master大于设定的值也会自动从对外服务机器列表里面去掉。三个值同时满足时又会被加入到服务列表,对外提供服务。这个检测脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/perl -w
use DBI;
use DBD::mysql;
# CONFIG VARIABLES
$SBM = 120;
$db "test";
$host $ARGV[0];
$port = 3306;
$user "root";
$pw "mysql";
# SQL query
$query "show slave status";
$dbh = DBI->connect("DBI:mysql:$db:$host:$port"$user$pw, { RaiseError => 0,PrintError => 0 });
if (!defined($dbh)) {
exit 1;
}
$sqlQuery $dbh->prepare($query);
$sqlQuery->execute;
$Slave_IO_Running =  "";
$Slave_SQL_Running "";
$Seconds_Behind_Master "";
while (my $ref $sqlQuery->fetchrow_hashref()) {
$Slave_IO_Running $ref->{'Slave_IO_Running'};
$Slave_SQL_Running $ref->{'Slave_SQL_Running'};
$Seconds_Behind_Master $ref->{'Seconds_Behind_Master'};
}
$sqlQuery->finish;
$dbh->disconnect();
if $Slave_IO_Running eq "No" || $Slave_SQL_Running eq "No" ) {
exit 1;
else {
if $Seconds_Behind_Master $SBM ) {
exit 1;
else {
exit 0;
}
}

3、安装配置lvs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@test1 ~]# yum install -y ipvsadm
[root@test1 ~]# lsmod  |grep ip_vs
[root@test1 ~]# modprobe  ip_vs
[root@test1 ~]# lsmod  |grep ip_vs
ip_vs                 122241  0
这里不能靠进程来判断是不是加载了ip_vs模块,因为这里就是一个命令,没有产生进程。
vim /etc/init.d/lvsdrrip
#!/bin/bash
#DR server
VIP=192.168.46.100
case "$1" in
start)
echo "start LVS of DR"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
/sbin/route add -host $VIP dev lo:0
echo "1" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
stop)
echo "stop LVS of DR"
/sbin/ifconfig lo:0 down
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" > /proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" > /proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage:$0 {start|stop}"
esac
exit
1

4,test1和test2上安装mysql服务,test1为master,test2为slave

参考http://wolfword.blog.51cto.com/4892126/1290938

5,test3调度器安装lvsdr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@test3 ~]# vim  /etc/init.d/lvsdr
#!/bin/bash
VIP=192.168.46.100
RIP1=192.168.46.131
RIP2=192.168.46.130
case "$1" in
start)
echo "start LVS of DirectorServer DR"
/sbin/iptables -F
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 $VIP broadcast $VIP  netmask 255.255.255.0  up
/sbin/ipvsadm  -A -t $VIP:3306  -s rr
/sbin/ipvsadm  -a -t $VIP:3306  -r  $RIP1 -g
/sbin/ipvsadm  -a -t $VIP:3306  -r  $RIP2 -g
/sbin/ipvsadm
;;
stop)
echo "stop  LVS of DirectorServer DR"
echo "0" >/proc/sys/net/ipv4/ip_forward
/sbin/ipvsadm -C
/sbin/ifconfig eth0:0 down
;;
*)
[root@test3  ~]#chown +x /etc/init.d/lvsdr

from: http://wolfword.blog.51cto.com/4892126/1290938
http://wolfword.blog.51cto.com/4892126/1291868

mysql dba系统学习(18)mysql主从复制的实现 mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡相关推荐

  1. mysql dba系统学习(19)配置mysql+lvs+keeplived实现Mysql读操作的负载均衡

    配置mysql+lvs+keeplived实现Mysql读操作的负载均衡 环境: test1192.168.46.131master test2192.168.46.130slave备份test库 t ...

  2. java毕业设计网络学习平台源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计网络学习平台源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计网络学习平台源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技术栈: 项目 ...

  3. docker学习系列14 使用haproxy实现mysql集群的负载均衡...

    在上节中我们创建了 mysql 集群. 实际工作中,我们不希望让某一数据库节点处理所有的请求,这样的话单个负载高,性能差. image.png 在这里我们使用haproxy作为负载均衡的中间件,类似的 ...

  4. redis深度系统学习三:主从复制的原理与注意事项

    前言 在前面的两篇文章中,分别介绍了Redis的内存模型和Redis的持久化. 在Redis的持久化中曾提到,Redis高可用的方案包括持久化.主从复制(及读写分离).哨兵和集群.其中持久化侧重解决的 ...

  5. 网易MySQL中间件的负载均衡策略及性能优化

    来自:DBAplus社群 团队介绍 网易乐得DBA组,负责网易乐得电商.网易邮箱.网易技术部数据库日常运维,负责数据库私有云平台的开发和维护,负责数据库及数据库中间件Cetus的开发和测试等等. 一. ...

  6. mysql 中间点策略_网易MySQL中间件的负载均衡策略及性能优化

    团队介绍 网易乐得DBA组,负责网易乐得电商.网易邮箱.网易技术部数据库日常运维,负责数据库私有云平台的开发和维护,负责数据库及数据库中间件Cetus的开发和测试等等. 一.背景 随着业务的爆发式增长 ...

  7. OneProxy实现MySQL读写分离与负载均衡

    Part1:写在最前 OneProxy平民软件完全自主开发的分布式数据访问层,帮助用户在MySQL/PostgreSQL集群上快速搭建支持分库分表的分布式数据库中间件,也是一款具有SQL白名单(防SQ ...

  8. oneproxy mysql_在OneProxy的基础上实行MySQL读写分离与负载均衡

    简介 Part1:写在最前 OneProxy平民软件完全自主开发的分布式数据访问层,帮助用户在MySQL/PostgreSQL集群上快速搭建支持分库分表的分布式数据库中间件,也是一款具有SQL白名单( ...

  9. 双机高可用、负载均衡、MySQL(读写分离、主从自动切换)架构设计

    前几天网友来信说帮忙实现这样一个架构:只有两台机器,需要实现其中一台死机之后另一台能接管这台机器的服务,并且在两台机器正常服务时,两台机器都能用上.于是设计了如下的架构. 架构简介 此架构主要是由ke ...

最新文章

  1. python连接excel存放数据_有了这篇python操作Excel学习笔记,以后储存数据 办公很轻松!...
  2. 云计算模型 - 1. 概述
  3. 【转】ionic run android 成功launch success,但是genymotion虚拟机没有显示
  4. React Router 使用教程
  5. 工控设备 如何将数据发送到串口_实现4G无线通信透传的远程通信多组网5个PLC相互交换数据...
  6. Redis发布与订阅——PUBLISH SUBSCRIBE
  7. 关于JavaScript系列的自学,该怎么学比较好?
  8. c语言几个字符串排序,请教多个字符串排序(不用数组)
  9. linux系统开机图片修改,linux开机logo 和 android开机logo 的修改
  10. 产品经理面试技巧及常见问题
  11. rational rose mysql_用Rational Rose逆向工程(java)生成类图(教程和错误解决)
  12. 解决word标题样式错乱
  13. ASP.net和ASP的区别
  14. THUSC2021游记
  15. win10创建新的计算机用户名和密码,win10电脑怎么新建用户?高手教你在win10新建用户的方法...
  16. linux(centos) 保存退出vi编辑
  17. 2019各大互联网公司校园招聘流程
  18. Qt开发技术:Qt的动态静态插件框架介绍和Demo
  19. java 累加器_Spark累加器(Accumulator)
  20. Scratch3.0——助力新进程序员理解程序(案例八、等差数列计算1)

热门文章

  1. AI模型变身文豪:“看懂”新闻报道,命名图片更有文采
  2. 三天竟然爆发两起大漏洞事件!我们来教你如何跳过以太坊的坑
  3. 中科院罗平演讲全文:自动撰写金融文档如何实现,用 AI 解
  4. 孙剑亲自撰文:我在 Face++ 的这半年
  5. 杨鹏谈世纪佳缘推荐算法:基于Spark GraphX,弃GBDT和LR用FM
  6. 后年将有60亿部手机!
  7. Redis - RedisTemplate及4种序列化方式深入解读
  8. 白话Elasticsearch06- 深度探秘搜索技术之手动控制全文检索结果的精准度
  9. Spring-JDK Timer 以及在Spring(4.0以下)中使用JDK Timer
  10. java抽象和接口的理解_Java接口实现与抽象类的区别理解 | 彬菌