/ 中存储网

MySQL5.5数据库的一主多从配置

2014-07-13 15:46:03 来源:中存储网

首先,保证主从库的数据库已经安装好,并且版本一致,然后可以开始配置了。

假如我们要同步的数据库叫 homework,在主从库上分别导入homework的数据库文件,可以包含数据,我们用mysql命令导入homework.sql。

grant replication slave on *.* to 'salve'@'10.129.63.203' identified by 'xxx!@#';

grant replication slave on *.* to 'salve'@'10.129.81.111' identified by 'xxx!@#';

2.修改主库的配置文件my.cnf

vim /etc/my.cnf

已经开启的选项,要保证有哦:

log-bin=mysql-bin #主库的bin-log记录,一定要开启,从库会从此文件做数据同步。

Mysql5.5主从架构安装-一主多从配置 - codygao - 高二鹏的技术博客-关注互联网技术

(最终安装好后可以在主库看到,两个从库通过Binlog Dump的方式来同步数据)

server-id       = 1 #主库的id,默认就好

要打开的选项:

binlog-do-db=homeWorkDB #要同步的数据库,多个的话,按这个格式依次取就好了

binlog-ignore-db=mysql #不希望同步的数据库,mysql是系统数据库,就不要同步了

innodb_flush_log_at_trx_commit=0 #1表示每次提交事务是都flush数据到硬盘,0表示每秒从buffer flush到硬盘一次,1和2每次事务都会写入,1写入文件系统,2写入文件系统缓冲区,0最安全,1的话,普通硬盘效率会很低,raid硬盘的话,差别不大

sync_binlog=0 #0表示多个binlog操作合并后从buffer flush到硬盘,1表示每次事务都从buffer flush到硬盘

为追求性能可以设置成:

innodb_flush_log_at_trx_commit=2

sync_binlog=0

更安全的配置是:

innodb_flush_log_at_trx_commit=1

sync_binlog=1

陷阱(有两种配置情况可能导致主从数据不一致

sync_binlog=1 innodb_flush_log_at_tx_commit=0

当commit时数据写到binlog当时并没有写到redolog 时 系统crash。此时从库已经拿到binglog进行数据重做,但是主库重启后会回滚该事务,此时导致主从数据不一致.

sync_binlog=1 innodb_flush_log_at_tx_commit=2

此时binglog刷盘并在从库重做,但是主库的redolog 只是写到log中,但是写没有刷盘,所以还是主库没有执行事务,但是从库执行了事务导致数据不一致。)

配置好后重启mysql

/etc/init.d/mysqld restart

,登录mysql,查看master状态:

show master status;

Mysql5.5主从架构安装-一主多从配置 - codygao - 高二鹏的技术博客-关注互联网技术

配置slave服务器1:

1.修改my.cnf配置文件

#log-bin=mysql-bin #从库可关闭binlog,除非是多主多从需要开启

server-id       = 2

陷阱(#master-host、#master-user 等选项,在mysql5.5中都已经去掉,开启的话会导致启动mysql失败)

relay-log-index=slave-relay-bin.index

relay-log=slave-relay-bin

replicate-do-db=homework #要同步的数据库,不写表示复制所有库,还是写上吧

2.修改后重启mysql,并登录mysql

/etc/init.d/mysqld restart

登录进去之后,执行

change master to master_host='10.129.63.234',master_user='salve',master_password='xxx!@#',master_log_file='mysql-bin.000006',master_log_pos=107;

红字部分请在主库上执行show master status;即可看到要同步的log文件和当前同步到的位置。

之后执行

show slave statusG;

看到

             Slave_IO_Running: Connecting

            Slave_SQL_Running: Yes

表示同步已经ok了。

若失败的话,看err的log日志,再找解决办法,实在不行执行

flush slave,保证主从库数据一致后,重新配置从库。

执行slave start;

配置slave服务器2:

另外一个从库执行同样的步骤,只是修改下server-id即可

server-id       = 3

然后就完成了,去主库插入一条记录,看看从库是不是可以自动更新。

其他相关操作:

数据不同步时,执行:

slave stop;

set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

slave start;

从库同步失败的时候:

flush slave;

这样 

show slave status;

从库的所有状态都已经清除掉了,可以手动恢复数据一致后重新配置从库。