Gtid+MGR+atlas读写分离以及负载均衡高可用架构

MySQL5.7.24 Gtid+MGR+atlas读写分离以及负载均衡高可用架构

一.服务器环境介绍:

腾讯云的云主机安装360开源的mysql中间键Atlas
腾讯云机器的外网ip:119.29.97.131
沧州233测试物理机器的外网ip192.168.1.233(安全起见故意写成内网的ip,其实是外网ip)

二.mysqlGtid+MGR安装

参考博文地址:

三.中间键Atlas简介

(摘抄自https://github.com/Qihoo360/Atlas)

Atlas 是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平 台,每天承载的读写请求数达几十亿条。同时,有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加。
主要功能:
1.读写分离
2.从库负载均衡
3.IP过滤
4.自动分表
5.DBA可平滑上下线DB
6.自动摘除宕机的DB

官方链接:https://github.com/Qihoo360/Atlas

Atlas部分配置参数及原理详解
参考文档:
https://github.com/Qihoo360/Atlas/wiki/Atlas部分配置参数及原理详解

Atlas的运行及常见问题
参考文档:
https://github.com/Qihoo360/Atlas/wiki/Atlas的运行及常见问题

四.安装Atlas以及配置过程:

wget    https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
yum  -y localinstall Atlas-2.2.1.el6.x86_64.rpm

Atlas启动和关闭
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul start
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul stop
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul status
/usr/local/mysql-proxy/bin/mysql-proxyd mgrmul restart

4.1编辑Atlas配置文件:

在数据库里准备用户

由于在MGR中mysql3306 是主库,mysql3307 和mysql3308 是slave从库
所以在mysql3306上执行下面的sql就可以了,会自动同步到mysql3307 和mysql3308上
grant all on *.* to jianweiuser@'119.29.97.131' identified by 'jianwei@559886';flush privileges;

登录腾讯云的云主机测试远程是否可以登录192.168.1.233 机器上的mysql实例

 mysql -ujianweiuser -p'jianwei@559886' -h192.168.1.233 -P3306
 mysql -ujianweiuser -p'jianwei@559886' -h192.168.1.233 -P3307
 mysql -ujianweiuser -p'jianwei@559886' -h192.168.1.233 -P3308

测试是可以登录的

对使用数据库的用户密码进行加密:
执行/usr/local/mysql-proxy/bin/encrypt jianweiuser

获得一个密码串W7moDRl9VZ8jaj+4argKVA== 加入到atlas的配置文件mgrmul.cnf

配置文件具体参数解释参考:
https://github.com/Qihoo360/Atlas/wiki/Atlas的安装

4.2演示环境可用的配置文件内容如下:

[root@VM_82_178_centos ~]# cat /usr/local/mysql-proxy/conf/mgrmul.cnf 
[mysql-proxy]

#带#号的为非必需的配置项目

#管理接口的用户名
admin-username = zykjwtest

#管理接口的密码
admin-password = zykjwtest01

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔
proxy-backend-addresses=192.168.1.233:3306,192.168.1.233:3307,192.168.1.233:3308
#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔
proxy-read-only-backend-addresses = 192.168.1.233:3307@1,192.168.1.233:3308@1

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = 01test:XU7LYbEX2MY62nXU/3RMPA==, jianweiuser:XU7LYbEX2MY12rq2Ryj6/g==

#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true

#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
keepalive = true

#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 4

#日志级别,分为message、warning、critical、error、debug五个级别
log-level = warning

#日志存放的路径
log-path = /usr/local/mysql-proxy/log

#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log = REALTIME

#慢日志输出设置。当设置了该参数时,则日志只输出执行时间超过sql-log-slow(单位:ms)的日志记录。不设置该参数则输出全部日志。
#sql-log-slow = 10

#实例名称,用于同一台机器上多个Atlas实例间的区分
instance = mgrmul

#Atlas监听的工作接口IP和端口
proxy-address = 0.0.0.0:1200

#Atlas监听的管理接口IP和端口
admin-address = 0.0.0.0:1300

#分表设置,此例中person为库名,mt为表名,id为分表字段,3为子表数量,可设置多项,以逗号分隔,若不分表则不需要设置该项
#tables = person.mt.id.3

#默认字符集,设置该项后客户端不再需要执行SET NAMES语句
#charset = utf8

#允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所有IP连接,否则只允许列表中的IP连接
client-ips = 127.0.0.1, 192.168.1, 119.29.97.131

#Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP),若有LVS且设置了client-ips则此项必须设置,否则可以不设置
#lvs-ips = 192.168.1.1
[root@VM_82_178_centos ~]# 

4.3Atlas重要参数介绍:


(1)Atlas的工作端口

proxy-address项配置,例如proxy-address = 0.0.0.0:1200代表客户端应该使用1200这个端口连接Atlas来发送SQL请求。

(2)Atlas的管理端口

admin-address项配置,例如admin-address = 0.0.0.0:1300代表DBA应该使用1300这个端口连接Atlas来执行运维管理操作。

(3)管理接口的用户名和密码

admin-username项和admin-password项设置,这两项是用来进入Atlas的管理界面的,与后端连接的MySQL没有关系,所以可以任意设置,不需要MySQL在配置上做任何改动。

(4)用户名和密码配置项,需要和主从mysql实例配置的用户名和密码配置一样,多个用户可以用逗号分开
pwds = 01test:XU7LYbEX2MY62nXU/3RMPA==, jianweiuser:XU7LYbEX2MY12rq2Ryj6/g==

(5)允许连接Atlas的客户端的IP,可以是精确IP,也可以是IP段,以逗号分隔,若不设置该项则允许所>有IP连接,否则只允许列表中的IP连接
client-ips = 127.0.0.1, 192.168.1, 119.29.97.131

(6)#SQL日志的开关,可设置为OFF、ON、REALTIME,OFF代表不记录SQL日志,ON代表记录SQL日志,REALTIME代表记录SQL日志且实时写入磁盘,默认为OFF
sql-log = REALTIME  ###此处为了演示效果,所以开启次参数,让sql语句记录到SQL日志中

(7)mgrmul.cnf 配置文件参数instance 设置
mgrmul是conf目录下配置文件的名字,也是配置文件里instance项的名字,三者需要统一
[root@VM_82_178_centos conf]# grep mgrmul /usr/local/mysql-proxy/conf/mgrmul.cnf 
instance = mgrmul

五.Atlas应用演示

5.1Atlas的管理端口演示:

可以通过登录Atlas管理界面进行动态的上线和下线mysql的节点,查看各个mysql节点的状态,查看允许登录的客户端的ip信息,可以允许在线添加和删除客户端的ip来链接Atlas,
可以在线查看当前允许那些用户登录Atlas,以及在线添加和删除允许链接Atlas的账户和密码。可以在线添加完数据后并保存到Atlas的配置文件等

[root@VM_82_178_centos ~]# mysql -uzykjwtest -p'zykjwtest01' -P1300
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'zykjwtest'@'localhost' (using password: YES)
[root@VM_82_178_centos ~]# mysql -uzykjwtest -p'zykjwtest01' -h127.0.0.1 -P1300

[email protected] [(none)]>SELECT * FROM help;
+----------------------------+---------------------------------------------------------+
| command                    | description                                             |
+----------------------------+---------------------------------------------------------+
| SELECT * FROM help         | shows this help                                         |
| SELECT * FROM backends     | lists the backends and their state                      |
| SET OFFLINE $backend_id    | offline backend server, $backend_id is backend_ndx's id |
| SET ONLINE $backend_id     | online backend server, ...                              |
| ADD MASTER $backend        | example: "add master 127.0.0.1:3306", ...               |
| ADD SLAVE $backend         | example: "add slave 127.0.0.1:3306", ...                |
| REMOVE BACKEND $backend_id | example: "remove backend 1", ...                        |
| SELECT * FROM clients      | lists the clients                                       |
| ADD CLIENT $client         | example: "add client 192.168.1.2", ...                  |
| REMOVE CLIENT $client      | example: "remove client 192.168.1.2", ...               |
| SELECT * FROM pwds         | lists the pwds                                          |
| ADD PWD $pwd               | example: "add pwd user:raw_password", ...               |
| ADD ENPWD $pwd             | example: "add enpwd user:encrypted_password", ...       |
| REMOVE PWD $pwd            | example: "remove pwd user", ...                         |
| SAVE CONFIG                | save the backends to config file                        |
| SELECT VERSION             | display the version of Atlas                            |
+----------------------------+---------------------------------------------------------+
16 rows in set (0.01 sec)

[email protected] [(none)]>SELECT * FROM backends; 
+-------------+--------------------+-------+------+
| backend_ndx | address            | state | type |
+-------------+--------------------+-------+------+
|           1 | 192.168.1.233:3306 | up    | rw   |
|           2 | 192.168.1.233:3307 | up    | rw   |
|           3 | 192.168.1.233:3308 | up    | rw   |
|           4 | 192.168.1.233:3307 | up    | ro   |
|           5 | 192.168.1.233:3308 | up    | ro   |
+-------------+--------------------+-------+------+
5 rows in set (0.00 sec)
[email protected] [(none)]>

5.2 Aatlas负载均衡功能:

提示:腾讯云主机要允许本机的外网的ip来访问Atlas的端口:1200
所以在腾讯云的控制台安全组中 设置运行云主机外网ip 访问1200端口

只读负载均衡测试:select @@port,可以查看端口区分来自不同的可读mysql实例;

[root@VM_82_178_centos ~]#  mysql -ujianweiuser -p'jianwei@559886' -h127.0.0.1 -P1200
[email protected] [(none)]>select @@port;
+--------+
| @@port |
+--------+
|   3307 |
+--------+
1 row in set (0.04 sec)

[email protected] [(none)]>select @@port;
+--------+
| @@port |
+--------+
|   3308 |
+--------+
1 row in set (0.05 sec)

[email protected] [(none)]>

[root@VM_82_178_centos ~]# tailf /usr/local/mysql-proxy/log/sql_mgrmul.log 
[12/29/2018 22:03:08] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 43.210 "select @@port"
[12/29/2018 22:03:11] C:127.0.0.1:34600 S:192.168.1.233:3308 OK 42.856 "select @@port"

从SQL日志看到已经实现了负载均衡的功能

5.3 Atlas读写分离测试

读写分离测试:Atlas代理的机制确定了它只会向配置文件中记录的可写节点的第一个可用的去写,如果第一个不可用就会去访问第二个,直到找到一个可用的并一直只向该主机去写;读的话则从配置文件中的所有可读节点去读;

mysql -ujianweiuser -p'jianwei@559886' -h127.0.0.1 -P1200
或者
mysql -ujianweiuser -p'jianwei@559886' -h119.29.97.131 -P1200

创建测试表进行测试:

create database test01;use test01;
CREATE TABLE `test01` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

insert into test01.test01 values(1,'列兵',1,0,1,now());
insert into test01.test01 values(2,'班长',2,1000,1,now());

查看sql日志,发现已经实现了读写分离:

[root@VM_82_178_centos ~]# tailf /usr/local/mysql-proxy/log/sql_mgrmul.log
[12/29/2018 22:07:23] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 50.116 "create database test01"
[12/29/2018 22:07:23] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 43.100 "SELECT DATABASE()"
[12/29/2018 22:07:23] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 86.225 "show databases"
[12/29/2018 22:07:24] C:127.0.0.1:34600 S:192.168.1.233:3308 OK 85.390 "show tables"
[12/29/2018 22:07:35] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 148.760 "CREATE TABLE `test01` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8"
[12/29/2018 22:09:00] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 95.845 "insert into test01.test01 values(1,'列兵',1,0,1,now())"
[12/29/2018 22:09:01] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 96.185 "insert into test01.test01 values(2,'班长',2,1000,1,now())"
[12/29/2018 22:09:37] C:127.0.0.1:34600 S:192.168.1.233:3306 OK 86.894 "select * from test01.test01"
[12/29/2018 22:09:39] C:127.0.0.1:34600 S:192.168.1.233:3307 OK 86.323 "select * from test01.test01"
[12/29/2018 22:11:19] C:119.29.97.131:35378 S:192.168.1.233:3308 OK 277.726 "select @@version_comment limit 1"
[12/29/2018 22:11:19] C:119.29.97.131:35378 S:192.168.1.233:3307 OK 277.027 "select USER()"

关闭maste实例mysql3306演示

[root@localhost ~]# /etc/init.d/mysqld stop
Shutting down MySQL............. SUCCESS!
[root@localhost ~]#

创建test02库和test02测试表:

mysql -ujianweiuser -p'jianwei@559886' -h119.29.97.131 -P1200

create database test02;use test02;
CREATE TABLE `test02` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

insert into test02.test02 values(1,'列兵',1,0,1,now());
insert into test02.test02 values(2,'班长',2,1000,1,now());

select * from test01.test01;select * from test02.test02;

发现写库切换到了mysql3307实例,读库在mysql3307 和mysql3308实例之间轮训切换


[root@VM_82_178_centos ~]# tailf /usr/local/mysql-proxy/log/sql_mgrmul.log 

[12/29/2018 22:23:15] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 42.392 "select @@version_comment limit 1"
[12/29/2018 22:23:15] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 41.100 "select USER()"
[12/29/2018 22:25:20] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 304.954 "create database test02"
[12/29/2018 22:25:20] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 42.489 "SELECT DATABASE()"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 85.458 "show databases"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 77.739 "show tables"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 139.017 "CREATE TABLE `test02` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `titles` char(15) NOT NULL,
  `icon` smallint(6) unsigned DEFAULT '0',
  `integral` int(10) NOT NULL DEFAULT '0',
  `isdefault` tinyint(1) unsigned NOT NULL DEFAULT '0',
`create_time` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  KEY `integral` (`integral`)
) ENGINE=Innodb AUTO_INCREMENT=0 DEFAULT CHARSET=utf8"
[12/29/2018 22:25:21] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 93.835 "insert into test02.test02 values(1,'列兵',1,0,1,now())"
[12/29/2018 22:25:24] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 92.871 "insert into test02.test02 values(2,'班长',2,1000,1,now())"
[12/29/2018 22:27:53] C:119.29.97.131:36168 S:192.168.1.233:3307 OK 85.442 "select * from test01.test01"
[12/29/2018 22:27:53] C:119.29.97.131:36168 S:192.168.1.233:3308 OK 84.813 "select * from test02.test02"

Gtid+MGR+atlas读写分离以及负载均衡高可用架构演示到此结束,欢迎同学们一起交流和学习

猜你喜欢

转载自blog.51cto.com/wujianwei/2337085