linux运维——MYSQL的读写分离

总结:现在网上人们浏览的变的多了起来,而具体实际操作的却不像浏览的那么多,比如像淘宝这样的大网站,每天访问量可能大的惊人,你说每个人都会买吗,不一定,所以就导致进入的流量过大,而这个时候,我们就会采用读写分离,将浏览的资源和购买过的资源分到分别不同的数据库中去,这样可以大大的减少资源的浪费,可以更加方便直观的查看资源的走向。

原理:

顾名思义,读写分离基本的原理是让主数据库处理事务性增、改、删操作,而从数据库处理查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。

linux运维——MYSQL的读写分离_第1张图片

实现方式

实现方式有很多,但是不外乎分为内部配置和使用中间件,下面列举几个常用的方法:
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)

1、查看mysql的状态,先进行关闭mysql,为了不影响实验的纯净性,先全部关闭。

**systemctl stop mysqld(关闭master和slave的mysql服务,关闭之前的mysql,因为proxy也用3306端口) **

2、给监控机下载mysql-proxy安装包,可以在mysql官网上下载
[root@lucky4 mysql安装包]# tar zxf  mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz  -C /usr/local/        下载好的解压
3、创建软连接便于访问
[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
4、查看文档,创建新的目录,并且书写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
5、创建日志目录

mysql-proxy中有写到日志目录,但是日志目录是系统默认没有存在的,所以是需要建立新的目录了

[root@lucky4 conf]# mkdir /usr/local/mysql-proxy/log
6、修改lua脚本

mysql-proxy中lua脚本决定着读写分离的重要因素.

[root@lucky4 conf]# vim /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua 

把原来的4和8改为1和2,默认超过4个连接才会启动读写分离,改为1个好测试

linux运维——MYSQL的读写分离_第2张图片

7、启动mysql-proxy

首先查看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
8、在master主机上授权新用户读写权限

查看原本的/var/lib/mysql,删除其所有的资源文件,保证实验的纯净

rm -rf /var/lib/mysql/*

编辑mysql配置文件,设置为gtid的方式,就不会去寻找默认位置,更为方便
master主机和slave主机都进行设置。

vim /etc/my.cnf

linux运维——MYSQL的读写分离_第3张图片linux运维——MYSQL的读写分离_第4张图片
开启服务
systemctl start mysqld

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
9、给proxy监测机下载监测插件
[root@lucky4 ~]# yum install lsof -y
[root@lucky4 conf]# lsof -i:3306          监测是谁在连接
10、开启物理机连接监测

先开一个物理机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都可以看到,看不出读写分离,因为存在主从复制

你可能感兴趣的:(linux运维——MYSQL的读写分离)