返回顶部
首页 > 资讯 > 数据库 >Deploying a Highly Available MySQL Cluster
  • 293
分享到

Deploying a Highly Available MySQL Cluster

摘要

作者:禅与计算机程序设计艺术 1.简介 2020年已经过去了很多年了,随着互联网公司的发展,网站流量日益增长,网站的负载越来越高。为了应对网站的访问压力,现在大多数公司都采用集群化部署的方式,将应用服

作者:禅与计算机程序设计艺术

1.简介

2020年已经过去了很多年了,随着互联网公司的发展,网站流量日益增长,网站的负载越来越高。为了应对网站的访问压力,现在大多数公司都采用集群化部署的方式,将应用服务部署到多个服务器上,利用这些服务器之间的网络通信,提升网站的处理能力和响应速度。Mysql作为一个开源关系型数据库,在集群环境下运行非常出色,但如何部署到云端,并提供高可用性,是一个值得研究的问题。本文主要基于AWS平台,详细阐述了如何利用AWS的EC2, RDS等资源快速构建起具备高可用性的mysql集群。

为什么要部署Mysql集群?

大数据容器化、微服务架构等新兴技术的影响下,企业应用系统越来越复杂,应用服务越来越多,如何有效地部署应用服务和数据库成为企业架构的重要问题之一。分布式存储系统(如hdfs)、云计算平台(如AWS ECS/EKS)等已经成为企业架构的标配,而对于关系型数据库,传统的单机部署方式已不适用,需要进行集群化部署才能实现高可用性。当然,部署数据库集群不是一件容易的事情,首先,需要有足够的硬件资源,其次,还需要考虑数据库的配置,特别是分区表的配置、读写分离的设置等。此外,需要考虑数据库的安全防护措施,如备份策略、监控告警机制等,确保数据的完整性、可用性和安全性。

MySQL集群架构与功能

为了部署高可用的MySQL集群,通常会选择主从复制模式。在这种模式下,集群中存在一个主节点(Primary),负责处理所有的写入请求,并将数据更新同步给其他节点,称为备库(Replica)。当主节点出现故障时,由另一台服务器充当热备机接管,保证集群始终处于正常工作状态。因此,MySQL集群包含以下几个重要组件:

MySQL Server: MySQL Server安装在每台服务器上,提供存储和查询功能。每个Server可以承载多个Schema,每个Schema又可以有多个Database。
2.MySQL Router: MySQL Router是一个轻量级应用程序,它可以用来管理MySQL Cluster。它可以通过接受来自客户端的连接,将请求路由至合适的Server上,并执行相应的SQL语句。Router提供健康检查功能,确保Cluster中的所有Server正常运行。
3.VIP(Virtual IP): VIP是在多个Server之间共享的一个IP地址。当某个Server发生故障切换时,Router可以根据健康检查结果,自动地将流量转移至另一台Server上。
4.Galera Cluster: Galera Cluster是一个高可用性的分布式数据库,由多个Server组成。它通过复制协议来确保数据的一致性和高可用性。
5.MySQL Query Cache: 查询缓存可以提高MySQL的查询性能,减少数据库服务器的负担。当相同的查询被重复执行时,缓存可以避免重新解析SQL语句。Query Cache可以在读请求到来前,先在内存中查找,如果没有找到,才会访问磁盘。
6.MySQL Replication Manager: MySQL Replication Manager是一个WEB界面,用于管理MySQL Replication。它提供了创建、停止、删除复制任务的功能,同时可以查看各个节点的复制状态。
7.MySQL Backup and Recovery Service: MySQL Backup and Recovery Service是一个Web界面,用于备份和恢复MySQL数据库。它支持手动备份和定时备份,还可以从S3、EBS或其他云存储空间恢复数据。

案例实施方案

下面,我们以在AWS云上部署MySQL高可用集群为例,来讲述部署过程及关键配置参数。

1.准备工作

  • 一台或者多台拥有ssh登录权限的Centos linux服务器;
  • VPC网络配置:选择一块vpc网络配置,然后创建一个子网,再为该子网创建对应的安全组,以便于后续使用mysql server连接;
  • EC2 Key Pair:在aws控制台创建一个密钥对,并下载私钥文件,以便于本地登录服务器;
  • S3 Bucket:创建一个s3 bucket用于存储mysql backup,这个bucket需要和之前创建的key pair所属的用户进行绑定;
  • MySQL官方镜像:从MySQL官网下载mysql tar包,上传至s3 bucket中;
  • EC2 Instance Configuration:根据自己的需求配置EC2 instance,包括类型、数量、存储大小、网络、安全组等;

