作者:禅与计算机程序设计艺术 1.简介 2020年已经过去了很多年了,随着互联网公司的发展,网站流量日益增长,网站的负载越来越高。为了应对网站的访问压力,现在大多数公司都采用集群化部署的方式,将应用服
作者:禅与计算机程序设计艺术
2020年已经过去了很多年了,随着互联网公司的发展,网站流量日益增长,网站的负载越来越高。为了应对网站的访问压力,现在大多数公司都采用集群化部署的方式,将应用服务部署到多个服务器上,利用这些服务器之间的网络通信,提升网站的处理能力和响应速度。Mysql作为一个开源关系型数据库,在集群环境下运行非常出色,但如何部署到云端,并提供高可用性,是一个值得研究的问题。本文主要基于AWS平台,详细阐述了如何利用AWS的EC2, RDS等资源快速构建起具备高可用性的mysql集群。
在大数据、容器化、微服务架构等新兴技术的影响下,企业应用系统越来越复杂,应用服务越来越多,如何有效地部署应用服务和数据库成为企业架构的重要问题之一。分布式存储系统(如hdfs)、云计算平台(如AWS ECS/EKS)等已经成为企业架构的标配,而对于关系型数据库,传统的单机部署方式已不适用,需要进行集群化部署才能实现高可用性。当然,部署数据库集群不是一件容易的事情,首先,需要有足够的硬件资源,其次,还需要考虑数据库的配置,特别是分区表的配置、读写分离的设置等。此外,需要考虑数据库的安全防护措施,如备份策略、监控告警机制等,确保数据的完整性、可用性和安全性。
为了部署高可用的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高可用集群为例,来讲述部署过程及关键配置参数。
安装MySQL的源,编辑/etc/profile文件,添加以下内容:
export PATH=/usr/local/mysql/bin:$PATH
执行source /etc/profile命令使得环境变量生效。
使用阿里云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
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
执行如下命令:
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时,可以选取多种不同的备份频率,如每周一次,每月一次等,还可以选择保留的时间长度,一般选择七天或者三十天的备份,以满足不同的需求。
yum install nginx -y
将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;
[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连接。
systemctl start nginx
mysqlrouter start
浏览器输入http://
Galera Cluster是一个开源的MySQL数据库集群解决方案,它使用的是MariaDB数据库引擎,具有高度可用、数据完整性、强一致性和水平扩展性等特性。本文中,我们只介绍Galera Cluster的部署方法,如果你对MariaDB更熟悉的话,也可以参考MariaDB官网进行相关配置,但可能不会遇到一些坑。
yum install galera-3 -y
修改/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
参数含义如下:
执行show variables like ‘%version%’;确认MySQL版本是否正确。
systemctl start mysqld
执行如下命令验证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
2024-10-23
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
2024-10-22
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0