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..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= \
-DWITH_INNOBASE_STORAGE_ENGINE= \
-DWITH_MEMORY_STORAGE_ENGINE= \
-DWITH_READLINE= \
-DMYSQL_UNIX_ADDR=/var/lib/mysql/mysql.sock \
-DMYSQL_TCP_PORT= \
-DENABLED_LOCAL_INFILE= \
-DWITH_PARTITION_STORAGE_ENGINE= \
-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 ''
这个用户叫'copier' 密码为 '12345678' 运行外网访问
剩下的配置从库,添加下面几句配置
log_bin=mysql_bin
server-id=3
剩下的从库配置相同
好了,下面我们就开始连接主库
在mysql命令行下输入
CHANGE MASTER TO
MASTER_HOST='192.168.138.4',
MASTER_USER='copier',
MASTER_PASSWORD='',
MASTER_LOG_FILE='mysql_bin.000004',
MASTER_LOG_POS=;
里面有两个参数 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 这些东西。
读写分离有优点,也有缺点,比如多台数据库可能造成程序比较复杂(负载均衡问题),最致命的就是复制延迟(比如下订单时,用户明明已经下了单,可是到用户中心后却找不到,过一会就出来了)
鄙人才疏学浅,有不足之处,欢迎补足
MySQL5.6 实现主从复制,读写分离,分散单台服务器压力的更多相关文章
- Mysql多实例安装+主从复制+读写分离 -学习笔记
Mysql多实例安装+主从复制+读写分离 -学习笔记 .embody{ padding:10px 10px 10px; margin:0 -20px; border-bottom:solid 1px ...
- MySQL 主从复制&读写分离 简介
1. 读写分离&读写分离 简介 主从同步延迟 分配机制 解决单点故障 总结 2. 主从复制&读写分离 搭建 搭建主从复制(双主) 搭建读写分离 1. 读写分离&读写分离 简介 ...
- mysql主从复制-读写分离
mysql主从复制+读写分离 环境:mysql主:193.168.1.1mysql从:193.168.1.2amoeba代理:193.168.1.3########################## ...
- redis 主从复制+读写分离+哨兵
1.redis读写分离应用场景 当数据量变得庞大的时候,读写分离还是很有必要的.同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能.redis ...
- MySQL主从复制&读写分离&分库分表
MySQL主从复制 MySQL的主从复制只能保证主机对外提供服务,从机是不提供服务的,只是在后台为主机进行备份数据 首先我们说说主从复制的原理,这个是必须要理解的玩意儿: 理解: MySQL之间的数据 ...
- 进阶!基于CentOS7系统使用cobbler实现单台服务器批量自动化安装不同版本系统(week3_day5_part2)-技术流ken
前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...
- cobbler单台服务器实现批量自动化安装不同版本系统-技术流ken
前言 在上一篇博文<cobbler批量安装系统使用详解-技术流ken>中已经详细讲解了cobbler的使用以及安装,本篇博文将会使用单台cobbler实现自动化批量安装不同版本的操作系统. ...
- 高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少
高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少 阅读(81374) | 评论(9)收藏16 淘帖1 赞3 JackJiang Lv.9 1 年前 | 前言 曾几何时我 ...
- 【 Linux 】单台服务器上并发TCP连接数
单台服务器上并发TCP连接数 问题:一台服务器到底能够支持多少TCP并发连接呢? 1. 文件描述符限制: 对于服务器来说,每一个TCP连接都要占用一个文件描述符,一旦文件描述符使用完,新的 ...
随机推荐
- 十五天精通WCF——第十三天 用WCF来玩Rest
在我们玩wcf的时候,都会潜意识的觉得wcf就是通过soap协议交换消息的,并且可以在basic,tcp,msmq等等绑定中任意切换, 牛逼的一塌糊涂,但是呢,如果说哪一天wcf不再使用soap协议, ...
- mysql-2 mysql客户端
mysql 官方客户端 MySQL-Workbench 下载链接http://dev.mysql.com/downloads/workbench/ 具体安装步骤就不写了,直接一直下一步就可以了. 下 ...
- [转]Shell中read的常用方式
原文:Linux Shell Scripting Tutorial V2.0 read命令的语法: read -p "Prompt" variable1 variable2 var ...
- 使用VIM插件ctags来阅读C代码
说明 Ctags是vim下方便代码阅读的工具.尽管ctags也可以支持其它编辑器,但是它正式支持的只有vim.并且vim中已经默认安装ctags,它可以帮助程序员很容易地浏览源代码:ctags最先是用 ...
- 在Eclipse里查看Java字节码
要理解 Java 字节码,比较推荐的方法是自己尝试编写源码对照字节码学习.其中阅读 Java 字节码的工具必不可少.虽然javap可以以可读的形式展示出.class 文件中字节码,但每次改动源码都需调 ...
- 微软Nokia 222:可拍照可上网 售价37美元 32GB的microSD卡扩展
腾讯科技讯 8月27日,在几乎所有厂商都在智能手机领域大肆拼杀的时候,微软日前却悄悄地发布了一款功能手机Nokia 222. 目前,尽管全球许多发达国家的居民都对互联网已经再熟悉不过了,但事实上全球依 ...
- 利用div实现遮罩层效果
利用div实现遮罩层效果就是利用一个全屏.半透明的div遮住页面上其它元素,典型的例子就是百度的登录界面.下面贴出示例代码: <!DOCTYPE html> <html> &l ...
- https协议了解,以及相关协议的解析
HTTPS简介 HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版. ...
- 学习OpenStack之 (0):基础知识
vi 方向键出现字母问题解决方法 执行命令 sudo apt-get remove vim-common 执行命令 sudo apt-get install vim 鼠标被virtualbox捕获无法 ...
- jquery.roundabout.js实现3D图片层叠旋转木马切换
最近项目中需要实现3D图片层叠旋转木马切换的效果,于是用到了jquery.roundabout.js. 兼容性如图: html结构代码: <div id="featured-area& ...