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

[经验分享] mysql数据库主从同步之双主配置----互为主从

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-6-23 09:46:17 | 显示全部楼层 |阅读模式
Mysql数据库复制原理:
整体上来说,复制有3个步骤:   
(1)master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2)slave将master的binary log events拷贝到它的中继日志(relay log);
(3)slave重做中继日志中的事件,将改变反映它自己的数据。
下图描述了复制的过程:
QQ截图20160623094604.png


      该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二进制日志记录这些改变。MySQL将事务串行的写入二进制日 志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
       下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中 继日志。
       SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数 据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
        此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制 过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。


具体配置

环境
MySQL-master1:10.6.1.210
MySQL-master2:10.6.1.211
OS版本:CentOS 6.6
MySQL版本:5.1.73

一、MySQL master-master配置

1.1、修改MySQL配置文件

两台MySQL均如要开启binlog日志功能,开启方法:在MySQL-master1  配置文件/etc/my.cnf

[MySQLd]段中加上
user = mysql
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-bin
server-id = 1
binlog-do-db=test
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates=1     (log-slave-updates也可以)
slave-skip-errors=all
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=1

在MySQL-master2 配置文件/etc/my.cnf

[MySQLd]段中加上
user = mysql
log-bin=mysql-bin
binlog_format=mixed
relay-log=relay-bin
server-id=10
binlog-do-db=test
binlog-ignore-db=mysql
replicate-do-db=test
replicate-ignore-db=mysql
log-slave-updates=1   (log-slave-updates也可以)
slave-skip-errors=all
sync_binlog=1
auto_increment_increment=2
auto_increment_offset=2

将两个配置文件保存,分别重启mysql服务器

讲解几个重要的常用选项:

server_id
值必须为2到232–1之间的一个正整数值。ID值唯一的标识了复制群集中的主从服务器,因此它们必须各不相同。

binlog-do-db=database
是要记录日志的数据库;

同步多个数据库重复设置选项 binlog-do-db=test 和replicate-do-db=test
例如                              
binlog-do-db=test1
replicate-do-db=test1
binlog-do-db=test2
replicate-do-db=test2

binlog-ignore-db
不要记录日志的数据库名,多个数据库中间用逗号(,)隔开;

log-slave-updates=1
这个参数用来配置从服务器的更新是否写入二进制日志,这个选项默认是不打开的,但是,如果这个从服务器B是服务器A的从服务器,同时还作为服务器C的主服务器,那么就需要开发这个选项,这样它的从服务器C才能获得它的二进制日志进行同步操作

sync_binlog=1
  这个参数直接影响mysql的性能和完整性. 在进行n次事务提交以后,Mysql将执行一次fsync之类的磁盘同步指令,同志文件系统将Binlog文件缓存刷新到磁盘。Mysql中默认的设置是sync_binlog=0,即不作任何强制性的磁盘刷新指令,这时性能是最好的,但风险也是最大的。一旦系统Crash,在文件系统缓存中的所有Binlog信息都会丢失


auto_increment_increment=2
auto_increment_offset=1

auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了

auto_increment_increment = 2
auto_increment_offset = 2
auto_increment字段产生的数值是:2, 4, 6, 8, …等偶数ID了

这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。

另外:
master-connect-retry

master-connect-retry这个参数是用来设置在和主服务器连接丢失的时候,重试的时间间隔,默认是60秒

read-only
read-only是用来限制普通用户对从数据库的更新操作,以确保从数据库的安全性,不过如果是超级用户依然可以对从数据库进行更新操作

slave-skip-errors

在复制过程中,由于各种的原因,从服务器可能会遇到执行BINLOG中的SQL出错的情况,在默认情况下,服务器会停止复制进程,不再进行同步,等到用户自行来处理。
Slave-skip-errors的作用就是用来定义复制过程中从服务器可以自动跳过的错误号,当复制过程中遇到定义的错误号,就可以自动跳过,直接执行后面的SQL语句。

skip-slave-start
表示从mysql服务器启动时不启动同步线程,这就要在启动从服务器之后,手工启动同步线程


1.2  做同步之前要保证两个数据库数据一致.

如果主数据库有数据的话。 数据库锁表操作,不让数据再进行写入动作。
mysql> FLUSH TABLES WITH READ LOCK;

