MySQL——Atlas代理MySQL集群实现读写分离

Posted Pakho`

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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_agent192.168.100.10
mysql_master_node01192.168.100.20
mysql_master_node02192.168.100.21
mysql_slave_node01192.168.100.11
mysql_slave_node02192.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目录下放的都是可执行文件
      1. encrypt是用来生成MySQL密码加密的,在配置的时候会用到
      2. mysql-proxy是MySQL自己的读写分离代理
      3. mysql-proxyd是360的,后面有个“d”,服务的启动重启停止。都是用他来执行的
    • conf目录下放的是配置文件
      1. 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;

在这里插入图片描述

以上是关于MySQL——Atlas代理MySQL集群实现读写分离的主要内容,如果未能解决你的问题,请参考以下文章

Atlas+mysql主主集群实现读写分离

采用Atlas实现MySQL读写分离

[记录]MySQL读写分离(Atlas和MySQL-proxy)

Atlas做mysql读写分离

nginx集群综合项目

实现MySQL读写分离 部署集群基础环境(有图)