登 录
注 册
< 数 据 库
MySQL
ClickHouse
ES
Doris
MongoDB
Redis
其他DB
AB复制实例
读写分离架构
数据备份恢复
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
安全常识
一文读懂SSO
当前位置:
首页
>>
MySQL
>>
读写分离架构
读写分离架构
2020-07-04 22:38:44 星期六 阅读:2050
![](/static/images/article_images/1693739281.034254.jpeg) 现在大型的电子商务系统,在数据库层面大都采用读写分离技术,就是一个Master数据库,多个Slave数据库。 Master库负责数据更新,Slave库当然负责非实时数据查询。 因为在实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验度。 我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力。 采用读写分离技术的目标:`有效减轻Master库的压力,又可以把用户查询数据的请求分发到不同的Slave库,从而保证系统的健壮性`。 ####常用实现读写分离的方法 #####开发在代码中写死 #####MySQL自带工具包 MySQL自带的官方产品工具mysql-proxy,底层非常不稳定,非常容易崩,比如:主库坏了,从库应该可以提供查询工作。但是使用该分离工具,只要主库坏了,从库默认也坏了。 #####第三方工具 - Atlas cobar TDDL mysql-proxy 阿米巴 Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。 它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。 目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条。 #### Atlas的主要功能 >读写分离 从库负载均衡 IP过滤 SQL语句黑白名单 自动分表 ####Atlas实例(全部在主库操作) ``` # 给root用户授权 GRANT ALL PRIVILEGES ON *.* TO "root"@"%" identified by "xxx"; FLUSH PRIVILEGES; ``` 安装Atlas ``` yum install -y gcc* rpm -ivh Atlas-2.2.1.el5.x86_64.rpm #【rpm包直接安装】 rpm -ql Atlas #【查看安装路径】 ``` 找到配置文件路径: /usr/local/mysql-proxy/conf/test.cnf ,然后执行: ``` # 【去乱码并且生成新文件,过滤垃圾提示符】 grep -v "^#" /usr/local/mysql-proxy/conf/test.cnf |grep -v "^$" > /usr/local/mysql-proxy/conf/user mv test.cnf test.cnf.old cat /usr/local/mysql-proxy/conf/lipengfei > /usr/local/mysql-proxy/conf/test.cnf rm -rf /usr/local/mysql-proxy/conf/user #【xxxx是MySQL root 的密码,把密码加密】 /usr/local/mysql-proxy/bin/encrypt xxxx TWbz0dlu35U= ``` 清空该配置文件(test.cnf)里的内容,然后自己配置如下: `vi /usr/local/mysql-proxy/conf/test.cnf` ``` [mysql-proxy] plugins = admin,proxy admin-username=admin admin-password=admin admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua proxy-backend-addresses = 192.168.8.100:3306 proxy-read-only-backend-addresses = 192.168.8.101:3306,192.168.8.102:3306 pwds = root:TWbz0dlu35U= daemon = true keepalive = true event-threads = 8 log-level = message log-path = /usr/local/mysql-proxy/log instance = test proxy-address = 0.0.0.0:1234 admin-address = 0.0.0.0:5678 charset = utf8 ``` 查看监听端口并开启服务 ``` netstat -tanlp | grep mysql /usr/local/mysql-proxy/bin/mysql-proxyd test start /usr/local/mysql-proxy/bin/mysql-proxyd test stop ``` 登录管理 ``` #【在主库或者其他从库登录Atlas主机管理控制台】 mysql -h 192.168.8.103 -P 5678 -u admin -padmin ``` ``` # 正常通过代理操作 mysql -h 192.168.8.103 -P 1234 -u root -pxxx SHOW VARIABLES LIKE "server_id"; mysql> select * from backends; +-------------+-------------------+-------+------+ | backend_ndx | address | state | type | +-------------+-------------------+-------+------+ | 1 | 192.168.0.42:3306 | down | rw | | 2 | 192.168.0.44:3306 | down | ro | | 3 | 192.168.0.43:3306 | down | ro | +-------------+-------------------+-------+------+ 3 rows in set (0.00 sec) ``` 5678端口:是Atlas的管理接口,此接口提供了查看mysql状态,设置上线、下线后端mysql服务器 访问方法使用mysql命令 `mysql -h 10.142.132.50 -P2345 -u admin -p"admin"` 这里的用户名密码是上面配置文件中的admin-username = admin、admin-password = admin 下面是管理接口的使用帮助 ``` SELECT * FROM help; # 查看帮助信息 SELECT * FROM backends; # 查看后端主机状态 SET OFFLINE $backend_id # 下线一台主机,$backend_id == SELECT * FROM backends;查出来的ID SET ONLINE $backend_id # 上线一台主机 ADD MASTER $backend # 添加一台master节点,如: ADD MASTER 10.57.1.131; ADD SLAVE $backend # 添加一台slave节点,如 : ADD SLAVE 10.57.1.132; REMOVE BACKEND $backend_id # 删除一个节点 ``` 自动读写分离挺好,但有时候我写完马上就想读,万一主从同步延迟怎么办? SQL语句前增加 /*master*/ 就可以将读请求强制发往主库 ####将atlas设置成服务,并实现开机自动启动 ``` cp /tmp/atlas /etc/rc.d/init.d/atlas chmod +x /etc/rc.d/init.d/atlas chkconfig --add atlas chkconfig atlas on ``` ``` #!/bin/sh #description: atlas autorun #your instance name instance_name=test case "$1" in "start") /usr/local/mysql-proxy/bin/mysql-proxyd $instance_name start ;; "stop") /usr/local/mysql-proxy/bin/mysql-proxyd $instance_name stop ;; "restart") /usr/local/mysql-proxy/bin/mysql-proxyd $instance_name restart ;; "status") /usr/local/mysql-proxy/bin/mysql-proxyd $instance_name status ;; *) echo "Usage: service atlas start/stop/restart/status " ;; esac ``` 使用命令如下 ``` service atlas start service atlas stop service atlas status service atlas restart ``` ####监控atlas脚本 `cat /usr/local/mysql-proxy/bin/monitor_atlas.sh` ``` #!/bin/bash if [ $(ps -ef |grep "mysql-proxy" |grep -v "grep" |wc -l) -eq "0" ];then /usr/local/mysql-proxy/bin/mysql-proxyd test start sleep 5 if [ $(ps -ef |grep "mysql-proxy" |grep -v "grep" |wc -l) -eq "0" ];then killall -9 keepalived service network restart fi fi ``` `chmod +x /usr/local/mysql-proxy/bin/monitor_atlas.sh`