MySQL+keepalived MASTER到MASTER的主主互备,主从互备和故障时自动切换的配置

Mysql复制概述:
MySQL支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。

复制实现细节:
MySQL使用3个线程来执行复制功能(其中1个在主服务器上,另两个在从服务器上)。当发出START SLAVE时,从服务器创建一个I/O线程,以连接主服务器并让它发送记录在其二进制日志中的语句。主服务器创建一个线程将二进制日志中的内容发送到从服务器。该线程可以即为主服务器上SHOW PROCESSLIST的输出中的Binlog Dump线程。从服务器I/O线程读取主服务器Binlog Dump线程发送的内容并将该数据拷贝到从服务器数据目录中的本地文件中,即中继日志。第3个线程是SQL线程,由从服务器创建,用于读取中继日志并执行日志中包含的更新。在从服务器上,读取和执行更新语句被分成两个独立的任务。当从服务器启动时,其I/O线程可以很快地从主服务器索取所有二进制日志内容,即使SQL线程执行更新的远远滞后。

请注意当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否则,你必须要小心,以避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
单向复制有利于健壮性、速度和系统管理:
· 主服务器/从服务器设置增加了健壮性。主服务器出现问题时,你可以切换到从服务器作为份。
· 通过在主服务器和从服务器之间切分处理客户查询的负荷,可以得到更好的客户响应时间。SELECT查询可以发送到从服务器以降低主服务器的查询处理负荷。但修改数据的语句仍然应发送到主服务器,以便主服务器和从服务器保持同步。如果非更新查询为主,该负载均衡策略很有效,但一般是更新查询。
· 使用复制的另一个好处是可以使用一个从服务器执行备份,而不会干扰主服务器。在备份过程中主服务器可以继续处理更新。
MySQL 提供了数据库的同步功能,这对我们实现数据库的冗灾、备份、恢复、负载均衡等都是有极大帮助的

MYSQL数据库没有增量备份的机制,所以如果面对比较大的数据量,并且需要时时更新时,我们可以利用mysql提供的replication机制来间接实现增量备份功能。Replication是一种异步复制过程。

Mysql的AB复制方式大致分为4种:常规的一主一从模式、双主模式、一主多从模式、多主多从模式等,可以根据实际情况来搭建环境。本文采用最常规的一主一从的模式。

Mysql的AB复制功能在版本上需要注意,MYSQL的版本都要高于3.2,还有一个基本的原则就是作为从数据库的数据库版本可以高于主服务器数据库的版本,但是不可以低于主服务器的数据库版本。

通过Mysql自身的replication 实现不同机器上多个数据库的同步整体性能此方案将会降低MYSQL 1%左右的性能,可用性及数据安全性将大有提高,同时服务器的切换对终端使用者是透明的,终端应用不需要进行更改。

MySQL的主主复制实际上就是双向的主从复制。

说明:由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,

因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,
Master的版本肯定不能高于Slave版本。(版本向下兼容)

MYSQL主从同步的作用
(1) 数据分布
(2) 负载平衡(load balancing)
(3) 备份
(4) 高可用性(high availability)和容错
MYSQL主从同步的原理
关于MYSQL的主从同步,最主要的是要了解MYSQL的主从同步是如何工作的也即主从同步的原理,通过下图能很明白的指导其工作的过程:

2609273034124649326

MySql复制的过程:
1.主(master)服务器把数据更改的记录或者事件记录到二进制日志里。
2.从(slave)服务器把主服务器的二进制日志复制到自己的中继日志里。
3.从(slave)服务器根据中继日志的内容应用到自己的数据上。

0R5521342-0

环境描述
主1:192.168.122.151 mysql1
主2:192.168.122.152 mysql2
从1:192.168.122.153 mysql3
vip(Virtual IP) :192.168.122.160

一. mysql配置
主服务器ip: 192.168.122.151
[root@mysql1 ~]# service iptables stop
[root@mysql1 ~]# yum -y install mysql-server mysql
[root@mysql1 ~]# service mysqld start
[root@mysql1 ~]# mysqladmin -uroot password '123456'
[root@mysql1 ~]# mysql -uroot -p123456
授权用户
mysql> grant replication slave,file on *.* to 'mysql1'@'192.168.122.152' identified by '123456';
mysql> grant all privileges on *.* to 'mysqlvip'@'%' identified by '123456';
mysql> create database dz;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dz |
| mysql |
| test |
+--------------------+

