标签:linux运维
Linux运维 第四阶段 (七)MySQL REPLICATION(主从复制、半同步复制、复制过滤)
一、MySQL Replication相关概念:
1、复制的作用:辅助实现备份;高可用HA;异地容灾;分摊负载(scaleout);rw-spliting(mysql proxy工作在应用层)。
2、master有多个CPU允许事务并行执行,但往二进制日志文件只能一条条写;slave比master要慢;master-slave默认异步方式传送。
3、半同步:仅负责最近一台slave同步成功,其它的slave不管,5.5之前不支持半同步,半同步应指定timeout间隔,若超时则降级为异步模式继续工作。
4、slave-server本身可以写操作,但在master-slave架构中不允许slave写,因为它无法同步至其它server。
5、slave可向master做冷备份。
6、master的二进制日志文件和slave上的中继日志文件在文件大小和个数上都不会一样,还原只能用master的二进制日志文件,不能使用中继日志文件。
7、本地一定要有中继日志和二进制日志;slave-side只要不做多级复制,可不要二进制日志文件;多级复制可减轻master复制压力;slave-side存储引擎可用blackhole。
8、master-side若宕掉,可将slave-side提升为master(执行二进制日志),从而实现高可用。
slave-side,IO_thread用于从主端接收dump_thread发来的二进制日志语句然后保存为本地的中继日志,SQL_thread读中继日志转为数据文件成功后再保存二进制日志。
9、server-id避免循环复制。
10、双主无法减轻写操作。
11、主从架构中,不使用mysql-proxy,如何让master写,slave读:让程序(PHP开发出的程序)自身具有读写分离的功能;双主模型。
12、生产环境下不建议使用双主模型。
13、双主模型产生的问题:两人同时更改同一表的不同字段或插入数据,提交后可能会导致数据库崩溃或出现非常规错误。
14、数据库server压力大时,两种方案:scaleout;scale on
15、scale out:根据业务分库,每个业务涉及到的库放到一个物理服务器上(垂直拆分),但数据有热区,例如,100G的数据,仅1个G很BUSY,其它很闲,而这1G的数据在一个表里;拆表(水平拆分),rid(row id)。
注:能不拆则不拆否则后续问题很难排查。
16、一个从只能有一个主,一主可以有多从。
17、读写分离:mysql-proxy、amoeba(java),配置文件xml格式
18、coba(amoeba):数据拆分。
19、复制线程:master-side(dump)、slave-side(IO_thread、SQL_thread)
20、默认情况下MySQL的复制是异步的,Master上所有的更新操作写入Binlog之后并不确保所有的更新都被复制到Slave之上。异步操作虽然效率高,但是在Master/Slave出现问题的时候,存在很高数据不同步的风险,甚至可能丢失数据。
21、MySQL5.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_THREAD和SQL_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_THREAD和SQL_THREAD是否为ON状态)
>STOP SLAVE IO_THREAD; (master上数据若有问题时,可将slave-side的IO_THREAD停掉)
slave-side重启mysqld,IO_THREAD和SQL_THREAD会自动启动,数据目录下/mydata/data/relay-log.info和master.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_clients和Rpl_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运维
原文地址:http://jowin.blog.51cto.com/10090021/1690086