MySQL5.6 实现主从复制,读写分离,分散单台服务器压力

闲来无事,在本地搭建几台虚拟机,准备配一个mysql读写分离的主从配置,版本选用最新版的,mysql.5.6.28 版本,本处使用源码安装(鄙人一向喜欢源码安装,因为centos中鄙人不知道yum安装怎么指定安装目录,还有怎么指定各种配置,不过有些依赖的库之类的反正鄙人不直接用,使用源码安装到时还得指定安装目录,而且有时各种不匹配也是醉了)

安装环境:Centos 6.4

Mysql版本: 主从都使用MySQL5.6.28

机器情况:使用三台,分别为centos1/centos3/centos4 (为啥没有centos2呢,因为centos2被我弄坏了,再也开不起来了), 其中centos4作为主库,其他两台作为从库, 当然这几台hostname 都以centos1/centos3/centos4 命名, IP 分别为 192.168.138.4 192.168.138.3 192.168.138.1

使用 ifconfig 可以查看我的配置

细心同学会发现,我这里有两块网卡,这主要是和我公司的环境有关,因为网管把IP和MAC地址绑定了,因此我的电脑只能使用固定IP,虚拟机没法得到一个IP,就无法上网。因此我就增加了一块网卡,一个用于内网使用 使用 Host-only 的方式为其指定固定IP,一个使用NAT的方式共享主机IP用于上网。

这个配置也不是很复杂,在目录‘/etc/sysconfig/network-scripts/‘下有一个‘ifcfg-eth0‘ 的网卡配置,然后执行(注意要把HWADDR和你虚拟机的实际MAC地址对应起来)

cp ifcfg-eth0 ifcfg-eth1

赋值一份配置文件,然后 ‘ifcfg-eth0‘的配置如下

这块网卡对应的是使用HOST-ONLY方式连接的网卡,使用静态IP

‘ifcfg-eth1‘的配置如下

这块网卡对应的是使用NAT网络的网卡,用于连接外网,动态获取IP

两个弄好后,重新启动网络

service network restart

注意,如果不通,看你的机器上是否已经有两个网卡

没有的话加上,然后在你的虚拟机上 ‘Edit‘->‘Virtual Network Editor‘ 中查看

这两个网络分别属于 192.168.15.0 和 192.168.77.0 这两个网络,因此你本地的VMnet8 是要作为网关的,要保持和虚拟机中和NAT配置的在一个网络才能通信,因此VMnet8配置如下

如此才能保证虚拟机能够上网 (剩下几台机器使用一样的步骤配置网络)

好了,上面属于题外话,不过笔者弄了很久才弄通,相信不少同学都会遇到以上问题,既要指定固定IP,又要上网,但是公司又做了限制

首先要安装mysql

先解压文件

 tar -zxvf mysql-5.6.28.tar.gz

不过这个东西在安装之前还有一些依赖文件,分别为 ‘make gcc-c++ cmake bison-devel ncurses-devel‘ 此处使用yum安装

yum -y install make gcc-c++ cmake bison-devel  ncurses-devel

一切就绪,进入解压后的源码安装包,这里你会发现很惊奇,没有‘configure‘文件,不造咋编译,这个是因为新版的使用了‘cmake‘进行编译,因此要确保是否安装了cmake

rpm -q cmake

如果没有安装就安装上去,然后输入以下指令进行配置

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

上面几个重要的地方

‘-DCMAKE_INSTALL_PREFIX‘ 是安装目录

‘-DMYSQL_DATADIR‘ 是数据文件存放目录

‘-DSYSCONFDIR‘ 配置文件目录

‘-DMYSQL_UNIX_ADDR‘ SOCK文件存放目录

‘-DMYSQL_TCP_PORT‘ 端口号

没有问题然后编译

make && make install

经过30分钟漫长等待...

等一切就绪后,我们需要确保存在 mysql组和mysql用户

cat /etc/group|grep ‘mysql‘
cat /etc/passwd|grep ‘mysql‘

如果不存在则需要添加组合用户

groupadd mysql
useradd -g mysql mysql

然后将目录‘/usr/local/mysql‘的所有者改为mysql

chown -R mysql:mysql /usr/local/mysql

这时算是已经安装完成了,但是mysql中是没有数据的(即使系统自带的数据都没有),这时需要执行自带脚本,初始化mysql数据

/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql

执行完成后,你会发现/usr/local/mysql/data 目录下多了一些文件,这些就是mysql的数据文件了

然后启动mysql,这时要注意,我们上面指定配置文件位于‘/etc‘目录下,但是我们为了方便,想把mysql配置文件放到‘/usr/local/mysql/‘,这时我们需要把‘/etc/my.conf‘更改一下名称

mv /etc/my.cnf  /etc/my.cnf.bak

