配置Mysql实现主从复制与读写分离

环境说明

主从复制使用mysql自带的master与slave机制;读写分离使用mysql-proxy实现!

有服务器三台:s1,s2,s3。

s1为web服务器,装有httpd,php,mysql,mysql-proxy。

s2为主数据库服务器(Master),仅装mysql。

s3为从数据库服务器(Salve),仅装mysql。

实现目标

s1上的网站的数据库读写操作分摊到s2和s3上,即s2专门进行写操作(也可以读),s3专门进行读操作;

s2上的数据库中有数据更新时,自动将变化同步到s3上的数据库中。

配置主从复制(涉及的服务器:s2,s3)

1.首先在主数据库服务器(master)s2上进行配置

#编辑mysql配置文件
vim /etc/my.cnf#整体内容如下:
[client]
default_character_set=utf8[mysqld]
default_character_set=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0server-id=1             #重要,需和副数据库的id区分开,主为1,副为2
log-bin=mysql-bin       #定义二进制log文件,从数据库将通过读取二进制log文件来更新
binlog-ignore-db=mysql  #定义忽略的数据库,即不需要同步的数据库
binlog-do-db=testdb     #定义需要同步的数据库,如果没有此,将同步所有数据库(除了上面ignore的数据库)[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

2.在主数据库服务器(master)s2上的mysql中创建一个供副数据库(slave)s3连接的账号

#在主数据库服务器上进入mysql命令行
mysql -u root  -p
(输入密码)#成功进入mysql命令行,新建一个用户
mysql>grant replication slave on *.* to '用户名'@'副数据库的IP地址' identified by '密码';#查看创建用户是否成功
mysql>select user,host from mysql.user;

 

3.重启主数据库服务器上的mysql服务

service mysqld restart

4.记录主数据库服务器的master状态,在配置从服务器时需要使用到

#同样进入mysql命令行
mysql>show master status;

类似于此内容:

记下Flie和Position。需要注意的是这两个值在mysql重启后变化。所以在第一次配置从服务器时,需要注意了!

主数据库的配置完成,现在开始从数据库服务器。

5.配置从数据库服务器上的my.cnf文件

vim /etc/my.cnf#整体内容如:
[client]
default_character_set=utf8[mysqld]
default_character_set=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
symbolic-links=0server-id=2            #重要,与主数据上id不一样[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

6.重启从数据库服务器的mysqld

service mysqld restart

 

7.进入mysql命令行,执行change master to命令

#进入mysql
mysql -u root -p
(输入密码)#进入mysql后,先停止slave
mysql>slave stop;
mysql>change master to>master_host='主数据库的ip地址或者hostname',>master_user='主数据库中允许从数据库连接它的用户名',>master_password='这里是密码',>master_log_file='mysql-bin.000004',>master_log_pos=261;#master_log_file,master_log_pos即上面使用show master status看到的信息
mysql>slave start;#查看slave状态
mysql>show slave status\G;

在看到的slave状态中,关键信息为:

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果这两项都为Yes,说明主从之间复制ok了。

贴上我的slave status:

mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: s2Master_User: userssMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000004Read_Master_Log_Pos: 2308873Relay_Log_File: mysqld-relay-bin.000288Relay_Log_Pos: 251Relay_Master_Log_File: mysql-bin.000004Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 2308873Relay_Log_Space: 5650Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: 
1 row in set (0.00 sec)

最后,可以测试下,在主数据库中创建一个数据库,创建一张表,插入点数据,然后在从数据库中看时候有数据!

配置读写分离(涉及的服务器s1,s2,s3)

1.首先我们想要在web服务器上安装mysql-proxy,并配置好它,mysql-proxy官网下载

#进入mysqlproxy的目录
cd /opt/mysql-proxy

 

#创建mysqlproxy.cnf文件
vim mysqlproxy.cnf
#整体内容如下
[mysql-proxy]
user=mysql
daemon=true
keepalive=true
log-level=message
log-file=/opt/mysql-proxy/mysqlproxy.log
pid-file=/opt/mysql-proxy/mysqlproxy.pid
proxy-backend-addresses=主数据库服务器IP:端口(默认3306)
proxy-read-only-backend-addresses=从数据库服务器IP:端口(默认3306)

 

#编辑环境变量文件
vim /etc/profile

 

