主从不能减轻写的压力
一、一主多从
主:
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;