2.部署MySQL服务器

配置环境变量

安装MySQL的源,编辑/etc/profile文件,添加以下内容:

export PATH=/usr/local/mysql/bin:$PATH

执行source /etc/profile命令使得环境变量生效。

设置yum源

使用阿里云yum源,修改/etc/yum.repos.d/mysql.repo文件如下:

[mysql-commUnity]name=MySQL 5.7 Community Serverbaseurl=Http://mirrors.aliyun.com/mysql/yum/mysql-5.7-community/el/7/$basearch/enabled=1gpGCheck=1repo_gpgcheck=1gpgkey=http://mirrors.aliyun.com/mysql/RPM-GPG-KEY-mysql[mysql-community-release]name=MySQL 5.7 Community Server - Release packagebaseurl=http://mirrors.aliyun.com/mysql/yum/mysql-5.7-community/el/7/$basearch/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=http://mirrors.aliyun.com/mysql/RPM-GPG-KEY-mysql
安装mysql

yum install mysql-community-server -y

修改默认密码

执行如下命令:

grep 'temporary passWord' /var/log/mysqld.logsudo mysqladmin -u root password yourpasswordrm -rf /var/lib/mysql/ib_logfile* && systemctl restart mysqld
初始化集群配置

执行如下命令:

sudo mysql_install_db --user=mysql --datadir=/var/lib/mysql --basedir=/usr/local/mysql/ --ldata=/var/lib/mysql/mysql sudo /sbin/chkconfig mysqld onsudo service mysqld start
配置mysql参数

执行如下命令:

sed -i "s|bind-address.*|bind-address = 0.0.0.0|" /etc/my.cnfecho "skip-name-resolve" >> /etc/my.cnf
创建数据目录

执行如下命令:

mkdir /data1;mkdir /data2;chown -R mysql:mysql /data{1..2}echo "/data1:/data2" | sudo tee -a /etc/fstabmount -a
添加容灾备份策略

通过RDS for MySQL备份策略,可以设置多个不同时间段的备份策略,以保证数据的安全。创建RDS backup policy时,可以选取多种不同的备份频率,如每周一次,每月一次等,还可以选择保留的时间长度,一般选择七天或者三十天的备份,以满足不同的需求。

3.部署MySQL Router

安装Nginx

yum install nginx -y

配置nginx

将mysql router配置文件/etc/nginx/conf.d/mysqlrouter.conf修改如下:

