当前位置: 首页 > 编程日记 > 正文

proxy实现 mysql 读写分离

实现 mysql 读写分离


图解:


环境:
iptables 和 selinux 关闭
proxy:test2 172.25.1.2
Master: test3 172.25.1.3
Slave:test4 172.25.1.4
环境已经实现 test3(master) 和 test4(slave) 的主从复制

Server2:

[root@test2 ~]# ls
mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz
[root@test2 ~]# tar zxf mysql-proxy-0.8.5-linux-el6-x86-64bit.tar.gz -C
/usr/local
[root@test2 ~]# cd /usr/local
[root@test2 local]# ln -s mysql-proxy-0.8.5-linux-el6-x86-64bit/ mysql-proxy

[root@test2 local]# vim ~/.bash_profile

[root@test2 local]# source ~/.bash_profile            //使环境变量生效
[root@test2local]# cd /usr/local/mysql-proxy/share/doc/mysql-proxy
[root@test2mysql-proxy]# vim rw-splitting.lua                    //修改读写分离 lua 脚本

mysql proxy 会检测客户端连接, 当连接没有超过 max_idle_connections 值时, 不会进
行读写分离, 即查询操作会发生到 master 上。

[root@test2 local]# cd /usr/local
[root@test2 local]# cd mysql-proxy
[root@test2 mysql-proxy]# mkdir conf
[root@test2 mysql-proxy]# cd conf
[root@test2 conf]# vim mysql-proxy.conf

[mysql-proxy]
user=root
proxy-address=0.0.0.0:3306
proxy-backend-addresses=172.25.254.11:3306
proxy-read-only-backend-addresses=172.25.254.12:3306
proxy-lua-script=/usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
log-file=/usr/local/mysql-proxy/logs/mysql-proxy.log
log-level=debug
daemon=true
keepalived=true

[root@test2conf]#mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf

[root@test2 conf]# mkdir ../logs
[root@test2 conf]# chmod 660 /usr/local/mysql-proxy/conf/mysql-proxy.conf             //配置文件必须是 660 权限
[root@test2 conf]# mysql-proxy  --defaults-file=/usr/local/mysql-proxy/conf/mysql-proxy.conf         //再次执行启动配置文件


[root@test2 conf]# netstat -antlp          //查看端口

主备 mysql 开启服务
Test3 和 test4 都需要做解压 mysql 并已搭建好主备模式


Test3:

mysql> grant insert,update on westos.* to cxx@'%' identified by '@Caoxingxing123';
mysql> show master status;
mysql> show slave status;



Test4:

mysql> stop slave;
mysql>change master to master_host='172.25.1.3',master_user='repl',master_password='@Caoxingxing123', master_auto_position=1;
mysql> start slave


mysql> show slave status\G;

Test3:

mysql> show databases;

mysql> CREATE DATABASE westos;
mysql> USE westos;
mysql> CREATE TABLE userlist(
-> username varchar(10) not null,
-> password varchar(30) not null
-> );
mysql> select * from userlist;

Test4:

mysql> show databases;

mysql> use westos;
mysql> select * from userlist;                    //数据库已经同步过来了

客户端测试:

[root@foundation1 ~]# mysql -u root -h 172.25.1.2 -p              //会出现如下情况
ERROR 1045 (28000): Unknown error 1045


//注意:root 用户需要在 master 和 slave 做授权
test3 和 test4 都需要执行

mysql> grant insert,update on westos.* to cxx@'%' identified by  '@Caoxingxing123';

//再次尝试登陆

[root@foundation1 ~]# mysql -h 172.25.1.2 -u cxx -p westos

MySQL [(none)]> use westos;
MySQL [westos]> show tables;

MySQL [westos]> insert into userlist values('user1','111');

MySQL [westos]> select * from userlist;            //只能写不能读


master 和 slave 端都可以查看到刚插入的数据
Test3:

Test4:


当连接一个时:
test3:通过监控查看连接情况

[root@test3 ~]# yum install lsof -y
[root@test3 ~]# lsof -i :3306                 //下载所需的监控


test4:通过监控查看连接情况

[root@test4 ~]# yum install lsof -y
[root@test4 ~]# lsof -i :3306