mysql> flush privileges;
mysql> quit
[root@mysql1 ~]# service mysqld stop
编辑配置文件/etc/my.cnf 加入以下内容
[root@mysql1 ~]# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1

#添加以下内容
log-bin=mysql-bin						// 启动二进制日志系统,显式的指定二进制日志的文件名
server-id=1								// 本机数据库ID,另一台为2,其中master_id必须为1到232–1之间的一个正整数值
binlog-do-db=test						// 需要记录二进制日志的数据库.如果有多个数据库可用逗号分隔(用逗号分隔经测试无效),或者使用多个binlog-do-db选项,不写全部都备份
binlog-do-db=dz							// 二进制同步的数据库名
binlog-ignore-db=mysql					// 避免同步mysql用户配置,以免不必要的麻烦,不需要记录进制日志的数据库.如果有多个数据库可用逗号分隔(用逗号分隔经测试无效),或者使用多个binlog-ignore-db选项
replicate-do-db=test					// 需要进行同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-do-db选项
replicate-do-db=dz						// 同步数据库名称
replicate-ignore-db=mysql				// 屏蔽对mysql库的同步,不需要同步的数据库.如果有多个数据库可用逗号分隔,或者使用多个replicate-ignore-db选项
log-slave-updates						// 把更新的记录写到二进制文件中
slave-skip-errors=all					// 过滤掉一些没啥大问题的错误,如果不加这个,出现任何错误同步进程会终止
#同步参数:
#保证slave挂在任何一台master上都会接收到另一个master的写入信息
#log-slave-updates
sync_binlog=1							// 设为1就是把MySql每次发生的修改和事件的日志即时同步到硬盘上
auto_increment_increment=2				// 每次增长2
auto_increment_offset=1					// 设置自动增长的字段的偏移量,即初始值为1,另一台改为2
#end
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

注:二者都只有server-id不同和 auto-increment-offset不同
auto-increment-increment的值应设为整个结构中服务器的总数,本案例用到两
台服务器,所以值设为2。

[root@mysql1 ~]# service mysqld restart
[root@mysql1 ~]# chkconfig mysqld on
[root@mysql1 ~]# mysql -uroot -p123456
mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | test,dz | mysql |
+------------------+----------+--------------+------------------+

主服务器2ip: 192.168.122.152
[root@mysql1 ~]# service iptables stop
[root@mysql2 ~]# yum install mysql-server mysql
[root@mysql2 ~]# service mysqld start
[root@mysql2 ~]# mysqladmin -uroot password '123456'
[root@mysql2 ~]# mysql -uroot -p123456
授权用户
mysql> grant replication slave,file on *.* to 'mysql2'@'192.168.122.151' identified by '123456';
mysql> grant all privileges on *.* to 'mysqlvip'@'%' identified by '123456';
mysql> create database dz;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dz |
| mysql |
| test |
+--------------------+
mysql> flush privileges;
mysql> quit

[root@mysql2 ~]# service mysqld stop

[root@mysql2 ~]# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1

###添加以下内容
log-bin=mysql-bin
server-id=2  # 从服务器 ID 号,不要和主 ID 相同   ,
如果设置多个从服务器,每个从服务器必须有一个唯一的server-id值,必须与主服务器的以及其它从服务器的不相同。可以认为server-id值类似于IP地址:这些ID值能唯一识别复制服务器群集中的每个服务器实例。
binlog-do-db=test
binlog-do-db=dz
binlog-ignore-db=mysql
replicate-do-db=test
replicate-do-db=dz
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2
#end
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[root@mysql2 ~]# service mysqld restart
[root@mysql2 ~]# chkconfig mysqld on

[root@mysql2 ~]# mysql -uroot -p123456

mysql> show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 | 98 | test,dz | mysql |
+------------------+----------+--------------+------------------+

