总结:现在网上人们浏览的变的多了起来,而具体实际操作的却不像浏览的那么多,比如像淘宝这样的大网站,每天访问量可能大的惊人,你说每个人都会买吗,不一定,所以就导致进入的流量过大,而这个时候,我们就会采用读写分离,将浏览的资源和购买过的资源分到分别不同的数据库中去,这样可以大大的减少资源的浪费,可以更加方便直观的查看资源的走向。
顾名思义,读写分离基本的原理是让主数据库处理事务性增、改、删操作,而从数据库处理查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。
实现方式有很多,但是不外乎分为内部配置和使用中间件,下面列举几个常用的方法:
1.配置多个数据源,根据业务需求访问不同的数据,指定对应的策略:增加,删除,修改操作访问对应数据,查询访问对应数据,不同数据库做好的数据一致性的处理。由于此方法相对易懂,简单,不做过多介绍。
2、现在市面上对于mysql读写分离有几款比较火的插件如mysql-proxy ,mycat,Amoeba,这个方案用mysql-proxy来实现,对于mycat也是有了解的 ,暂时先用mysql-proxy实现mysql的读写分离
准备4台服务器
master主:172.25.18.2 (lucky2)
slave从:172.25.18.3 (lucky3)
mysql-proxy监控、管理:172.25.18.4 (lucky4)
**systemctl stop mysqld(关闭master和slave的mysql服务,关闭之前的mysql,因为proxy也用3306端口) **
[root@lucky4 mysql安装包]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C /usr/local/ 下载好的解压
[root@lucky4 mysql安装包]# cd /usr/local/
[root@lucky4 local]# ls
bin etc games include lib lib64 libexec mysql-proxy-0.8.5-linux-el6-x86-64bit sbin share src
[root@lucky4 local]# ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy
[root@lucky4 local]# cd /usr/local/mysql-proxy
[root@lucky4 mysql-proxy]# mkdir conf
[root@lucky4 mysql-proxy]# cd conf/
[root@lucky4 conf]# vim mysql-proxy.conf
[mysql-proxy]
proxy-address=0.0.0.0:3306
proxy-backend-addresses=172.25.18.2:3306
proxy-read-only-backend-addresses=172.25.18.3:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
pid-file=/usr/local/mysql-proxy/log/mysql-proxy.pid
plugins=proxy
log-file=/usr/local/mysql-proxy/log/mysql-proxy.log
log-level=debug
keepalive=true
daemon=true
在mysql-proxy中
有写到日志目录,但是日志目录是系统默认没有存在的,所以是需要建立新的目录了
[root@lucky4 conf]# mkdir /usr/local/mysql-proxy/log
在mysql-proxy
中lua脚本决定着读写分离的重要因素.
[root@lucky4 conf]# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
把原来的4和8改为1和2,默认超过4个连接才会启动读写分离,改为1个好测试
首先查看mysql-proxy
是否开启的 查看端口。
[root@lucky4 conf]# netstat -antlp 查看并没有3306端口,证明没有开启服务
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 643/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 860/master
tcp 0 0 172.25.18.4:22 172.25.18.250:53880 ESTABLISHED 2252/sshd: root@pts
tcp6 0 0 :::22 :::* LISTEN 643/sshd
tcp6 0 0 ::1:25 :::* LISTEN 860/master
开启服务
[root@lucky4 conf]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
2019-07-04 15:40:27: (critical) mysql-proxy-cli.c:326: loading config from '/usr/local/mysql-proxy/conf/mysql-proxy.conf' failed: permissions of /usr/local/mysql-proxy/conf/mysql-proxy.conf aren't secure (0660 or stricter required)
2019-07-04 15:40:27: (message) Initiating shutdown, requested from mysql-proxy-cli.c:328
2019-07-04 15:40:27: (message) shutting down normally, exit code is: 1 开启服务出现报错,给出的错误原因是给出的权限过大,所以改权限即可,报错中给出的文件是可以设置660权限的。那么我们就设置660权限。
重新给配置文件权限,并且重新启动
[root@lucky4 conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf
[root@lucky4 conf]# /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf 启动成功
可以再次查看日志,会发现两个节点已经加进来了。
[root@lucky4 conf]# cat /usr/local/mysql-proxy/log/mysql-proxy.log
2019-07-04 15:42:55: (message) chassis-unix-daemon.c:136: [angel] we try to keep PID=12061 alive
2019-07-04 15:42:55: (debug) chassis-unix-daemon.c:157: waiting for 12061
2019-07-04 15:42:55: (debug) chassis-unix-daemon.c:121: we are the child: 12061
2019-07-04 15:42:55: (critical) plugin proxy 0.8.5 started
2019-07-04 15:42:55: (debug) max open file-descriptors = 1024
2019-07-04 15:42:55: (message) proxy listening on port 0.0.0.0:3306
2019-07-04 15:42:55: (message) added read/write backend: 172.25.18.2:3306 lucky2主机
2019-07-04 15:42:55: (message) added read-only backend: 172.25.18.3:3306 lucky3从
[root@lucky4 conf]#
结束进程
[root@lucky4 conf]# ps aux | grep proxy
root 12060 0.0 0.0 37856 700 ? S 15:42 0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
root 12061 0.0 0.1 37856 1144 ? S 15:42 0:00 /usr/local/mysql-proxy/libexec/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf
root 12066 0.0 0.0 112648 960 pts/0 S+ 15:48 0:00 grep --color=auto proxy
[root@lucky4 conf]# kill -9 12060
[root@lucky4 conf]# kill -9 12061
[root@lucky4 conf]# ps aux | grep proxy
root 12068 0.0 0.0 112648 956 pts/0 R+ 15:48 0:00 grep --color=auto proxy
查看原本的/var/lib/mysql
,删除其所有的资源文件,保证实验的纯净
rm -rf /var/lib/mysql/*
编辑mysql配置文件,设置为gtid的方式,就不会去寻找默认位置,更为方便
master主机和slave主机都进行设置。
vim /etc/my.cnf
master主机初始化密码,登陆mysql,设置新的资源
[root@lucky2 mysql]# cat /var/log/mysqld.log |grep password
[root@lucky2 mysql]# mysql -uroot -p
mysql> alter user root@localhost identified by 'Westos+123';
Query OK, 0 rows affected (0.08 sec)
mysql> grant replication slave on *.* to repl@'172.25.18.%' identified by 'Westos+123';
Query OK, 0 rows affected, 1 warning (0.39 sec)
slave从机初始化密码,登陆mysql,设置新的mysql资源
[root@lucky3 etc]# cat /var/log/mysqld.log | grep password
mysql> alter user root@localhost identified by 'Westos+123';
Query OK, 0 rows affected (0.01 sec)
mysql> CHANGE MASTER TO 确定master主机是那个
-> MASTER_HOST = '172.25.18.2',
-> MASTER_USER = 'repl',
-> MASTER_PASSWORD='Westos+123',
-> MASTER_AUTO_POSITION =1;
Query OK, 0 rows affected, 2 warnings (0.80 sec)
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)
mysql> show slave status\G
Slave_IO_Running: Yes 查看IO线程和sq线程是否为yes状态
Slave_SQL_Running: Yes
[root@lucky4 ~]# yum install lsof -y
[root@lucky4 conf]# lsof -i:3306 监测是谁在连接
先开一个物理机shell 连接查看
[kiosk@foundation18 ~]$ mysql -h 172.25.18.4 -ukiosk -pWestos+123;
mysql-proxy机器上查看
root@lucky4 conf]# lsof -i:3306
连续物理机shell连接两次查看,发现两次连接都指向lucky2,是因为还没有开启读写分离,所以这个时候可以在连接一次,会发现指向lucky3,读写分离效果就达到了
在数据库中建立一个库,然后可以使用物理机上插入数据,以测试读写分离
MySQL [(none)]> use lucky;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MySQL [lucky]> insert into tb values ('user1','2222');
Query OK, 1 row affected (0.06 sec)
MySQL [lucky]> select * from tb;
+----------+----------+
| username | password |
+----------+----------+
| user1 | 2222 |
+----------+----------+
1 row in set (0.00 sec)
MySQL [lucky]>
这个时候发现lucky2和lucky3都可以看到,看不出读写分离,因为存在主从复制