这时mysql 在‘/etc‘目录下找不到,就会到‘$basedir‘下去找,也就是‘/usr/local/mysql/‘目录

此时mysql的安装工作算是完了,下面就要启动了,你会发现使用使用

/usr/local/mysql/bin/mysql start

无法启动,报错为

ERROR 2002 (HY000): Can‘t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock‘ (2)

之前笔者怎么弄都不行,即使建立‘/var/lib/mysql/mysql.sock‘ 后来终于知道,原来不是怎么启动的,而是

/usr/local/mysql/support-files/mysql.server start

OK,现在可以正常启动了,但是一些懒惰的读者发现敲命令时 都要加上 ‘/usr/local/mysql/bin‘ 及其的麻烦,我能不能直接使用 ‘mysql xxx‘这种

这下就要把mysql的命令目录加入到环境变量中了

cp /etc/profile /root/backup/profile
vim /etc/profile

编辑‘/etc/profile‘ 即可,上面一句是备份以免弄错了,系统崩溃无法恢复

在尾部加上

export PATH=/usr/local/mysql/bin:$PATH

如果已经有了这句,只需要在$PATH 前面加个‘/usr/local/mysql/bin:‘ 即可,然后使配置立即生效

source /etc/profile

使用

mysql -u root

进入mysql命令行,这些就算爽了,把剩下的按照这个配完整就OK了

然后就要开始主从配置了,首先在centos4上配置主库,修改‘/usr/local/mysql/my.cnf‘

server_id=1
log_bin=mysql_bin

然后重新启动mysql

然后为主库添加一个用户,用于同步数据

GRANT REPLICATION SLAVE ON *.* TO ‘copier‘@‘%‘ IDENTIFIED BY ‘12345678‘

这个用户叫‘copier‘ 密码为 ‘12345678‘ 运行外网访问

剩下的配置从库,添加下面几句配置

log_bin=mysql_bin
server-id=3

剩下的从库配置相同

好了,下面我们就开始连接主库

在mysql命令行下输入

CHANGE MASTER TO
MASTER_HOST=‘192.168.138.4‘,
MASTER_USER=‘copier‘,
MASTER_PASSWORD=‘12345678‘,
MASTER_LOG_FILE=‘mysql_bin.000004‘,
MASTER_LOG_POS=120;

里面有两个参数 MASTER_LOG_FILE 和 MASTER_LOG_POS 要到主库中获取,在主库mysql命令行下输入

show master status\G

结果中 File 和 Position 分别代表 MASTER_LOG_FILE 和 MASTER_LOG_POS的值,千万记住上面单引号和逗号,最后一个是数字没有单引号

然后在从库mysql命令行下运行

start slave

然后查看状态

show slave stauts\G

可以看到

一定要是这个状态,如果是 ‘Connecting to master‘ 这样的字眼,那就有问题,问题就出现在四个方面

1、网络不通

2、用户名密码不对

3、MASTER_LOG_FILE 和  MASTER_LOG_POS 的值不对(主库每次启动,这两个值都可能发生变化)

4、主库防火墙规则限制(相信很多同学找不到原因,可能就是这条,这里实验环境把防火墙关闭就OK了 ‘service iptables stop‘)

OK,以上就是鄙人的实践,过程中遇到的问题主要是防火墙没关,从库状态一直是"Connecting to master",关闭后就基本解决了

我在找上面的问题时发现网上有人问,这怎么就就叫做读写分离了?

其实读写分离是一种架构,只能从主库写入,从库关闭写入功能,程序在读取的时候可以选择从主库或主库读取(一般从从库读取),写入只能选择主库,因为功能大多都是读取,多台从库分散压力。如果要考虑高可用性,可以弄两台主库,一台主库用于热备,加上心跳监控和实效转移,当常用的主库发生故障时,自动切换到另一台备用主库上面,平时这两台主库保持数据一致就OK了。当然这个东西牵扯到其他一些东西,比如hearbeat/DRBD/Keepalived 这些东西。

读写分离有优点,也有缺点,比如多台数据库可能造成程序比较复杂(负载均衡问题),最致命的就是复制延迟(比如下订单时,用户明明已经下了单,可是到用户中心后却找不到,过一会就出来了)

鄙人才疏学浅,有不足之处,欢迎补足

时间: 2024-08-06 08:25:06

MySQL5.6 实现主从复制,读写分离,分散单台服务器压力的相关文章

Mysql的主从复制读写分离--简单篇

Mysql基础拓扑图: Mysql环境准备: 一台mysql主服务器(安装mysql) 两台mysql从服务器(安装mysql) 一台mysql代理(安装amoeba和java) 一台mysql客户端(mysql客户端) 部署前先关闭所有的iptables,selinux Mysql的主从复制读写分离所需安装包: cmake-2.8.6.tar.gz mysql-5.5.22.tar.gz amoeba-mysql-binary-2.2.0.tar.gz jdk-7u65-linux-x64.t