upstream mysql {    server <ip>:<port> max_fails=3 fail_timeout=5s;    server <ip>:<port> max_fails=3 fail_timeout=5s;}proxy_cache_path /tmp/mysql_cache levels=1:2 keys_zone=mysql_cache:10m inactive=60m max_size=1g;server {    listen       80 default_server;    server_name  _;    location / {if ($request_method = 'POST') {    return 403;}set $sql_url '/$1';rewrite ^(/[^?]+)(\?.*)?$ $sql_url break;try_files $uri @backend;    }    location @backend {proxy_pass http://mysql;proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;client_max_body_size    100m;error_page   500 502 503 504  /50x.html;location = /50x.html {    root   html;}    }}cache_zone mysql_cache zone=mysql_cache:10m inactive=60m use_stale=error update=0 background_update=1;
配置mysqlrouter.conf
[mysqld]datadir=/data1port=3306log_bin=/var/lib/mysql/mysql-bin.logbinlog_fORMat=ROWserver_id=<unique id of the server>log-slave-updatesread_only=ONskip-name-resolvelower_case_table_names=1[mysqlrouter]app_read_timeout=300app_connect_timeout=300local_ip=<private ip address or public dns name>admin_addresses=127.0.0.1,localhostcluster_admin_access=SUPERbootstrapper_addresses=127.0.0.1,localhostdata_dir=/var/lib/mysqlrouterstats_report_interval=30report_host=<hostname where the reports will be sent to>report_interval=30disable_clusters_support=falseallow_ssl_connections=true

上面的app_read_timeout和app_connect_timeout分别表示客户端连接超时时间和等待响应超时时间,单位为秒。local_ip字段表示MySQL router所在的服务器的私有IP地址或公开DNS名称。cluster_admin_access字段的值为SUPER意味着允许mysqlrouter所在的服务器的管理员账户直接访问整个MySQL Cluster,注意不要把这个选项设置为NO,否则管理员账户将无法访问整个MySQL Cluster。bootstrapper_addresses字段表示Master服务器列表,也就是mysqlmaster所在的服务器的IP地址或主机名。data_dir字段表示MySQL router的配置文件所在路径,stats_report_interval字段表示向MySQL报告统计信息的间隔时间,单位为秒。report_host字段表示向哪台主机发送报告,report_interval字段表示报告发送的间隔时间,单位为秒。disable_clusters_support字段默认为false,表示开启MySQL Cluster支持;allow_ssl_connections字段默认为false,表示禁止SSL连接。

启动nginx和mysqlrouter

systemctl start nginx
mysqlrouter start

测试MySQL Router

浏览器输入http:///test ,如果返回显示“Connection success!”则表示测试成功。

4.部署Galera Cluster

Galera Cluster是一个开源的MySQL数据库集群解决方案,它使用的是MariaDB数据库引擎,具有高度可用、数据完整性、强一致性和水平扩展性等特性。本文中,我们只介绍Galera Cluster的部署方法,如果你对MariaDB更熟悉的话,也可以参考MariaDB官网进行相关配置,但可能不会遇到一些坑。

安装Galera Cluster依赖包

yum install galera-3 -y

配置Galera Cluster

修改/etc/my.cnf文件,在[mysqld]部分添加如下内容:

wsrep_provider=/usr/lib64/galera/libgalera_smm.sowsrep_cluster_address="gcomm://"wsrep_node_address=''wsrep_sst_auth=":"wsrep_slave_threads=1wsrep_certify_nonPK=1wsrep_max_ws_rows=131072wsrep_max_ws_row_size=1048576wsrep_debug=0wsrep_convert_LOCK_to_trx=0wsrep_retry_autocommit=1wsrep_auto_increment_control=1wsrep_drupal_282555_workaround=0binlog_format=ROWdefault-storage-engine=innodbinnodb_autoinc_lock_mode=2bind-address=0.0.0.0skip-name-resolvelower_case_table_names=1key_buffer_size=256Mmyisam_sort_buffer_size=256Mtmp_table_size=256Mwait_timeout=600interactive_timeout=600sort_buffer_size=256Kthread_stack=192Kjoin_buffer_size=128Kread_buffer_size=128Kread_rnd_buffer_size=256Klong_query_time=10slow_query_log=onlog_queries_not_using_indexes=onperformance_schema=offtransaction_isolation=READ-COMMITTEDinit_connect='SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci'character-set-server=utf8mb4collation-server=utf8mb4_general_cigtid_mode=ONenforce_gtid_consistency=ONexplicit_defaults_for_timestamp=ONaudit_log_file=/var/lib/mysql/audit.logaudit_log_format=%t@%u@%d %p [%r] %c %q %eback_log=1000sync_binlog=1expire_logs_days=10general_log=OFFgeneral_log_file=/var/lib/mysql/mysql.logsql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONserver_id=1binlog_direct_non_transactional_updates=ONskip_slave_start=ONslave_parallel_type=LOGICAL_CLOCKlog_slave_updates=ONdebug_sync_counter=100000000open_files_limit=65535table_definition_cache=4096table_open_cache=4096thread_cache_size=8query_cache_type=1query_cache_limit=1048576query_cache_size=262144thread_concurrency=10concurrent_insert=ALLinit_file=/etc/init.d/galera-healthcheckwsrep_notify_cmd=echo 'Node joined!'wsrep_sst_method=rsyncexpire_log_days=10rpl_stop_slave_timeout=30rpl_semi_sync_fragsize=50000relay_log=relay-binrelay_log_index=relay-bin.index

参数含义如下:

  • wsrep_provider: 指定Galera provider。
  • wsrep_cluster_address: 指定集群通讯地址。
  • wsrep_node_address: 指定当前节点的IP地址或主机名。
  • wsrep_sst_auth: 指定用户名和密码,用于访问其他节点上的sst备份文件。
  • wsrep_slave_threads: 指定galera线程数量,建议值为CPU核数的两倍。
  • wsrep_certify_nonPK: 指定是否只复制非主键索引的数据。
  • wsrep_max_ws_rows: 指定允许使用的最大行数。
  • wsrep_max_ws_row_size: 指定单行允许的最大字节数。
  • wsrep_debug: 指定调试级别。
  • wsrep_convert_LOCK_to_trx: 指定是否自动将InnoDB的表转换为事务
  • wsrep_retry_autocommit: 指定在部分错误情况下是否重试自动提交。
  • wsrep_auto_increment_control: 指定InnoDB表的自增ID控制策略。
  • wsrep_drupal_282555_workaround: 指定drupal数据库修复脚本的workaround。
  • binlog_format: 指定binlog格式。
  • default-storage-engine: 指定默认的存储引擎。
  • innodb_autoinc_lock_mode: 指定InnoDB auto increment lock mode。
  • bind-address: 指定MySQL bind地址。
  • skip-name-resolve: 不做域名解析。
  • lower_case_table_names: 大写表名小写。
  • key_buffer_size: 指定Innodb buffer pool的大小。
  • myisam_sort_buffer_size: 指定MyISAM排序缓存。
  • tmp_table_size: 指定临时表大小。
  • wait_timeout: 指定客户端连接超时时间。
  • interactive_timeout: 指定交互式客户端连接超时时间。
  • sort_buffer_size: 指定排序缓存大小。
  • thread_stack: 指定线程栈大小。
  • join_buffer_size: 指定连接缓冲区大小。
  • read_buffer_size: 指定读取缓冲区大小。
  • read_rnd_buffer_size: 指定随机IO缓冲区大小。
  • long_query_time: 指定慢日志阈值。
  • slow_query_log: 启用慢查询日志。
  • log_queries_not_using_indexes: 不使用索引时的查询记录到慢日志中。
  • performance_schema: 关闭MySQL性能评估工具
  • transaction_isolation: 指定事务隔离级别。
  • init_connect: 指定初始化连接命令。
  • character-set-server: 指定字符集。
  • collation-server: 指定比较规则集。
  • gtid_mode: 支持GTID。
  • enforce_gtid_consistency: 是否强制执行GTID一致性。
  • explicit_defaults_for_timestamp: 如果缺少TIMESTAMP列,则指定默认的TIMESTAMP值。
  • audit_log_file: 指定审计日志文件。
  • audit_log_format: 指定审计日志格式。
  • back_log: 指定内核缓冲区大小。
  • sync_binlog: 每次事务提交后,立即同步二进制日志。
  • expire_logs_days: 指定日志保存天数。
  • general_log: 是否启用全日志。
  • general_log_file: 指定全日志文件。
  • sql_mode: 指定SQL模式。
  • server_id: 指定唯一ID。
  • binlog_direct_non_transactional_updates: 指定无事务的UPDATE同步方式。
  • skip_slave_start: 当集群启动时跳过从库的启动过程。
  • slave_parallel_type: 从库并行类型,设置为LOGICAL_CLOCK。
  • log_slave_updates: 记录从库更新。
  • debug_sync_counter: 设置同步断点。
  • open_files_limit: 指定打开的文件描述符限制。
  • table_definition_cache: 指定表定义缓存。
  • table_open_cache: 指定表打开缓存。
  • thread_cache_size: 指定线程缓存。
  • query_cache_type: 指定查询缓存类型。
  • query_cache_limit: 查询缓存限制。
  • query_cache_size: 查询缓存大小。
  • thread_concurrency: 指定最大连接数。
  • concurrent_insert: 指定并发插入类型。
  • init_file: 初始化文件。
  • wsrep_notify_cmd: 指定通知命令。
  • wsrep_sst_method: 指定备份方式,这里设置为rsync。
  • expire_log_days: 设置日志过期天数。
  • rpl_stop_slave_timeout: 设置停止从库超时时间。
  • rpl_semi_sync_fragsize: 设置半同步fragent size。
  • relay_log: 设置中继日志文件。
  • relay_log_index: 设置中继日志索引文件。
检查MySQL版本

执行show variables like ‘%version%’;确认MySQL版本是否正确。

启动Galera Cluster

systemctl start mysqld

测试Galera Cluster

执行如下命令验证Galera Cluster的运行状况:

mysql -uroot -e "SHOW STATUS LIKE 'wsrep_%'"

返回类似如下内容表示Galera Cluster运行正常:

+-------------------+-------+| Variable_name      | Value |+-------------------+-------+| wsrep_apply_oooe   | 0     || wsrep_apply_oool   | 0     || wsreg_local_recv_queue_avg | 0 || wsrep_flow_control_paused | OFF || wsrep_cluster_size | 3     || wsrep_cluster_status | Primary || wsrep_connected | ON     || wsrep_ready | ON     || wsrep_thread_count | 2     |+-------------------+-------+

来源地址:https://blog.csdn.net/universsky2015/article/details/131971610

您可能感兴趣的文档:

--结束END--

本文标题: Deploying a Highly Available MySQL Cluster

本文链接: https://lsjlt.com/news/418460.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作