当连接两个时:

[kiosk@foundation1 ~]$ mysql -h 172.25.1.2 -u cxx -p westos              //加一个

Test3:

[root@test3 mysql]# lsof -i :3306

Test4:

[root@test4 mysql]# lsof -i :3306

当连接三个时(此时已超过最大连接数):

[kiosk@foundation1 ~]$ mysql -h 172.25.1.2 -u cxx -p westos

Test3:


Test4:


此时在最后一个连接的客户端写数据

MySQL [westos]> insert into userlist values ('user2','222');

Test3 查看数据:


Test4 查看数据:

实现了读写分离,当读数据的时候第三个连接到的是test4 ,但
写数据时自动连接 test3 从而保存数据。
总结:
首先连接的是 master,所以此时是对 master 读写,还没有读写分离,只有当连接数
大于设置的最大连接数时才会出现读写分离。
之前设置了最大连接数为 2,最小连接数为 1。所以默认为当连接数(客户端访问量)
为 1 时,连接的是 master,连接数为 2 时,连接的也是 master;只有当连接数大于 2 时,
后面连接的为 slave,且当读的时候访问的是 slave,写的时候访问的是 master(原因是:
master 和 slave 主从同步是单向的,所以写数据的时候如果写到 slave,slave 是不会同步
给 master 的。读的话就可以,因为数据的一致性, slave 和 master 的数据始终是相同的)。

相关文章:

iOS开发中用到的一些第三方库

下面是我在开发中用到的一些优秀的iOS第三方开源库: 1.AFNetworking(网络请求,类似的还有ASIHTTPRequest) https://github.com/AFNetworking/AFNetworking/ 2.MBProgressHUD(提示框) https://github.…

小图标外链API

网页上有些分享的小图标,比如分享到facebook,weibo,qq空间等功能的时候,图标以前一般是自己做一个css sprite。当一个网站的图标变了的时候,比如facebook变成assbook的时候,你就要修改这个css sprite。费时…

转载JQuery 获取设置值,添加元素详解

转载原地址 http://www.cnblogs.com/0201zcr/p/4782476.html jQuery 获取内容和属性 jQuery DOM 操作 jQuery 中非常重要的部分,就是操作 DOM 的能力。 jQuery 提供一系列与 DOM 相关的方法,这使访问和操作元素和属性变得很容易。 提示:DOM …

mysql 主从复制 和基于gtid的mysql主从复制

主从复制 原理: mysql 无需借助第三方工具,而是其自带的同步复制功能,另外一点,mysql 的主从 复制并不是从硬盘给上文件直接同步,而是逻辑的 binlog 日志同步到本地的应用执行的过 程。 数据从一个 mysql 数据库(master)复制到另一个 mysql 数据库(slave),在 master 与 slave …

使用read write 读写socket

一旦,我们建立好了tcp连接之后,我们就可以把得到的fd当作文件描述符来使用。 由此网络程序里最基本的函数就是read和write函数了。 写函数: ssize_t write(int fd, const void*buf,size_t nbytes); write函数将buf中的nbytes字节内容写入文件…

iOS从通讯录中选择联系人

有时候APP需要用户输入一位联系人的姓名和电话&#xff0c;除了用户手动输入&#xff0c;一般也允许用户从通讯录中选择一位联系人&#xff08;图1&#xff09;&#xff0c;下面的代码就是使用系统的<AddressBookUI/AddressBookUI.h>库实现这一需求。 图1 完整代码&…

document.readystate

http://www.cnblogs.com/lhb25/archive/2009/07/30/1535420.html http://www.cnblogs.com/haogj/archive/2013/01/15/2861950.html http://jincuodao.baijia.baidu.com/article/2896 电视转载于:https://www.cnblogs.com/daishuguang/p/3523783.html

Openstack安装部署

系统版本 rhel7.4 关闭 iptables 关闭 selinux foundation1: 172.25.254.1 server1: 172.25.254.11 server2: 172.25.254.12 可参考&#xff1a;https://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/ //选择的mitaka 虚拟机上网 首先物理机必须可…

在Xcode中使用Git进行源码版本控制

