1、相关概念 2、mysqldump 3、基于lvm2备份数据 4、xtrabackup 5、MySQL主从复制及架构 6、主从复制 7、主主复制 8、半同步复制 9、MHA 10、读写分离 11、主从架构中的主服务器高可用 ================================================================================================================================================ 相关概念 1、备份恢复注意点 做还原测试,用于测试备份的可用性 还原演练 2、备份类型 从数据的范围: 完全备份:备份整个数据集 部分备份:只备份数据的子集 增量备份:仅备份最近一次完全备份或者增量备份以来变化的数据。此种备份方式节省存储空间,但还原困难 差异备份:仅备份最近一次完全备份以来变化的数据 从业务是否在线: 热备:读写操作均可执行。{数据正在被读写操作的时候,进行复制备份,可能会导致数据错乱} 温备:读操作可执行,但不能写操作 冷备:读写操作均不可执行 物理备份、逻辑备份: 物理备份:直接复制数据文件进行备份 逻辑备份:从数据库中导出数据另存进行备份。逻辑备份存在一个问题就是可能会导致数据出现偏差。逻辑备份与存储引擎无关。 3、存储引擎支持的备份方式 MyISAM支持温备,不支持热备 InnoDB支持热备 5、备份内容 数据 二进制日志、InnoDB事务日志 代码(存储过程、存储函数、触发器、时间调度器) 服务器配置文件 6、设计备份方案 数据集:完全?增量? 备份手段:物理?逻辑? 7、备份工具 mysqldump 逻辑备份工具,可以完全备份,也可以部分备份,适用于所有存储引擎,属于温备。对InnoDB存储引擎支持热备。 cp|tar:属于物理备份,适用所有储存引擎。 LVM:快照功能,可以实现热备。借助于文件系统管理工具进行备份 mysqlhotcopy:冷备,仅使用与MyISAM存储引擎。 8、备份策略 1、mysqldump + 复制binlog文件 mysqldump实现完全备份 复制binlog中指定时间范围的event,实现增量备份 2、LVM2快照 lvm2快照 + 复制binlog lvm2快照并使用cp或tar做物理备份,完全备份 复制binlog中指定时间范围的event,实现增量备份 3、xtrabackup{支持对InnoDB做热备} 完全备份、增量备份 ================================================================================================================================================ mysqldump 1、工具 mysqldump mydumper phpMyAdmin Schema和数据存储在一起,逻辑备份事实上是将数据抽取出来,将数据组织成一个巨大的SQL语句,将所有的数据都备份到一个单个文件中。 2、mysqldump 一个客户端命令,通过MySQL协议连接服务器端。向MySQL服务器发起一个全量查询操作,拿到数据之后将数据保存到本地一个文件中,从而 完成备份操作。 语法格式: mysqldump [options] [db_name [tbl_name ...] 选项: --all-databases, -A # 备份所有数据库 --databases, -B DATAVASW_NAME # 备份某个指定的数据库 --lock-all-tables|-x # 锁定所有数据库中的所有表。{施加了全局读锁} --lock-tables, -l # 只锁定要备份的那个数据库。备份所有数据库也可以使用这个选项,只是会挨个进行锁定表 --single-transaction # 启动一个巨大的单个事务 {对于InnoDB存储引擎的数据库进行} --events|-E # 连同所要备份数据库的事件ecent scheduler都一起备份 --routines|-R # 用于存储备份指定数据库所有存储过程和存储函数 --triggers # 备份触发器,默认启用。--skip-triggers忽略备份 --flush-logs # 锁定表完成后,执行flush logs命令,做日志滚动 示例: 备份:mysqldump -uroot -h172.18.26.5 -p123 --databases hellodb > /root/hellodb.mysql # 默认会将抽取数据后生成的MySQL语句输出到屏幕 恢复:mysql -uroot -hlocalhost -p123 < hellodb.sql mysqldump另一种方式备份: shell> mysqldump [options] db_name [tbl_name ...] # 此种方式只是将指定db_name内的表备份,在恢复的时候需要自己创建数据库 shell> mysqldump [options] --databases db_name ... # 此种方式会自动创建数据库,恢复时无需手动创建数据库 shell> mysqldump [options] --all-databases # 会自动创建数据库,备份所有数据库 注意: 1、对于MyISAM存储引擎,应该锁定备份库,然后启动备份操作 2、--single-transaction,对InnoDB存储引擎支持热备 3、mysqldump备份之后,只能备份这个时间点之前的数据。之后在恢复的过程中只要进行恢复完全备份的数据,以及恢复二进制日志文件中 备份那个时间之后的所有事务即可。 --master-data=2:选项可以记录备份那一刻二进制文件记录处于的那个文件那个时间点上。但二进制文件中距离的是所有数据库的改 变记录,所以还要将所要恢复的那个数据中的记录抽取出来。1为不注释CHANGE MASTER,0为不启用 备份:mysqldump -uroot -hlocalhost -p123 --databases --master-data=2 hellodb > /root/all.mysql 4、恢复数据之前,暂时关闭二进制日志记录功能: SET sql_log_bin=0 ================================================================================================================================================ 基于lvm2备份数据 1、创建lvm pvcreate /dev/sdb1 vgcreate mysql.data /dev/sdb1 lvcreate -L +500M -n mydata mysql.data mkfs.xfs /dev/mysql.data/mydata mount /dev/mysql.data/mydata /data/ mkdir /data/mysql chown -R mysql:mysql /data/mysql 2、恢复数据 1、请求锁定所有表 mysql> FLUSH TABLES WITH READ LOCK; 2、记录二进制日志文件及事件位置(滚动二进制文件) mysql> FLUSH LOGS; mysql> SHOW MASTER STATUS; mysql -e 'SHOW MASTER STATUS' > /path/to/file 3、创建逻辑卷快照 lvcreate -L 200M -s -n mydata-snap -p r /dev/mysql.data/mydata 4、释放锁 mysql> UNLOCK TABLES; 5、恢复数据 1、挂载逻辑卷快照 mount -r mydata-snap /mnt 2、将快照内的数据复制出来 3、将数据目录的所有文件复制到之前数据库目录下 4、读取二进制文件并重放恢复 mysqlbinlog --start-position=245 mysql-bin.000004 Note:要通过原卷备份二进制日志文件 ================================================================================================================================================ xtrabackup percona公司。 www.percona.com 1、xtrabackup支持热备、基于物理备份。仅仅支持事务型的存储引擎进行热备。可以将增量备份的文件添加到完全备份的文件上,实现完全备份和增量备份的 过程。对 MyISAM 存储引擎不支持热备。 xtrabackp可以读取/etc/my.cnf文件中[mysqld]和[xtrabackup]中的配置段,从而获取自己的配置项。 [xtrabackup] target_dir = /data/backups/mysql/ # 文件备份之后放置的目录路径 2、安装 yum install xtrabackup 3、工具列表 /usr/bin/innobackupex /usr/bin/xbcrypt /usr/bin/xbstream /usr/bin/xtrabackup 示例:xtrabackup --backup --target-dir=/data/backups/base --datadir=/var/lib/mysql/ 4、innobackupex备份恢复 使用innobakupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV 和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命名的目录中。可以理解 innobackupex是一个封装了xtrabackup工具的更易用的一个脚本程序,是一个Perl脚本。 示例格式 innobackupex --user=DBUSER --password=DBPASSWORD /path/to/file/dir # 以某个用户的身份,连接MySQL服务器端进行备份,并保存到某个路径下 innobackupex --stream=tar ./ | gzip - > backup.tar.gz # 压缩备份 innobackupex --stream=tar ./ | bzip2 - > backup.tar.bz2 如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户: mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY 's3cret'; mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bkpuser'; mysql> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost'; mysql> FLUSH PRIVILEGES; 1、全量备份 innobackupex --user=root /backup 在备份的同时,innobackupex还会在备份目录中创建如下文件: xtrabackup_checkpoints 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息 xtrabackup_binlog_info mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置 xtrabackup_binlog_pos_innodb 二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position xtrabackup_binary 备份中用到的xtrabackup的可执行文件 backup-my.cnf 备份命令用到的配置选项信息 整理日志: 一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事 务。因此,此时数据文件仍处理不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于 一致性状态。 在实现"准备"的过程中,innobackupex通常还可以使用--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用, 可以多划分一些内存给prepare的过程,以提高其完成速度。 innobackupex --apply-log /backup/2017-11-03_22-13-46 恢复文件: innobackupex --copy-back /backup/2017-11-03_22-13-46/ Note:恢复数据以后,数据库目录下的属主属组都是root,所以应该都改为mysql用户,mysql组。chown -R mysql:mysql * 2、增量备份 每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即 innobackupex通过备份上次完全备份之后发生改变的页面来实现。 其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增 量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其 --incremental-basedir 应该指向上一次的增量备份所在的目录。 增量备份: innobackupex --incremental /backup --incremental-basedir=/backup/2017-11-04_08-51-11 重放和回滚所有备份数据: innobackupex --apply-log --redo-only BASE-DIR # 重放完全备份的数据 innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1 # 第一个增量备份合并到完全备份,同时重放 innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2 # 将第二个增量备份合并到完全备份,同时重放 重放合并后的完全备份: innobackupex --apply-log --redo-only BASE-DIR 还原: innobackupex --copy-back /backup/2017-11-04_08-51-11/ # 将合并之后的完全备份恢复 注意: 最后恢复之后,要将二进制日志文件在最后一个增量备份之后的内容重放到数据库中,重放之前需要关闭二进制日志记录功能, 恢复之后,要再次进行备份。 ================================================================================================================================================ MySQL主从复制及架构 1、对读操作进行负载均衡,调度到后端不同的MySQL服务器上。对写操作只调度到某一个主节点上,从节点从主节点复制数据到本地。每个 节点都保存一个完整的数据集。 MySQL的代理负载均衡时,要基于7层代理MySQL服务器,负载均衡代理MySQL的代理要能够理解客户端发来的请求是查询语句还是写请求 语句。 2、复制的优势 数据分布 负载均衡度 备份 高可用 3、主从复制相关进程 主节点:为每个 Slave 的 I/O THread启动一个[dump线程],用于向其发送 binary log events 从节点: I/O Thread:从Master请求二进制时间,并保存在本地的中继日志中 SQL Thread:从[中继日志]中读取日志时间,在本地完成重放 4、特点 异步复制 从节点中的数据时间点可能会落后与主服务器 主从架构可以是M/S、M/M 一主多从 一从多主,但多主得是不同的数据库 从服务器还可以再有从服务器,级联复制 ================================================================================================================================================ 主从复制 1、主节点配置 # 启动记录二进制功能 vim /etc/my.cnf log_bin=mysql-bin server_id=1 innodb_file_per_table=ON skip_name_resolve=ON # 启动服务 systemctl start mariadb.service # 查看MySQL个功能是否启动 mysql> SHOW MASTER LOGS; mysql> SHOW GLOBAL VARIABLES LIKE '%server%'; # 创建有复制权限的用户 mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.18.%.%' IDENTIFIED BY '123'; mysql> FLUSH PRIVILEGES; 2、从服务器配置 # 启动中继日志配置server_id vim /etc/my.cnf relay_log=relay-log relay_log_index=relay-log server_id=2 innodb_file_per_table=ON skip_name_resolve=ON read_only=ON # 启动服务 systemctl start mariadb.service # 使用有复制权限的账号连接至主服务器并启动复制线程 mysql> HELP CHANGE MASTER TO # 主节点查看二进制文件名称及位置 mysql> SHOW MASTER STATUS; mysql> SHOW MASTER LOGS; # 启动复制线程 mysql> CHANGE MASTER TO MASTER_HOST='172.18.26.4',MASTER_USER='repluser',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=491; mysql> START SLAVE [IO_THREAD,SQL_THREAD]; MASTER_CONNECT_RETRY = 60 # 连接失败的重试时间 # 查看从节点状态 mysql> SHOW SLAVE STATUS\G; 3、主节点添加删除数据,查看从节点是否同步复制 4、Note 1、配置从服务器为只读 read_only=ON; 此限制对拥有SUPER权限的用户无效 阻止所有用户: mysql> FLUSH TABLES WITH READ LOCK; 2、保证事务的安全 当主服务器接收一个事务,但并没有写入磁盘之前,主服务器都有可能挂掉,此时从服务器就不能得到主服务器的事务。因此就必须保证 从服务器能够快速得到主服务器的事务信息。 在主节点设置的参数: sync_binlog=ON # 当有事务提交时,必须要将binlog缓冲区记录的事件立即记录到磁盘上的二进制文件中,使得从节点能够快速读取事件 innodb_flush_logs_trx_commit=ON # 在事务提交时,要将内存中与事务相关的数据同步到磁盘上去 innodb_support_xa=ON # 分布式提交事务 sync_master_info=1 # 开启同步信息给从节点 在从节点设置的参数: skip_slave_start=ON # 关闭MySQL启动时,自动启动事务同步 sync_relay_log=1 sync_relay_info=1 3、如果主节点已经运行一段时间,且有大量数据时,通过备份恢复数据到从服务器,复制起始位置为备份时的二进制文件和位置。 ================================================================================================================================================ 主主复制 1、主主复制可能会造成数据不一致的现象。 2、主节点配置 # 修改配置文件 vim /etc/my.cnf log_bin=mysql-bin server_id=1 innodb_file_per_table=ON skip_name_resolve=ON relay_log=relay-log auto_increment_offset=1 auto_increment_increment=2 # 启动服务 systemctl start mariadb.service # 创建有复制权限的账号 mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.18.%.%' IDENTIFIED BY '123'; mysql> FLUSH PRIVILEGES; # 主节点查看二进制文件名称及位置 mysql> SHOW MASTER STATUS; mysql> SHOW MASTER LOGS; # 启动复制线程 mysql> CHANGE MASTER TO MASTER_HOST='172.18.26.4',MASTER_USER='repluser',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=491; mysql> START SLAVE; 3、从节点配置 # 修改配置文件 vim /etc/my.cnf log_bin=mysql-bin server_id=2 innodb_file_per_table=ON skip_name_resolve=ON relay_log=relay-log auto_increment_offset=2 auto_increment_increment=2 # 启动服务 systemctl start mariadb.service # 创建有复制权限的账号 mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.18.%.%' IDENTIFIED BY '123'; mysql> FLUSH PRIVILEGES; # 主节点查看二进制文件名称及位置 mysql> SHOW MASTER STATUS; mysql> SHOW MASTER LOGS; # 启动复制线程 mysql> CHANGE MASTER TO MASTER_HOST='172.18.26.4',MASTER_USER='repluser',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=491; mysql> START SLAVE; ================================================================================================================================================ 半同步复制 确定有一个节点是同步复制主节点的数据的,确保有一个从节点是同步复制主节点的数据,而其他从节点是异步复制主节点的数据。 1、半同步复制是通过插件的方式实现的。/usr/lib64/mysql/plugin /usr/lib64/mysql/plugin/semisync_master.so # 主节点启用的插件 /usr/lib64/mysql/plugin/semisync_slave.so # 从节点启用的插件 2、主节点配置 # vim /etc/my.cnf log_bin=mysql-bin server_id=1 innodb_file_per_table=ON skip_name_resolve=ON # 启动服务 systemctl start mariadb.service # 创建有复制权限的账号 mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.18.%.%' IDENTIFIED BY '123'; mysql> FLUSH PRIVILEGES; # 主节点查看二进制文件名称及位置 mysql> SHOW MASTER STATUS; mysql> SHOW MASTER LOGS; # 安装插件 命令:INSTALL PLUGIN plugin_name SONAME 'shared_librart_name'; # 此处的plugin_name需要确认插件的名称。插件文件名称和插件名称可能不同 mysql> INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so'; mysql> SHOW PLUGINS; # 变量参数 MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%'; +------------------------------------+-------+ | Variable_name | Value | +------------------------------------+-------+ | rpl_semi_sync_master_enabled | OFF | # 是否启用半同步复制的主节点 | rpl_semi_sync_master_timeout | 10000 | # 等待从节点响应的超时时长 | rpl_semi_sync_master_trace_level | 32 | | rpl_semi_sync_master_wait_no_slave | ON | +------------------------------------+-------+ # 状态变量参数 MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%rpl%'; # 启动半同步复制 MariaDB [(none)]> SET GLOBAL rpl_semi_sync_master_enabled=1; # 查看状态 MariaDB [(none)]> SHOW GLOBAL STATUS LIKE '%semi%'; 3、从节点配置 # vim /etc/my.cnf server_id=2 innodb_file_per_table=ON skip_name_resolve=ON relay_log=relay-log # 启动服务 systemctl start mariadb.service # 启动复制线程 mysql> CHANGE MASTER TO MASTER_HOST='172.18.26.4',MASTER_USER='repluser',MASTER_PASSWORD='123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=491; mysql> START SLAVE; # 查看从节点状态 mysql> SHOW SLAVE STATUS\G; # 停止从节点复制 mysql> STOP SLAVE; # 安装插件 mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so'; mysql> SHOW PLUGINS; # 变量参数 MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE '%semi%'; +---------------------------------+-------+ | Variable_name | Value | +---------------------------------+-------+ | rpl_semi_sync_slave_enabled | OFF | # 是否启用 | rpl_semi_sync_slave_trace_level | 32 | +---------------------------------+-------+ # 启动半同步复制 MariaDB [(none)]> SET GLOBAL rpl_semi_sync_slave_enabled=1; # 重新启动复制线程 MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> START SLAVE; # 查看从节点状态 mysql> SHOW SLAVE STATUS\G; 4、复制过滤器 1、让从节点仅复制指定的数据库或指定数据库的指定表。 2、实现方式 1、(方法一)主服务器仅向二进制日志中记录与特定数据库相关的时间。下列两个参数不能同时使用。 binlog_do_db= # 数据库白名单,多个数据库用 "," 隔开 binlog_ignore_db= # 数据库黑名单 2、(方法二)从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库相关的时间并应用于本地 replicate_do_db= replicate_ignore_db= replicate_do_table= replicate_ignore_table= replicate_wild_do_table= # 可以使用通配符 replicate_wild_ignore_table= # 可以使用通配符 3、配置从节点 MariaDB [(none)]> STOP SLAVE; MariaDB [(none)]> SHOW GLOBAL VARIABLE LIKE 'replicate%'; MariaDB [(none)]> SET GLOBAL replicate_do_db='mizi'; MariaDB [mizi]> SHOW SLAVE STATUS\G; 5、和复制相关的文件 master.info # 用于保存slave连接至master时的相关信息,包括账号、密码服务器地址等信息 relay-log.000002 relay-log.000003 relay-log.index relay-log.info # 保存当前slave节点上已经复制的当前的二进制日志和本地replay log日志的对应关系 6、复制监控和维护 二进制日志删除: Examples: PURGE {BINARY|MASTER} LOGS TO 'mysql-bin.010'; # 指定日志之前的二进制文件全部删除 PURGE {BINARY|MASTER} LOGS BEFORE '2008-04-02 22:46:26'; # 指定时间点之前二进制文件全部删除 监控: SHOW PROCESSLIST; SHOW SLAVE STATUS; SHOW MASTER STATUS; SHOW MASTER LOGS; 判断从服务器是否落后与主服务器: MariaDB [mizi]> SHOW SLAVE STATUS\G; Seconds_Behind_Master: 0 判断主从节点是否一致: percona-toolkit工具包中的pt-table-checksum ======================================================================================================================================= MHA 1、尽管主从复制的数据库架构能够负载分担读操作,但对于写操作依然不能为力。这时候就需要一个中间件将用户的读请求路由至不同的数据库 服务器上。同时这也意味着此中间件能够分析用户请求报文中的内容是读请求还是写请求。 2、切分 垂直切分:分库。将没有关联个的表分别放置到不同服务器上,写数据时分别到不同的服务器上写数据。 水平切分:将表切分,例如按数据范围切分、哈希值切分。sharding。cobar、gizzard。 将热区数据拆分 这两种切分依然有可能成为性能瓶颈,因为热区数据无法保证切分。这时候需要对数据库进行分片,将数据库放入不同的节点上进行 负载和冗余。{分布式数据库} 3、主从架构中,有多个从节点从主节点复制数据,且从节点负责接收用户发起的读请求。有一种场景就是,当主节点宕机后,整个主从复制架构将 完全不能提供服务。为了解决这个文件,引入的一个第三方的节点,它实时监控主节点的状态,当主节点出现宕机后,此第三方节点将会自动将 某一个从节点提升为主节点并负责接收写请求。 此第三方节点还会将存活的从节点中数据进行聚合,组成一个较为完成的数据集合。 解决方案: MMM:Muliti Master MySQL MHA:Master HA Galera Cluster:多主模型的实现。通过wresp协议在全局实现复制,任何一节点都可读写 4、配置 1、主节点配置 # 修改配置文件 my.cnf vim /etc/my.cnf innodb_file_per_table = 1 skip_name_resolve = 1 log_bin = master-bin relay_log = relay-bin server_id = 1 # 启动服务 systemctl start mariadb # 查看二进制文件状态 MariaDB [(none)]> SHOW MASTER STATUS; +-------------------+----------+--------------+------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | +-------------------+----------+--------------+------------------+ | master-bin.000003 | 245 | | | +-------------------+----------+--------------+------------------+ # 创建复制账号 MariaDB [(none)]> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repluser'@'172.18.%.%' IDENTIFIED BY '123'; MariaDB [(none)]> FLUSH PRIVILEGES; 2、配置从节点(1) # 修改配置文件 my.cnf vim /etc/my.cnf innodb_file_per_table = 1 skip_name_resolve = 1 log_bin = master-bin relay-log = relay-log server_id = 2 read_only = 1 relay_log_purge = 0 # 定义复制信息 MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.18.26.2',MASTER_USER='repluser',MASTER_PASSWORD='123',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=245; # 启动复制 MariaDB [(none)]> START SLAVE; # 查看状态 MariaDB [(none)]> SHOW SLAVE STATUS\G; 3、配置从节点(2) # 修改配置文件 my.cnf vim /etc/my.cnf innodb_file_per_table = 1 skip_name_resolve = 1 log_bin = master-bin relay-log = relay-log server_id = 3 read_only = 1 relay_log_purge = 0 # 定义复制信息 MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='172.18.26.2',MASTER_USER='repluser',MASTER_PASSWORD='123',MASTER_LOG_FILE='master-bin.000003',MASTER_LOG_POS=245; # 启动复制 MariaDB [(none)]> START SLAVE; # 查看状态 MariaDB [(none)]> SHOW SLAVE STATUS\G; 4、主节点上配置具有管理权限的账号 MariaDB [(none)]> GRANT ALL ON *.* TO 'mhauser'@'172.18.26.%' IDENTIFIED BY '123'; MariaDB [(none)]> FLUSH PRIVILEGES; 5、配置各主机间ssh无密通信 # 其中一个主机 ssh-keygen -t rsa -P '' cat .ssh/id_rsa.pub > .ssh/authorized_keys chmod go= .ssh/authorized_keys # 将公钥和私钥复制到个节点 scp -p .ssh/id_rsa.pub .ssh/authorized_keys NOD1:/root/.ssh/ 6、管理节点安装manager yum install mha4mysql-manager-0.56-0.el6.noarch.rpm ================================================================================================================================================ 读写分离 1、读写分离的实现可以是由客户端直接请求时完成发往不同的主机,也可以在数据库服务器前添加读写分离器,将读请求和写请求发往不同的 数据库节点。 注意:可以在读写分离器上添加一个调度器HAproxy、Nginx将读请求调度。 2、读写分离解决方案 MySQL Proxy # MySQL官方。测试版本,没有正式发布 atlas # MySQL Proxy的增进版 amoeba for MySQL # cobar # 分片框架 OneProxy ProxySQL Maxscale # MariaDB社区维护 AliSQL 4、特性 缓存查询 查询路由 支持故障转移 运行时配置 应用层代理 跨平台 防火墙,过滤查询语句 5、生成文件 [ root@node2 ~ ]# rpm -ql proxysql /etc/init.d/proxysql /etc/proxysql.cnf /usr/bin/proxysql /usr/share/proxysql/tools/proxysql_galera_checker.sh /usr/share/proxysql/tools/proxysql_galera_writer.pl 6、配置文件 datadir="/var/lib/proxysql" admin_variables= { admin_credentials="admin:admin" mysql_ifaces="172.18.26.1:6032;/tmp/proxysql_admin.sock" } mysql_variables= # ProxySQL的工作属性 { threads=4 max_connections=2048 default_query_delay=0 default_query_timeout=36000000 have_compress=true poll_timeout=2000 interfaces="172.18.26.1:3306;/tmp/mysql.sock" default_schema="information_schema" stacksize=1048576 server_version="5.5.30" connect_timeout_server=3000 monitor_history=600000 monitor_connect_interval=60000 monitor_ping_interval=10000 monitor_read_only_interval=1500 monitor_read_only_timeout=500 ping_interval_server=120000 ping_timeout_server=500 commands_stats=true sessions_sort=true connect_retries_on_failure=10 } mysql_servers = # # 定义后端服务器 ( { address = "172.18.0.67" # no default, required . If port is 0 , address is interpred as a Unix Socket Domain port = 3306 # no default, required . If port is 0 , address is interpred as a Unix Socket Domain hostgroup = 0 # no default, required status = "ONLINE" # default: ONLINE weight = 1 # default: 1 compression = 0 # default: 0 }, { address = "172.18.0.68" port = 3306 hostgroup = 1 status = "ONLINE" # default: ONLINE weight = 1 # default: 1 compression = 0 # default: 0 }, { address = "172.18.0.69" port = 3306 hostgroup = 1 status = "ONLINE" # default: ONLINE weight = 1 # default: 1 compression = 0 # default: 0 } ) mysql_users: # 创建连接后端数据库主机的账号密码 ( { username = "root" password = "mageedu" default_hostgroup = 0 max_connections=1000 default_schema="mydb" active = 1 } ) mysql_query_rules: ( ) scheduler= ( ) mysql_replication_hostgroups= # 定义接受写请求的主机组和接收读请求的主机组 ( { writer_hostgroup=0 reader_hostgroup=1 comment="test repl 2" # 集群的注释信息 } ) 7、ProxySQL配置 # 备份配置文件 cp /etc/proxysql.cnf /etc/proxysql.cnf.bak # 启动 service proxysql start # 数据配置信息 /varlib/proxysql/ 8、管理接口 mysql -S /tmp/mysql.sock -uUsername -pPassword ==================================================================================================================================== 主从架构中的主服务器高可用方案 1、DRBD 内核级别实现块设备的复制,使用TCP协议镜像另一个节点的块设备。但此种方案仍然极有可能造成文件系统的损坏,因为两个节点都有可能挂载此设备 进行读写。 2、高可用主服务器,两个节点使用共享存储。 3、MHA:Master HA 4、MMM:Muliti Master MySQL 5、Galera Cluster:多主模型的实现。通过wresp协议在全局实现复制,任何一节点都可读写 6、Percona XtraDB Cluster(PXC) MySQL集群解决方案主从复制集群。每一个节点都能处理读写请求,前端调度器将用户请求调度到任意一个节点。不依赖二进制日志文件, 实时同步复制节点间的数据。保证数据的一致性。 percona公司。 =====================================================================================================================================