数据库应用——Atlas代理MySQL集群实现读写分离
Posted 烈火吞噬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库应用——Atlas代理MySQL集群实现读写分离相关的知识,希望对你有一定的参考价值。
Atlas代理mysql集群实现读写分离
一、Atlas简介和架构
- Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它是在mysql-prox 0.8.2版本的基础上,对其进行了优化,增加了一些新的功能特性。360内部使用Atlas运行的mysql业务,每天承载的读写请求数达几十亿条。
- Atlas是一个位于应用程序与MySQL之间中间件。在后端DB看来,Atlas相当于连接它的客户端,在前端应用看来,Atlas相当于一个DB。Atlas作为服务端与应用程序通讯,它实现了MySQL的客户端和服务端协议,同时作为客户端与MySQL通讯。它对应用程序屏蔽了DB的细节,同时为了降低MySQL负担,它还维护了连接池。Atlas的整体架构,可参考下面这两幅图:
1.1 环境准备
IP地址 | 主机参数 |
---|---|
atlas_agent | 192.168.100.10 |
mysql_master_node01 | 192.168.100.20 |
mysql_master_node02 | 192.168.100.21 |
mysql_slave_node01 | 192.168.100.11 |
mysql_slave_node02 | 192.168.100.12 |
#MySQL主从节点安装MySQL5.7
yum -y install mysql-community-server*
#启动MySQL
systemctl start mysqld
#查找MySQL初始密码并进行修改
grep password /var/log/mysqld.log
mysqladmin -uroot -p'g<jrr-jrU8-D' password 'Pakho@611'
1.2 配置时间服务器
#建立时间同步环境,在主节点上搭建时间同步服务器
[root@mysql_master_node01 ~]# yum -y install ntp
#配置NTP
[root@mysql_master_node01 ~]# vim /etc/ntp.conf
server 127.127.1.0
Fudge 127.127.1.0 stratum 8 #注释原有pool下的server配置,设置时区为+08区
#重启服务并设置为开机启动
[root@mysql_master_node01 ~]# systemctl restart ntpd && systemctl enable ntpd
#在其余节点上进行时间同步
yum -y install ntpdate
ntpdate 192.168.100.20
二、主服务器配置
2.1 master节点1的配置
#启动二进制日志
[root@mysql_master_node01 ~]# vim /etc/my.cnf
[mysqld]
log_bin #开启二进制目录
server-id=1 #指明服务器ID
gtid_mode=ON
enforce_gtid_consistency=1
[root@mysql_master_node01 ~]# systemctl restart mysqld #重启以使配置生效
#登录MySQL授权复制用户
[root@mysql_master_node01 ~]# mysql -uroot -p
mysql> grant replication slave,replication client on *.* to 'myslave'@'192.168.100.%' identified by 'Pakho@0403';
#该动作并不是集群中必要的动作,是一次授权行为,该账户仅用于集群同步时使用
#replication:复制
mysql> flush privileges;
#设置对应主服务器
mysql> change master to
-> master_host='192.168.100.21',
-> master_user='myslave',
-> master_password='Pakho@0403',
-> master_auto_position=1; #自动进行位置记录
mysql> start slave;
mysql> show slave status\\G
2.2 master节点2的配置
[root@mysql_master_node02 ~]# vim /etc/my.cnf
[mysqld]
log_bin #开启二进制目录
server-id=2 #指明服务器ID
gtid_mode=ON
enforce_gtid_consistency=1
[root@mysql_master_node02 ~]# systemctl restart mysqld #重启以使配置生效
#登录MySQL授权复制用户
[root@mysql_master_node02 ~]# mysql -uroot -p
mysql> grant replication slave,replication client on *.* to 'myslave'@'192.168.100.%' identified by 'Pakho@0403';
mysql> flush privileges;
#设置对应主服务器
mysql> change master to
-> master_host='192.168.100.20',
-> master_user='myslave',
-> master_password='Pakho@0403',
-> master_auto_position=1; #自动进行位置记录
mysql> start slave;
mysql> show slave status\\G
2.3 主服务器配置完成后的测试
# master_node01建表,node02查看
mysql> create database master;
# master_node02建表,node01查看
mysql> create table Y2101(id int);
双方同步成功,双主设置完成!
三、从服务器配置
#同步现有数据库并发送至从服务器
[root@mysql_master_node01 ~]# mysqldump -p'Pakho@611' --all-databases --single-transaction --master-data=2 --flush-logs > mmss-mysql-all.sql
#所有的库,保持数据可用性,不关机的备份 InnoDB一致性服务可用性,注释掉二进制日志记录,切断日志重定向到备份文件
[root@mysql_master_node01 ~]# scp -r mmss-mysql-all.sql 192.168.100.11:/tmp
[root@mysql_master_node01 ~]# scp -r mmss-mysql-all.sql 192.168.100.12:/tmp
3.1 slave节点1的配置
#从服务器数据还原
[root@mysql_slave_node01 ~]# mysql -uroot -p'Pakho@611' </tmp/mmss-mysql-all.sql
#配置MySQL配置文件
[root@mysql_slave_node01 ~]# vim /etc/my.cnf
[mysqld]
server-id=3
gtid_mode=ON #GTID开启
enforce_gtid_consistency=1 #开启自动协商ID
master-info-repository=TABLE #将主服务器的信息存在表,更安全
relay-log-info-repository=TABLE #把中继日志也存在表里,更安全
[root@mysql_slave_node01 ~]# systemctl restart mysqld #重启以配置生效
mysql> change master to
-> master_host='192.168.100.20', #改变主服务器
-> master_user='myslave', #拷贝时所使用的用户
-> master_password='Pakho@0403', #账号的密码
-> master_auto_position=1 #自动进行位置记录
-> for channel '192.168.100.20'; #第一通道
mysql> change master to
-> master_host='192.168.100.21',
-> master_user='myslave',
-> master_password='Pakho@0403',
-> master_auto_position=1
-> for channel '192.168.100.21'; #第二通道
mysql> start slave; #启动从服务器
mysql> show slave status\\G
3.1 slave节点2的配置
#从服务器数据还原
[root@mysql_slave_node02 ~]# mysql -uroot -p'Pakho@611' </tmp/mmss-mysql-all.sql
#配置MySQL配置文件
[root@mysql_slave_node02 ~]# vim /etc/my.cnf
[mysqld]
server-id=4
gtid_mode=ON #GTID开启
enforce_gtid_consistency=1 #开启自动协商ID
master-info-repository=TABLE #将主服务器的信息存在表,更安全
relay-log-info-repository=TABLE #把中继日志也存在表里,更安全
[root@mysql_slave_node02 ~]# systemctl restart mysqld #重启以配置生效
[root@mysql_slave_node02 ~]# mysql -uroot -p
mysql> change master to
-> master_host='192.168.100.20', #改变主服务器
-> master_user='myslave', #拷贝时所使用的用户
-> master_password='Pakho@0403', #账号的密码
-> master_auto_position=1 #自动进行位置记录
-> for channel '192.168.100.20'; #第一通道
mysql> change master to
-> master_host='192.168.100.21',
-> master_user='myslave',
-> master_password='Pakho@0403',
-> master_auto_position=1
-> for channel '192.168.100.21'; #第二通道
mysql> start slave; #启动从服务器
mysql> show slave status\\G
3.3 从服务器配置完成后的测试
#插入数据后分别进入从服务器查看数据
[root@mysql_master_node01 ~]# mysql -uroot -p'Pakho@611' -e 'insert into master.Y2101 values (20)';
[root@mysql_master_node02 ~]# mysql -uroot -p'Pakho@611' -e 'insert into master.Y2101 values (21)';
四、Atlas的配置
4.1 下载并安装Atlas
#下载Atlas
[root@atlas_agent ~]# wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
#安装Atlas
[root@atlas_agent ~]# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm
- 安装完成后会默认在
/usr/local/mysql-proxy
下生成4个文件夹,以及需要配置的文件bin
目录下放的都是可执行文件encrypt
是用来生成MySQL密码加密的,在配置的时候会用到mysql-proxy
是MySQL自己的读写分离代理mysql-proxyd
是360的,后面有个“d”,服务的启动、重启、停止。都是用他来执行的
conf
目录下放的是配置文件test.cnf
只有一个文件,用来配置代理的,可以使用vim来编辑
lib
目录下放的是一些包,以及Atlas的依赖log
目录下放的是日志,如报错等错误信息的记录
4.2 配置读写分离
#配置4台服务器节点开放权限给Atlas,四台服务器同时操作
mysql> grant all on *.* to test@'192.168.100.%' identified by 'Admin@123';
mysql> flush privileges;
#加密用户密码
[root@atlas_agent ~]# /usr/local/mysql-proxy/bin/encrypt Admin@123
Tw8uck69VjyTZ6zxvGQr9A==
#编辑test.cnf配置文件
[root@atlas_agent ~]# vim /usr/local/mysql-proxy/conf/test.cnf
[mysql-proxy]
#带#号的为非必需的配置项目
#管理接口的用户名
admin-username = user
#管理接口的密码
admin-password = pwd
#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.100.20:3306,192.168.100.21:3306
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.100.11:3306@1,192.168.100.12@1
#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = test:Tw8uck69VjyTZ6zxvGQr9A==
#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1234
#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:2345
4.3 启动Atlas软件
#配置无误后,启动Atlas软件
[root@atlas_agent ~]# /usr/local/mysql-proxy/bin/mysql-proxyd test start
OK: MySQL-Proxy of test is started
#关闭软件
/usr/local/mysql-proxy/bin/mysql-proxyd test stop
4.4 测试Atlas代理MySQL
#安装MySQL
[root@atlas_agent ~]# yum -y install mysql-community-server*
#用管理账号user登录2345管理接口IP和端口
[root@atlas_agent ~]# mysql -h 127.0.0.1 -P 2345 -uuser -ppwd
#查看帮助
mysql> select * from help;
#查看服务器集群中的服务器状态
mysql> select * from backends;
#通过代理访问Mysql
[root@atlas_agent ~]# mysql -h192.168.100.10 -utest -p'Admin@123' -P1234
#查询
mysql> select * from master.Y2101;
以上是关于数据库应用——Atlas代理MySQL集群实现读写分离的主要内容,如果未能解决你的问题,请参考以下文章