复制的作用:
辅助实现备份 高可用 异地容灾 scale out:分摊负载在复制当中server-id很重要 主从架构中,不使用MySQL代理,如何让主的负责写,从的负责读?1、使用前端开发程序来控制读写分离(增加了开发难度)2、双主模型(对于读操作可以分担负载,对于写操作没有分担负载)读写分离: mysql-proxy amoeba数据拆分: cobar: 一个从服务器只能属于一个主服务器MySQL 5.5: 复制功能实现很简单MySQL 5.6: gtid(更安全), multi-thread replication(多线程复制)配置MySQL复制基本步骤:一、master1、启用二进制日志log-bin = master-binlog-bin-index = master-bin.index2、选择一个惟一server-idserver-id = {0-2^32}3、创建具有复制权限的用户REPLICATION SLAVEREPLICATION CLIENT二、slave1、启用中继日志relay-log = relay-logrelay-log-index = 2、选择一个惟一的server-idserver-id = {0-2^32}3、连接至主服务器,并开始复制数据; mysql> CHANGER MASTER TO MASTER_HOST='',MASTER_PORT='',MASTER_LOG_FILE='',MASTER_LOG_POS='',MASTER_USER='',MASTER_PASSWORD=''; mysql> START SLAVE; mysql> START SLAVE IO_Thread; mysql> START SLAVE SQL_Thread; 复制线程: master: dump slave: IO_Thread, SQL_Thread read-only = YES 在从服务器上设定,但对具有SUPER权限的用户不生效;(完成后重启服务,复制线程也会启动)sync-binlog = ON 在主服务器上设定,用于事务安全; 1、从服务器能不能执行“写”操作?CREATE INSERT 如何阻止写从服务器? my.cnf [mysqld] read-only = 1 不能阻止 SQL Thread如果某用户有SUPER权限,则不被阻止;mysql> FLUSH TABLES WITH READ LOCK;2、一个主服务器可否多从?可以 一从是否多主?不行 3、主-->从:异步mysql 5.5 google 补丁 半同步: semisync 半同步如果无法在指定时间完成-->自动 降到异步模式; 4、如何从服务器的mysql服务在启动时候不要自动启动从服务线程? master.inforelay-log.info在从服务器上:[mysqld]skip-slave-start=1 5、数据库复制过滤在主服务器上实现:binlog-do-db=testdbbinlog-do-db=mydbbinlog-ignore-db=mysql主服务器[mysqld]binlog-do-db=ORbinlog-ignore-db=在主服务器过滤:任何不涉及到数据库相关的写操作都不会被记录到二进制日志当中;从服务器:replicate_do_dbrpplicate_ignore_dbreplicate_do_tablereplicate_ignore_tablereplicate_wild_do_tablereplicate_wild_ignore_table在从服务器上只复制mageedu一个数据库:[mysqld]replicate_do_db=mageedureplicate_do_db=mysql设置半同步步骤:在Master和Slave的mysql命令行运行如下代码:# On Master mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql> SET GLOBAL rpl_semi_sync_master_enabled = 1; mysql> SET GLOBAL rpl_semi_sync_master_timeout = 1000; # On Slave mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SET GLOBAL rpl_semi_sync_slave_enabled = 1; mysql> STOP SLAVE IO_THREAD; START SLAVE IO_THREAD; 在Master和Slave的my.cnf中编辑:# On Master [mysqld] rpl_semi_sync_master_enabled=1 rpl_semi_sync_master_timeout=1000 # 1 second # On Slave [mysqld] rpl_semi_sync_slave_enabled=1 # 也可通过设置全局变量的方式来设置,如下:set global rpl_semi_sync_master_enabled=1 # 取消加载插件mysql> UNINSTALL PLUGIN rpl_semi_sync_master;==============================================查看从服务器上的semi_sync是否开启:mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';查看主服务器上的semi_sync是否开启,注意clients 变为1 ,证明主从半同步复制连接成功:mysql> SHOW GLOBAL STATUS LIKE 'rpl_semi%';工具:percona: percona-tools mattkit-tools 设置主-主复制:1、在两台服务器上各自建立一个具有复制权限的用户;2、修改配置文件:# 主服务器上[mysqld]server-id = 10log-bin = mysql-binrelay-log = relay-mysqlrelay-log-index = relay-mysql.indexauto-increment-increment = 2auto-increment-offset = 1#auto-increment-increment,auto-increment-offset用于解决自动增长时合并表出错,一个用奇数,一个用偶数,起点为1,增长为2# 从服务器上[mysqld]server-id = 20log-bin = mysql-binrelay-log = relay-mysqlrelay-log-index = relay-mysql.indexauto-increment-increment = 2auto-increment-offset = 23、如果此时两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可server1|mysql> SHOW MASTER STATUS\G************************** 1. row *************************** File: mysql-bin.000001 Position: 710 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)server2|mysql> SHOW MASTER STATUS\Gmysql> SHOW MASTER STATUS\G*************************** 1. row *************************** File: mysql-bin.000003 Position: 811 Binlog_Do_DB: Binlog_Ignore_DB: 1 row in set (0.00 sec)4、各服务器接下来指定对另一台服务器为自己的主服务器即可:server1|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=811server2|mysql> CHANGE MASTER TO ...,MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=710A: 查看B的二进制日志文件及位置,并以及作为自己的复制起点;B: