数据库篇(8)—数据库主从架构和配置优化(文字篇)

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

--------------------------------------------------------------------------------------------------------------------------------------------


一、MySQL复制

1、扩展方式:Scale UP,Scale Out

2、MySQL的扩展

    读写分离

    复制:每个节点都有相同的数据集

    向外扩展

    基于二进制日志发生更改,实现主从复制

    单向复制,由主到从复制

3、复制的功用

数据分布、负载均衡读、备份、高可用和故障切换、MySQL升级测试

二、MySQL读写分离

    读写分离应用:

    mysql-proxy:Oracle

    Atlas:奇虎,基于mysql-proxy

    DBProxy:美团

    Cetus:网易

    Amoeba

    Cobar:阿里巴巴,基于Amoeba的升级版

    Mycat:基于Cobar

    ProxySQL

三、主从复制

1、一主一从

image.png

2、一主多从

image.png

3、主从复制原理

主服务器数据更新,写入二进制日志,之后通过slave服务线程(线程1)将自己的二进制日志读取,和从服务器的IO Thread(线程2)传输二进制日志,写入中继日志relay log,接着从服务器通过SQL Thread的线程(线程3)写入数据库中,实现了主从复制

要求主服务器必须启动二进制日志,如果从服务器开自己的从服务器,也需要开启二进制日志

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

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

image.png

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

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

image.png

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

6、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

7、MySQL复制模型

image.png

四、实现主从复制(版本最好一样)

主节点配置:

1、 启用二进制日志

    [mysqld]

    log_bin

2、为当前节点设置一个全局惟一的ID号

    [mysqld]

    server_id=#

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

3、创建有复制权限的用户账号

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

从节点配置:

1、启动中继日志

    [mysqld]

    server_id=# 为当前节点设置一个全局惟的ID号

    relay_log=relay-log relay log的文件路径,默认值hostname-relay-bin

    relay_log_index=relay-log.index 默认值hostname-relay-bin.index

2、 使用有复制权限的用户账号连接至主服务器,并启动复制线程,记不住输入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];

3、如果主节点已经运行了一段时间,且有大量数据时,如何配置并启动slave节点

    通过备份恢复数据至从服务器

    复制起始位置为备份时,二进制日志文件及其POS

    如果要启用级联复制,需要在从服务器启用以下配置,及主---从1----从2,从3中从1需要加的内容

    [mysqld]

    log_bin

    log_slave_updates

复制架构中应该注意的问题:

    1、限制从服务器为只读

    在从服务器上设置read_only=ON

    注意:此限制对拥有SUPER权限的用户均无效

    阻止所有用户, 包括主服务器复制的更新

    mysql> FLUSH TABLES WITH READ LOCK;

2、RESET SLAVE

    在从服务器清除master.info ,relay-log.info, relay log ,开始新的relay log ,注意:需要先STOP SLAVE

    RESET SLAVE ALL 清除所有从服务器上设置的主服务器同步信息如:PORT, HOST, USER和 PASSWORD 等

3、sql_slave_skip_counter = N 从服务器忽略几个主服务器的复制事件,global变量,复制时候产生错误,是否跳过错误,默认值是0,关闭

4、如何保证主从复制的事务安全

    参看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到磁盘

五、半同步复制

半同步复制实现:一主多从,如果至少一个从服务器同步成功,主服务器将会向客户端返回成功信息;或者所有从服务器长时间没有同步,超过了限定时长,主服务器也将会向客户端返回成功信息

1、主服务器配置:

    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%‘;

2、从服务器配置:

    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

六、

1、复制过滤器:

    让从节点仅复制指定的数据库,或指定数据库的指定表

2、两种实现方式:

    (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=

3、基于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 01 >slave.crt

    证书申请完毕,将生成的文件放到对应的目录下

七、复制的监控和维护

1、 清理日志

    PURGE { BINARY | MASTER } LOGS { TO 'log_name' | BEFORE datetime_expr }

    RESET MASTER

    RESET SLAVE

2、 复制监控

    SHOW MASTER STATUS

    SHOW BINLOG EVENTS

    SHOW BINARY LOGS

    SHOW SLAVE STATUS

    SHOW PROCESSLIST

3、 从服务器是否落后于主服务

    Seconds_Behind_Master: 0

4、 如何确定主从节点数据是否一致

    percona-tools

5、 数据不一致如何修复

    删除从数据库,重新复制

八、高可用

1、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

2、MHA: Master High Availability,对主节点进行监控,可实现自动故障转移至其它从节点;通过提升某一从节点为新的主节点,基于主从复制实现,还需要客户端配合实现,目前MHA主要支持一主多从的架构,要搭建MHA,要求一个复制集群中必须最少有三台数据库服务器,一主二从,即一台充当master,一台充当备用master,另外一台充当从库,出于机器成本的考虑,淘宝进行了改造,目前淘宝TMHA已经支持一主一从

    官网:https://code.google.com/archive/p/mysql-master-ha/

3、Galera Cluster:wsrep(MySQL extended with the Write Set Replication)

    通过wsrep协议在全局实现复制;任何一节点都可读写,不需要主从复制,实现多主读写

九、MHA集群架构

工作原理

1、从宕机崩溃的master保存二进制日志事件(binlog events)

2、识别含有最新更新的slave

3、应用差异的中继日志(relay log)到其他的slave

4、应用从master保存的二进制日志事件(binlog events)

5、提升一个slave为新的master

6、使其他的slave连接新的master进行复制

实验,建议centos7上做,不要在centos6做

1、准备初步环境,四台主机 ,1主2从1管理器

2、主机之间实现基于key实现,时间需要同步

随便一台主机,ssh-keygen,ssh-copy-id,在自己主机生成公钥,将此目录拷贝至每个设备对应的/root,实现设备之间互通基于key验证

3、主服务器上:

    vim /etc/my.cnf

    [mysqld]

    log-bin

    server_id=1

    skip_name_resolve=1   --------->必须项

4、创建账户

    复制账号: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';

5、从服务器改文件

从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   --------->必须项

    改好后重启服务

6、两台从服务器: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开启线程

7、基于epel源安装工具

    管理节点安装manager工具包:mha4mysql-manager、mha4mysql-node

    被管理节点安装node工具包:mha4mysql-node

8、修改管理主机配置文件

    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 -------->从服务器

9、mha验证启动

    masterha_check_ssh --conf=/etc/mastermha/app1.cnf      --------->8的配置文件建哪了就写哪

    masterha_check_repl --conf=/etc/mastermha/app1.cnf 同上

10、启动执行

    masterha_manager --conf=/etc/mastermha/app1.cnf 该步骤前台执行,确保安全可以加hub

11、测试

    主机宕机后会依旧执行程序,系统自动更换主服务器

十、Galera Cluster

1、集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版本,分别是Percona Xtradb Cluster及MariaDB Cluster,Galera本身是具有多主特性的,即采用multi-master的集群架构,是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案

2、特点

    多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的

    同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失

    并发复制:从节点APPLY数据时,支持并行执行,更好的性能

    故障切换:在出现数据库故障时,因支持多点写入,切换容易

    热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小

    自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,Galera Cluster会自动拉取在线节点数据,最终集群会变为一致

    对应用透明:集群的维护,对应用程序是透明的

3、在一个服务器发生事务,在另一台服务器也会发生同样的事务

4、Galera Cluster包括两个组件

    Galera replication library (galera-3)

    WSREP:MySQL extended with the Write Set Replication

5、WSREP复制实现:percona-cluster、MariaDB-Cluster

6、注意:都至少需要三个节点,不能安装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

7、编辑配置文件

    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'

8、其它设备的配置文件按照刚才配置文件格式进行更改,或者覆盖

9、首次启动时,需要初始化集群,在其中一个节点上执行命令

    /etc/init.d/mysql start --wsrep-new-cluster

10、其它主机正常启动其它节点

    service mysql start   ----------->注意mysql不带d

11、查看集群中相关系统变量和状态变量

    SHOW VARIABLES LIKE 'wsrep_%'\G    ----->服务器变量

    SHOW STATUS LIKE 'wsrep_%'\G    ------>服务器当前状态

    SHOW STATUS LIKE 'wsrep_cluster_size'\G

12、测试

十一、复制的问题和解决方案:

1、数据损坏或丢失

    Master: MHA + semi repl

    Slave: 重新复制

2、混合使用存储引擎

    MyISAM:不支持事务

    InnoDB: 支持事务

3、不惟一的server id

    重新复制

4、复制延迟

    需要额外的监控工具的辅助

    一从多主:mariadb10版后支持

    多线程复制:对多个数据库复制

十二、性能衡量指标

1、数据库服务衡量指标:

    qps: query per second

    tps: transaction per second

2、压力测试工具:

    mysqlslap

    Sysbench:功能强大,https://github.com/akopytov/sysbench

    tpcc-mysql

    MySQL Benchmark Suite

    MySQL super-smack

    MyBench

十三、生产环境my.cnf配置示例

硬件:内存32G

image.png

十四、MYSQL配置最佳实践

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

2、参考:

    阿里巴巴Java开发手册

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

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

猜你喜欢

转载自blog.51cto.com/13873498/2299825