主从不能减轻写的压力 一、一主多从 主: 1、开启二进制日志及设置server_id bin_log=my_bin server_id=201 2、创建复制账号(REPLICATION SLAVE,REPLICATION CLIENT) CREATE USER repuser; GRANT REPLICATION SLAVE,REPLICATION CLIENT ON . TO repuser@'%' IDENTIFIED BY 'smile'; 3、 从: 1、开启中继日志及设置唯一server_id relay_log=relay_log server_id=202 skip_slave_start=1 #启动时不自动启用从库同步

2、使用复制账号连接主并启动SQL及I/O进程 CHANGE MASTER TO option [, option] ... option: MASTER_BIND = 'interface_name' | MASTER_HOST = 'host_name' 主服务器地址 | MASTER_USER = 'user_name' 有复制权限的用户名 | MASTER_PASSWORD = 'password' 用户密码 | MASTER_PORT = port_num 主服务器的端口 | MASTER_CONNECT_RETRY = interval 连接重试时间间隔 | MASTER_HEARTBEAT_PERIOD = interval 心跳检测时间间隔 | MASTER_LOG_FILE = 'master_log_name' 主服务器二进制日志文件 | MASTER_LOG_POS = master_log_pos 二进制日志文件中的位置 | RELAY_LOG_FILE = 'relay_log_name'
| RELAY_LOG_POS = relay_log_pos | MASTER_SSL = {0|1} | MASTER_SSL_CA = 'ca_file_name' | MASTER_SSL_CAPATH = 'ca_directory_name' | MASTER_SSL_CERT = 'cert_file_name' | MASTER_SSL_KEY = 'key_file_name' | MASTER_SSL_CIPHER = 'cipher_list' | MASTER_SSL_VERIFY_SERVER_CERT = {0|1} | IGNORE_SERVER_IDS = (server_id_list)

CHANGE MASTER TO MASTER_HOST='',MASTER_USER='',MASTER_PASSWORD='',MASTER_LOG_FILE='',MASTER_LOG_POS= ; START SLAVE; 查看slave状态:SHOW SLAVE STATUS;

MariaDB [(none)]> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.0.201
                  Master_User: repuser
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: my_bin.000002
          Read_Master_Log_Pos: 339
               Relay_Log_File: relay_log.000006
                Relay_Log_Pos: 635
        Relay_Master_Log_File: my_bin.000002
					  Slave_IO_Running: Yes       #IO线程状态
            Slave_SQL_Running: Yes   #SQL线程状态

关于复制的注意事项 1、从库的只读问题 read_only=1 还可以FLUSH TABLES WITH READ LOCK; 2、几个保证安全的参数 1)对于InnoDB引擎来说: sync_binlog=1 master写binlog与innodb引擎写redo类似,也有参数控制:sync_binlog = 0 :表示MySQL不控制binlog的刷新,由文件系统自己控制它的缓存的刷新 > 0 :表示每sync_binlog次事务提交,MySQL调用文件系统的刷新操作将缓存刷下去 其中最安全的就是=1,表示每次事务提交,MySQL都会把binlog缓存刷下去,这样在掉电等情况下,系统才有可能丢失1个事务的数据。当sync_binlog设置为1,对系统的IO消耗也是非常大的。 innodb_flush_log_at_trx_commit =0 每秒write cache 并且 flush log =1 每次事务提交后都write cache并且flush log 最安全 =2 每次事务提交后都write cache 根据innodb_flush_logs_at_timeout来flush log innodb_support_XA=1 mysql的分布式事务 2PC CAP BASE 2)从库开机时不自动同步 SKIP_START_SLAVE=1 3) slave读取master的binlog日志后,需要个文件:relay log、relay log info、master info: relay log:即读取过来的master的binlog,内容与格式与master的binlog一致 relay log info:记录SQL Thread应用的relay log的位置、文件号等信息 master info:记录IO Thread读取master的binlog的位置、文件号、延迟等信息 master中sync_master_info sync_relay_log=1 sync_relay_log_info=1 从MySQL5.5.X版本开始,增加了relay_log_recovery参数,这个参数的作用是:当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性。默认情况下该功能是关闭的,将relay_log_recovery的值设置为 1时,可在slave从库上开启该功能,建议开启。 relay_log_recovery=1 relay-log-info-repository = TABLE(mysql中有,MariaDB中没有) 二、半同步 介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间。所以,半同步复制最好在低延时的网络中使用。 1)主库安装 安装插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';

启动模块

MariaDB [(none)]> SET GLOBAL rpL_semi_sync_master_enabled=1;

设置超时时间

MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=20000;

2)从库配置 全备主库并恢复到从库中 可使用mysqldump或者xtarbackup 安装插件

MariaDB [(none)]> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
MariaDB [(none)]> SET GLOBAL rpL_semi_sync_slave_enabled=1;
MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_timeout=20000;