<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>服务器安全维护工作室 &#187; 安装MySQL中间层 Atlas实现不改程序就能读写分离</title>
	<atom:link href="https://www.fuwuqiok.com/tag/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.fuwuqiok.com</link>
	<description></description>
	<lastBuildDate>Sun, 01 Mar 2020 07:28:40 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.26</generator>
	<item>
		<title>安装MySQL中间层 Atlas实现不改程序就能读写分离</title>
		<link>https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/</link>
		<comments>https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/#comments</comments>
		<pubDate>Sun, 10 Jan 2016 13:29:59 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[服务器迁移]]></category>
		<category><![CDATA[网站防挂马]]></category>
		<category><![CDATA[安装MySQL中间层 Atlas实现不改程序就能读写分离]]></category>
		<category><![CDATA[服务器基础环境搭建]]></category>
		<category><![CDATA[阿里云代维]]></category>

		<guid isPermaLink="false">https://www.fuwuqiok.com/?p=2874</guid>
		<description><![CDATA[<p>Atlas是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目 [&#8230;]</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/">安装MySQL中间层 Atlas实现不改程序就能读写分离</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></description>
				<content:encoded><![CDATA[<p><a href="https://github.com/Qihoo360/Atlas/">Atlas</a>是由 Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目。它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上，修改了大量bug，添加了很多功能特性。目前该项目在360公司内部得到了广泛应用，很多MySQL业务已经接入了Atlas平 台，每天承载的读写请求数达几十亿条。</p>
<p>主要功能：<br />
* 读写分离<br />
* 从库负载均衡<br />
* IP过滤<br />
* SQL语句黑白名单<br />
* 自动分表</p>
<p>Q &amp; A<br />
——————-<br />
Q: 是否支持多字符集？<br />
A: 这是我们对原版MySQL-Proxy的第一项改进，符合国情是必须的</p>
<p>Q: 自动读写分离挺好，但有时候我写完马上就想读，万一主从同步延迟怎么办?<br />
A: SQL语句前增加 /*master*/ 就可以将读请求强制发往主库</p>
<p>Q: 主库宕机，读操作受影响么？<br />
A: 在atlas中是不会的! 能问这样的问题, 说明你用过官方的mysql-proxy, 很遗憾官方版本并未解决这个问题</p>
<p>Q: 检测后端DB状态会阻塞正常请求么？<br />
A: 不会, atlas中检测线程是异步进行检测的，即使有db宕机，也不会阻塞主流程。在atlas中没有什么异常会让主流程阻塞! 同上，官方版本也会让你失望</p>
<p>Q: 想下线一台DB, 又不想停掉mysql server, 怎么办？<br />
A: 可以通过管理接口手动上下线后端db, atlas会优先考虑管理员的意愿</p>
<p>Q: 想给集群中增加一台DB, 不想影响线上正常访问可以吗？<br />
A: 通过管理接口可以轻松实现</p>
<p>Q: 相比官方mysql-proxy, atlas还有哪些改进？<br />
A: 这实在是个难以回答的问题，性能，稳定性，可靠性，易维护性，我们做过几十项的改进，下面会尽量列一些较大的改动</p>
<p>VS 官方MySQL-Proxy<br />
——————-<br />
1. 将主流程中所有Lua代码改为纯C实现，Lua仅用在管理接口<br />
2. 重写网络模型、线程模型<br />
3. 实现了真正意义的连接池<br />
4. 优化了锁机制，性能提高数十倍<br />
……</p>
<p>附名字来源：<br />
Atlas，希腊神话中双肩撑天的巨人，普罗米修斯的兄弟，最高大强壮的神之一，因反抗宙斯失败而被罚顶天。我们期望这个系统能够脚踏后端DB，为前端应用撑起一片天。</p>
<p>一.安装dbproxy altas<br />
https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E5%AE%89%E8%A3%85</p>
<p>wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el5.x86_64.rpm<br />
rpm –ivh Atlas-2.2.1.el5.x86_64.rpm</p>
<p>注意事项：</p>
<p>(1).Atlas只能安装运行在64位的系统上。</p>
<p>(2).Centos 5.X安装 Atlas-XX.el5.x86_64.rpm，Centos 6.X安装Atlas-XX.el6.x86_64.rpm。</p>
<p>(3).如果执行sudo rpm –i Atlas-XX.el6.x86_64.rpm，提示类似：“file /usr/local/mysql-proxy/bin/encrypt from install of Atlas-2.0.1-1.x86_64 conflicts with file from package Atlas-1.0.3-1.x86_64”错误，则表示该系统之前已经安装过Atlas-1.0.3-1.x86_64，需要执行：sudo rpm –e Atlas-1.0.3-1.x86_64，将之前安装的Atlas删除掉，再执行sudo rpm –i Atlas-XX.el6.x86_64.rpm安装新版本的Atlas。</p>
<p>(4).后端mysql版本应大于5.1，建议使用Mysql 5.6</p>
<p>二.配置文件修改<br />
cd /usr/local/mysql-proxy/conf<br />
cp tests.cnf dbproxy.cnf<br />
vi dbproxy.cnf</p>
<p>Atlas运行需要依赖一个配置文件（test.cnf）。在运行Atlas之前，需要对该文件进行配置。Atlas的安装目录是/usr /local/mysql-proxy，进入安装目录下的conf目录，可以看到已经有一个名为test.cnf的默认配置文件，我们只需要修改里面的某 些配置项，不需要从头写一个配置文件。</p>
<p>1.配置范例及说明如下：</p>
[mysql-proxy]
<p>(必备，默认值即可)管理接口的用户名</p>
<p>admin-username = user</p>
<p>(必备，默认值即可)管理接口的密码</p>
<p>admin-password = pwd</p>
<p>(必备，根据实际情况配置)主库的IP和端口</p>
<p>proxy-backend-addresses = 192.168.0.12:3306</p>
<p>(非必备，根据实际情况配置)从库的IP和端口，@后面的数字代表权重，用来作负载均衡，若省略则默认为1，可设置多项，用逗号分隔。如果想让主库也能分担读请求的话，只需要将主库信息加入到下面的配置项中。</p>
<p>proxy-read-only-backend-addresses = 192.168.0.12:3306@2,192.168.0.13:3306@4,192.168.0.14:3306@4</p>
<p>(必备，根据实际情况配置)用户名与其对应的加密过的MySQL密码，密码使用PREFIX/bin目录下的加密程序encrypt加密，用户名与 密码之间用冒号分隔。主从数据库上需要先创建该用户并设置密码（用户名和密码在主从数据库上要一致）。比如用户名为myuser，密码为mypwd，执 行./encrypt mypwd结果为HJBoxfRsjeI=。如果有多个用户用逗号分隔即可。则设置如下行所示：</p>
<p>pwds = dbproxy: /iZxz+0GRoA=</p>
<p>（必备，默认值即可)Atlas的运行方式，设为true时为守护进程方式，设为false时为前台方式，一般开发调试时设为false，线上运行时设为true</p>
<p>daemon = true</p>
<p>(必备，默认值即可)设置Atlas的运行方式，设为true时Atlas会启动两个进程，一个为monitor，一个为 worker，monitor在worker意外退出后会自动将其重启，设为false时只有worker，没有monitor，一般开发调试时设为 false，线上运行时设为true</p>
<p>keepalive = true</p>
<p>(必备，根据实际情况配置)工作线程数，推荐设置成系统的CPU核数的2至4倍</p>
<p>event-threads = 4</p>
<p>(必备，默认值即可)日志级别，分为message、warning、critical、error、debug五个级别</p>
<p>log-level = message</p>
<p>(必备，默认值即可)日志存放的路径</p>
<p>log-path = /usr/local/mysql-proxy/log</p>
<p>(必备，根据实际情况配置)SQL日志的开关，可设置为OFF、ON、REALTIME，OFF代表不记录SQL日志，ON代表记录SQL日志，该 模式下日志刷新是基于缓冲区的，当日志填满缓冲区后，才将日志信息刷到磁盘。REALTIME用于调试，代表记录SQL日志且实时写入磁盘，默认为OFF</p>
<p>sql-log = OFF</p>
<p>(可选项，可不设置）慢日志输出设置。当设置了该参数时，则日志只输出执行时间超过sql-log-slow（单位：ms)的日志记录。不设置该参数则输出全部日志。</p>
<p>#sql-log-slow = 10</p>
<p>(可选项，可不设置）关闭不活跃的客户端连接设置。当设置了该参数时，Atlas会主动关闭经过’wait-timeout’时间后一直未活跃的连接。单位：秒</p>
<p>wait-timeout = 10</p>
<p>(必备，默认值即可)Atlas监听的工作接口IP和端口</p>
<p>proxy-address = 0.0.0.0:1234</p>
<p>(必备，默认值即可)Atlas监听的管理接口IP和端口 admin-address = 0.0.0.0:2345</p>
<p>(可选项，可不设置)分表设置，此例中person为库名，mt为表名，id为分表字段，3为子表数量，可设置多项，以逗号分隔，若不分表则不需要 设置该项，子表需要事先建好，子表名称为表名_数字，数字范围为[0,子表数-1]，如本例里，子表名称为mt_0、mt_1、mt_2</p>
<p>#tables = person.mt.id.3</p>
<p>(可选项，可不设置)默认字符集，若不设置该项，则默认字符集为latin1</p>
<p>#charset = utf8</p>
<p>(可选项，可不设置)允许连接Atlas的客户端的IP，可以是精确IP，也可以是IP段，以逗号分隔，若不设置该项则允许所有IP连接，否则只允许列表中的IP连接</p>
<p>client-ips = 127.0.0.1, 192.168.1</p>
<p>(可选项，极少需要)Atlas前面挂接的LVS的物理网卡的IP(注意不是虚IP)，若有LVS且设置了client-ips则此项必须设置，否则可以不设置</p>
<p>#lvs-ips = 192.168.1.1</p>
<p>2. 重要配置说明</p>
<p>以下几项配置参数对性能和正常运行起到重要作用，需要正确设置。</p>
<p>(1)线程数</p>
<p>event-threads项设置，过小无法充分发挥多核CPU的性能，过大造成不必要的线程切换开销，推荐设置为CPU的核数。</p>
<p>(2)最小空闲连接数(2.x以上版本不需要该项，1.x版本需要)</p>
<p>min-idle-connections项设置，过小则在高并发下会有报错，过大虽然不报错但在测试时不容易看出读写分离效果，推荐设置为比客户 端的并发峰值稍大，详见《配置参数详解》。上面的配置范例是针对Atlas 2.X版本，没有该选项。对于Atlas 1.X版本的配置文件，需要加入该配置选项。</p>
<p>3. 可选配置说明</p>
<p>以下几项可以设置，也可以使用默认值，区别不大。</p>
<p>(1)Atlas的工作端口</p>
<p>proxy-address项配置，例如proxy-address = 0.0.0.0:1234代表客户端应该使用1234这个端口连接Atlas来发送SQL请求。</p>
<p>(2)Atlas的管理端口</p>
<p>admin-address项配置，例如admin-address = 0.0.0.0:2345代表DBA应该使用2345这个端口连接Atlas来执行运维管理操作。</p>
<p>(3)管理接口的用户名和密码</p>
<p>admin-username项和admin-password项设置，这两项是用来进入Atlas的管理界面的，与后端连接的MySQL没有关系，所以可以任意设置，不需要MySQL在配置上做任何改动。</p>
<p>(4)日志级别</p>
<p>以log-level项配置，分为message、warning、critical、error、debug五个级别。</p>
<p>(5)日志路径</p>
<p>以log-path项配置，如log-path = /usr/local/mysql-proxy/log。</p>
<p>三. 给后端mysql增加访问用户<br />
CREATE USER ‘dbproxy’@’192.168.0.11’ IDENTIFIED BY ‘***’;</p>
<p>GRANT USAGE ON * . * TO ‘dbproxy’@’192.168.0.11’ IDENTIFIED BY ‘***’ WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;<br />
GRANT SELECT , INSERT , UPDATE , DELETE , LOCK TABLES ON `c1gstudio` . * TO ‘dbproxy’@’192.168.0.11’;</p>
<p>加密密码<br />
bin/encrypt 123456<br />
/iZxz+0GRoA=</p>
<p>添加iptables<br />
iptables<br />
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -p tcp -m tcp –dport 1234 -j ACCEPT</p>
<p>四.启动<br />
1.启动dbproxy<br />
cd /home/mysql/dbproxy/bin<br />
./mysql-proxyd dbproxy start</p>
<p># /usr/local/mysql-proxy/bin/mysql-proxyd dbproxy start<br />
# /usr/local/mysql-proxy/bin/mysql-proxyd dbproxy stop<br />
# /usr/local/mysql-proxy/bin/mysql-proxyd dbproxy restart</p>
<p>2.访问测试<br />
mysql -udbproxy -h192.168.0.11 -P1234 -p<br />
password<br />
mysql-&gt; show databases;<br />
mysql&gt; show variables like “server_id”;<br />
+—————+——-+<br />
| Variable_name | Value |<br />
+—————+——-+<br />
| server_id | 19 |<br />
+—————+——-+<br />
1 row in set (0.00 sec)</p>
<p>mysql&gt; show variables like “server_id”;<br />
+—————+——-+<br />
| Variable_name | Value |<br />
+—————+——-+<br />
| server_id | 20 |<br />
+—————+——-+<br />
1 row in set (0.00 sec)</p>
<p>五、Atlas管理接口使用</p>
<p># mysql -u管理用户 -p管理密码 -h127.0.0.1 -P管理端口<br />
mysql -uadmin -h192.168.0.11 -P2345 -p<br />
password<br />
#查看管理语句参数：<br />
mysql&gt; select * from help;<br />
+—————————-+———————————————————+<br />
| command | description |<br />
+—————————-+———————————————————+<br />
| SELECT * FROM help | shows this help |<br />
| SELECT * FROM backends | lists the backends and their state |<br />
| SET OFFLINE $backend_id | offline backend server, $backend_id is backend_ndx’s id |<br />
| SET ONLINE $backend_id | online backend server, … |<br />
| ADD MASTER $backend | example: “add master 127.0.0.1:3306”, … |<br />
| ADD SLAVE $backend | example: “add slave 127.0.0.1:3306”, … |<br />
| REMOVE BACKEND $backend_id | example: “remove backend 1”, … |<br />
| SELECT * FROM clients | lists the clients |<br />
| ADD CLIENT $client | example: “add client 192.168.1.2”, … |<br />
| REMOVE CLIENT $client | example: “remove client 192.168.1.2”, … |<br />
| SELECT * FROM pwds | lists the pwds |<br />
| ADD PWD $pwd | example: “add pwd user:raw_password”, … |<br />
| ADD ENPWD $pwd | example: “add enpwd user:encrypted_password”, … |<br />
| REMOVE PWD $pwd | example: “remove pwd user”, … |<br />
| SAVE CONFIG | save the backends to config file |<br />
| SELECT VERSION | display the version of Atlas |<br />
+—————————-+———————————————————+<br />
#查看DB状态：<br />
mysql&gt; select * from backends;<br />
+————-+——————-+——-+——+<br />
| backend_ndx | address | state | type |<br />
+————-+——————-+——-+——+<br />
| 1 | 192.168.0.12:3306 | up | rw |<br />
| 2 | 192.168.0.12:3306 | up | ro |<br />
| 3 | 192.168.0.13:3306 | up | ro |<br />
| 4 | 192.168.0.14:3306 | up | ro |<br />
+————-+——————-+——-+——+</p>
<p>六.性能测试结果<br />
从Atlas处理三类SQL操作的QPS和完成每条SQL操作的时间对比来看，将event-threads参数设置为CPU个数的2-4倍较为合理。将 event-threads参数设置为CPU个数的两倍时，带来的QPS提升较为明显，将其设置为CPU个数的四倍时，QPS也有提升但不是非常明显。对 于处理每条SQL操作的时间，通过提高event-threads值是没有显著效果的。</p>
<p>所以我们建议使用者：如果追求Atlas处理SQL请求时的QPS，将event-threads值设置为CPU个数的2-4倍。如果追求Atlas处理SQL请求的完成时间，将event-threads值设置为CPU个数即可。</p>
<p>下文主要测试了通过Atlas转发SQL请求与直连DB发送SQL请求这两种情形下的性能差距，和event-threads值对Atlas的性能 影响。从测试结果来看，Atlas性能表现较为优秀，并没有明显的性能下降。同时在测试中发现Atlas系统属于CPU密集型任务，相对于磁盘IO和内存 占用率而言，Atlas对CPU消耗显得最为明显，所以建议在部署Atlas的时候需要优先考虑服务器的CPU性能。</p>
<p><a rel="nofollow" href="https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/">安装MySQL中间层 Atlas实现不改程序就能读写分离</a>，首发于<a rel="nofollow" href="https://www.fuwuqiok.com">服务器安全维护工作室</a>。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.fuwuqiok.com/%e5%ae%89%e8%a3%85mysql%e4%b8%ad%e9%97%b4%e5%b1%82-atlas%e5%ae%9e%e7%8e%b0%e4%b8%8d%e6%94%b9%e7%a8%8b%e5%ba%8f%e5%b0%b1%e8%83%bd%e8%af%bb%e5%86%99%e5%88%86%e7%a6%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
