腾讯云的云主机安装360开源的mysql中间键Atlas
腾讯云机器的外网ip:119.29.97.131
沧州233测试物理机器的外网ip192.168.1.233(安全起见故意写成内网的ip,实际上是外网ip)
mysql
参考博文地址:http://www.javashuo.com/article/p-bfypcjmp-vc.htmlgit
(摘抄自https://github.com/Qihoo360/Atlas)github
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.自动摘除宕机的DBsql
官方连接:https://github.com/Qihoo360/Atlas数据库
Atlas部分配置参数及原理详解
参考文档:
https://github.com/Qihoo360/Atlas/wiki/Atlas部分配置参数及原理详解后端
Atlas的运行及常见问题
参考文档:
https://github.com/Qihoo360/Atlas/wiki/Atlas的运行及常见问题centos
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
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 zykjwtest@127.0.0.1 [(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) zykjwtest@127.0.0.1 [(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) zykjwtest@127.0.0.1 [(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 jianweiuser@127.0.0.1 [(none)]>select @@port; +--------+ | @@port | +--------+ | 3307 | +--------+ 1 row in set (0.04 sec) jianweiuser@127.0.0.1 [(none)]>select @@port; +--------+ | @@port | +--------+ | 3308 | +--------+ 1 row in set (0.05 sec) jianweiuser@127.0.0.1 [(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"
提示说明:以上MGR采用的是multi master的方式演示的,若是采用默认的single master模式,再选主上会存在问题,例如出现read-only,提示新主库不可写
Gtid+MGR+atlas读写分离以及负载均衡高可用架构演示到此结束,欢迎同窗们一块儿交流和学习