用命令mysqldump备份数据库。
在master服务器执行
shell> mysqldump -uroot -p123456 test >test.sql
看主数据库的状态 mysql> show master status;
记录File 和 Position 项的值
注:没有锁定主服务器,这里记录的主服务器二进制日志position值可能会大于做mysqldump时的值,这将导致从服务器丢失在此期间的更新。如果可以保证在此期间主服务器不会出现创建新表的更新,那么丢失的影响不大;否则,将导致从服务器复制线程失败,这时必须在做mysqldump时锁定主服务器。
-----------------------------------------------
从服务器中my.cnf文件中加入选项
skip-slave-start
表示从mysql服务器启动时不启动同步线程,这就要在启动从服务器之后,手工启动同步线程,在mysql> 提示符下面运行“start slave”就可以
保存my.cnf后

执行
shell> mysqladmin -uroot -p123456 create test
shell> mysql -uroot -p123456 test <test.sql

启动从服务器线程
mysql>start slave;
取消主数据库锁定 mysql>UNLOCK TABLES;




1.3、将10.6.1.210设为10.6.1.211的主服务器

在10.6.1.210上新建授权用户
MySQL> grant  replicationclient,replication  slave  on  *.*   to  'repluser'@'10.6.1.211'  identified by  '123456';
Query OK, 0 rows affected (0.00 sec)  

MySQL>flush privileges;
Query OK, 0 rows affected (0.00 sec)

查看Master数据库上的bin文件以及时间点. 登录Master服务器的mysql  后执行:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000015 |     2474 | test         |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

此处,bin文件为mysql-bin.000015,节点为2474。


在10.6.1.211将10.6.1.210设为自己的主服务器

MySQL> change master to master_host='10.6.1.210',master_user=' repluser ',master_password='123456',master_log_file='MySQL-bin.000015',master_log_pos=2474;
Query OK, 0 rows affected (0.05 sec)

红色标注部分为10.6.1.210主机中show master status;命令结果中的file、postion两个值

MySQL> start slave;
Query OK, 0 rows affected (0.00 sec)

MySQL> show slave status/G



Slave_IO_Running:Yes            #IO thread  是否运行
Slave_SQL_Running:Yes         #SQL thread是否运行




1.4、将10.6.1.211设为10.6.1.210的主服务器

在10.6.1.211上新建授权用户
MySQL> grant  replicationclient,replication  slave  on  *.*   to 'repluser'@'10.6.1.210'  identified by  '123456';
Query OK, 0 rows affected (0.00 sec)

MySQL>flush privileges;
Query OK, 0 rows affected (0.00 sec)

查看Master数据库上的bin文件以及时间点. 登录Master服务器的mysql  后执行:
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 |     1476 | test         |                  |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

此处,bin文件为mysql-bin.000004,节点为1476。


在10.6.1.210将10.6.1.211设为自己的主服务器
MySQL> change master to master_host='10.6.1.211',master_user=' repluser ',master_password='123456',master_log_file='MySQL-bin.000004',master_log_pos=1476;
Query OK, 0 rows affected (0.05 sec)   
MySQL> start slave;
Query OK, 0 rows affected (0.00 sec)   
MySQL>
MySQL> show slave status/G



Slave_IO_Running:Yes            #IO thread  是否运行
Slave_SQL_Running:Yes         #SQL thread是否运行



1.5 、其他命令

1.5.1、查看复制进度
需要在主库上运行
mysql>show processlist \G;
1.5.2、主服务器上的相关命令:
show processlist;
show master status
show slave hosts
show {master|binary} logs
show binlog events
purge {master|binary} logs to 'log_name'
purge {master|binary} logs before 'date'
reset master(老版本flush master)
set sql_log_bin={0|1}

1.5.3、从服务器上的相关命令:
slave start
slave stop
slave stop IO_THREAD //此线程把master段的日志写到本地
slave start IO_THREAD
slave stop SQL_THREAD //此线程把写到本地的日志应用于数据库
slave start SQL_THREAD
reset slave
set global sql_slave_skip_counter
load data from master
show slave status(SUPER,REPLICATION CLIENT)
CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,MASTER_USER=, MASTER_PASSWORD= //动态改变master信息
PURGE MASTER [before 'date'] 删除master端已同步过的日志




运维网声明 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.iyunv.com/thread-233961-1-1.html 上篇帖子: mysql主从复制 下篇帖子: mysqlfabric如何使用 数据库 mysql
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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