mysql数据库主从复制+读写分离

本文引自: http://www.361way.com/atlas-mysql/5310.html,根据踩过的坑,在原内容的基础上做了一定的修改,需要注意的地方我已经加了标注。

--------------------------------------------------------------------------------------

Atlas是360团队弄出来的一套基于MySQL-Proxy基础之上的代理,修改了MySQL-Proxy的一些BUG,并且优化了很多东西。而且安装方便。配置与注释写的都很详细,并且是都是中文,不过从Altas在github上的代码来看,将近一年没更新了。与Atlas类似的产品有Cobar、Cobar、amoeba、TDDL、mycat等,不过这些产品部分已经停滞或文档不全面,mycat相对比较活跃。

Atlas官方文档链接:https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md

Atlas下载链接:https://github.com/Qihoo360/Atlas/releases

一、主机规划

环境:

系统IP配置

CentOS 6.8192.168.122.10Atlas代理服务

CentOS 6.8192.168.122.20主MySQL数据库

CentOS 6.8192.168.122.30从MySQL数据库

二、用户及数据库准备

首先需要在两台 mysql 主机上分别创建一个 mysql 用户,用于两台mysql 主机之间做主从配置,同时也可以让 atlas 代理可以使用该用户可以连接到两台realserver 。具体实施步骤如下:

mysql> grant all on *.* to  sync@'%' identified by "361way.com";

mysql> use mysql;

mysql> select user, host from user;    //确认增加的用户是否成功

mysql> flush privileges;

上面我们创建了一个sync用户,密码为361way.com 。

三、mysql 主从配置

很早之前我写就写过 mysql主从配置 ,具体可以查看:http://www.361way.com/mysql-replicate/975.html ,这里再简单的列下步骤。

1、my.cnf配置

修改主mysql 主机my.cnf 的配置如下:

[mysqld]

datadir=/data/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

#主从复制配置

innodb_flush_log_at_trx_commit=1

sync_binlog=1

#需要备份的数据库

binlog-do-db=test

#不需要备份的数据库

binlog-ignore-db=mysql

#启动二进制文件

log-bin=mysql-bin

#服务器ID

server-id=1

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

注:重启数据库,若没有配置binlog-do-db和binlog_ignore_db,表示备份全部数据库。

修改备mysql 主机的my.cnf 配置如下:

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

server-id=2

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

这里就增加了server-id=2 一行,其他都是默认配置 。

重启数据库

2、主备同步配置

在主服务器上配置同步权限设置,并配置表只读及查看服务器binlog日志信息:

mysql> grant replication slave on *.* to 'sync'@'%' identified by '361way.com';

Query OK, 0 rows affected (0.00 sec)

mysql> flush tables with read lock;

Query OK, 0 rows affected (0.00 sec)

mysql> show master status;

+------------------+----------+--------------+------------------+

| File            | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+------------------+----------+--------------+------------------+

| mysql-bin.000003 |      757 | test        | mysql            |

+------------------+----------+--------------+------------------+

1 row in set (0.00 sec)

备用mysql 服务器上配置同步(该操作之前,确认通过上面的用户连接到主mysql 服务器上,避免iptables等的影响):

备用库同样设置

mysql> grant replication slave on *.* to 'sync'@'%' identified by '361way.com';

如果不设置,在后面的步骤中会出错!!!!!!!!!!!!

mysql> change master to master_host='192.168.122.20',

master_user='sync',master_password='361way.com',

master_port=3306,master_log_file='mysql-bin.000003',

master_log_pos=757,master_connect_retry=10;

并在备用mysql 服务器上启动 slave 并查看主备同步状态 :

mysql> start slave;

mysql> show slave status \G;

查看slave状态时,确认Slave_IO_Running和Slave_SQL_Running都是ok的。

四、Atlas安装配置

1、Atlas安装

前提要求:安装jdk!!!!!!!!!

Atlas会有两个版本,其中有个分表的版本,但是这个需要其他的依赖,一般场景下不需要分表这种需求,所以这里选择安装普通的版本:

Atlas (普通) : Atlas-2.2.1.el6.x86_64.rpm

Atlas (分表) : Atlas-sharding_1.0.1-el6.x86_64.rpm

安装如下:

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

# rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

其安装后,目前结构如下:

[root@atlas ~]# cd /usr/local/mysql-proxy/

[root@atlas mysql-proxy]# ll

total 16

drwxr-xr-x. 2 root root 4096 Dec 12 04:14 bin

drwxr-xr-x. 2 root root 4096 Dec 13 02:27 conf

drwxr-xr-x. 3 root root 4096 Dec 12 04:14 lib

drwxr-xr-x. 2 root root 4096 Dec 13 02:38 log

bin目录下放的都是可执行文件

1. “encrypt”是用来生成MySQL密码加密的,在配置的时候会用到

2. “mysql-proxy”是MySQL自己的读写分离代理

3. “mysql-proxyd”是360弄出来的,后面有个“d”,服务的启动、重启、停止。都是用他来执行的

conf目录下放的是配置文件

1. “test.cnf”只有一个文件,用来配置代理的,可以使用vim来编辑

lib目录下放的是一些包,以及Atlas的依赖 ,log目录下放的是日志,如报错等错误信息的记录 。

2、Atlas配置

加密数据库使用的密码:

[root@atlas bin]# ./encrypt 361way.com

FVqTnS1W5uzgSv1GServJg==

编辑/usr/local/mysql-proxy/conf/test.cnf文件 。这是用来登录到Atlas的管理员的账号与密码,与之对应的是“#Atlas监听的管理接口IP和端口”,也就是说需要设置管理员登录的端口,才能进入管理员界面,默认端口是2345,也可以指定IP登录,指定IP后,其他的IP无法访问管理员的命令界面。