#在最后加入下列两行内容(路径自行修改)
PATH=/opt/mysql-proxy/bin:/opt/mysql-proxy/share/doc/mysql-proxy:$PATH
export PATH
#可以创建一个简单的脚本,以便于开机启动
vim mysqlproxy
#内容如下:
#!/bin/bash
mysql-proxy --defaults-file=/opt/mysql-proxy/mysqlproxy.cnf
#创建好后,把mysqlproxy文件复制到/opt/mysql-proxy/bin目录下#在开机启动项中,可以加入mysqlproxy
vim etc/rc.d/rc.local
#加入:
mysqlproxy#确认mysqlproxy文件是否具有可执行权限
#最后修改rw-splitting.lua文件
vim /opt/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua
#修改这两个值
min_idle_connections = 1, //默认为4
max_idle_connections = 1, //默认为8

 

2.在主数据库服务器上进入mysql命令行,创建一个用户

mysql -u root -p#进入mysql后
mysql>grant all on *.* to '用户名'@'web服务器地址' identified by '密码';

此时由于主数据库和从数据库是主从复制,从数据库上应该已经有了上面新建的用户了。

 

如果还没配置主从复制,在从服务器上执行下grant就好。

重要配置已经完成了,最后就要确定下防火墙(iptables)了。

web服务器的mysql-proxy默认端口为4040,主从两个数据库3306端口。

测试读写分离

在web服务器上通过mysql连接4040端口:

#用户名为上面第二步中新建的用户,hostname为其对应的hostname(即web服务器地址)
mysql -u 用户名 -p -P 4040 -h hostname

输入密码后,通过web服务器就能连接到s2,所做的变更将直接在s2上生效,而s3将通过主从复制,实现同步!

 

注:web服务器的mysql的3306端口,不参与读写分离主从复制!web服务器上的网站程序数据库只需要连接4040端口即可!

 

 

 

 

转载于:https://www.cnblogs.com/keheng/articles/3721107.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/460405.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arduino 土壤温湿度传感器_嫌arduino太贵?太大?试试ATTINY85!DIY温湿度计入门级教程...

ATTINY85做主控,OLED显示的温湿度计。简介:通过Arduino开发环境,对ATTINY85进行编程,利用DH11温湿度传感器,在SSD1306(128*64)OLED显示屏上显示温度和湿度。材料:ATTINY85DHT11SSD1306 (12864 OLED)电池盒纸…

认识事件冒泡和事件捕获

一.事件冒泡就是多个元素同时响应了同一个事件,前提是这些元素都绑定了这一个事件。这只是我的定义,感觉好理解些。 称它为冒泡,是因为事件会按照DOM元素的层次结构依次执行,就像水泡一样不断浮向顶端。所以称之为事件冒泡。 这个…

计算abc=a!+b!+c!

根据题目,即求abca!b!c! 下面我们设计算法: 设三位数为n,取出每一位数分别放在a、b、c中 通过定义形参,求每位数的阶乘,通过函数返回值返回 主函数中,调用返回值,每一位的阶乘相加与该三位数比较&#xff0…

docker选择安装位置_自定义WSL的安装位置,别再装到C盘啦