主服务器1ip: 192.168.122.151
[root@mysql1 ~]# mysql -uroot -p123456
(锁库表)这里锁表的目的是为了生产环境中不让进新的数据,好让从服务器定位同步位置。初次同步完成后,记得解锁。
mysql> flush tables with read lock\G
// 查看master状态
mysql> show master status\G
用change master 语句指定同步位置
mysql> change master to master_host='192.168.122.152',master_user='mysql2', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=98;
# master_log_file需要在另一台上执行show master status;查看
mysql> start slave;
// 查看slave状态
mysql> show slave status\G
以下两项为yes则成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show processlist \G; 查看当前进程,###在这里看到回显里面有State: Has sent all binlog to slave; waiting for binlog to be updated,说明主主复制基本OK了。###
mysql> unlock tables; // 解锁表(因为之前锁表了,所以这里要解锁)
mysql> quit

主服务器2ip: 192.168.122.152
[root@mysql2 ~]# mysql -uroot -p123456
mysql> flush tables with read lock\G
mysql> show master status\G
mysql> change master to master_host='192.168.122.151', master_user='mysql1', master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=98;
#master_log_filed另一台上执行show master status查看
mysql> start slave;
mysql> show slave status\G
以下两项为yes则成功
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

mysql> unlock tables; // 解锁表(因为之前锁表了,所以这里要解锁)
mysql> quit

二. mysql主主同步测试
1) 主服务器创建表,查看从服务器;
[root@mysql1 ~]# mysql -uroot -p123456
mysql> use test ;
mysql> create table test.yan( id int ,name varchar(10));
mysql> insert into test.yan values (1, 'yan');
mysql> select * from test.yan;
+------+------+
| id | name |
+------+------+
| 1 | yan |
+------+------+
mysql> use dz;
mysql> create table dz.hello( id int ,name varchar(10));
mysql> insert into dz.hello values (1, 'hello');
mysql> select * from dz.hello;
+------+-------+
| id | name |
+------+-------+
| 1 | hello |
+------+-------+

切换到从服务器查看:192.168.1.152
[root@mysql2 ~]# mysql -uroot -p123456
mysql> select * from dz.hello;
+------+-------+
| id | name |
+------+-------+
| 1 | hello |
+------+-------+
mysql> select * from test.yan;
+------+------+
| id | name |
+------+------+
| 1 | yan |
+------+------+

2)从服务器创建表,查看主服务器;
[root@mysql2 ~]# mysql -uroot -p123456
需要任意选择一个数据库,如果不先选择数据库,则在从服务器上修改的数据不会同步到主服务器,在主服务器上测试也一样
mysql> use test ;
mysql> insert into test.yan values (2,'test');
mysql> insert into dz.hello values (2,'dz');
mysql> select * from dz.hello;
+------+-------+
| id | name |
+------+-------+
| 1 | hello |
| 2 | dz |
+------+-------+
mysql> select * from test.yan;
+------+------+
| id | name |
+------+------+
| 1 | yan |
| 2 | test |
+------+------+
mysql> quit

切换到主服务器查看:192.168.1.151
[root@mysql1 ~]# mysql -uroot -p123456
mysql> select * from dz.hello;
+------+-------+
| id | name |
+------+-------+
| 1 | hello |
| 2 | dz |
+------+-------+
mysql> select * from test.yan;
+------+------+
| id | name |
+------+------+
| 1 | yan |
| 2 | test |
+------+------+

3)将要进行复制的数据库打包传到server服务器上
[root@primary mysql]# tar -zcvf /root/db.tar test/ (将要进行复制的test数据库打包)
[root@primary ~]# scp db.tar root@192.168.122.152:/var/lib/mysql/ (将.tar复制到server的/var/lib/mysql/目录)

如果主主同步没有问题了,就可以进入下一个阶段,通过keepalived实现mysql的单点故障。如果有问题,请仔细查看mysql的错误日志,并自己google下。

三.安装keepalived(主从安装相同)

[root@mysql1 ~]# yum -y install keepalived
[root@mysql1 ~]# cd /etc/keepalived/
[root@mysql1 keepalived]# mv keepalived.conf keepalived.conf.bak
[root@mysql1 keepalived]# vi keepalived.conf

global_defs {
        router_id Haweb_1
    }

