文章目录
一、读写分离原理
mariadb(mysql)读写分离的基本的原理是让主数据库处理事务性增加、修改、更新、删除操作(CREATE、INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。读写分离的前提是基于主从复制,这样可以保证在master上修改数据,slave同步之后,web应用可以读取到slave端的数据。
二、读写分离环境
服务器 | IP | 查询命令 |
---|---|---|
数据库Master的IP | 192.168.1.200 | |
数据库Slave的IP | 192.168.1.210 | |
mysql-proxy服务器的IP | 192.168.1.220 | |
mariadb版本 | mariadb-server-10.3.11-2.module_el8.0.0+35+6f2527ed.x86_64 | |
rpm -qa | grep mariadb | ||
mysql-proxy版本 | mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit | |
linux版本 | CentOS Linux release 8.0.1905 (Core) | cat /etc/redhat-release |
三、读写分离部署
一、服务器200、210、220安装数据库mariadb(mysql)服务
安装过程请参照博客:https://blog.csdn.net/renfeigui0/article/details/102743258
二、服务器200、210配置mariadb(mysql)服务主从复制,确保主从工作正常运行
配置过程请参照博客:https://blog.csdn.net/renfeigui0/article/details/102797353
三、服务器220安装mariadb(mysql)proxy服务
1、登录官网https://downloads.mysql.com/archives/proxy/,根据自己的系统选择合适的软件版本。
2、下载mariadb(mysql)proxy软件,解压并移动到指定目录/usr/local/mysql-proxy。
wget https://downloads.mysql.com/archives/get/file/mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
ls
tar zxf mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit.tar.gz
mv mysql-proxy-0.8.5-linux-glibc2.3-x86-64bit /usr/local/mysql-proxy
3、使用如下命令,编辑环境变量配置文件内容。
export PATH=$PATH:$HOME/bin:/usr/local/mysql-proxy/bin
4、进入mysql-proxy目录,编辑配置文件,增加如下配置文件内容。(配置文件中不要有注释空格等其他内容,不然启动程序时会报错)。
cd /usr/local/mysql-proxy/
vi mysql-proxy.conf
配置文件内容
[mysql-proxy]
plugins=proxy
proxy-address=192.168.1.220:4040
proxy-backend-addresses=192.168.1.200:3306
proxy-read-only-backend-addresses=192.168.1.210:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/mysql-proxy.log
log-level=debug
keepalive=true
daemon=true
5、启动mysql-proxy服务,如果报错“(0660 or stricter required)”,如下图一,修改配置文件权限为660即可,服务正常启动后如下图二。查看启动日志,如下图三。
mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf
chmod 660 /usr/local/mysql-proxy/mysql-proxy.conf
mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf
netstat -antp |grep mysql-proxy
cat /usr/local/mysql-proxy/mysql-proxy.log #查看日志
图一
图二
图三
6、修改读写分离配置文件rw-splitting.lua,1表示只要有一个连接,就进行读写分离。重启mysql-proxy服务。
find / -name rw-splitting.lua
vi /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
pkill mysql-proxy
mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.conf
7、主从服务器200、210,登录数据库授权账户mysqlproxy,密码123456,访问所有数据库所有权限。
grant all on *.* to 'mysqlproxy'@'%'identified by '123456';
flush privileges;
grant all on *.* to 'mysqlproxy'@'%'identified by '123456';
flush privileges;
8、读写分离测试。
写入测试(在proxy上使用建表语句成功在master上创建数据表stu,slave通过主从复制,得到stu数据表。在slave服务器上使用“stop slave”命令先停止slave,再从proxy上插入数据,master上通过查询看到新插入的数据,slave上却查询不到新插入的数据,表明通过proxy插入语句的数据是写入master的数据表中。proxy也查询不到新数据,表明通过proxy查询的数据是查询的slave的数据库)
步骤 | master | slave | proxy |
---|---|---|---|
1 | mysql -uroot -p | mysql -uroot -p | mysql -umysqlproxy -p -P 4040 -h 192.168.1.220 |
2 | show databases; | show databases; | show databases; |
3 | use newdb; | use newdb; | use newdb; |
4 | show tables; | show tables; | show tables; |
5 | create table stu (age int, name char(40) ); | ||
6 | show tables; | show tables; | show tables; |
7 | stop slave; | ||
8 | insert into stu values (220, ‘proxy’); | ||
9 | select * from stu; | select * from stu; | select * from stu; |
读取测试(salve服务器使用“start slave”启动slave服务,先通过proxy插入三条数据,然后slave删除一条数据,再次在proxy查询时,只能看到2条数据,说明proxy查询读的是从库)
步骤 | master | slave | proxy |
---|---|---|---|
1 | start alave; | ||
2 | insert into stu values (200, ‘master’); | ||
3 | insert into stu values (210, ‘slave’); | ||
4 | insert into stu values (220, ‘proxy’); | ||
5 | select * from stu; | select * from stu; | select * from stu; |
6 | delete from stu where age=‘220’; | ||
7 | select * from stu; | select * from stu; | select * from stu; |
9、mysql-proxy.conf配置文件说明。
参数 | 说明 |
---|---|
[mysql-proxy] | |
plugins=proxy | 在mysql-proxy启动时加载的插件。 |
proxy-address=192.168.1.220:4040 | 代理服务监听的地址和端口,不加端口号时,默认4040。 |
proxy-backend-addresses=192.168.1.200:3306 | 指定后端master,写入mysql服务器的地址和端口。 |
proxy-read-only-backend-addresses=192.168.1.210:3306 | 指定后端slave,只读mysql服务器的地址和端口。 |
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua | 指定读写分离配置文件位置。 |
log-file=/usr/local/mysql-proxy/mysql-proxy.log | 指定日志文件位置。 |
log-level=debug | 定义log日志级别,由高到低分别有(error |
keepalive=true | 以守护进程方式启动mysql-proxy。 |
daemon=true | 在mysql-proxy崩溃时尝试重启。 |