本文使用 Zhihu On VSCode 创作并发布为了用docker,今天才决定更新到win10 2004打算另外装一个WSL2的发行版折腾docker和GPU,发现之前装WSL到非系统盘的教程找不到了。现在网上也没找到有这方面的东西,干脆自己写一个留作记录吧~WSL(Windows Subsystem f…

[讨论帖] 程序员如何赚外快?

昨天的一篇文章一个程序员如何快速赚到一百万?引起了大家的热门讨论,现在另开一个贴,讨论一下如何赚钱。 -------------------------- 挣外快需要的是大量的业余时间和强大的意志,如果你是个每天工作十几个小时天天累得像狗一样的…

求两个数的最大公约数和最小公倍数

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 [plain] view plaincopy #include <stdio.h> int main() { int a, b, num1, num2, tmp; printf("Input a & b:"); scanf("%d %d",&num…

24安装失败 spss win10_教你win10系统显卡驱动安装失败的解决方法「系统天地」

我们日常在对电脑的使用过程中&#xff0c;经常都会遇到这样或那样的问题。比如说win10系统显卡驱动安装失败该怎么办呢&#xff1f;别着急&#xff0c;还有小编在呢&#xff1f;接下来小编就来告诉大家win10电脑系统显卡驱动安装失败怎么解决。详细教你win10系统显卡驱动安装失…

算法题系列

如果字符串str3能够由str1和str2中的字符按顺序交替形成&#xff0c;那么称str3为str1和str2的交替字符串。 例如str1"abc"&#xff0c;str2"def"&#xff0c;那么"adbecf", "abcdef", "abdecf", "abcdef", "…

学会拒绝别人的6个技巧_多少人败在不懂拒绝上!牢记10个高情商拒绝技巧,人生越来越顺...

人际交往中&#xff0c;往往需要拒绝别人的请求&#xff0c;否定别人的意见&#xff0c;这并非易事&#xff0c;需要极高的情商&#xff0c;做到既能成功拒绝&#xff0c;又不得罪他人。否则&#xff0c;不懂拒绝的话&#xff0c;就会给自己带来许多麻烦&#xff0c;也会给别人…

记GMIC 2014

我也是因为一次偶然的机会得知了全球移动互联网大会&#xff08;缩写GMIC&#xff09;这样一个全球最大规模的移动互联网行业的盛会&#xff0c;并且因为偶然的机会有幸在今年五一假期时得到一张分会场的门票。面对这样难得的机会&#xff0c;果断把五一三天假给自己放成了七天…

Win10/Win7小技巧:教你如何彻底关闭系统进程

无论Windows 10打过多少补丁&#xff0c;官方说的有多么完美&#xff0c;运行卡顿和程序假死还是常有的事儿。这个时候常规的解决方案就是用任务管理器&#xff08;CtrlAltDel&#xff09;去解决一些占用系统资源非常过分&#xff0c;“表脸”的进程。 但有的时候会发现任务管理…

导致大量kworker的原因_高尿酸与生活习惯有关?导致高尿酸的8个坏习惯,现在改还来得及...

高尿酸是痛风出现前的一个时期&#xff0c;大约百分之十左右的患者会出现痛风情况。这种疾病是一种人体代谢絮乱疾病&#xff0c;是由内外多种因素导致的&#xff0c;那么关于高尿酸形成的具体原因&#xff0c;下面我们一起来看看吧。高尿酸的病因有哪些&#xff1f;1、饮食不当…

C#开发微信公众平台-就这么简单(附Demo)

相关文档&#xff1a;https://www.google.com/search?site&sourcehp&qC%23%E5%BE%AE%E4%BF%A1%E5%BC%80%E5%8F%91&btnGGoogle%E6%90%9C%E7%B4%A2 原文地址&#xff1a;http://www.cnblogs.com/xishuai/p/3625859.html 写在前面 服务号和订阅号URL配置创建菜单查询…

用一个简单的例子来演绎事件委托

本篇博文&#xff0c;Insus.NET想使用一个超简单的例子来演绎事件委托。我们在开发网页时&#xff0c;刚开始时在网页的顶部放一个铵钮(web control)&#xff0c;想实现一个功能。 在xxx.aspx.cs: OK&#xff0c;某一天&#xff0c;此网页的内容随时间而增长&#xff0c;出现了…

Java的接口及实例

一、定义Java接口&#xff08;Interface&#xff09;&#xff0c;是一系列方法的声明&#xff0c;是一些方法特征的集合&#xff0c;一个接口只有方法的特征没有方法的实现&#xff0c;因此这些方法可以在不同的地方被不同的类实现&#xff0c;而这些实现可以具有不同的行为&am…

三位数的茎叶图怎么看_贝德玛化妆品生产日期怎么看?贝德玛化妆品保质期怎么看?...

对于喜欢化妆的小伙伴来说&#xff0c;贝德玛这个名字并不陌生。因为在卸妆产品中&#xff0c;有一个爆款单品卸妆水就出自贝德玛旗下&#xff0c;当然这也是贝德玛最知名的产品。不过很多人并不知道&#xff0c;这个来自法国的化妆品品牌&#xff0c;其实属于药妆系列。所以贝…

从Loagistic 到 SVM算法

SVM&#xff08;支持向量机&#xff09;&#xff0c;一种二类分类器&#xff0c;之所以称之为向量机&#xff0c;是因为它本身就产生一个二值决策结果&#xff0c;即使一种决策“机”&#xff0c;支持向量机的泛化错误低&#xff08;具有结构风险最小&#xff09;&#xff0c;具…

数据有序_Redis实战(3)-数据结构List实战一之商品信息的有序存储

摘要电商平台的管理后端一般有两大角色的用户可以使用&#xff0c;一个是系统管理员&#xff0c;一个是平台的卖家/商家&#xff0c;对于商家而言&#xff0c;管理自个儿的商品是日常工作中再为普通不过的事情了&#xff0c;本文我们将以"有序存储并展示电商平台中商家上传…

c单链表

#include <stdio.h>#include <stdlib.h>#define T 1#define F -1typedef int Type;struct Node{Type value;struct Node *next;};int init(struct Node **head); //初始化int insert_head(struct Node *head, Type value); // 头插法int in…

和redis_Redis 缓存

使用场景#Redis 通常用作web应用的内存缓存&#xff0c;和Django&#xff0c;Ruby-on-Rails&#xff0c;Node.js以及Flask框架结合Redis在存储新的数据的过程中可以清除陈旧的数据。Redis使用Less Recently Used(LRU)策略,可以为每个健设置过期时间Redis 存储指标数据用于量化网…