当前位置:Gxlcms > 数据库问题 > 第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

时间:2021-07-01 10:21:17 帮助过:70人阅读

运维 第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

一、MySQL Replication相关概念:

1、复制的作用:辅助实现备份;高可用HA;异地容灾;分摊负载(scaleout)rw-spliting(mysql proxy工作在应用层)

2master有多个CPU允许事务并行执行,但往二进制日志文件只能一条条写;slavemaster要慢;master-slave默认异步方式传送。

3、半同步:仅负责最近一台slave同步成功,其它的slave不管,5.5之前不支持半同步,半同步应指定timeout间隔,若超时则降级为异步模式继续工作。

4slave-server本身可以写操作,但在master-slave架构中不允许slave写,因为它无法同步至其它server

5slave可向master做冷备份。

6master的二进制日志文件和slave上的中继日志文件在文件大小和个数上都不会一样,还原只能用master的二进制日志文件,不能使用中继日志文件。

7、本地一定要有中继日志和二进制日志;slave-side只要不做多级复制,可不要二进制日志文件;多级复制可减轻master复制压力;slave-side存储引擎可用blackhole

8master-side若宕掉,可将slave-side提升为master(执行二进制日志),从而实现高可用。

slave-sideIO_thread用于从主端接收dump_thread发来的二进制日志语句然后保存为本地的中继日志,SQL_thread读中继日志转为数据文件成功后再保存二进制日志。

9server-id避免循环复制。

10、双主无法减轻写操作。

11、主从架构中,不使用mysql-proxy,如何让master写,slave读:让程序(PHP开发出的程序)自身具有读写分离的功能;双主模型。

12、生产环境下不建议使用双主模型。

13、双主模型产生的问题:两人同时更改同一表的不同字段或插入数据,提交后可能会导致数据库崩溃或出现非常规错误。

14、数据库server压力大时,两种方案:scaleoutscale on

15scale  out:根据业务分库,每个业务涉及到的库放到一个物理服务器上(垂直拆分),但数据有热区,例如,100G的数据,仅1GBUSY,其它很闲,而这1G的数据在一个表里;拆表(水平拆分),rid(row id)

注:能不拆则不拆否则后续问题很难排查。

16、一个从只能有一个主,一主可以有多从。

17、读写分离:mysql-proxyamoeba(java),配置文件xml格式

18coba(amoeba):数据拆分。

19、复制线程:master-side(dump)slave-side(IO_threadSQL_thread)

20默认情况下MySQL的复制是异步的,Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高,但是在Master/Slave出现问题的时候,存在很高数据不同步的风险,甚至可能丢失数据。

21MySQL5.5引入半同步复制功能的目的是为了保证在master出问题的时候,至少有一台Slave的数据是完整的。在超时的情况下也可以临时转入异步复制,保障业务的正常使用,直到一台salve追赶上之后,继续切换到半同步模式。

 

二、主从复制、半同步复制、数据库复制过滤,具体操作:

1、主从复制配置步骤:

 

master-side:

#vi /etc/my.cnf

[mysqld]

log-bin =  master-bin  (开启二进制日志)

log-bin-index  = master-bin.index  (定义二进制日志索引文件)

server-id =  1  (与slave-side不能一样,避免循环复制)

sync_binlog =  1  (此项用于事务安全,设定事务一提交就写入二进制日志文件)

innodb_flush_logs_at_trx_commit  = 1  (每事务同步)

innodb_file_per_table  = 1  (只要支持事务的此项必开,每表一个表空间)

datadir =  /mydata/data

log_format =  mixed

>GRANT REPLICATION  SLAVE  ON *.*  TO  ‘repluser’@’192.168.1.%’  IDENTIFIED BY  ‘repluser’;

>FLUSH PRIVILEGES;

 

slave-side:

#vi /etc/my.cnf

[mysqld]

relay-log =  relay-log

relay-log-index  = relay-log.index

server-id =  11

read_only =  1  slave-side不允许写数据,仅读,但此项对有SUPER权限的用户不生效)