#管理接口的用户名

admin-username = user

#管理接口的密码

admin-password = pwd

通过管理接口,简化管理工作,DB的上下线对应用完全透明,同时可以手动上下线。这个后面再提 。接下来配置主数据的地址与从数据库的地址:

#Atlas后端连接的MySQL主库的IP和端口,可设置多项,用逗号分隔

proxy-backend-addresses = 192.168.122.20:3306

#Atlas后端连接的MySQL从库的IP和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为1,可设置多项,用逗号分隔

proxy-read-only-backend-addresses = 192.168.122.30:3306@1

注意,上面这一行默认是注释掉的,你需要把他前面的#去掉。

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的user1和user2为示例,将其替换为你的MySQL的用户名和加密密码!

#pwds = user1:+jKsgB3YAG8=, user2:GS+tr4TPgqc=

pwds = sync:FVqTnS1W5uzgSv1GServJg==

上面用到的pwds密码为encrypt加密过后的密码 。同时需要在设置管理端的密码,否则不能登录!!!!

#Atlas监听的工作接口IP和端口

proxy-address = 0.0.0.0:1234

#Atlas监听的管理接口IP和端口

admin-address = 0.0.0.0:2345

以上为连接端口和管理端口配置 。其中管理端口用于连接增删节点 ,默认为2345端口 。1234端口为连接端口,连接完这个端口可以正常执行数据库的增删改查 sql 语句 。

可以通过如下操作启动altas:

[root@atlas bin]# ./mysql-proxyd test start

OK: MySQL-Proxy of test is started

五、连接与测试

1、连接管理接口

# mysql -h127.0.0.1 -P2345 -uuser -ppwd

管理接口可以执行的命令如下:

注意:如果这里只能看到一个地址,

可以先看一下mysql_proxy/conf/test.cnf中设置从库ip那一块是不被注释了

也可以这样:add slave ip ;save config;

如果新添加的slave地址 state的状态为down,

先检查ip地址和端口是否正确,

然后可以登录slave数据库.查看mysql表是否设置了远程登录,如果没有请设置,具体方法如下:

mysql>grant all on *.* to  sync@'%' identified by "361way.com";

可以看出这里管理的内容和test.cnf配置文件内使用的内容相关 。这里和直接修改配置文件的区别是,在这里执行语句的修改可以立即生效,无需重再重启atlas服务 。

2、读写分离测试

操作前,可以先修改test.cnf文件,开启sql-log = REALTIME ,这样执行的sql操作及连接的主机都会在日志中显示。先把mysql的主节点关闭,执行select查询操作:

MySQL [test]> select max(id) from my;

+---------+

| max(id) |

+---------+

|    9999 |

+---------+

1 row in set (0.00 sec)

MySQL [test]> select * from my where id=9999;

+------+-------+

| id  | name  |

+------+-------+

| 9999 | XnBQJ |

+------+-------+

1 row in set (0.00 sec)

MySQL [test]> insert my values(10000,'xxxxx');

ERROR 2013 (HY000): Lost connection to MySQL server during query

MySQL [test]> insert my values(10000,'xxxxx');

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id:    10010

Current database: test

Query OK, 1 row affected (0.03 sec)

可以发现,当主节点出现问题后。查询操作仍然不受影响,写入操作会受到影响。接着将主mysql节点开启,把从mysql节点关闭,发现插入和写入都不受影响:

MySQL [test]> insert my values(10001,'361way.com');

Query OK, 1 row affected (0.01 sec)

MySQL [test]> select max(id) from my;

+---------+

| max(id) |

+---------+

|  10001 |

+---------+

1 row in set (0.01 sec)

开始sql-log实时日志后,可以查看日志,发现其连接情况如下:

[root@atlas log]# more sql_test.log

[12/08/2016 01:43:25] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 1.546 "show databases"

[12/08/2016 01:43:25] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 0.911 "show tables"

[12/08/2016 01:43:35] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 1.735 "show databases"

[12/08/2016 01:43:39] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 1.143 "SELECT DATABASE()"

[12/08/2016 01:43:50] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 5.462 "select max(id) from my"

[12/08/2016 01:45:32] C:127.0.0.1:55946 S:192.168.122.20:3306 OK 8.488 "insert my values(10002,'361way.com')"

[12/08/2016 01:46:06] C:127.0.0.1:55946 S:192.168.122.30:3306 OK 2.940 "select * from my where id=10002"

[12/08/2016 01:46:40] C:127.0.0.1:55946 S:192.168.122.20:3306 OK 2.718 "help 'update'"

[12/08/2016 01:47:24] C:127.0.0.1:55946 S:192.168.122.20:3306 OK 16.327 "update my set name='yunwei' where id=10002"

这里可以发现查询相关的操作都是在从mysql 上执行的,select和update操作在主mysql 上操作的。

六、总结

1.主库宕机不影响读

主库宕机,Atlas自动将宕机的主库摘除,写操作会失败,读操作不受影响。从库宕机,Atlas自动将宕机的从库摘除,对应用没有影响。在mysql官方的proxy中主库宕机,从库亦不可用。

2.通过管理接口,简化管理工作,DB的上下线对应用完全透明,同时可以手动上下线。 比如可以通过add slave手动添加一台从库。

3.自己实现读写分离

(1)为了解决读写分离存在写完马上就想读而这时可能存在主从同步延迟的情况,Altas中可以在SQL语句前增加 /*master*/ 就可以将读请求强制发往主库。

(2)主库可设置多项,用逗号分隔,从库可设置多项和权重,达到负载均衡。

4.其在安全方面还具有可以根据用户或IP进行过滤的功能。在分表功能上也可以将单个大表拆分成多个小表,但这里有一个限制,多个小表必须在同一台DB的同一个库里,具分表需要手动创建好。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容