昨天发了《Mysql主从复制完美配置,So easy!5分钟搞定!》,是Mysql主从复制双机集群的配置方法,有需要的朋友可以点我头像进去查看。
今天继续昨天的话题,主从复制配置完成以后我们该怎么用?
单机Mysql情况下,我们这样用:
java应用通过jdbc(Mybatis,Hibernate等)连接到mysql,中间需要配置连接URL:
很熟悉吧?对,这个URL里的192.168.1.1和3306就是Mysql的IP和端口
主从复制的集群咋办?
很显然不能在上面的URL里面写上两个IP和端口吧!请欢迎我们的大神Atlas出场。
Atlas是奇虎360公司开源的数据库中间件,可以作为代理,实现数据库集群情况下一系列复杂的功能。
Atlas能干啥?
读写分离
从库负载均衡
自动分表
IP过滤
SQL语句黑白名单
DBA可平滑上下线DB
自动摘除宕机的DB
看看这一堆功能,头晕,我们先实现一个小目标:配置Mysql连接URL的时候把IP和端口换成Atlas的IP和端口,Atlas就能自动帮我们实现读写分离!把我们的Java应用跑起来!
补充一点:Atlas的Github地址:
https://github.com/Qihoo360/Atlas
再补充一点:同样作为数据库中间件,Mysql官方也有一个,不过那个玩意实在不咋地!一身毛病。Atlas是以那个为蓝本修改的。
再再补充一点:别的公司还有很多别的中间件,比如mycat,cobar等等。我没用过, 有兴趣的请自己百度
Atlas安装部署:
wget https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
yum install Atlas-2.2.1.el6.x86_64.rpm
下面命令是加密,加密啥呢?Atlas作为代理要连接Mysql,需要用户名密码,Atlas需要把mysql的密码保存在配置文件中,那么很显然不能保存明文吧?于是我们用下面命令加密一下,然后写到配置文件中,用眼睛看到的是xxxooo乱码,但是Atlas能看懂!
执行命令:
/usr/local/mysql-proxy/bin/encrypt 要加密的mysql密码
得到 xxxooo 一堆,好了,保存好,后面要用
修改配置文件:
vi /usr/local/mysql-proxy/conf/test.cnf
给Atlas配置一个管理员用户名:
admin-username = user
管理员密码:
admin-password = xoxoxo
Atlas监听的工作接口IP和端口;下面表示1234端口连接Atlas来发送SQL请求。
proxy-address = 0.0.0.0:1234
上一篇我们配置好的主Mysql的ip和端口:
proxy-backend-addresses = 192.168.1.1:3306
从Mysql的ip和端口配置(可以配置多个从mysql,中间加,),每个从Mysql后面可以加@,再加数字,用来表示权重的高低,不加的话表示权重相同。另外,默认情况下这里配置的mysql都是只读(就是“只读取数据”,写入数据会自动分配到主Mysql),如果也想从主mysql读,需要把主mysql的IP和端口也配置进去
proxy-read-only-backend-addresses = 192.168.1.2:3306,192.168.1.3:3306
数据库密码配置,上面加密出来的那个xxxooo还记得么?用在这里!另外,主从Mysql要配置一个相同的用户myuser(同用户名,同密码),方便Atlas使用。
pwds = myuser:xxxooo
启动Atlas
进入/usr/local/mysql-proxy/bin
./mysql-proxyd test start 启动Atlas。
./mysql-proxyd test restart 重启Atlas。
./mysql-proxyd test stop 停止Atlas。
启动后测试
ps -ef | grep mysql-proxy
查看进程是否存在。没问题的话执行如下:
mysql -hAtlas主机的ip -P1234 -u用户名 -p
回车,填写密码,回车!这个用法跟mysql连接是一致的。看看是否能连接上,如果连上了,请注意!这可是用atlas
作为代理实现的连接!不再是直接连接mysql了!
回归到Java应用
做到了上面几步,说明atlas已经成功跑起来了,再用java应用连接时URL配置IP和端口使用atlas的IP和端口,后面Atlas会自动将写入请求发送到主Mysql,将读请求发送到从Mysql,而你写入到主Mysql的信息会自动的同步到从Mysql(同步这个事是Mysql自己干的,跟Atlas没关系了)
OK!就说到这里,其实我写的东西,在github上也都有!这里只帮你先跑起来,后面详细的研究请多多实践!
补充一点,昨天有朋友问我,主从复制的情况下,会不会出现主库写完以后,同步到从库有延迟?答案是100%的,虽然绝大部分情况下延迟较小,但是也不能忽略,毕竟哪怕1ms在某些业务中也是不允许的,怎么办?Atlas提供了方案:
执行select 时,在select语句前加上 /*master*/ 这样就会从主Mysql强制读了!
OK!感谢关注!