MariaDB数据库主从架构和配置优化
node
--------------------------------------------------------------------------------------------------------------------------------------------
mysql
1、MySQL复制git
一、扩展方式:Scale UP,Scale Outgithub
二、MySQL的扩展sql
读写分离数据库
复制:每一个节点都有相同的数据集vim
向外扩展centos
基于二进制日志发生更改,实现主从复制安全
单向复制,由主到从复制服务器
三、复制的功用
数据分布、负载均衡读、备份、高可用和故障切换、MySQL升级测试
2、MySQL读写分离
读写分离应用:
mysql-proxy:Oracle
Atlas:奇虎,基于mysql-proxy
DBProxy:美团
Cetus:网易
Amoeba
Cobar:阿里巴巴,基于Amoeba的升级版
Mycat:基于Cobar
ProxySQL
3、主从复制
一、一主一从
二、一主多从
三、主从复制原理
主服务器数据更新时,会产生二进制日志,以后经过slave服务线程(线程1)读取二进制日志,而且和从服务器的IO Thread(线程2)传输二进制日志,写入中继日志relay log,接着从服务器经过SQL Thread的线程(线程3)读取中继日志中SQL语句并写入数据库中,从而实现了主从复制
要求主服务器必须启动二进制日志,若是从服务器开本身的从服务器,也须要开启二进制日志
用户访问量大时,主从复制会有延迟
四、读写分离方法:MySQL垂直分区
其余信息、用户信息、消息信息各放各的服务器,数据表之间没法join,须要结合软件开发来实现表之间的链接
五、读写分离方法:MySQL水平分片
仍然须要配合业务部门的软件开发来实现
六、MySQL复制概念
主从复制线程:
主节点:
dump Thread:为每一个Slave的I/O Thread启动一个dump线程,用于向其发送binary log events
从节点:
I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
SQL Thread:从中继日志中读取日志事件,在本地完成重放
跟复制功能相关的文件:
master.info:用于保存slave链接至master时的相关信息,例如帐号、密码、服务器地址等
relay-log.info:保存在当前slave节点上已经复制的当前二进制日志和本地replay log日志的对应关系
主从复制特色:
异步复制:客户端发送同步命令完毕,什么时候主从同步不予理会
主从数据不一致比较常见
复制架构:
Master/Slave, Master/Master(除非对数据准确度要求不高,通常不推荐使用), 环状复制
一主多从
从服务器还能够再有从服务器
一从多主:适用于多个不一样数据库(mysql版本大于5.6)
复制须要考虑二进制日志事件记录格式
STATEMENT(5.0以前)
ROW(5.1以后,推荐)
MIXED
七、MySQL复制模型
4、实现主从复制(版本最好同样)
主节点配置:
一、 启用二进制日志
[mysqld]
log_bin
二、为当前节点设置一个全局唯一的ID号
[mysqld]
server_id=#
log-basename=master 可选项,设置datadir中日志名称,确保不依赖主机名
三、建立有复制权限的用户帐号
GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';
从节点配置:
一、启动中继日志
[mysqld]
server_id=# 为当前节点设置一个全局唯的ID号
relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin
relay_log_index=relay-log.index 默认值hostname-relay-bin.index
二、 进入数据库进行远程复制,对主服务器进行远程链接记不住输入help change,会有提示,接着help chage master to,会有提示命令
mysql> CHANGE MASTER TO MASTER_HOST='host', MASTER_USER='repluser',
MASTER_PASSWORD='replpass', MASTER_LOG_FILE='mysql-bin.xxxxx',
MASTER_LOG_POS=#;
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
三、若是主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点
经过备份恢复数据至从服务器
复制起始位置为备份时,二进制日志文件及其POS
若是要启用级联复制,须要在从服务器启用如下配置,及主---从1----从2,从1须要加的内容
[mysqld]
log_bin
log_slave_updates
复制架构中应该注意的问题:
一、限制从服务器为只读
在从服务器上设置read_only=ON
注意:此限制对拥有SUPER权限的用户均无效
阻止全部用户, 包括主服务器复制的更新
mysql> FLUSH TABLES WITH READ LOCK;
二、RESET SLAVE
在从服务器清除master.info ,relay-log.info, relay log ,开始新的relay log ,注意:须要先STOP SLAVE
RESET SLAVE ALL 清除全部从服务器上设置的主服务器同步信息如:PORT, HOST, USER和 PASSWORD 等
三、sql_slave_skip_counter = N 从服务器忽略几个主服务器的复制事件,global变量,复制时候产生错误,是否跳过错误,默认值是0,关闭
四、如何保证主从复制的事务安全
参看https://mariadb.com/kb/en/library/server-system-variables/
在master节点启用参数:
sync_binlog=1 每次写后当即同步二进制日志到磁盘,性能差
若是用到的为InnoDB存储引擎:
innodb_flush_log_at_trx_commit=1 每次事务提交当即同步日志写磁盘
innodb_support_xa=ON 默认值,分布式事务MariaDB10.3.0废除
sync_master_info=# #次事件后master.info同步到磁盘
在slave节点启用服务器选项:
skip_slave_start=ON 不自动启动slave,在slave节点启用参数:
sync_relay_log=# #次写后同步relay log到磁盘
sync_relay_log_info=# #次事务后同步relay-log.info到磁盘
5、半同步复制
半同步复制实现:一主多从,若是至少一个从服务器同步成功,主服务器将会向客户端返回成功信息;或者全部从服务器长时间没有同步,超过了限定时长,主服务器也将会向客户端返回成功信息
一、主服务器配置:
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;超时长为1s,单位是毫秒
mysql>SHOW GLOBAL VARIABLES LIKE '%semi%';
mysql>SHOW GLOBAL STATUS LIKE '%semi%‘;
二、从服务器配置:
mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
mysql> SET GLOBAL rpl_semi_sync_slave_enabled=1;
stop slave; start slave;,这两步用来启用插件
附show plugins;:查看插件
工做中建议master--slave半同步--slave1,2,3
6、
一、复制过滤器:
让从节点仅复制指定的数据库,或指定数据库的指定表
二、两种实现方式:
(1) 服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件
注意:此项和binlog_format相关
参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-dbbinlog_do_db = 数据库白名单列表,多个数据库需多行实现,选项,/etc/my.cnf的[mysqld]
binlog_ignore_db = 数据库黑名单列表,选项
问题:基于二进制还原将没法实现;不建议使用
(2) 从服务器SQL_THREAD在replay中继日志中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地
问题:会形成网络及磁盘IO浪费
在从服务器上添加的复制过滤器相关变量,先stop slave中止线程,而后使用set replicate...=DB设置名单
replicate_do_db= 指定复制库的白名单,只适用于global选项,使用必须use进入当前库进行增删改操做,不能在其它表中用DB.TBL
replicate_ignore_db= 指定复制库黑名单
replicate_do_table= 指定复制表的白名单
replicate_ignore_table= 指定复制表的黑名单
replicate_wild_do_table= foo%.bar% 支持通配符
replicate_wild_ignore_table=
三、基于SSL复制:
在默认的主从复制过程或远程链接到MySQL/MariaDB全部的连接通讯中的数据都是明文的,外网里访问数据或则复制,存在安全隐患。经过SSL/TLS加密的方式进行复制的方法,来进一步提升数据的安全性
参看:https://mariadb.com/kb/en/library/replication-with-secure-connections/
主服务器开启SSL:[mysqld] 加一行ssl
主服务器配置证书和私钥;而且建立一个要求必须使用SSL链接的复制帐号
从服务器使用CHANGER MASTER TO 命令时指明ssl相关选项
Master服务器配置
[mysqld]
log-bin
server_id=1
ssl
ssl-ca=/etc/my.cnf.d/ssl/cacert.pem ----CA证书
ssl-cert=/etc/my.cnf.d/ssl/master.crt ----CA颁发的证书
ssl-key=/etc/my.cnf.d/ssl/master.key ----主服务器的私钥
保存后进入数据库输入
grant replication slve on *.* to ssluser@'HOST' identified by 'passwd' require ssl;,创建强制加密的用户
Slave服务器配置
mysql>
CHANGE MASTER TO
MASTER_HOST='MASTERIP',
MASTER_USER='rep',
MASTER_PASSWORD='centos',
MASTER_LOG_FILE='mariadb-bin.000001',
MASTER_LOG_POS=245,
MASTER_SSL=1,
MASTER_SSL_CA = '/etc/my.cnf.d/ssl/cacert.pem',
MASTER_SSL_CERT = '/etc/my.cnf.d/ssl/slave.crt',
MASTER_SSL_KEY = '/etc/my.cnf.d/ssl/slave.key';
CA服务器:创建目录放证书,openssl genrsa 2048 >cakey.pem,
openssl req -new -x509 -key cakey.pem -out cacert.pem -days 3650,生成自签名,交互式设置;
openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > master.csr,生成主服务器私钥文件 > 生成证书申请,交互式填写与上一步同样
openssl x509 -req -in master.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 01 >master.crt
openssl req -newkey rsa:1024 -days 100 -nodes -keyout master.key > slave.csr
openssl x509 -req -in slave.csr -days 100 -CA cacert.pem -CAkey cakey.pem -set_serial 02 >slave.crt
证书申请完毕,将生成的文件放到对应的目录下
7、复制的监控和维护
一、 清理日志
PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }
RESET MASTER
RESET SLAVE
二、 复制监控
SHOW MASTER STATUS
SHOW BINLOG EVENTS
SHOW BINARY LOGS
SHOW SLAVE STATUS
SHOW PROCESSLIST
三、 从服务器是否落后于主服务
Seconds_Behind_Master: 0
四、 如何肯定主从节点数据是否一致
percona-tools
五、 数据不一致如何修复
删除从数据库,从新复制
8、高可用
一、MMM: Multi-Master Replication Manager for MySQL,Mysql主主复制管理器是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置(同一时间只有一个节点是可写的)
官网: http://www.mysql-mmm.org
https://code.google.com/archive/p/mysql-master-master/downloads
二、MHA: Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;经过提高某一从节点为新的主节点,基于主从复制实现,还须要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从
官网:https://code.google.com/archive/p/mysql-master-ha/
三、Galera Cluster:wsrep(MySQL extended with the Write Set Replication)
经过wsrep协议在全局实现复制;任何一节点均可读写,不须要主从复制,实现多主读写
9、MHA集群架构
工做原理
一、从宕机崩溃的master保存二进制日志事件(binlog events)
二、识别含有最新更新的slave
三、应用差别的中继日志(relay log)到其余的slave
四、应用从master保存的二进制日志事件(binlog events)
五、提高一个slave为新的master
六、使其余的slave链接新的master进行复制
实验,建议centos7上作,不要在centos6作
一、准备初步环境,四台主机 ,1主2从1管理器
二、主机之间实现基于key实现,时间须要同步
随便一台主机,ssh-keygen,ssh-copy-id,在本身主机生成公钥,将此目录拷贝至每一个设备对应的/root,实现设备之间互通基于key验证
三、主服务器上:
vim /etc/my.cnf
[mysqld]
log-bin
server_id=1
skip_name_resolve=1 --------->必须项
四、建立帐户
复制帐号:mysql>grant replication slave on *.* to repluser@'192.168.8.%' identified by 'magedu';
管理帐号:mysql>grant all on *.* to mhauser@'192.168.8.%' identified by 'magedu';
五、从服务器改文件
从1:
vim /etc/my.cnf
[mysqld]
server_id=2 不一样节点此值各不相同
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1 --------->必须项
从2:
vim /etc/my.cnf
[mysqld]
server_id=3 不一样节点此值各不相同
log-bin
read_only
relay_log_purge=0
skip_name_resolve=1 --------->必须项
改好后重启服务
六、两台从服务器:mysql>CHANGE MASTER TO MASTER_HOST=‘主服务器_IP', MASTER_USER='repluser', MASTER_PASSWORD=‘magedu', MASTER_LOG_FILE='mariadb-bin.000001', MASTER_LOG_POS=245;,设置主从同步,show slave status\G检查同步状态,复制完成后start slave开启线程
七、基于epel源安装工具
管理节点安装manager工具包:mha4mysql-manager、mha4mysql-node
被管理节点安装node工具包:mha4mysql-node
八、修改管理主机配置文件
vim /etc/mastermha/app1.cnf ----------->本身新建
[server default]
user=mhauser
password=magedu
manager_workdir=/data/mastermha/app1/ -------->注意有没有根下/data目录
manager_log=/data/mastermha/app1/manager.log
remote_workdir=/data/mastermha/app1/
ssh_user=root
repl_user=repluser
repl_password=magedu
ping_interval=1
[server1]
hostname=192.168.8.17---------->主服务器
candidate_master=1
[server2]
hostname=192.168.8.27 --------->代替主服务器的从服务器
candidate_master=1
[server3]
hostname=192.168.8.37 -------->从服务器
九、mha验证启动
masterha_check_ssh --conf=/etc/mastermha/app1.cnf --------->8的配置文件建哪了就写哪
masterha_check_repl --conf=/etc/mastermha/app1.cnf 同上
十、启动执行
masterha_manager --conf=/etc/mastermha/app1.cnf 该步骤前台执行,确保安全能够加hub
十一、测试
主机宕机后会依旧执行程序,系统自动更换主服务器
10、Galera Cluster
一、集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera自己是具备多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案
二、特色
多主架构:真正的多点读写的集群,在任什么时候候读写数据,都是最新的
同步复制:集群不一样节点之间数据同步,没有延迟,在数据库挂掉以后,数据不会丢失
并发复制:从节点APPLY数据时,支持并行执行,更好的性能
故障切换:在出现数据库故障时,因支持多点写入,切换容易
热插拔:在服务期间,若是数据库挂了,只要监控程序发现的够快,不可服务时间就会很是少。在节点故障期间,节点自己对集群的影响很是小
自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不须要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致
对应用透明:集群的维护,对应用程序是透明的
三、在一个服务器发生事务,在另外一台服务器也会发生一样的事务
四、Galera Cluster包括两个组件
Galera replication library (galera-3)
WSREP:MySQL extended with the Write Set Replication
五、WSREP复制实现:percona-cluster、MariaDB-Cluster
六、注意:都至少须要三个节点,不能安装mariadb-server,安装后会自动卸载mariadb-server,安装本身的集群版
基于epel源安装,epel源地址:https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-5.5.59/yum/centos7-amd64/
yum install MariaDB-Galera-server
七、编辑配置文件
vim /etc/my.cnf.d/server.cnf
wsrep_provider = /usr/lib64/galera/libgalera_smm.so -------->程序路径
wsrep_cluster_address="gcomm://192.168.8.7,192.168.8.17,192.168.8.27" ---->3个服务器ip地址
binlog_format=row ----------->基于行的复制方式
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2 -------->基于锁的模式
bind-address=0.0.0.0
下面配置可选项
wsrep_cluster_name = 'mycluster' 默认my_wsrep_cluster
wsrep_node_name = 'node1'
wsrep_node_address = ‘192.168.8.7'
八、其它设备的配置文件按照刚才配置文件格式进行更改,或者覆盖
九、首次启动时,须要初始化集群,在其中一个节点上执行命令
/etc/init.d/mysql start --wsrep-new-cluster
十、其它主机正常启动其它节点
service mysql start ----------->注意mysql不带d
十一、查看集群中相关系统变量和状态变量
SHOW VARIABLES LIKE 'wsrep_%'\G ----->服务器变量
SHOW STATUS LIKE 'wsrep_%'\G ------>服务器当前状态
SHOW STATUS LIKE 'wsrep_cluster_size'\G
十二、测试
11、复制的问题和解决方案:
一、数据损坏或丢失
Master: MHA + semi repl
Slave: 从新复制
二、混合使用存储引擎
MyISAM:不支持事务
InnoDB: 支持事务
三、不唯一的server id
从新复制
四、复制延迟
须要额外的监控工具的辅助
一从多主:mariadb10版后支持
多线程复制:对多个数据库复制
12、性能衡量指标
一、数据库服务衡量指标:
qps: query per second
tps: transaction per second
二、压力测试工具:
mysqlslap
Sysbench:功能强大,https://github.com/akopytov/sysbench
tpcc-mysql
MySQL Benchmark Suite
MySQL super-smack
MyBench
十3、生产环境my.cnf配置示例
硬件:内存32G
十4、MYSQL配置最佳实践
一、高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的状况下,这些功能极可能将数据库拖死,业务逻辑放到服务层具有更好的扩展性,可以轻易实现“增机器就加性能”
二、参考:
阿里巴巴Java开发手册
58到家数据库30条军规解读
http://zhuanlan.51cto.com/art/201702/531364.htm