本文翻译自Understanding Git Source Control in Xcode &#xff08;译者myShire&#xff09;欢迎您加入我们的翻译小组。 在应用程序开发过程中&#xff0c;很重要的一部分工作就是如何进行源码的版本控制。当代码出现问题时&#xff0c;我们就需要将代码恢复到原先正常的版本…

敏捷开发之道(二)极限编程XP

上次的博文敏捷开发之道&#xff08;一&#xff09;敏捷开发宣言中&#xff0c;我们介绍了一下敏捷开发宣言&#xff0c;在其中&#xff0c;我们了解到了关于敏捷开发的几个重要的价值观。今天我们来了解一个敏捷开发的方法——极限编程XP 1、介绍 极限编程&#xff08;eXtreme…

spring 3.X与jdk 1.8不兼容

1、报错&#xff08;部分&#xff09; 2、解决 虽然Spring的jdk要求如下&#xff0c;但是spring 3与jdk1.8不兼容&#xff08;使用的是spring 3.2&#xff09; 在eclipse将jdk版本下调。这里将JDK调到1.7&#xff08;在eclipse如下设置&#xff09; 同时&#xff0c;需要设置服…

rhel-server-7.5-x86_64-dvd.iso镜像下载及rar压缩包的解压

主机名为server1 [rootserver1 ~]# ls rhel-server-7.5-x86_64-dvd.part1.rar rarlinux-5.6.1.tar.gz rhel-server-7.5-x86_64-dvd.part2.rar 1、如果没有rarlinux-5.6.1.tar.gz包可以去 https://www.rarlab.com/download.htm 这个网站下载RAR 5.61 for Linux 或者RAR 5.…

Expandable Table的Demo

在网上看到一个可点击cell展开的TableView的demo&#xff0c;原文是swift语言&#xff0c;我写了个oc版&#xff0c;有兴趣的朋友可以看下&#xff1a; 效果&#xff1a; oc源码&#xff08;带中文注释&#xff09;&#xff1a;http://download.csdn.net/detail/dolacmeng/941…

Java对多线程的支持

Java运行时系统实现了一个用于调度线程执行的线程调度器&#xff0c;用于确定某一时刻由哪一个线程在CPU上运行。在Java技术中&#xff0c;线程通常是抢占式的而不需要时间片分配进程&#xff08;分配给每个线程相等的CPU时间的进程&#xff09;。抢占式调度模型就是许多线程处…

ESP8266-iot-2

1.SDK概述 复制相关的工程文件到HelloWorld里面 要在版本esp8266_nonos_sdk_v2.0.0_16_07_19上面开发&#xff0c;那么就要复制相应文件 然后打开IDE 导入HelloWorld到工程里面 创建3个文件&#xff0c;如下图 再从lib里面添加文件 复制到我的下面 复制app里面的内容 打算从IoT…

iptables防火墙策略

环境&#xff1a; foundation1 172.25.1.250 172.25.254.1 server1 172.25.1.1 server2 172.25.1.2 server3 172.25.1.3 四个主机都做解析 iptables简介&#xff1a; netfilter/iptables&#xff08;简称为iptables&#xf…

ubuntu(16.04.01)学习-day1

1.修改root用户密码 sudo passwd root 按提示进行设置。 2.从Ubuntu 16.04开始&#xff0c;用户可以实现改变启动器的位置&#xff0c;可以将启动器移到屏幕底部&#xff0c;但是无法移到右边或顶部。打开终端&#xff0c;然后输入下面这个命令&#xff0c;即可将启动器移到屏幕…

HDU 1090 A+B for Input-Output Practice (II)

#include <cstdio> int main() {int n,a,b;scanf("%d",&n);for (int i1; i<n; i){ scanf("%d%d",&a,&b);printf("%d\n",ab);}return 0; } 转载于:https://www.cnblogs.com/forever97/p/3539605.html

监听UIWebView点击视频播放的事件

最近项目需要统计在跳转UIWebView后&#xff0c;用户点击网页上的视频进行播放的概率。找了很多监听进入视频播放的方法&#xff0c;最后在stackoverflow找到下面这个使用Notification的可行方法(如果是弹出)&#xff1a; #pragma mark Notification - (void)addNotification {…