mysql数据业务垂直+水平分割+主从复制读写分离

友情提示:本人第一次写技术博客,会继续完善,尽量做到图文并茂,通俗易懂,如果有什么写的不好的地方,还请大家多多提意见,您的意见将是我宝贵的资源.如果有兴趣的话,还可以一起讨论相关技术哦,亲!一定要注意软件版本哦! 联系方式 QQ:794884160 指导老师:双星  冯德勇老师  曾勇老师 一.拓扑图: 垂直+水平分割+主从复制+读写分离完整原理图: 仅说明原理,详细拓扑及参数参考本次实验拓扑图 本次试验拓扑图:(上图左侧部分) 二.实验描述: 根据业务原型先进行数据库垂直切割,然后用户数据根据

【实战】Amoeba 代理 MySQL 主从复制 + 读写分离 【提供源码包】

目录简介: 1· Amoeba 的介绍2· MySQL 主从复制原理3· MySQL 读写分离原理4· 实战案例5· 总结归纳 Amoeba 的介绍 1)Amoeba 是什么: 1·Amoeba 的中文名是:变形虫.它是一个以MySQL为底层数据存储,并对应用提供MySQL协议接口的proxy.它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. 2·Amoeba相当于一个SQL请求的路由器,目的是为负载均衡.读

mysql主从复制读写分离之——proxysql应用

一.说明ProxySQL是一个开源的MySQL代理服务器,这意味着它充当MySQL服务器和访问其数据库的应用程序之间的中介.ProxySQL可以通过在多个数据库服务器池之间分配流量来提高性能,并且如果一个或多个数据库服务器发生故障,还可以通过自动故障切换到备用数据库来提高可用性. 系统环境:master1:ubuntu16.04 mysql5.6 192.168.1.10 3307 master2:ubuntu16.04 mysql5.6 192.168.1.20 3307slave1: ubu

mysql主从复制读写分离-Altas

mysql主从复制读写分离 本文读写分离使用的软件是Altas,altas是奇虎360公司开发的开源数据库代理软件.它是基于mysql-proxy开发而成的 它集中地响应应用的请求,依据用户事先设置的规则,将SQL请求发送到特定的数据库上执行.基于此可以实现负载均衡.读写分离.高可用性等需求. mysql读写分离原理: 数据库层在高并发的情况下,i/o会产生瓶颈.而实际上用户读的请求要远远大于写的请求. 使用代理服务作为数据库前端,将不同的请求根据规则分配到不同的后端数据上面去,比如将写的请求分

【 Linux 】单台服务器上并发TCP连接数

单台服务器上并发TCP连接数    问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制:    对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的连接到来返回给我们的错误是"Socket/File:Can't open so many files" 这时,你需要明白操作系统可以打开最大文件数的限制. 进程限制(用户限制):            执行 ulimit -n 输出1024,说明对于一个进程而言最多只能打开1024个文件,

网络编程释疑之:单台服务器上的并发TCP连接数可以有多少

曾几何时我们还在寻求网络编程中C10K问题的解决方案,但是现在从硬件和操作系统支持来看单台服务器支持上万并发连接已经没有多少挑战性了.我们先假设单台服务器最多只能支持万级并发连接,其实对绝大多数应用来说已经远远足够了,但是对于一些拥有很大用户基数的互联网公司,往往面临的并发连接数是百万,千万,甚至腾讯的上亿(注:QQ默认用的UDP协议).虽然现在的集群,分布式技术可以为我们将并发负载分担在多台服务器上,那我们只需要扩展出数十台电脑就可以解决问题,但是我们更希望能更大的挖掘单台服务器的资源,先努力

单台服务器并发百万级配置(转)

单台服务器并发百万级配置(转) 目的:让服务器支持大量并发访问. 注:以下内容 ASP/ASP.NET IIS 用不成.另外要精通Linux,TCP/IP. 摘要:本文主要介绍利用单台PC服务器来实现可支持百万级用户并发访问的WEB服务器的实践工作.意在提出一些手段来发掘设备的潜力,充分利用设备资源,以求达到降低硬件投入成本和维护成本的目的. 随着硬件技术的飞速发展,当前单台PC 服务器的性能得到了显著提升,反之,硬件成本却在快速下降.另一方面,多数门户网站.大型社区在建设WEB服务.邮件服务等

centos7在单台服务器上安装FastDFS的方法

准备环境: #安装依赖包 yum -y install gcc gcc-c++ libtool pcre* zlib openssl openssl-devel mkdir /FastDFS/ #上传下载工具 yum -y install lrzsz yum -y install unzip cd /FastDFS/ 上传fastdfs-dep.zip rz #安装libfastcommon cd /FastDFS/ unzip fastdfs-dep.zip cd /FastDFS/fastd