MariaDB数据库主从架构和配置优化

                          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、主从复制

一、一主一从

image.png

二、一主多从

image.png

三、主从复制原理

主服务器数据更新时,会产生二进制日志,以后经过slave服务线程(线程1)读取二进制日志,而且和从服务器的IO Thread(线程2)传输二进制日志,写入中继日志relay log,接着从服务器经过SQL Thread的线程(线程3)读取中继日志中SQL语句并写入数据库中,从而实现了主从复制

要求主服务器必须启动二进制日志,若是从服务器开本身的从服务器,也须要开启二进制日志

用户访问量大时,主从复制会有延迟

四、读写分离方法:MySQL垂直分区

image.png

其余信息、用户信息、消息信息各放各的服务器,数据表之间没法join,须要结合软件开发来实现表之间的链接

五、读写分离方法:MySQL水平分片

image.png

仍然须要配合业务部门的软件开发来实现

六、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复制模型

image.png

4、实现主从复制(版本最好同样)

主节点配置:

一、 启用二进制日志

    [mysqld]

    log_bin

二、为当前节点设置一个全局唯一的ID号

    [mysqld]

    server_id=#

    log-basename=master 可选项,设置datadir中日志名称,确保不依赖主机名

三、建立有复制权限的用户帐号

    GRANT REPLICATION SLAVE ON *.* TO 'repluser'@'HOST' IDENTIFIED BY 'replpass';image.png

从节点配置:

一、启动中继日志

    [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]image.png

    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

spacer.gifimage.png

十4、MYSQL配置最佳实践

一、高并发大数据的互联网业务,架构设计思路是“解放数据库CPU,将计算转移到服务层”,并发量大的状况下,这些功能极可能将数据库拖死,业务逻辑放到服务层具有更好的扩展性,可以轻易实现“增机器就加性能”

二、参考:

    阿里巴巴Java开发手册

    58到家数据库30条军规解读

    http://zhuanlan.51cto.com/art/201702/531364.htm

相关文章
相关标签/搜索