linux系统下redhat7之虚拟机控制

基础操作&#xff1a; [kioskfoundation0 Desktop]$ rht-vmctl start desktop ###开启desktop虚拟机 Error: desktop not started (is already running) ###报错&#xff0c;desktop已经运行 [kioskfoundation0 Desktop]$ rht-vmctl view desktop …

如何设计一个 iOS 控件?(iOS 控件完全解析)

前言 一个控件从外在特征来说&#xff0c;主要是封装这几点&#xff1a; 交互方式显示样式数据使用 对外在特征的封装&#xff0c;能让我们在多种环境下达到 PM 对产品的要求&#xff0c;并且提到代码复用率&#xff0c;使维护工作保持在一个相对较小的范围内&#xff1b;而一个…

Chapter12:动态内存

智能指针——shared_ptr为了更容易地使用动态内存&#xff0c;新的标准提供了智能指针来管理动态对象。智能指针的行为类似常规指针&#xff0c;重要的区别是它负责自动释放指向的对象。 智能指针的使用方式与普通指针类似。解引用一个智能指针返回它指向的对象。 1 if (p1 &am…

判断JS对象是否拥有某属性两种方式

方式&#xff0c;但稍有区别 1&#xff0c;in 运算符 1 2 3 var obj {name:jack}; alert(name in obj); // --> true alert(toString in obj); // --> true 可看到无论是name&#xff0c;还是原形链上的toString&#xff0c;都能检测到返回true。 2&#xff0c;hasOwnP…

Linux之redhat7系统结构

一.linux系统结构 linux是一个倒树结构 linux中所有的东西都是文件 这些文件都在系统顶级目录“/” /就是根目录 /目录以下为二级目录这些目录都是系统装机时系统自动建立的 二级目录的作用 /bin ##二进制可执行文件也就是系统命令 /sbin ##系统管理命令存放位置 /boot …

ASP.NET优化

源地址&#xff1a;http://www.cnblogs.com/wangjingblogs/archive/2013/02/27/2934706.html http://jingyan.baidu.com/article/2d5afd69bfd0ff85a3e28e6d.html转载于:https://www.cnblogs.com/haizine/p/5841771.html

3D Touch介绍: 一个数字压力器App和Quick Actions

随着iPhone 6s and 6s Plus的发布&#xff0c;苹果介绍了全新的手机交互方式&#xff1a;重按手势。你应该知道&#xff0c;这个特性其实早已应用在苹果手表和MacBook产品中&#xff0c;名字叫Force Touch。它给用户交互添加了全新的维度&#xff01; 或许你对Force Touch为什么…

一些LUA函数(转载)

转自http://hi.baidu.com/chevallet/item/9a3a6410c20d929198ce3363 一些LUA函数 1、assert (v [, message])  功能&#xff1a;相当于C的断言&#xff0c;当表达式v为nil或false将触发错误,  message&#xff1a;发生错误时返回的信息&#xff0c;默认为"assertion f…

cifs------网络文件系统(1)

SMB文件共享 SMB&#xff08;Server Message Block&#xff09;通信协议是微软&#xff08;Microsoft&#xff09;和英特尔(Intel)在1987年制定的协议&#xff0c;主要是作为Microsoft网络的通讯协议。SMB 是在会话层&#xff08;session layer&#xff09;和表示层&#xff0…

Swift 教學:如何使用iOS Charts API 製作漂亮的圖表

在應付許多的資料時&#xff0c;比起只在表格中呈現&#xff0c;使用圖表來顯示資料&#xff0c;可以幫助使用者容易地了解資訊。有了圖表&#xff0c;相對於讀取整個資料表&#xff08;或幾個資料表&#xff09;你可以輕鬆地一眼便見到以圖形表示的資料&#xff0c;取得所需的…

在Proteus中添加标号

1.Proteus中添加组件后双击引脚可以快速生成一个最近的端口。 2.按A调出设置界面 3.在String中写&#xff1a;netH#,"H"可以换成自定义前缀。count为起始值&#xff0c;increment为增量。 4.依次点击想要编号的引脚。转载于:https://www.cnblogs.com/viaduct/p/58424…