mysql主从+读写分离.docx
- 文档编号:4322117
- 上传时间:2022-11-29
- 格式:DOCX
- 页数:14
- 大小:182.43KB
mysql主从+读写分离.docx
《mysql主从+读写分离.docx》由会员分享,可在线阅读,更多相关《mysql主从+读写分离.docx(14页珍藏版)》请在冰豆网上搜索。
mysql主从+读写分离
Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。
但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。
因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力这样的方案来进行部署与实施的。
下面是我在实际工作过程中所整理的笔记,在此分享出来,以供大家参考。
一、MySQL的安装与配置
值得一提的是,我的安装过程都是源码包编译安装的,并且所有的配置与数据等都统一规划到了/opt/mysql目录中,因此在一台服务器上安装完成以后,可以将整个mysql目录打包,然后传到其它服务器上解包,便可立即使用。
二、MySQL主从复制
场景描述:
主数据库服务器:
192.168.10.130,MySQL已经安装,并且无应用数据。
从数据库服务器:
192.168.10.131,MySQL已经安装,并且无应用数据。
2.1主服务器上进行的操作
启动mysql服务
/opt/mysql/init.d/mysqlstart
通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql-uroot-p'new-password'
授权给从数据库服务器192.168.10.131
mysql>GRANTREPLICATIONSLAVEON*.*to'rep1'@'192.168.10.131'identifiedby'password';
查询主数据库状态
Mysql>showmasterstatus;
+------------------+----------+--------------+------------------+
|File|Position|Binlog_Do_DB|Binlog_Ignore_DB|
+------------------+----------+--------------+------------------+
|mysql-bin.000005|261|||
+------------------+----------+--------------+------------------+
记录下FILE及Position的值,在后面进行从服务器操作的时候需要用到。
2.2配置从服务器
修改从服务器的配置文件/opt/mysql/etc/f
将server-id=1修改为server-id=10,并确保这个ID没有被别的MySQL服务所使用。
启动mysql服务
/opt/mysql/init.d/mysqlstart
通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql-uroot-p'new-password'
执行同步SQL语句
mysql>changemasterto
master_host=’192.168.10.130’,
master_user=’rep1’,
master_password=’password’,
master_log_file=’mysql-bin.000005’,
master_log_pos=261;
正确执行后启动Slave同步进程
mysql>startslave;
主从同步检查
mysql>showslavestatus\G
==============================================
****************1.row*******************
Slave_IO_State:
Master_Host:
192.168.10.130
Master_User:
rep1
Master_Port:
3306
Connect_Retry:
60
Master_Log_File:
mysql-bin.000005
Read_Master_Log_Pos:
415
Relay_Log_File:
localhost-relay-bin.000008
Relay_Log_Pos:
561
Relay_Master_Log_File:
mysql-bin.000005
Slave_IO_Running:
YES
Slave_SQL_Running:
YES
Replicate_Do_DB:
……………省略若干……………
Master_Server_Id:
1
1rowinset(0.01sec)
==============================================
其中Slave_IO_Running与Slave_SQL_Running的值都必须为YES,才表明状态正常。
如果主服务器已经存在应用数据,则在进行主从复制时,需要做以下处理:
(1)主数据库进行锁表操作,不让数据再进行写入动作
mysql>FLUSHTABLESWITHREADLOCK;
(2)查看主数据库状态
mysql>showmasterstatus;
(3)记录下FILE及Position的值。
将主服务器的数据文件(整个/opt/mysql/data目录)复制到从服务器,建议通过tar归档压缩后再传到从服务器解压。
(4)取消主数据库锁定
mysql>UNLOCKTABLES;
2.3验证主从复制效果
主服务器上的操作
在主服务器上创建数据库first_db
mysql>createdatabasefirst_db;
QueryOk,1rowaffected(0.01sec)
在主服务器上创建表first_tb
mysql>createtablefirst_tb(idint(3),namechar(10));
QueryOk,1rowaffected(0.00sec)
在主服务器上的表first_tb中插入记录
mysql>insertintofirst_tbvalues(001,’myself’);
QueryOk,1rowaffected(0.00sec)
在从服务器上查看
mysql>showdatabases;
=============================
+--------------------+
|Database|
+--------------------+
|information_schema|
|first_db|
|mysql|
|performance_schema|
|test|
+--------------------+
5rowsinset(0.01sec)
=============================
数据库first_db已经自动生成
mysql>usefirst_db
Databasechaged
mysql>showtables;
=============================
+--------------------+
|Tables_in_first_db|
+--------------------+
|first_tb|
+--------------------+
1rowinset(0.02sec)
=============================
数据库表first_tb也已经自动创建
mysql>select*fromfirst_tb;
=============================
+------+------+
|id|name|
+------+------+
|1|myself|
+------+------+
1rowsinset(0.00sec)
=============================
记录也已经存在
由此,整个MySQL主从复制的过程就完成了,接下来,我们进行MySQL读写分离的安装与配置。
三、MySQL读写分离
场景描述:
数据库Master主服务器:
192.168.10.130
数据库Slave从服务器:
192.168.10.131
MySQL-Proxy调度服务器:
192.168.10.132
以下操作,均是在192.168.10.132即MySQL-Proxy调度服务器上进行的。
3.1MySQL的安装与配置
具体的安装过程与上文相同。
3.2检查系统所需软件包
通过rpm-qa|grepname的方式验证以下软件包是否已全部安装。
gcc*gcc-c++*autoconf*automake*zlib*libxml*ncurses-devel*libmcrypt*libtool*flex*pkgconfig*libevent*glib*
若缺少相关的软件包,可通过yum-yinstall方式在线安装,或直接从系统安装光盘中找到并通过rpm-ivh方式安装。
3.3编译安装lua
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua。
lua可通过以下方式获得
从http:
//www.lua.org/download.html下载源码包
从搜索相关的rpm包
这里我们建议采用源码包进行安装
cd/opt/install
wgethttp:
//www.lua.org/ftp/lua-5.1.4.tar.gz
tarzvfxlua-5.1.4.tar.gz
cdlua-5.1.4
visrc/Makefile
在CFLAGS=-O2-Wall$(MYCFLAGS)这一行记录里加上-fPIC,更改为CFLAGS=-O2-Wall-fPIC$(MYCFLAGS)来避免编译过程中出现错误。
makelinux
makeinstall
cpetc/lua.pc/usr/lib/pkgconfig/
exportPKG_CONFIG_PATH=$PKG_CONFIG_PATH:
/usr/lib/pkgconfig
3.4安装配置MySQL-Proxy
MySQL-Proxy可通过以下网址获得:
http:
//mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/
推荐采用已经编译好的二进制版本,因为采用源码包进行编译时,最新版的MySQL-Proxy对automake,glib以及libevent的版本都有很高的要求,而这些软件包都是系统的基础套件,不建议强行进行更新。
并且这些已经编译好的二进制版本在解压后都在统一的目录内,因此建议选择以下版本:
32位RHEL5平台:
http:
//mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
64位RHEL5平台:
http:
//mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-64bit.tar.gz
测试平台为RHEL532位,因此选择32位的软件包
wgethttp:
//mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
tarxzvfmysql-proxy-0.8.1-linux-rhel5-x86-32bit.tar.gz
mvmysql-proxy-0.8.1-linux-rhel5-x86-32bit/opt/mysql-proxy
创建mysql-proxy服务管理脚本
mkdir/opt/mysql-proxy/init.d/
vimmysql-proxy
#!
/bin/sh
#
#mysql-proxyThisscriptstartsandstopsthemysql-proxydaemon
#
#chkconfig:
-7830
#processname:
mysql-proxy
#description:
mysql-proxyisaproxydaemontomysql
#Sourcefunctionlibrary.
./etc/rc.d/init.d/functions
#PROXY_PATH=/usr/local/bin
PROXY_PATH=/opt/mysql-proxy/bin
prog="mysql-proxy"
#Sourcenetworkingconfiguration.
./etc/sysconfig/network
#Checkthatnetworkingisup.
[${NETWORKING}="no"]&&exit0
#Setdefaultmysql-proxyconfiguration.
#PROXY_OPTIONS="--daemon"
PROXY_OPTIONS="--admin-username=root--admin-password=password--proxy-read-only-backend-addresses=192.168.10.131:
3306--proxy-backend-addresses=192.168.10.130:
3306--admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua--proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua"
PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid
#Sourcemysql-proxyconfiguration.
if[-f/etc/sysconfig/mysql-proxy];then
./etc/sysconfig/mysql-proxy
fi
PATH=$PATH:
/usr/bin:
/usr/local/bin:
$PROXY_PATH
#Bydefaultit'sallgood
RETVAL=0
#Seehowwewerecalled.
case"$1"in
start)
#Startdaemon.
echo-n$"Starting$prog:
"
$NICELEVEL$PROXY_PATH/mysql-proxy$PROXY_OPTIONS--daemon--pid-file=$PROXY_PID--user=mysql--log-level=debug--log-file=/opt/mysql-proxy/log/mysql-proxy.log
RETVAL=$?
echo
if[$RETVAL=0];then
touch/var/lock/subsys/mysql-proxy
fi
;;
stop)
#Stopdaemons.
echo-n$"Stopping$prog:
"
killproc$prog
RETVAL=$?
echo
if[$RETVAL=0];then
rm-f/var/lock/subsys/mysql-proxy
rm-f$PROXY_PID
fi
;;
restart)
$0stop
sleep3
$0start
;;
condrestart)
[-e/var/lock/subsys/mysql-proxy]&&$0restart
;;
status)
statusmysql-proxy
RETVAL=$?
;;
*)
echo"Usage:
$0{start|stop|restart|status|condrestart}"
RETVAL=1
;;
esac
exit$RETVAL
脚本参数详解:
==============================================
PROXY_PATH=/opt/mysql-proxy/bin//定义mysql-proxy服务二进制文件路径
PROXY_OPTIONS=”–admin-username=root\//定义内部管理服务器账号
–admin-password=password\//定义内部管理服务器密码
–proxy-read-only-backend-addresses=192.168.10.131:
3306\//定义后端只读从服务器地址
–proxy-backend-addresses=192.168.10.130:
3306\//定义后端主服务器地址
–admin-lua-script=/opt/mysql-proxy/lib/mysql-proxy/lua/admin.lua\//定义lua管理脚本路径
–proxy-lua-script=/opt/mysql-proxy/scripts/rw-splitting.lua”\//定义lua读写分离脚本路径
PROXY_PID=/opt/mysql-proxy/run/mysql-proxy.pid//定义mysql-proxyPID文件路径
$NICELEVEL$PROXY_PATH/mysql-proxy$PROXY_OPTIONS\
–daemon\//定义以守护进程模式启动
–keepalive\//使进程在异常关闭后能够自动恢复
–pid-file=$PROXY_PID\//定义mysql-proxyPID文件路径
–user=mysql\//以mysql用户身份启动服务
–log-level=debug\//定义log日志级别,由高到低分别有(error|warning|info|message|debug)
–log-file=/opt/mysql-proxy/log/mysql-proxy.log//定义log日志文件路径
==============================================
cpmysql-proxy/opt/mysql-proxy/init.d/
chmod+x/opt/mysql-proxy/init.d/mysql-proxy
mkdir/opt/mysql-proxy/run
mkdir/opt/mysql-proxy/log
mkdir/opt/mysql-proxy/scripts
配置并使用rw-splitting.lua读写分离脚本
最新的脚本我们可以从最新的mysql-proxy源码包中获取
cd/opt/install
wgethttp:
//mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/mysql-proxy-0.8.1.tar.gz
tarxzvfmysql-proxy-0.8.1.tar.gz
cdmysql-proxy-0.8.1
cplib/rw-splitting.lua/opt/mysql-proxy/scripts
修改读写分离脚本rw-splitting.lua
修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离
vim/opt/mysql-proxy/scripts/rw-splitting.lua
--connectionpool
ifnotproxy.global.config.rwsplitthen
proxy.global.config.rwsplit={
min_idle_connections=1,//默认为4
max_idle_connections=1,//默认为8
is_debug=false
}
end
修改完成后,启动mysql-proxy
/opt/mysql-proxy/init.d/mysql-proxystart
3.5测试读写分离效果
创建用于读写分离的数据库连接用户
登陆主数据库服务器192.168.10.130,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql-uroot-p'new-password'
mysql>GRANTALLON*.*TO'proxy1'@'192.168.10.132'IDENTIFIEDBY'password';
为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能
登陆从数据库服务器192.168.10.131,通过命令行登录管理MySQL服务器
/opt/mysql/bin/mysql-uroot-p'new-password'
关闭Slave同步进程
mysql>stopslave;
QueryOK,0rowsaffected(0.00sec)
连接MySQL-Proxy
/opt/mysql/bin/mysql-uproxy1-p'password'-P4040-h192.168.10.132
登陆成功后,在first_db数据的first_tb表中插入两条记录
mysql>usefirst_db;
Databasechanged
mysql>insertintofirst_tbvalues(007,’first’);
QueryOk,1rowaffected(0.00sec)
mysql>insertintofirst_tbvalues(110,’second’);
QueryOk,1rowaffected(0.00sec)
mysql>quit
分别登陆到主从数据库服务器,对比记录
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mysql 主从 读写 分离