vrrp_sync_group VGM {
	group {
		VI_HA
	}
}

vrrp_script chk_mysql {
	script "killall -0 mysqld"     #检测mysqld进程,也可以替换成检测脚本
	interval 5
}

vrrp_instance VI_HA {
	state MASTER       ###从为BACKUP
	interface eth0
	virtual_router_id 51
	priority 100                ###从为99
	#nopreempt  #不抢占,只在优先级高的机器上设置即可,优先级低的机器不设置
	advert_int 5
	authentication {
		auth_type PASS
		auth_pass 111
	}

	virtual_ipaddress {
		192.168.122.160/24 dev eth0
	}

	track_script {
		chk_mysql        #执行上面的命令
	}
}

[root@mysql1 ~]# /etc/init.d/keepalived restart #主从同时启动
[root@mysql1 ~]# chkconfig keepalived on #开机启动
[root@mysql2 ~]# /etc/init.d/keepalived restart
[root@mysql2 ~]# chkconfig keepalived on #开机启动
[root@mysql1 ~]# ip a
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:d2:24:2f brd ff:ff:ff:ff:ff:ff
inet 192.168.122.151/24 brd 192.168.10.255 scope global eth0
inet 192.168.122.160/24 scope global secondary eth0

[root@mysql2 keepalived]# ip a
1: lo: mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
2: eth0: mtu 1500 qdisc pfifo_fast qlen000
link/ether 00:0c:29:1a:1c:1b brd ff:ff:ff:ff:ff:ff
inet 192.168.122.152/24 brd 192.168.10.255 scope global eth0

如果在其中一台机子上看到了VIP 192.168.122.160,且在局域网内能ping通,能连上,说明ok了!

四.keepalived测试
使用mysql -umysqlvip -h 192.168.122.160 -p123456 登陆
1).停止主服务器keepalived,检查VIP是否切换到从服务器;
重启主服务器keepalived,VIP再次由主服务器接管;
2).停止主服务器mysql,检查VIP是否切换到从服务器;
重启主服务器mysql,VIP再次由主服务器接管;

五、从机设置
从服务器1ip: 192.168.122.153
[root@mysql1 ~]# service iptables stop
[root@mysql2 ~]# yum install mysql-server mysql
[root@mysql2 ~]# service mysqld start
[root@mysql2 ~]# mysqladmin -uroot password '123456'
[root@mysql2 ~]# mysql -uroot -p123456
授权用户
分别在主机192.168.122.151和192.168.122.152上给从机授权
mysql> grant replication slave,file on *.* to 'mysql3'@'192.168.122.153' identified by '123456';
在从机192.168.122.153上授权
mysql> grant all privileges on *.* to 'mysqlvip'@'%' identified by '123456';
mysql> create database dz;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| dz |
| mysql |
| test |
+--------------------+
mysql> flush privileges;
mysql> quit

[root@mysql2 ~]# service mysqld stop

[root@mysql2 ~]# vi /etc/my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
old_passwords=1

###添加以下内容
server-id=11
master-host=192.168.122.151 # 如果填写虚拟ip:192.168.122.160,但考虑到两主之间的master_log_file和master_log_pos不一样,会造成同步失败,所以直接固定同步某一主机,经测试如果填虚拟IP,发生故障切换后,同步失败
master-user=mysql3
master-password=123456
master-port=3306
master-connect-retry=60 # 表示如果主服务器中断,从服务器重新连接的时间差
replicate-do-db=dz # 同步的数据库,不写本行 表示 同步所有数据库
replicate-do-db=test
read_only=1 # 对所有的非临时表进行只读控制。但是有两种情况例外:1. 对replication threads例外,以保证slave能够正常的进行replication。2.对于拥有super权限的用户,可以ignore这个选项。
#end
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

[root@mysql2 ~]# service mysqld restart
[root@mysql2 ~]# chkconfig mysqld on

[root@mysql2 ~]# mysql -uroot -p123456

mysql>start slave;
mysql>show slave status\G;

如果Slave_IO_Running、Slave_SQL_Running状态为Yes则表明设置成功。

六、测试主从服务器是否能同步
在主服务器192.168.1.122.151上面新建一个表,必须在dz或test数据库下