skip_slave_start  = 1  (服务启动不执行同步,待手动开启IO_THREADSQL_THREAD,用于master-side数据出错暂不往slave-side同步,等master-side数据正常,再手动开始同步)

>CHANGE MASTER  TO  MASTER_USER=’repluser’,MASTER_PASSWORD=’repluser’,MASTER_HOST=’192.168.1.222’,MASTER_LOG_FILE=’master_bin.000010’,MASTER_LOG_POS=’107’;

>START SLAVE;  (也可分开执行>START  SLAVE IO_THREAD;>START  SLAVE  SQL_THREAD;)若此步出现错误could notinitialization master info structure...执行>RESET  SLAVE;再重新执行>CHANGE  MASTER TO那条语句即可。

>SHOW SLAVE  STATUS\G  (查看IO_THREADSQL_THREAD是否为ON状态)

>STOP SLAVE  IO_THREAD;  master上数据若有问题时,可将slave-sideIO_THREAD停掉)

slave-side重启mysqldIO_THREADSQL_THREAD会自动启动,数据目录下/mydata/data/relay-log.infomaster.info这两个文件是replication的基础和前提,若不想让服务一启动就自动执行复制,可将这两个文件剪切至其它地方,再重新配置slave-side

 

2、配置半同步复制:

#ll /usr/local/mysql/lib/

semisync_master.so  semisync_slave.so  (插件由google提供)

MySQL在加载并开启Semi-sync插件后,每一个事务需等待备库接收日志后才返回给客户端。如果做的是小事务,两台主机的延迟又较小,则Semi-sync可以实现在性能很小损失的情况下的零数据丢失。 

 

master-side:

>INSTALL PLUGIN  rpl_semi_sync_master  SONAME ‘semisync_master.so’;

>SHOW GLOBAL  VARIABLES  LIKE  ‘%rpl_semi%’;

rpl_semi_sync_master_enabled  设为1

rpl_semi_sync_master_timeout  默认为10S  (如果主备网络故障或者备库挂了,主库在事务提交后等待10,无响应则自动转为异步状态)

>SET GLOBAL rpl_semi_sync_master_enabled=1;  (仅当前生效,可写入配置文件)

 

slave_side:

>INSTALL PLUGIN  rpl_semi_sync_slave  SONAME ‘semisync_slave.so’;

>SHOW GLOBAL  VARIABLES  LIKE  ‘%rpl_semi%’;

>SET GLOBAL rpl_semi_sync_slave_enabled=1;

>STOP SLAVE;

>START SLAVE;

 

master-side:

>SHOW GLOBAL  STATUS  LIKE  ‘%rpl%’;

Rpl_semi_sync_master_clientsRpl_semi_sync_master_status要为打开状态,半同步复制才配置成功

 

slave-side:

>SHOW SLAVE  STATUS\G

查看Seconds_Behind_Master

 

3、数据库复制过滤:

master-side:

binlog-do-db  = DB_name(白名单,仅将指定某数据库的操作记入二进制日志)

binlog-ignore-db  = DB_name(黑名单,不记录某数据库的操作到二进制日志)

注:不建议在master-side操作,否则二进制日志不完整。

slave-side:

replicate-do-db  = DB_name

replicate-ignore-db  = DB_name

replicate-do-table  = TABLE_name

replicate-ignore-table  = TABLE_name

replicate-wild-do-table  = TABLE_name  (支持通配符%_

replicate-wild-ignore-table  = TABLE_name

 

举例:在slave-side:

#vim /etc/my.cnf

[mysqld]

添加replicate-do-db  =  test1

replicate-ignore-db  = test2

#service mysqld  restart

>SHOW SLAVE  STATUS\G  (查看如下两项)

Replicate_Do_DB: test1

Replicate_Ignore_DB: test2

 

 

 

本篇是学习《马哥网络视频》做的笔记。

 


本文出自 “Linux运维重难点学习笔记” 博客,谢绝转载!

第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)

标签:linux运维

人气教程排行