mysql> use test
Database changed
mysql> create table test(id int,name char(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test values(1,'zaq');
Query OK, 1 row affected (0.00 sec)
mysql> insert into test values(1,'xsw');
Query OK, 1 row affected (0.00 sec)
mysql> select * from test;
+——+——+
| id | name |
+——-+——+
| 1 | zaq |
| 1 | xsw |
+——-+——+
2 rows in set (0.00 sec)

在从服务器查看是否同步过来
mysql> use test;
Database changed
mysql> select * from test;
+------+------+
| id | name |
+------+------+
| 1 | zaq |
| 1 | xsw |
+------+------+
2 rows in set (0.00 sec)

说明已经配置成功。
在主服务器192.168.1.122.152上也进行同样的测试,如果也能同步,则说明配置成功

主从设置参考资料:
centos下MySQL主从同步配置:http://www.cnblogs.com/phpnow/archive/2012/06/23/2559198.html
CentOS下Mysql实现数据库主从同步:http://blog.csdn.net/lfw802250/article/details/4804349

注意事项
如果不正常,从以下几点查找原因。
分别用"show master status\G"及"show slave status\G"来查看参数及状态。
注意用户mysql1、mysql2是否可远程登录mysql。可通过查看数据库mysql中数据表user中的的"Host"字段是否为%,%表示可远程登录。
注意防火墙,是否开放了3306端口。

可能出现的问题
1、Slave_IO_Running: No
现象:运行命令show slave status\G,发现Slave_IO_Running: No
解决方案:可能有四种情况,一个是网络有问题,连接不上,像有一次我用虚拟机搭建replication,使用了nat的网络结构,就是死都连不上,第二个是有可能my.cnf有问题,配置文件怎么写就不说了,网上太多了,第三个是授权的问题,replication slave和file权限是必须的。如果不怕死就all咯。。

一旦io为no了先看err日志,看看爆什么错,很可能是网络,也有可能是包太大收不了,这个时候主备上改max_allowed_packet这个参数。
最后一个是slave上没有权限读master上的数据。

2、Slave_SQL_Running: No
现象:运行命令show slave status\G,发现Slave_SQL_Running: No 解决方案:有两种可能,一种是slave机器上这个表中出现了其他的写操作,就是程序写了,这个是会有问题的,还有一种占绝大多数可能的是slave进程重启,事务回滚造成的,这也是mysql的一种自我保护的措施,像关键时候只读一样。

这个时候想恢复的话,只要停掉slave,set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;再开一下slave就可以了,这个全局变量赋值为N的意思是:

This statement skips the next N events from the master. This is useful for recovering from replication stops caused by a statement.

This statement is valid only when the slave thread is not running. Otherwise, it produces an error.

3、多主自增长ID重复
解决方案:我们只要保证两台服务器上插入的自增长数据不同就可以了
如:A查奇数ID,B插偶数ID,当然如果服务器多的话,你可以定义算法,只要不同就可以了
在这里我们在A,B上加入参数,以实现奇偶插入
A:my.ini上加入参数
auto_increment_offset = 1
auto_increment_increment = 2
这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了

B:my.ini上加入参数
auto_increment_offset = 2
auto_increment_increment = 2
这样B的auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了

可以看出,你的auto_increment字段在不同的服务器之间绝对不会重复,所以Master-Master结构就没有任何问题了。当然,你还可以使用3台,4台,或者N台服务器,只要保证auto_increment_increment = N 再设置一下auto_increment_offset为适当的初始值就可以了,那样,我们的MySQL可以同时有几十台主服务器,而不会出现自增长ID重复。

4、主从同步报错unknown variable 'master-host=192.168.8.111'
Mysql版本从5.1.7以后开始就不支持“master-host”类似的参数
在从库上执行如下命令;
change master to master_host='masterIP', master_user='slave', master_password='slvaePASS';

slave start;

切记:
此处是masterIP地址,不是slave地址,而登陆账号为slave账号密码
经验分享:
(参考:MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践:http://heylinux.com/archives/1004.html)
1.当MySQL主从复制在 show slave status\G 时出现Slave_IO_Running或Slave_SQL_Running 的值不为YES时,需要首先通过 stop slave 来停止从服务器,然后再执行一次本文 2.1与2.2 章节中的步骤即可恢复,但如果想尽可能的同步更多的数据,可以在Slave上将master_log_pos节点的值在之前同步失效的值的基础上增大一些,然后反复测试,直到同步OK。因为MySQL主从复制的原理其实就是从服务器读取主服务器的binlog,然后根据binlog的记录来更新数据库。

2.MySQL-Proxy的rw-splitting.lua脚本在网上有很多版本,但是最准确无误的版本仍然是源码包中所附带的lib/rw-splitting.lua脚本,如果有lua脚本编程基础的话,可以在这个脚本的基础上再进行优化;

3.MySQL-Proxy实际上非常不稳定,在高并发或有错误连接的情况下,进程很容易自动关闭,因此打开--keepalive参数让进程自动恢复是个比较好的办法,但还是不能从根本上解决问题,因此通常最稳妥的做法是在每个从服务器上安装一个MySQL-Proxy供自身使用,虽然比较低效但却能保证稳定性;

4.一主多从的架构并不是最好的架构,通常比较优的做法是通过程序代码和中间件等方面,来规划,比如设置对表数据的自增id值差异增长等方式来实现两个或多个主服务器,但一定要注意保证好这些主服务器数据的完整性,否则效果会比多个一主多从的架构还要差;

5.MySQL-Cluster 的稳定性也不是太好;

6.Amoeba for MySQL 是一款优秀的中间件软件,同样可以实现读写分离,负载均衡等功能,并且稳定性要大大超过MySQL-Proxy,建议大家用来替代MySQL-Proxy,甚至MySQL-Cluster。

以下参考:(MySql主从复制(Master-Slave):http://www.litvip.com/291/)
7、★:有人肯定要疑问了,为什么在从(Slave)服务器的配置里没有从主服务器复制的账户等相关信息?
回答:直接把这些的信息写到配置文件是没有好处的,根据一些高手的经验,还可以能出不可以预知的错误,因此我们将在下一步启动复制的时候,
在MySql命令行里执行命令来指定这些信息,这样做还有一个很大的好处,在我们要变换主服务器的时候不需要重启MySql。

8、★:关于过滤复制对象的问题,但是如果不是特殊需要,不要使用复制过滤,因为同样有几率在一些事件触发的时候导致一些错误。介绍几种过滤参数。
binlog_do_db 只复制指定的数据库(主服务器配置文件里设置)
binlog_ignore_db 不复制指定的数据库(主服务器配置文件里设置)
replicate_ignore_table 不复制指定的表(从服务器配置文件里设置)
replicate_wild_ignore_table 使用wild匹配来不复制的指定表(从服务器配置文件里设置),比如参数设为abc.%,表示不复制abc的所有表。

9、★:因为我们是新装的MySql服务器,所以接下来我们就可以开启复制了,如果你是给已经有大量数据的MySql服务器添加从(Slave)服务器,那么先从主(Master)服务器把数据导入到从(Slave)服务器里,让2者的数据一致,然后再开启复制。最简单的方法就是关闭主服务器MySql的写入,用mysqldump工具导出所有主(Master)服务器数据并上传到从(Slave)服务器:

10、★:有人觉得,数据分别保存在2个机器里,就认为备份不需要了,千万别这么想,只能说有助于备份,绝对不能替代备份。

参考资料:
mysql+keepalived:http://www.ealook.com/2013/?p=90
mysql高可用探究(二)Lvs+Keepalived+Mysql单点写入主主同步高可用方案:http://blog.chinaunix.net/uid-20639775-id-3337448.html
MYSQL 的 MASTER到MASTER的主主循环同步:http://blog.csdn.net/yueliangdao0608/article/details/3173231
MySQL_主从,主主同步:http://wenku.baidu.com/view/a3490725bd64783e09122bf2.html
mysql配置文件my.cnf详解[部分]:http://wenku.baidu.com/view/a3490725bd64783e09122bf2.html
Mysql一主多从和读写分离配置简记:http://blog.csdn.net/chenjie19891104/article/details/7616665

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据